{"id":50372462,"url":"https://github.com/ericerkz/kept","last_synced_at":"2026-05-30T08:00:55.066Z","repository":{"id":354554130,"uuid":"1223079805","full_name":"ericerkz/kept","owner":"ericerkz","description":"A self-hosted, Google Keep style notes app.","archived":false,"fork":false,"pushed_at":"2026-05-23T01:02:28.000Z","size":2354,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-23T01:23:33.335Z","etag":null,"topics":["google-keep","notes","sticky","sticky-notes"],"latest_commit_sha":null,"homepage":"http://www.keepitkept.xyz/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"aBrihoum/google-keep-clone","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericerkz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"ericerkz","ko_fi":"kept_notes"}},"created_at":"2026-04-28T01:48:32.000Z","updated_at":"2026-05-21T12:24:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ericerkz/kept","commit_stats":null,"previous_names":["ericerkz/google-keep-clone_reuse","ericerkz/kept"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/ericerkz/kept","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericerkz%2Fkept","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericerkz%2Fkept/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericerkz%2Fkept/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericerkz%2Fkept/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericerkz","download_url":"https://codeload.github.com/ericerkz/kept/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericerkz%2Fkept/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33684413,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["google-keep","notes","sticky","sticky-notes"],"created_at":"2026-05-30T08:00:54.317Z","updated_at":"2026-05-30T08:00:55.049Z","avatar_url":"https://github.com/ericerkz.png","language":"TypeScript","funding_links":["https://github.com/sponsors/ericerkz","https://ko-fi.com/kept_notes"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"src/assets/images/keep2x.png\" alt=\"Kept logo\" width=\"96\"\u003e\n  \u003cbr\u003e\n  \u003cimg src=\"src/assets/images/keep2x_Text.png\" alt=\"Kept\" width=\"180\"\u003e\n\n# Kept\n\n### Your self-hosted sticky notes — fast, friendly, and yours\n\n\u003c/div\u003e\n\nKept is a notes app for people who love quick, low-friction capture. Jot down a thought, scribble a doodle, run a checklist, save a link, attach a file — all the things a good notes app should make effortless. The catch with most note apps is that your data lives on someone else's server. Kept doesn't. You run it, your data stays put.\n\nIf you've been hunting for that *Google Keep feeling* in something self-hosted and kept being disappointed, this is the project for you.\n\n## What it looks like\n\n\u003cimg src=\"src/assets/images/ui-showcase.png\" alt=\"Kept UI showing the sidebar, search, and a grid of colorful note cards including checklists, image notes, link previews, and a drawing\"\u003e\n\n## Why Kept exists\n\nI've spent years bouncing between open-source note apps trying to find one that felt like Google Keep — quick, colorful, easy to glance at, never in the way. Most are capable but slow, or powerful but fiddly. Kept is the version I wanted: the speed and clean visual feel of Keep, with everything that comes from owning your own data.\n\n\nIf you want to show support/appreciation for Kept, I do enjoy coffee:\n\u003c!-- Ko-fi badge --\u003e\n\u003ca href=\"https://ko-fi.com/kept_notes\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Ko--fi-Support%20Me-ff5e5b?logo=ko-fi\u0026logoColor=white\" alt=\"Ko-fi\"\u003e\n\u003c/a\u003e\n\u003cbr\u003e\n\u003ca href=\"https://apps.apple.com/ca/app/kept-notes/id6768974473\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/App%20Store-Kept%20Notes-000000?logo=apple\u0026logoColor=white\" alt=\"Download Kept Notes on the App Store\"\u003e\n\u003c/a\u003e\n\n## What you get\n\n📝 **All the kinds of notes you actually use** — text, checklists, doodles you draw right in the app, photos, file attachments. Drag checklist items to reorder. Drag note cards to rearrange. Pin the important ones to the top.\n\n🎨 **Make them yours** — colors, background images, custom labels. The app remembers a per-user theme (light or dark), and your avatar can be a photo you upload or a friendly little animal.\n\n🔗 **Smart capture** — paste a URL and it grows a link preview card. Drop in images, attach PDFs or zips up to 25 MB, embed pictures inline in the body text.\n\n🔍 **Find anything fast** — search with simple text, or filter by type (`!image`, `!todo`, `!label:work`) and date queries (`last month`, `this week`). The grid filters live as you type.\n\n⏰ **Reminders that actually fire** — set a one-shot or scheduled reminder, get a browser push notification when it's time. Optional sync with Google Calendar or any CalDAV calendar (your calendar of choice — Apple, Fastmail, Nextcloud, whatever) if you want the events to show up alongside everything else.\n\n📱 **Install it like an app** — Kept supports PWA installs on iOS and Android, including push notifications for reminders. The short setup guide lives on the [Kept website](https://www.keepitkept.xyz/#pwa-mobile).\n\n🍎 **Native iPhone and iPad companion app** — [Kept Notes is available on the App Store](https://apps.apple.com/ca/app/kept-notes/id6768974473). It connects to your self-hosted Kept server and adds deeper iOS integration: native Apple Reminders support, a smoother iPhone/iPad shell, and Apple Intelligence-powered Smart Capture for local, private AI-assisted note creation and modification. The app has a small one-time cost, mostly because distributing software through the App Store is not free.\n\n\u003cp\u003e\n  \u003ca href=\"https://apps.apple.com/ca/app/kept-notes/id6768974473\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Download%20on%20the-App%20Store-000000?style=for-the-badge\u0026logo=apple\u0026logoColor=white\" alt=\"Download Kept Notes on the App Store\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n🤝 **Share notes with people on your instance** — collaborative editing in real time, like a doc editor. Both people typing in the same note see each other's changes live.\n\n🔐 **Privacy by default** — local user accounts, optional two-factor authentication with backup codes, an admin panel for managing users. Your data lives in a single folder on your machine. Nothing is sent anywhere unless you explicitly turn on a calendar integration.\n\n📦 **Coming from Google Keep?** — drop in a Google Takeout zip and Kept imports your notes, labels, colors, drawings, and images.\n\n🔄 **Merge notes** — select a few notes, smush them together into a single combined note. Keeps text, checklists, images, attachments, and reminders all together.\n\n💾 **Backups built in** — automated daily / weekly / monthly snapshots, downloadable as a single file. Restoring later is as easy as uploading that file back.\n\n## Get it running\n\nThe easiest path is Docker — it bundles everything up and works the same way everywhere.\n\nYou'll need:\n- **Docker** (the Docker Engine + Compose plugin, or Docker Desktop on Windows / macOS)\n- **Git**, to clone the repo\n\nThen it's three commands:\n\n```bash\ngit clone https://github.com/ericerkz/kept.git\ncd kept\ndocker compose up -d --build\n```\n\nThat's it. Open `http://localhost:6767` in your browser, follow the friendly setup wizard to create your admin account, and you're in.\n\nIf you need more guidance, refer to the [Kept website](https://www.keepitkept.xyz/#pwa-mobile).\n\nYour notes, uploads, and database all live in a `./data` folder right next to the project. Use Kept's automated backups, or you can back it up by copying that folder anywhere you'd back up the rest of your stuff (cloud sync, external drive, whatever) so long as it's idle/not mid-write. \n\n\u003cdetails\u003e\n\u003csummary\u003eWant to run it without Docker?\u003c/summary\u003e\n\nIf you'd rather install Kept directly on your machine, you'll need **Node.js v24.x**. There are scripts that handle the rest for you.\n\n**Linux or macOS:**\n```bash\nchmod +x install-native.sh\nsudo ./install-native.sh\n```\n\n**Windows** — open PowerShell as Administrator and run:\n```powershell\n.\\install-native.ps1\n```\n\nThe scripts install dependencies, build the app, and optionally set up a background service so Kept starts on boot. If Node.js v24.x isn't installed yet, the script will try to install it for you.\n\nIf you skip the background-service step, you can start Kept manually with `PORT=6767 npm run api` (or `$env:PORT=6767; npm run api` on Windows).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWant to put Kept behind a domain (with HTTPS)?\u003c/summary\u003e\n\nIf you want to access Kept from outside your home network, or you want push notifications to work on iPhone (which Apple gates behind real HTTPS), put Kept behind a reverse proxy with a real domain and a TLS certificate.\n\nThe easiest free path: point a domain at your server and set up [Caddy](https://caddyserver.com/), [Nginx Proxy Manager](https://nginxproxymanager.com/), or [Traefik](https://traefik.io/) — all of these will fetch and renew Let's Encrypt certificates automatically. Then have the proxy forward your domain to `localhost:6767`.\n\nRealtime online status and live collaboration use WebSockets at `/api/realtime`. If they work on LAN but not through your public domain, your reverse proxy is probably serving normal HTTP but not forwarding WebSocket upgrade requests. Put the `/api/realtime` rule before the catch-all `/` rule.\n\nApache example:\n\n```apache\n# Required once:\n# sudo a2enmod proxy proxy_http proxy_wstunnel rewrite ssl\n# sudo systemctl reload apache2\n\n\u003cVirtualHost *:80\u003e\n    ServerName kept.example.com\n    Redirect permanent / https://kept.example.com/\n\u003c/VirtualHost\u003e\n\n\u003cIfModule mod_ssl.c\u003e\n\u003cVirtualHost *:443\u003e\n    ServerName kept.example.com\n    ProxyRequests Off\n    ProxyPreserveHost On\n\n    # WebSocket realtime: online status + live collaboration.\n    ProxyPass /api/realtime ws://127.0.0.1:6767/api/realtime\n    ProxyPassReverse /api/realtime ws://127.0.0.1:6767/api/realtime\n\n    # Normal app/API traffic.\n    ProxyPass / http://127.0.0.1:6767/\n    ProxyPassReverse / http://127.0.0.1:6767/\n\n    SSLEngine on\n    SSLCertificateFile /etc/letsencrypt/live/kept.example.com/fullchain.pem\n    SSLCertificateKeyFile /etc/letsencrypt/live/kept.example.com/privkey.pem\n\u003c/VirtualHost\u003e\n\u003c/IfModule\u003e\n```\n\nNginx example:\n\n```nginx\nserver {\n    listen 80;\n    server_name kept.example.com;\n    return 301 https://$host$request_uri;\n}\n\nserver {\n    listen 443 ssl http2;\n    server_name kept.example.com;\n\n    ssl_certificate /etc/letsencrypt/live/kept.example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/kept.example.com/privkey.pem;\n\n    # WebSocket realtime: online status + live collaboration.\n    location /api/realtime {\n        proxy_pass http://127.0.0.1:6767/api/realtime;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n\n    # Normal app/API traffic.\n    location / {\n        proxy_pass http://127.0.0.1:6767;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n```\n\nOnce Kept is on a real `https://` URL, you can install it as a PWA on iOS or Android and get push notifications for reminders. See the [mobile install guide](https://www.keepitkept.xyz/#pwa-mobile) for the short version.\n\nIf you use an iPhone or iPad, you can also install the native [Kept Notes app from the App Store](https://apps.apple.com/ca/app/kept-notes/id6768974473). It is a small paid companion app for your self-hosted server, and it adds native iOS Reminders integration plus local, private Apple Intelligence-assisted Smart Capture for creating, updating, sharing, labeling, archiving, and trashing notes from natural language.\n\n\u003c/details\u003e\n\n## Backups \u0026 restoring\n\nYour data lives in `./data` — a regular folder. Copy it, sync it, snapshot it however you snapshot anything else. As long as you have that folder, you have your notes.\n\nKept also has a built-in backup feature that creates clean, consistent SQLite snapshots even while the app is running. As an admin, head to the **User Management** panel and look for the \"Database backups\" section — schedule daily, weekly, or monthly backups, or hit the button to make one right now. Backups download as a single `.sqlite` file you can stash anywhere.\n\nWhen the day comes that you need to restore — new server, lost data, whatever — the setup wizard's **\"Restore from backup\"** option takes that file and recreates everything. Users, notes, labels, settings, all of it.\n\n\u003cdetails\u003e\n\u003csummary\u003eOne safety note about restoring\u003c/summary\u003e\n\nThe restore endpoint is gated by an environment variable so a malicious actor can't use it to take over an empty Kept instance. To restore:\n\n1. Set `KEPT_ALLOW_RESTORE=1` (uncomment in `docker-compose.yml` or export it for native installs).\n2. Restart Kept (`docker compose up -d` for Docker).\n3. Upload your backup file via the setup screen.\n4. Comment out / unset the variable and restart again, so the endpoint is locked back down.\n\n\u003c/details\u003e\n\n## Updating\n\nWhen a new version of Kept is released, admin users see an unobtrusive banner at the top of the app letting them know. To update:\n\n```bash\ncd kept\ngit pull\ndocker compose up -d --build\n```\n\nYour data stays untouched.\n\n## Optional knobs\n\n`docker-compose.yml` has a few environment variables you can uncomment if you need them:\n\n- **`BASE_URL`** — only needed if you're behind a reverse proxy that doesn't forward HTTPS info correctly. Used for OAuth redirect URIs.\n- **`KEPT_SESSION_TTL_DAYS`** — how long login sessions last (default 30 days).\n- **`KEPT_CORS_ALLOW_ALL` / `KEPT_CORS_ORIGINS`** — Docker defaults to permissive CORS for remote clients/native shells. Use `KEPT_CORS_ORIGINS` if you want to restrict browser API access to specific app origins.\n- **`PUID` / `PGID`** — pin the container to a specific Linux user/group. Auto-detected by default.\n\nThe compose file has a comment explaining each one.\n\n## Tech under the hood\n\nKept's frontend is **Angular** with **Sass** styles, and the backend is a single-file **Express** server on **Node.js**. Data lives in a **SQLite** file. No external services required to run it. Web push uses the standard browser APIs.\n\n## Acknowledgement\n\nKept's original UI scaffolding was forked from [aBrihoum/google-keep-clone](https://github.com/aBrihoum/google-keep-clone). The project has since been substantially rewritten and extended into a full self-hosted notes platform — but the visual foundation came from that earlier work, and the credit is gratefully due.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericerkz%2Fkept","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericerkz%2Fkept","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericerkz%2Fkept/lists"}