A portfolio builder that runs in your browser. Assemble a personal site from drag-and-drop widgets, style it with a theme you can override, and publish it — or export a plain static site and host it yourself. No code required, and no lock-in if you want to write some.
Status: early development. Nothing here is usable yet.
- Marketing site — https://portfoliyou.snxethan.dev
- Website source — PortfoliYOU-WEBSITE
- V1, archived — PortfoliYOU-APP
The web builder, rebuilt. It supersedes PortfoliYOU-APP, which was an Electron desktop app.
That first version is a working prototype and the reference for the target shape — its data model, widget contract and theme system all carry forward. What does not carry forward is an architecture built around a desktop shell. See PLAN.md for the audit of what survives and why.
A portfolio is a public artefact. Its whole purpose is to be seen, which makes "local-first, your data never leaves your machine" a weak pitch for this product specifically. The ownership promise that actually matters is the static export, and that works identically in a browser.
Against that, desktop costs signed installers on three platforms, an update channel, platform-specific bug reports and a second QA pass on every release. Distribution argues the same way: a URL converts a curious visitor immediately; an installer asks them to commit before they have seen anything.
A project is stored as data, not code. Widgets emit a normalised node tree, and each framework target renders that tree once. Nine widgets across four targets is thirteen implementations rather than thirty-six, adding a widget does not tax every target, and the editor canvas becomes another consumer of the same tree — so what you see while editing cannot drift from what gets emitted.
It also makes changing a project's framework re-emission rather than translation: lossless for anything the builder generated, lossy only for code you hand-edited, which is exactly what the conversion warning can name.
- Create — name it, set site metadata, favicon pack, security contact, theme and target framework.
- Organise — add, rename, reorder and delete pages, each with its own route, metadata and breakpoints.
- Compose — drag widgets onto a canvas; move, resize and snap them.
- Edit — three depths per widget: a generated settings form, the widget as copyable JSON, or the real emitted source (with eject and un-eject).
- Deploy — download a zip free with no account, or publish to GitHub Pages, Vercel, Netlify or a Portfoli-YOU subdomain.
| Target | Output | Phase |
|---|---|---|
static |
HTML + CSS + a small vanilla JS bundle | 1 — the default |
react-ts |
Vite + React + TypeScript | 2 |
next |
Next.js App Router, SSG | 3 |
go |
html/template + net/http |
4 |
Nothing is implemented in this repo yet. PLAN.md carries the full
architecture, the data-model deltas, the build order and the open questions —
chiefly whether the Behaviour abstraction generalises, which the carousel and
contact-form widgets are the stress tests for.
Issues and pull requests are welcome once there is code to change. Until then, the most useful contribution is disagreement with PLAN.md — the node-tree decision is load-bearing and worth arguing about before it is built.
MIT.
Ethan Townsend (@snxethan) — started as a semester project at Neumont College of Computer Science, grew into a capstone.