Urbic is built for design studios that publish their work, and it ships finished: nine project case studies, four services, a seven-note journal, an about page and a connected contact form, all replaceable file by file. What sets it apart from a portfolio template is the CMS at /admin/. That CMS is not a hosted service and needs no API key or database to start — it signs a team in against its own accounts store, writes markdown into src/data/, commits it with git, and pushes the branch when someone presses Publish, so the content stays in the repository and the deploy stays your own Astro build. Editors get a block editor with server-side drafts and per-entry history, a page composer that assembles new pages out of the theme's own section components, and an image library that re-encodes to AVIF and shows the saving before it applies it. The public site is prerendered static Astro with no framework islands; only /contact/ renders per request, because its form reads its own action result.
Features
An embedded CMS at /admin/ — thirteen screens, no third-party service, no database and no API key needed for the first sign-in
Content is committed, not stored elsewhere: every save writes markdown into src/data/ and lands as a git commit, so the repository stays the single source of truth
A page composer that reads the theme's own section components off disk, draws each one as a wireframe, and edits its props in an inspector — the browser never produces .astro and the server never accepts it
A block editor with a frontmatter rail, undo, paste handling and a live word count, over a typed document model that degrades unknown markup losslessly rather than dropping it
Drafts held on the server per account, so an edit started at the studio can be finished anywhere; per-entry version history with restore
A review and publish screen that reads pending work straight from git — unpushed commits and uncommitted edits in one queue — and refuses with a reason a person can act on
Saves auto-push to the working branch a moment after they land, so a branch build is a preview deploy for free, while Publish stays the only verb that moves the live branch
A save-state pill that resolves dirty → saved → publishing → live by checking the deployed build's own commit stamp, using ancestry rather than equality so a colleague's save never walks it back
Team management with three roles, expiring single-use email invites, email verification, and a server-side rule that stops the last admin demoting themselves
An image library with upload, delete, alt text and an AVIF optimise pass that measures the saving first, every action batched into one commit
A settings screen that can connect a domain by writing and committing src/site.domain.ts, so the next build stamps every canonical, the sitemap, robots.txt, llms.txt and the feed
Accounts on unstorage — a file by default, or libSQL/Turso behind one environment variable, or any of its other drivers
Zod-validated content collections, so bad frontmatter fails the build with the entry named; order on a project drives both its grid slot and the prev/next pager on its case study
Project pages with a scatter layout, a masonry mode and a scroll-snap slider, plus a work filter strip built on radio groups with no JavaScript at all
A journal with a three-layout toggle built from radios and :has(), a contents rail derived from the note, topic archives, and a share row
45 UI primitives as tailwind-variants recipes — dialog, mega-menu, combobox, tabs, table and the rest — zero-JS unless interaction demands otherwise, all browsable at a dev-only /examples/ui catalog
574 inlined SVG icons behind a typed <Icon name="…" />, resolved at build time so nothing lands in client JavaScript
96 motion utilities, a dependency-free port of tailwind-animations plus scroll-driven extensions, under a global reduced-motion guard, with animations, view transitions and Lenis smooth scroll each behind a config switch
An owned SEO layer: every meta and OG tag emitted by BaseHead, JSON-LD from typed helpers, dynamic robots.txt and llms.txt, sitemap and RSS — no SEO package, and a production build that throws rather than ship the placeholder domain
CSS-first Tailwind 4 tokens: palette aliases feed semantic runtime variables which feed the utilities, so a rebrand is one alias block and light and dark follow
Two self-hosted variable fonts (Jost, Cormorant Garamond), latin-subset and preloaded — no external font or icon requests
A contact form on Astro Actions delivering through Resend, which reports itself unconfigured in plain words rather than failing the build when the keys are absent
TypeScript strict, ESLint and Prettier, 135 self-checks that run under Node's own type stripping with no test framework, and a maintained wiki/ whose citations are linted against the code
Ships with a Dockerfile for a container host; swap one adapter line for Cloudflare, Netlify or Vercel
Best Used For
Interior architecture, interior design and architecture studios
Design and creative studio portfolios built around project case studies
Studios whose clients need to edit and publish the site themselves
Agencies delivering a portfolio site with a CMS the client can run without a subscription






