Keepli. A project by Omar Mohamed

Give your bookmarks the attention they deserve.

Keep anything from anywhere in a couple of seconds. Keepli brings it back at just the right time.

I built Keepli for myself. This page shows what it does and how it’s made.

Keepli's web Home: a daily set of picks with stated reasons.

Screens show the real product on a demonstration library.

Why

Saving is easy. Returning is the hard part.

If you’re like me, every day you see more internet content than you could possibly get through. Most of it is ambient entertainment, but some things really stand out.

The good stuff can come in so many forms: a piece that inspires you, an article whose perspective you want to sit with, or a recipe you’d like to try out. So you bookmark a few posts, copy a link, leave a tab open, and plan to come back later.

The next day just brings more of the same. At best, your bookmarks stay scattered and dependent on your memory. And at worst, you’re closing out tabs that once felt full of promise.

Unfortunately, the realized value of most saved links rounds to zero. Keepli is my attempt to change that.

Keepli sits downstream of everywhere you see content. You choose what to keep. Keepli resurfaces it at the right place and time. As your interests move it moves with you, and the right Keep comes back before you thought to look for it.


How it works

A save only comes back if the whole loop works.

Four things have to work, in order, for a bookmark to come back around.

01

Keep

Save in seconds with your share sheet, a pasted link, or even a bulk import. Classification resolves while you watch: subject, summary, read time, and more.

From share sheet to filed, in one take. A silent-save setting skips the staging entirely when you want it done faster.
02

Organize

Every Keep is grouped in the right place, within a structure that maintains itself. Edits are optional.

The library. Every Keep lands under a living taxonomy covering subject area and intent.

Keepli's web Library: every Keep filed under a living taxonomy.
03

Return

This is the key moment in the loop and there’s no single approach to it. Keepli serves a curated set as part of your daily schedule, an engaging feed for when you have downtime, and a nudge by notification when appropriate.

When you open the app. Home is a short, editorial daily set: a lead pick with its reason, the read you left midway, and a couple more picks that fit the day. It’s finite, and that’s deliberate.

Keepli's iOS Home: the daily ritual page with the stream door at its foot.
04

Engage

A return only counts if you engage. Keeps open inside the app with your place remembered, and when a page won’t open in-app, a designed handoff guides you to the source.

Reads in place. Articles open as a clean read inside Keepli. A chart and an embedded tweet render right where they belong instead of bouncing you out to the source.

The in-app reader showing a clean article view with an embedded tweet rendering in place.

How it’s built

My weekends with Claude Code.

This has been my solo passion project for the last few months. Here are some of the parts worth asking me about:

ArchitectureAn iOS app and a web app on one FastAPI and Postgres backend, sharing a single typed contract so the two clients can never disagree about what a Keep is. Derived states, like how fresh a Keep is, get computed at read time instead of stored, to prevent them from going stale.
Semantic layerEvery Keep gets an embedding, a numeric representation of its meaning, stored in pgvector. That one layer powers search, recommendations, and pattern detection, and every similarity threshold in it was calibrated by hand against my own library.
ClassificationA single LLM call at save time reads the page and files it into your live taxonomy. When it can’t summarize honestly it stays silent, because an incorrect guess degrades search and recommendations downstream.
RankingThe daily set and the stream come from a deterministic scorer weighing how related, how loved, and how fresh each Keep is. There is no randomness. The inputs, picks, and recommendations are all traceable, which allows for cleaner debugging and experimentation.
ReliabilityEvery risky layer is isolated behind its own kill switch in case of failure. The basics come first. For example, if a summary cannot be generated, the save flow itself will not be impacted.

Every addition and threshold calibration in the recommendation layer ships the same way:

Dry-run on my real library Judge every decision by hand Ship behind a kill switch

This process once caught a refactor that had nudged a similarity score by 0.00005, just enough to cross the threshold that lets Keepli claim two of your saves are related. Past that line, I found that Keepli starts to draw connections that look wrong and kind of annoying. And with an app like this, one wrong claim vastly outweighs 10 decent ones. The refactor never shipped.

Each build cycle ends with a written verdict against one key metric (currently: sessions per week spent actually consuming saved content), with a baseline recorded before anything changed. What doesn’t move the needle gets killed.


What building it taught me

A daily consumer app is a hard game.

I use Keepli every day, and I’m still critical of it every day. It took a lot of iterations for me to naturally want to use an app that I built for myself.

Storage is the easy half.

A perfectly filed content library that nobody returns to is still a graveyard. Earning and sustaining attention is really difficult.

Social feeds get a lot right.

Keepli exists partly in response to and rebellion against the feeds. But in building a solution, I ended up repurposing some key mechanics: the one-gesture advance and the serving engine for the next thing up.

Expect errors.

The web is really hostile. There are paywalls, bot walls, dead links, empty pages. AI is also too often confidently wrong. So guardrails exist everywhere: failure states, scheduled retry logic, kill switches on risky features.


Where it’s at

Live on TestFlight and part of my own daily routine. A very small circle of friends is testing it with me. I’m looking to release Keepli more broadly later this year.


Contact

Happy to go deeper on any of it.