# gleaned — full content > A personal learning journal with spaced repetition, open threads, and end-to-end encryption. Open source, self-hosted, yours forever. Source: https://gleaned.dev GitHub: https://github.com/gleaned-app/gleaned llms.txt: https://gleaned.dev/llms.txt --- ## Home (https://gleaned.dev/) ### Tagline Open source · Self-hosted · Encrypted Capture what you actually learn. A personal learning journal with spaced repetition, open threads, and end-to-end encryption. Self-hosted. Yours forever. ### Word origin gleaned /ɡliːnd/ v. — to gather grain left in a field after harvest; to collect knowledge gradually, piece by piece. ### Features **01 — Spaced repetition** FSRS-5 — the state-of-the-art spaced repetition algorithm — decides when to surface an entry, right before you'd forget it. No flashcard decks, no manual scheduling. Write once, review at the exact right moment. Tags: FSRS-5 · Auto-queue · Gap penalty **02 — Open threads** Ideas that need more thought get a thread — tracked with due dates, color labels, and overdue alerts. Nothing falls through the cracks. Tags: Due dates · Color labels · Overdue alerts **03 — End-to-end encryption** Your passphrase derives the key via PBKDF2 at 600 000 rounds. Content is encrypted with AES-256-GCM before it ever touches the sync server. The key lives only in memory — never stored, never sent. Tags: AES-256-GCM · PBKDF2 · Zero-knowledge server **04 — Truly self-hosted** One Docker command. One SQLite file. One account — yours. No shared infrastructure, no other users on the same instance. Your journal lives where you put it, and a single `VACUUM INTO` backs it up. Tags: Docker · SQLite · One file, yours forever --- ## Quick start — gleaned docs (https://gleaned.dev/docs/) Get gleaned running in minutes with Docker or local development. > Note: Commands depend on third-party tools (Docker, Node.js, pnpm) that change independently. Verify against the official docs of each tool if something doesn't work. ### Option 1 — Docker gleaned ships as a single container. All data is stored in a SQLite file mounted via a named volume, so it survives container restarts and updates. #### Port-based (HTTP) Runs on http://localhost:3000. Good for a local server or behind your own reverse proxy. Step 1 — Clone the repo and generate secrets: ``` $ git clone https://github.com/gleaned-app/gleaned.git $ cd gleaned $ sh docker/setup.sh ``` The setup script generates a `docker/.env` file with random secrets. Never commit this file. Step 2 — Start the container: ``` $ docker compose -f docker/compose.yml up -d ``` Step 3 — Open the app: Visit http://localhost:3000. On first launch you'll be prompted to set your password. #### Traefik + TLS Runs on your own domain with automatic TLS via Let's Encrypt. Recommended for anything internet-facing. Step 1 — Clone and generate secrets: ``` $ git clone https://github.com/gleaned-app/gleaned.git $ cd gleaned $ sh docker/setup.sh ``` Step 2 — Set your domain: Open `docker/.env` and set the `DOMAIN` variable to your domain (e.g. `gleaned.example.com`). Point your DNS A record to your server's IP before continuing. Step 3 — Pull and start: ``` $ docker compose -f docker/compose.traefik.yml pull $ docker compose -f docker/compose.traefik.yml up -d ``` Traefik will obtain a Let's Encrypt certificate on first start. This may take up to a minute. Step 4 — Open your domain: Visit `https://your-domain.com` and set your password on first launch. > Single account: gleaned supports exactly one registration per instance. Once a password is set, the setup endpoint returns 409 for any further attempts. Two people means two separate containers. ### Option 2 — Local development No Docker needed. gleaned uses a local SQLite file (`gleaned.db` in the project root) in dev mode. Step 1 — Prerequisites: You need Node.js ≥ 22 and pnpm. If you don't have pnpm: ``` $ npm install -g pnpm ``` Step 2 — Install dependencies: ``` $ git clone https://github.com/gleaned-app/gleaned.git $ cd gleaned $ pnpm install ``` Step 3 — Run migrations and start: ``` $ pnpm db:migrate $ pnpm dev # → http://localhost:3000 ``` Step 4 — Set your password: Open http://localhost:3000. On first launch gleaned asks you to set a password. This password derives your encryption key via PBKDF2 — it cannot be recovered if lost. ### Running tests ``` $ pnpm test # unit tests (Vitest, watch mode) $ pnpm test --run # single run $ pnpm e2e # Playwright end-to-end (requires pnpm dev running) ``` --- ## Privacy Policy (https://gleaned.dev/privacy/) ### Controller Bruno Deanoz c/o Block Services Stuttgarter Str. 106 70736 Fellbach Germany Email: gleaned.security@proton.me ### Principles This website uses no tracking tools, no analytics services, and no advertising cookies. No personal data is shared with third parties. ### Server log files When you access this website, the web server automatically stores the following data in log files: - IP address of the requesting device - Date and time of access - URL requested - HTTP status code and bytes transferred - Browser and operating system (User-Agent) This data is technically necessary for operating the website (Art. 6 para. 1 lit. f GDPR) and is automatically deleted after at most 7 days. No attempt is made to link this data to individual persons. ### Local storage The website stores your theme preference (light/dark) exclusively in your browser's localStorage. This information never leaves your device and is not transmitted to the server. ### External links This website contains links to GitHub (github.com) and other external resources such as Docker documentation. When you follow these links, the privacy policies of the respective sites apply. ### Hosting This website is hosted on a server by Strato AG, Pascalstraße 10, 10587 Berlin, Germany. Strato acts as a data processor pursuant to Art. 28 GDPR. ### Your rights You have the right to access, rectify, erase, and restrict the processing of your personal data, as well as the right to data portability. You may contact me at any time by email. You also have the right to lodge a complaint with a data protection supervisory authority. --- ## Legal Notice (https://gleaned.dev/imprint/) ### Information pursuant to § 5 TMG Bruno Deanoz c/o Block Services Stuttgarter Str. 106 70736 Fellbach Germany ### Contact Email: gleaned.security@proton.me ### Liability for content As a service provider I am responsible for my own content on these pages under general law pursuant to § 7 para. 1 TMG. However, pursuant to §§ 8 to 10 TMG I am not obligated to monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity. The documentation on gleaned.dev links to third-party resources such as Docker, GitHub, and other tools. These third-party resources may change, become outdated, or be inaccurate. Commands and instructions published in the gleaned documentation are provided as-is, without warranty of any kind. They reflect the state of gleaned and its dependencies at the time of writing. ### Liability for links This site contains links to external third-party websites over whose content I have no control. I therefore cannot accept any liability for this external content.