Home

woven

Overview

A mobile reading app built around one small act: you find a note the last reader left, and you leave one for the next. Taken from concept to a working prototype in a 7-day design competition.

Stack
Next.js
TypeScript
Tailwind
Figma
Claude Code
DialKit
Scope
Product design
User research
Interaction & Motion
Prototyping
Collaborators
Joyce Ren
Joel Lim
Timeline
Oct 15 - 21, 2026

Brief

In a 7-day design competition, I led prototyping and worked out the interactions and logic. The one rule: pick a specific group of people and build something they'll love, even if everyone else hates it. The product had to center on storytelling.

Pick a specific group of people and design a product they'll love, even if others might hate it. There's just one constraint: Your product must center around the theme of “storytelling.”

We read storytelling literally at first and kept hitting the same wall. The story was always something the app displayed, never something it let people make. So we flipped it.

Ideation

Woven isn't where we started. The brief left the audience wide open, so we went wide too: kids in hospitals, AAC and ASL storytelling, immigrants holding on to their culture, night-shift workers, people who hoard nostalgia. The one we fell for hardest was families of Alzheimer's patients. An app to catch a person's stories before they faded.

A FigJam board of sticky notes grouped under Users and Product, linked by arrows, with a grey cluster on the Alzheimer's direction
Our FigJam board the day the prompt dropped

Then we pentested it and killed it ourselves. Real memories show up when they want to. Asking someone to tell a story on cue feels intrusive, and most of the time nothing comes. The privacy and ethics questions piled up fast. And confabulation meant we couldn't even trust what we'd be saving. So we flipped the exercise. Rather than invent a product, we took ones that already work and asked who else they could be for. That's how we got to Marginalia, the real word for the notes people scribble in the margins of books. A shared library where strangers pass along books they loved, each with a note for whoever reads it next.

A FigJam board in three parts: early audience ideas, products that share who you are, and product reframings, including the Marginalia note
Same products, new audiences

Features we cut

Our first user flow had a few features that would have turned Woven into one more social app. Cutting them gave it a spine.

123Most notesLeaderboard1Jane EyreCharlotte Brontë212 notes2Pride and PrejudiceJane Austen87 notes3DraculaBram Stoker14 notes
Note-count ratings
Ranking books by how many notes they had turns reading into a leaderboard.
SSofia P.Jane Eyreloved your note on p. 42wait, who is this?SeenMessage Sofia
Messaging
The moment you can message the last reader, it's a chat app, and the anonymity is gone.
GriefHopeHomeLongingWinter
Keyword map
Matching your answers against past readers' was one step from a feed.

Core bet

The decision everything else hangs on. A note you leave is not posted to a wall. It goes to one later reader, at the exact passage that moved you. We rejected the obvious version: a public copy where everyone's notes stack up on every page. That is SoundCloud comments. It turns a quiet book into a comment section, and the fortieth "so true" drowns the one note that was meant for you.

One note, one person does two things at once. It keeps the page uncluttered, and it makes a stranger's attention feel deliberate, like they wrote it for you, because they did.

The relay
AReader Awrites a noteBReader Breads, writes nothingCReader Cfinds A's note, adds one?Next

Keeping it human

Everything here came from one question: how do you make a one-way, anonymous connection feel two-sided and real, without becoming a social network.

A library card, not a profile. You don't pick a username or upload a photo. Woven issues you a library card with your first name and last initial, three genres you read, a signature and the day you joined. That is all anyone sees next to your notes. Enough to feel like a person wrote them. Nothing to search for, follow, or turn into content.

Rejected
Create your profile+Add a profile photoUsername@ava_readsAvailableBioTell people about yourself
Continue
Chosen
Library CardNO. 335586Sam YREADSFantasySci-fiClassicsSam YIssued onNOV 1 2026

No counts, one reaction. No likes, no reply threads, no badge saying how many people highlighted a line. The only thing you can do with a note is keep it. When someone keeps yours, you learn it landed. That is the whole feedback system.

Rejected
SSam YJane Eyre · Chapter I
There was no possibility of taking a walk that day.120
View 34 replies
Chosen
the good and faithful servant has been called at length into the joy of his Lord. And why weep for this? No fear of death will darken St. John’s last
uh because he’s dying?? also maybe she’s allowed to grieve someone she didn’t choose
Sofia P., Nov 6
hour: his mind will be unclouded; his heart will be undaunted; his hope will be sure; his faith steadfast.
His own words are a pledge of this:—

Highlight and note as one gesture. Early builds had a highlighter tool and a note tool in a dock, two ways to do nearly the same thing. I cut both and moved to the pattern every ereader already teaches: select text, then Highlight or Note float up. Adding a note just highlights for you. One mental model instead of two.

Rejected
length into the joy of his Lord. And why shall
I mourn this? No fear of death will darken
St. John’s last hour: his mind will be
unclouded; his heart will be undaunted; his
hope will be sure; his faith steadfast.
His own words are a pledge of this:—
Aa
Chosen
10:23 PMJane EyreChapter XXXVIII
St. John is unmarried: he never will marry now.
Himself has hitherto sufficed to the toil, and the
toil draws near its close: his glorious sun hastens
to its setting. The last letter I received from him
drew from my eyes human tears, and yet filled
my heart with divine joy: he anticipated his sure
reward, his incorruptible crown. I know that a
stranger’s hand will write to me next, to say that
the good and faithful servant has been called at
NoteHighlight

Craft

Four flows shaped most of the design and build decisions: setting up your library card, finding a note in the margin, leaving one, and passing the book on. Each took a few rounds to get right.

Setting up the card. Onboarding is the one place the app asks you to make something, so it got the most care. You pick a color and a shade from a wheel, three genres, a handwriting style and a pattern for your card, then sign it with your finger. The recording is the whole walkthrough.

Onboarding, start to finished card

The welcome animation runs as a CSS blur instead of an SVG filter. The filter version dropped frames on mobile Safari.

Card contrast. Every card is its own color, and its text has to stay readable on all of them. Colors and shades make 144 combinations, and my first rule for picking the ink, going by HSL lightness, failed 71 of them against WCAG AA. That is about half the library with text that quietly didn't work. So I built a small tool that measures every pair against WCAG contrast and marks it green or red, then replaced the rule. The new one measures real contrast and picks the tinted ink closest to the card's own tone that still holds up, aiming for 7:1. If no tint can reach 4.5:1 it falls back to plain black or white. Now none of the 144 fail. Checking that by eye was never going to work. Toggle between the two rules below.

71 of 144 under 4.5:1
Hover or tap a card. Green passes 4.5:1, red doesn't.
Every color and shade the card picker can make, with the ink each rule picks
10:23 PMJane EyreChapter XXXVIII
Finding the note
A small note icon sits on the last reader's highlight. No notification, no badge. You notice it when you get there.
10:23 PMJane EyreChapter XXXVIII
Leaving one
Select text and choose Note or Highlight. In testing people reached for Highlight first, and the note made more sense after.
Passing it on
The one place a name appears: first name and last initial. It should feel like finishing something.

Building with a team of agents

I'm proudest of this part as an engineer. Seven days, a team spread across the country, and most of us vibe-coding with different AI tools, each with its own habits and its own idea of the rules. That usually turns main into a mess, luckily this time it didn't. Here's how I structured the workflow.

Three laptops, each running an AI agent, share one Figma file and read one rules file from the repo, run their checks, push branches, can't push straight to main until the lead has vetted the code and merged it, and pull each other's branches to run locally because the host blocked previews for collaborators.
One rules file. AGENTS.md is the source of truth for every agent. The Claude and Cursor configs just import it, so both toolchains follow the same rules.
A lab. Every new idea is a scenario you toggle inside the running app. Main stays untouched, and two people's versions can sit side by side and get tuned live.
Agents own the git. Our non-technical teammates never had to touch a rebase. The agent makes the branch, runs the checklist, and ticks a box only after its check passes. Pushing straight to main was blocked until all our agents had agreed, and I vetted the code and did the merges.
No preview server. Our host blocked preview deploys for collaborators, so we skipped them. You push a branch, the agent pulls it locally, and strict lint, type and build checks do the rest. If it ran on everyone's machine, it ran on main.

It also opened my eyes. We hadn't really thought about collaborative vibe coding like this before.

Reflection

Unfortunately, we didn't make the finalist cut, but working with Joel and Joyce (two amazing people I didn't know at all before this challenge!) under a 7-day deadline was worth it; the constraint forced us to make more grounded decisions than we would have with open-ended time.

Given more time, I'd spend it on the brand. We moved fast, and most of the design decisions were justified by utility. That's not wrong, but software should also be fun to look at. Posters, more motion, a richer visual identity, that's where I'd go next. I'm still working on it between classes.

Two things I'd take from this into the next project:

Tight constraints are clarifying, not limiting.Every feature we cut made the one that stayed feel more intentional. Cutting ratings, messaging and the keyword map is what gave Woven its spine.
Building alongside agents changes what's possible in a sprint, but only if you invest upfront in how they work.The time we spent on just outlining and planning and even AGENTS.md paid back every day after. Every agent, on every machine, started from the same rules.