I rebuilt kenove.no in one evening. The old site was a CV themed after Star Trek's LCARS interface. It looked striking. The rebuild moved it from a CV to a publication.



The new site is a teaching publication. Bilingual. Editable from anywhere. Owned by me, not locked into anyone's platform.
This is what I used, in the order I used it.
The toolchain in one sentence. Lovable writes the React app and hosts it. Sanity stores the content. GitHub keeps the code in sync between Lovable and my Mac mini. Claude Code edits anything I need my hands on.
Step 1: Lovable, set up the project. I described what I wanted in plain English: a bilingual editorial site, English at root, Norwegian under /no, content from Sanity, hosted by Lovable. I picked the TanStack Start template (not the default Vite SPA) because I wanted server-side rendering for SEO. Lovable scaffolded the app: React, TypeScript, Tailwind, shadcn/ui, file-based routing under src/routes/, a server entry at src/server.ts.
Step 2: Sanity, set up the CMS. Lovable wired a Sanity Studio into a studio/ folder at the same repo. The Studio is the editor I use to write and publish posts. I defined four document types in the schema: note (short essays), walkthrough (this kind of piece), nowUpdate (the /now page), and later toolResearch (an internal knowledge base for grounding future drafts). Each editable type got language and translationOf fields so the bilingual setup works at the data layer, not just the routing layer.
Step 3: Deploy the schema. From studio/, I ran npx sanity@latest schema deploy. That registers the schema so the API recognizes my custom fields. One gotcha: the Studio needs a Node version that matches Sanity's engines constraint. I pinned Node 22 via Homebrew (brew install node@22) because the system Node 25 broke the Studio's deep dependencies.
Step 4: Connect GitHub. Lovable's two-way GitHub sync is the keystone of everything that comes next. Every change in Lovable pushes a commit. Every commit I push from my Mac mini, Lovable pulls. This is what makes the "edit in Lovable for visual work, edit in Claude Code for logic and migrations" split actually work. Without it, you have to pick one tool and accept its ceiling.
Step 5: Pull the repo, open it locally. I cloned the GitHub repo to my Mac mini. From there I edit code in Claude Code CLI when Lovable struggles: complex routing logic, async timing in Supabase flows, or, most recently, a typography sweep across 30 files to remove em dashes everywhere.
Step 6: Let Lovable host it. Lovable serves the SSR app at its own hosting. The deploy is automatic on every change, whether the change started in Lovable or as a commit pushed from my Mac mini through GitHub. No separate hosting account to set up, no deploy config to maintain.
Step 7: Self-host the Sanity Studio. I edit posts often enough that I wanted the Studio always running at localhost:3333. On macOS, that means a LaunchAgent: a small plist at ~/Library/LaunchAgents/no.ferbu.sanity.plist that runs sanity dev at login, restarts on crash, and survives reboots. Editing a post becomes one keystroke: Cmd+Tab to the browser, type, publish.
What surprised me. Two-way GitHub sync sounds boring on paper. In practice it is the single feature that unlocks the whole setup. Without it, Lovable would be a walled garden. With it, Lovable and Claude Code coexist as peers, and the codebase is mine all the way through.
What I would skip next time. Lovable bug-fix loops. When something breaks in a way Lovable cannot see, it sometimes fixes the wrong thing three times in a row and burns paid credits doing it. Faster path: open Claude Code, read the actual stack trace, fix the actual problem. Then push back, let Lovable see the diff, and move on.
What I would keep. Treating Sanity as the source of truth. Everything that is content (posts, walkthroughs, the /now page) lives in Sanity. The site is a renderer for it. That separation means I can change the site without re-typing the content, and I can change the content without touching the site.
What this enables. Adding a new post is open Studio, type, publish. Adding a new section is describe it to Lovable, watch the diff come through, polish in Claude Code. The site is fast, owned, bilingual, and editable from any room. The whole stack runs at roughly the price of one streaming subscription per month at the tier I am on now. Lovable is the biggest line item; Sanity and GitHub sit on free tier at this scale.
The site you are reading is the proof.
More walkthroughs like this at kenove.no. Subscribe at the bottom if you want them when they land.
