Tapestry

A digital scrapbook you build together.

jointhetapestry.com

Luke Hattrup presenting Tapestry on stage in a lecture hall
Acceptance speech — OIC showcase 2026.

Why I built it

I am a very nostalgic person. I get trapped in dreams of the past — a song I used to play on repeat, a camping trip I can’t stop replaying in my head. For a long time, I didn’t know what to do with that feeling.

There weren’t kids my age in the neighborhood I lived in growing up. My closest friend was my 30-year-old neighbor, Mary, who was diagnosed with M.S. I would spend a lot of time playing Wii Sports with her while she smoked a bong. I had my older sister, who beat me up constantly. Most of the time, I was stuck playing in my imaginary worlds. I kept playing in them for an embarrassingly long time.

I love stories, and I think that love stems from how much I was lost in an imaginary world. The hardest thing for me to do as a kid was to show other friends the feelings and emotions I got from those imaginary worlds. I had all these exciting and crazy adventures I’d want to play pretend with them, but I never convinced them, and we’d end up playing superheroes again.

Now I still find myself trying to convey emotions and nostalgia to people. I still have trouble. So I built something that could.

I am part of a generation drowning in photos, starting from before we learned to walk. We are one of the most nostalgic generations, even though we’re barely 20 years old. The hardest part is that those memories were never meant to be built alone. The way your friend remembers that night is different from the way you do — a different angle, a different feeling, a different song stuck in their head. The only way to actually capture a moment is to weave together everyone’s version of it.

What it is

I took those feelings, and I built an app I call Tapestry. You collect stickers from the world around you and trade them with friends in stacks. Everything you capture, share, and save goes to your sticker bank, and builds XP and a streak as it grows. Stickers save straight into Stickers in iPhone Messages.

The collective part is the point. Friends come together to weave a collective feeling across tiles, and the tiles make up a tapestry — a giant stickerboard. It lives on the home screen as a widget, so it keeps growing somewhere you’ll actually see it.

What I built

The hard problem was storage. A sticker can end up on many tapestries, and copying the file each time would multiply cost with every share. So assets are held once at the user level — the original, a poster frame, and a web-sized derivative — and everything downstream stores a pointer rather than a copy. A placement records where a sticker sits and which modifiers apply to it; the pixels come from the one file that already exists.

Access is role-based and enforced by Postgres row-level security rather than in app code, so a viewer resolves through schema access to a table policy to a single rule — owner, member, or accepted follower — before any row comes back. Deleted content is tombstoned and swept by a garbage-collection job on a schedule, so a canvas someone is still working in doesn’t vanish underneath them.

The widget shaped more of the design than anything else. Canvas shapes and widget sizes don’t line up, so the widget has to decide which part of a tapestry to show and at what crop. Updating it without the app being opened depends on the iOS version — newer releases allow a push-driven widget update, older ones need the app to wake in the background — so the server has to handle both paths.

Notebook page: Tapestry backend storage structure, showing per-user asset paths and the dedup system
Storage model. Assets live once per user; placements point at the file instead of copying it.
Notebook page: permission model using role-based access control and Postgres row-level security
Permission and viewership model. Role-based access, enforced in the database.
Notebook page: widget system, showing shape and size resolution between canvases and widgets
Widget system. Resolving the mismatch between canvas shapes and widget sizes.
Notebook page: new sticker creation flow, from camera capture through the full sticker editor
Sticker creation flow. Capture, cut out, file into the bank.

The beta

I spend a large portion of my time reaching out to different groups at the University of Oregon. I’ve had the honor of presenting to over 300 students at three separate events, including the Alpha Kappa Psi Business Fraternity, the Pi Phi Sorority, and the Founders Club. It was an amazing opportunity to share something I am so passionate about with such a large audience.

Over 200 of those students joined the v.1 beta test of the app. What I learned helped me hone in on what weaving a feeling really meant.

Tapestry was initially built without a sticker bank. The app’s main purpose was to make the scrapbook. Many beta testers came to me with a similar problem: they didn’t have enough recent photos to add. It made me realize that the most time-consuming part of scrapbooking is collecting the material, not putting it together.

So the daily driver became collecting and sharing stickers. Just weaving the app together didn’t introduce the collaborative aspect I wanted.

A Tapestry talk seen from the back of a packed room, the slide reading: Some moments don't fit in a frame
“Some moments don’t fit in a frame.” Pi Phi beta launch.

Where it is now

After beta testing, I spent much of last summer programming Tapestry full-time, rebuilding the backend and storage system entirely and polishing the app for release in the App Store.

I’ve dedicated a large portion of the funding to marketing, including UGC and native advertising. The reality is that the hard part wasn’t building the app. It will be getting it in front of the community.

Why it matters

I think a lot of people my age feel the same way. We are barely twenty and already grieving things. Trapped in a rapidly changing world, dreaming about the past, looking toward the future with uncertainty. Tapestry is my attempt to do something with that — to take what we’re carrying and weave it into something we can actually hold.