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.
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.
- Click Deploy on Railway and sign in or create a Railway account.
- Review the generated Kept service, volume, and environment settings.
- Deploy the template and wait for Railway to finish building the service.
- Open the public URL Railway provides.
- 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 StoreNative 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 PlayBefore 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
- Open your Kept URL in Safari.
- Tap Share, then Add to Home Screen.
- Open Kept from the new Home Screen icon, not from the Safari tab.
- 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
- Open your Kept URL in Chrome or another browser with PWA support.
- Use the browser menu and choose Install app or Add to Home screen.
- 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_SUBJECTindocker-compose.ymlto your public Kept URL, for examplehttps://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.