Kept Logo Kept
GitHub
Kept logo

Your self-hosted sticky notes

Get the speed, simplicity, and visual ease of your favorite note-taking appsβ€”while keeping full control of your own data.

πŸ‘‹ Welcome to Kept

Kept is designed for people who love fast, low-friction note capture. Whether you need a quick checklist, a drawing, or a simple text note, Kept makes it effortless to jot things down and organize them visually with colors and labels.

UI Showcase

If you're migrating from Google Keep, we've even included a simple import tool to bring all your existing notes over seamlessly.

✨ What you get with Kept

πŸ“ Rich Note Capture

Create text, checklist, image, and drawing notes. Drag and drop to sort checklists, pin important items, and organize with labels, binders, colors, and backgrounds.

πŸ“’ Binders

Binders are optional named homepages: dedicated pages of your curated notes for a project, topic, or area of your life. Create a binder from the sidebar, then move notes into it from an individual note menu. Notes in your binders stay out of your main Notes view, but search can still find them.

⏰ Reminders that Work

Set one-shot or scheduled reminders with snooze functionality. Get push notifications directly to your browser or phone, and sync them to Google Calendar or any CalDAV-friendly calendar if you want everything in one place.

πŸ“± Installable on Mobile

Add Kept to your home screen on iOS or Android as a PWA, or use the native mobile apps for location reminders, quick share, and deeper device integration.

🍎 Native iOS Companion

Kept Notes on the App Store connects to your self-hosted server and adds native Apple Reminders integration, quick share, and Apple Intelligence-powered Smart Capture for local, private AI-assisted note creation and modification.

πŸ€– Native Android App

Kept Notes on Google Play connects to your self-hosted server and adds native Android location reminders, saved places, quick share, home screen widgets, and on-device Smart Capture support.

🀝 Real-Time Sharing

Collaborate with others! Share notes with other users on your instance and edit together in real-time, just like a modern document editor.

πŸ“¦ Bring Your Notes

Moving over from Google Keep? Drop in a Google Takeout export and Kept can import your notes, checklists, labels, colors, drawings, and images in one go.

πŸ’Ύ Backups Without Drama

Schedule automatic daily, weekly, or monthly backups, or make one on demand before you poke at the server and pretend that was always the plan.

πŸ“€ Your Data, Your Exit

Export your notes whenever you like in JSON, CSV, or Markdown. Handy for backups, migrations, audits, or just the warm glow of knowing the door is open.

πŸ” Privacy First

Your data stays with you. Includes local user accounts, custom profile avatars, and optional two-factor authentication (2FA) for extra security.

πŸš€ How to Install

The easiest and most reliable way to run Kept is using the published Docker image, ghcr.io/ericerkz/kept:latest. It keeps everything self-contained and takes just a few minutes.

git clone https://github.com/ericerkz/kept.git
cd kept
docker compose up -d

That's it! Open your browser and go to http://localhost:6767. You'll be greeted by a friendly setup wizard to create your admin account.

Deploy Kept on Railway

If you do not want to set up Docker or manage a server yourself, Railway can create a ready-to-use Kept instance for you with storage and HTTPS handled.

Deploy on Railway
  1. Click Deploy on Railway and sign in or create a Railway account.
  2. Review the generated Kept service, volume, and environment settings.
  3. Deploy the template and wait for Railway to finish building the service.
  4. Open the public URL Railway provides.
  5. Create your first Kept admin account from the setup screen.

Railway is one convenient way to deploy Kept quickly. Kept remains self-hostable on any platform that supports Docker.

Prefer to build it yourself?

If you want to build from the local source instead of pulling the published image, use the dev compose override.

git clone https://github.com/ericerkz/kept.git
cd kept
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build

Reverse proxy examples

For public HTTPS access, point your domain at Kept and proxy traffic to 127.0.0.1:6767. Online status and live collaboration use WebSockets at /api/realtime, so that rule must come before the catch-all app proxy.

If you still need to set up HTTPS certificates, DigitalOcean has clear walkthroughs for Apache with Let's Encrypt and Nginx with Let's Encrypt. This is not a referral; we just love their detailed knowledgebase.

Apache

# Required once:
# sudo a2enmod proxy proxy_http proxy_wstunnel rewrite ssl
# sudo systemctl reload apache2

<VirtualHost *:80>
    ServerName kept.example.com
    Redirect permanent / https://kept.example.com/
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName kept.example.com
    ProxyRequests Off
    ProxyPreserveHost On

    # WebSocket realtime: online status + live collaboration.
    ProxyPass /api/realtime ws://127.0.0.1:6767/api/realtime
    ProxyPassReverse /api/realtime ws://127.0.0.1:6767/api/realtime

    # Normal app/API traffic.
    ProxyPass / http://127.0.0.1:6767/
    ProxyPassReverse / http://127.0.0.1:6767/

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/kept.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/kept.example.com/privkey.pem
</VirtualHost>
</IfModule>

Nginx

server {
    listen 80;
    server_name kept.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name kept.example.com;

    ssl_certificate /etc/letsencrypt/live/kept.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kept.example.com/privkey.pem;

    # WebSocket realtime: online status + live collaboration.
    location /api/realtime {
        proxy_pass http://127.0.0.1:6767/api/realtime;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Normal app/API traffic.
    location / {
        proxy_pass http://127.0.0.1:6767;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Advanced config

VPN/Tailscale/WireGuard setups

If you access Kept through Tailscale, WireGuard, another VPN, a LAN hostname/IP, or more than one reverse-proxy domain, the CORS settings may be relevant. These setups do not require special CORS settings by themselves; CORS only matters when the browser page and Kept API are reached through different origins, or when you restrict origins with KEPT_CORS_ORIGINS. If you use KEPT_CORS_ORIGINS, include each exact browser origin you use, such as your Tailnet name, VPN-only domain, LAN IP, or public reverse-proxy domain, including the scheme and port when applicable. For the simplest personal setup, leave KEPT_CORS_ALLOW_ALL=1 enabled instead. Same-origin access does not need extra CORS configuration.

Custom header support in the mobile apps

The native iOS and Android apps support optional custom connection headers for reverse proxies or access gateways that require them, such as Cloudflare Access service tokens or shared-secret proxy headers. Configure these only if your proxy setup requires them.

Custom headers help the mobile apps pass normal Kept HTTP requests through a header-auth gateway, including login, loading notes, saving notes, attachments, and settings. They are not a replacement for Kept login; users still need a Kept account/session.

Custom headers do not apply to realtime WebSocket connections. Realtime presence and live collaboration use WebSockets at /api/realtime, and browser/WebView WebSockets cannot attach arbitrary custom headers. Behind gateways that require header auth on WebSocket upgrade requests, normal reads/writes should still work, but live updates may only appear after refocusing the app or manually refreshing.

Install on iOS and Android

Kept can be installed from the browser as a Progressive Web App. Once it is running from a real HTTPS address, reminder push notifications work on desktop browsers, Android, and iOS home-screen installs. Location-based reminders require the native iOS or Android app.

Native iPhone and iPad app

Kept Notes is available on the App Store as a companion app for your self-hosted Kept server. It adds native Apple Reminders integration, quick share from other apps, and Apple Intelligence-powered Smart Capture, so you can create, update, share, label, archive, and trash notes from natural language while keeping AI processing local and private on supported devices.

The app has a nominal one-time cost. That helps cover the charge required to distribute Kept through the App Store.

Download on theApp Store

Native Android app

Kept Notes is available on Google Play as a companion app for your self-hosted Kept server. It adds native Android location reminders with arrival/departure triggers, saved places, quick share from other apps, home screen widgets for recent or pinned notes, and on-device Smart Capture on supported devices.

Get it onGoogle Play

Before you install

  • Put Kept behind a public https:// domain. Mobile push will not work from plain HTTP or a raw local network address. Need help with certificates? See the Apache or Nginx Let's Encrypt tutorials linked above in the Reverse proxy section.

iPhone or iPad

  1. Open your Kept URL in Safari.
  2. Tap Share, then Add to Home Screen.
  3. Open Kept from the new Home Screen icon, not from the Safari tab.
  4. Sign in and allow notifications when Kept asks.

iOS only allows web push for installed home-screen web apps, so the Safari tab is just for installing.

Android

  1. Open your Kept URL in Chrome or another browser with PWA support.
  2. Use the browser menu and choose Install app or Add to Home screen.
  3. Open Kept from the installed app icon and allow notifications when prompted.

If notifications do not arrive

  • Check that the installed app is using your HTTPS domain.
  • Confirm notifications are allowed in the browser or OS settings.
  • Kept auto-generates VAPID keys for web push. If push still fails behind a reverse proxy, set VAPID_SUBJECT in docker-compose.yml to your public Kept URL, for example https://kept.example.com.
  • On iOS, remove and reinstall the Home Screen app after changing domains or VAPID settings.

πŸ’Ύ Peace of mind with Backups

We know how important your notes are, so Kept makes protecting them simple.

  • Automated Schedules: Set Kept to automatically back up your data daily, weekly, or monthly. You never have to think about it.
  • One-Click Restore: If you ever need to set up a new server or recover your data, you can upload your backup file during setup to restore everything instantly.

Your data is safely stored in a single folder (./data), making it extremely easy to copy, move, or sync to your personal cloud storage.

Privacy Policy

Short version: Kept is self-hosted. Your notes, and all data, live on the server you choose.

  • What Kept stores: Your notes, uploads, reminders, account details, and settings live in your Kept instance.
  • Location data: If you use location-based reminders or saved places, Kept may access your device location and store the places, coordinates, reminder radius, and arrive/leave preference needed to make those reminders work. This data is used only for Kept reminder features and is stored on your Kept server.
  • Who controls it: Whoever runs the server controls that data. If that is you, it is your stuff on your machine.
  • Third-party services: Calendar syncing only happens if you turn it on and connect Google Calendar or CalDAV yourself.
  • Moving your data: You can back it up, export it, delete it, or move it somewhere else.
  • This docs site: This page has no accounts, forms, cookies, ads, or analytics scripts. Your web host may still keep normal server logs.

This is not fancy legal armor. It is the basic truth of the app: Kept is built so your notes stay under your control.