kraft
A public lab of interactive demos and UI experiments — live, playable proofs of concept, not writeups or finished products.
A separate site from this one, on purpose. kraft is where a UI question or a “does this actually work” curiosity turns into a small, live, playable thing — not a blog post about the idea, the idea itself, running in a browser.
The problem
Most of what I build to answer a technical question dies in a scratch repo or a throwaway branch. kraft gives that work a permanent, public home instead: one MDX file plus one React island per experiment, indexed on a single page, each one live and interactive rather than described after the fact.
No backend, no database, no accounts. If an experiment needs state, it keeps it in the browser. If it needs feedback, that’s a link straight to a GitHub issue, pre-filled with the experiment’s context.
My contribution and decisions
I built kraft as a solo project, using Astro for the content and routing and React islands for the interactive experiments. Each experiment pairs an explanation with something visitors can try, keeping the question and its evidence together.
The scope stays deliberately small: browser state where needed, and GitHub issues for feedback. That lets each experiment stand on its own without an account or a backend.
The outcome
The experiments range from small UI challenges to open technical questions I wanted to see proven, not just explained. One example: “Can you iframe it?” — a tool that loads any URL in a real <iframe> to test whether it renders or gets blocked, which grew out of a real question about embedding a login-gated app. The two blog posts on that topic exist because the experiment surfaced enough edge cases to be worth writing down.
Tech
Astro 7 for the shell and routing, MDX content collections for the experiments themselves, React 19 islands (client:load) for the interactive parts, Tailwind 4 for styling. Fully static, deployed on Vercel.
Current Status
Live, with new experiments added as questions come up worth answering in public instead of in a scratch file.