A personal read-it-later app. Much like Pocket (RIP) or Raindrop.io, but you run it yourself on Cloudflare's free tier.
- Flutter client for Android and the web — one codebase, both platforms.
- Firefox extension to save the current tab with one click.
- Hono backend on Cloudflare Workers with SQLite (D1) for storage.
- Raindrop.io importer to bring your existing bookmarks across.
- Single static token for auth — no accounts, no OAuth.
- Designed to fit comfortably inside Cloudflare's free tier.
You'll end up with the worker deployed to Cloudflare and the web client running at a Cloudflare Pages URL.
- A free Cloudflare account.
miseto manage tool versions and run the tasks.
git clone https://github.com/guille/florilegio.git
cd florilegio
mise installThis installs all the needed development tools and runs first-time setup tasks.
cd worker
wrangler d1 create bookmarksCopy the printed database_id into worker/wrangler.jsonc, replacing the existing one.
TOKEN=$(openssl rand -base64 32)
echo "$TOKEN" # save this — you'll need it for the client
wrangler secret put API_TOKEN
# paste the same token when promptedThe token must match RFC 6750's Bearer token grammar. openssl rand -base64 32 produces one that does.
mise run apply-schema:remote
mise run deployNote the worker URL (e.g. https://florilegio.<your-subdomain>.workers.dev).
cd ../client
mise run deploy:webThe first run will prompt you to create a Cloudflare Pages project. Pick a name and accept the defaults. After deploy, note the Pages URL (e.g. https://florilegio-xyz.pages.dev).
Open your Pages URL. The app boots into the settings screen until you provide:
- Endpoint URL: your worker URL from step 4.
- Token: the API token from step 3.
Save. You should now be looking at your (empty) reading list.
Download the signed XPI from the latest release and open it in Firefox, or build from source:
cd ff-extension
mise run package
# drag addon.xpi into about:debugging → This Firefox → Load Temporary Add-onConfigure the extension with the same endpoint URL and token.
cd client
mise run build:android
# install build/app/outputs/flutter-apk/app-release.apk on your deviceOn first launch, point it at the same endpoint URL and token.
Structured as a monorepo.
| Path | What it is |
|---|---|
worker/ |
Hono API on Cloudflare Workers, SQLite (D1) storage. See worker/README.md. |
client/ |
Flutter app targeting Android and the web. |
ff-extension/ |
Firefox extension to save the current tab. |
support/ |
Scripts, including a Raindrop.io export → Florilegio JSON converter. |
Export your collection from Raindrop.io as JSON, then run the converter in support/convert.py to turn it into a Florilegio import (can be loaded from the Settings page).
This project heavily uses Mise for dev tools and tasks. Run mise tasks from any directory to see what's available.
The stack is deliberately minimal: a single static Bearer token instead of accounts, Cloudflare's free tier instead of dedicated infrastructure, SQLite/D1 instead of Postgres. It fits one person's reading list and costs nothing to run. It's not built for multi-tenancy.
MIT.
