Paradox
My approach to making connected stories explorable.
I designed and built Paradox around branching stories. Explore my approach to the canvas, guest-first onboarding, search, and readable story details.
- Next.js
- React
- TypeScript
- Tailwind CSS
- Node.js
- PostgreSQL
- Redis
- REST & GraphQL APIs
- Magic-link auth
- Docker
- Vercel
- AWS
- Cloudflare
- GitHub Actions CI/CD
- Sentry
My contribution and decisions
I designed and built the product end to end. The central interaction is a timeline canvas: it needs to show a connected story without making readers lose their place.
Guest access, a command palette, and a details panel give readers several ways to explore. The examples below show how I connect navigation, information hierarchy, and interaction behavior.
What it does
Complex data people want to explore.
Explore connected timelines on a pannable canvas, with a minimap that keeps the wider story in view.
- Minimap at 1:1 with the canvas
- Drag, scrub and guided tour
- Color that carries meaning
Let readers explore before signing up.
Guest access lets readers explore first, with magic-link, Google, and Discord sign-in when they choose to join.
- Guest mode before any account
- Magic links, Google and Discord
- No passwords to forget or leak
Search stories and run commands in one place.
⌘K searches every timeline, branch, event and variant, and runs commands too.
- Grouped, ranked results
- Full keyboard control
- Content and actions in one box
Inspect the details without losing your place.
Overview, canon, branches and variants in one panel, without leaving the view.
- Tabs instead of new pages
- Primary action always in reach
- Creator and rights built in
Keep recent story activity in view.
A live stream of what’s happening right now: new branches, discoveries, milestones.
- Real-time events
- Readable at a glance
- Every item leads somewhere
Filters with live counts.
Narrow by type, source and genre. Counts update as you go.
- Faceted by type, source and genre
- A count on every option
- One-click reset
User content that stays readable.
When anyone can post, structure is what keeps quality up.
- Required summaries, shown first
- Live sorting by real activity
- Creator credit on everything
Why it’s built this way.
Why magic links instead of passwords?
Magic links remove the need to create and remember a password. Their security still depends on email access, short-lived tokens, safe redirects, and session handling.
Why let people in as a guest first?
Guest access lets readers understand the stories and navigation before deciding whether to create an account. The sign-in flow is available when they want to take part.
Why a ⌘K command palette?
The palette brings search and common actions into one keyboard-accessible entry point, with results grouped by content type. It gives readers an alternative to navigating each view separately.
Why a details panel instead of a new page?
Users keep their place. Stats, people and actions open beside what they’re looking at, so nobody loses the thread or hits back five times.
How does the canvas stay easy to navigate?
The minimap and the canvas share one model, so they never drift out of sync. A guided tour shows the way, and hands control back the moment you touch it.
Why require a summary on every branch?
When anyone can post, structure keeps quality up. One required sentence, shown first, means every card is readable at a glance.
How is discovery ranked?
By what readers actually do: readers, branches and recent activity. The busiest worlds rise on their own, no guesswork.
Who built it?
Nicholas Howell, designed and built end to end. It’s how I’d build your product, too.










