P99engineering
All work

AI product · Web app & Chrome extension

Savedly

Save anything. Find it when you need it.

Visit savedly.app
  • Web app
  • Chrome extension
  • Open source
  • Self-hostable

The problem

Saving is the easy part. Finding it again is where it goes wrong. Links, screenshots and notes pile up in different places and never resurface when you need them.

Under the hood

How Savedly is built.From the real codebase, not a slide.

712

Commits

4 Aug – 26 Oct 2026

107k

Lines of TypeScript

Server, web app, extension

37

API modules

One folder per feature

51

Database tables

Postgres + pgvector

57

Migrations

Drizzle ORM

83

Web app pages

Next.js 16

System architecture

Three apps, one API, background workers and bring-your-own-key AI. Hover a part to follow its connections.

ClientsBackendData & jobsThird-party

Savedly backend

API

The one backend every client talks to: 39 routers under /api/v1, Zod-validated requests, httpOnly JWT sessions with device-bound refresh tokens. Shipped as a Docker image behind Caddy on AWS.

  • Express
  • TypeScript
  • Zod
  • JWT
  • Caddy
  • AWS

server/src/app.ts

server/src/modules

Hover or tap a part to follow its connections.

The AI ingestion pipeline

Every save runs through the same LangGraph state machine, whatever its format. Independent steps run in parallel; optional steps can fail without losing the memory.

Hover a step to see what it does, or run the pipeline.

Optional Required

Ask Savedly: a grounded agent

A corrective-RAG agent that answers only from your library, checks its own answer, and can act on your account through the same services as the app.

  1. Front desk
  2. Agent
  3. Tools
  4. Grounding check
  5. Answer

Agent ⇄ Tools loops until the agent has enough to answer.

Step 1 of 5

Front desk

A quick classifier checks the request is about the library. Off-topic requests get a polite reply here, before any expensive call.

Ask Savedly

What did I save about sourdough hydration?

20 tools the agent can use

Writes call the same services as the REST API. Delete moves to Trash, so a misread request is always recoverable.

read

  • search_memories
  • search_memories_by_date
  • find_memories
  • find_related
  • read_memory
  • list_collections
  • list_tags
  • list_upcoming_events
  • search_web
  • platform_help

write

  • create_memory
  • update_memory
  • update_many_memories
  • delete_memory
  • restore_memories
  • create_collection
  • create_calendar_event
  • update_event
  • remove_event
  • set_reminder

Hybrid search

Two searches in parallel, merged into one ranked list. If the semantic leg is unavailable, keyword search still answers.

QueryKeyword · Postgres tsvectorRRF mergeMeaning · pgvector cosine

Reciprocal Rank Fusion · server/src/modules/ai/search/rrf.ts

How the project is run

A three-month build, managed like a long-lived product: enforced architecture, one module pattern, automated delivery and written docs.

Commit activity

Commits per week, Aug – Oct 2026

181commits · week 42

AugSepOct

Enforced layers

Imports only go down. pnpm check:arch fails on an upward import or a cycle.

  1. AppMounts routers and job starters
  2. Modules37 features; others import only through api.ts
  3. PlatformRuntime-configured services: storage, mailer
  4. Shared · DBCrypto, errors, logger, schema
  5. ConfigEnv validated with Zod at startup

One pattern, 37 modules

Every feature has the same five files, so any engineer can find their way.

memory.routes.ts→memory.validator.ts→memory.controller.ts→memory.service.ts→memory.schema.ts
  • account
  • admin
  • ai
  • ai-settings
  • ai-usage
  • announcements
  • auth
  • batch
  • billing
  • blog
  • collection
  • config
  • contact
  • email
  • feature-flags
  • files
  • health
  • help-assistant
  • highlight
  • import
  • insights
  • instance-settings
  • integrations
  • memory
  • messages
  • notification
  • plans
  • report
  • roadmap
  • search
  • settings
  • share
  • tag
  • upload
  • user
  • vault
  • whats-new

From pull request to production

GitHub Actions: CI on every pull request, CD on every merge.

  1. 1

    Pull request

    Branch per feature; Dependabot keeps dependencies current

  2. 2

    CI

    Server: typecheck. Web app: lint and production build

  3. 3

    Merge to main

    63 merged pull requests so far

  4. 4

    Build image

    Typecheck, then a Docker image pushed to GHCR

  5. 5

    Deploy

    SSH to AWS, pull the image, restart behind Caddy

  6. 6

    Verify

    Live API check; logs printed if the deploy fails

Enforced architecture

pnpm check:arch fails the build on an upward import or an import cycle, in the API and the web app.

Documented

24 docs: architecture, self-hosting, AWS deploy, release process, feature specs.

Changelog

Every notable change recorded in Keep a Changelog format.

Open source

AGPL-3.0, with contributing guide, code of conduct and security policy.

Secure by default

AI keys encrypted with AES-256-GCM; httpOnly cookies; refresh tokens hashed and tied to a device.

Graceful AI

Every AI step is optional: if a provider fails, the memory still saves with whatever succeeded.

Building something like this?

Tell us about your product. You’ll get a clear plan and quote.