chore: updated docs
279df285
5 file(s) · +111 −0
| 16 | 16 | | [**Shrink**](apps/shrink) | Image compression and resizing | [](https://railway.com/deploy/enYUFb?referralCode=JGcIp6) | |
|
| 17 | 17 | | [**Cellar**](apps/cellar) | Minimal wine collection tracker | [](https://railway.com/deploy/MNprVh?referralCode=JGcIp6) | |
|
| 18 | 18 | | [**Posts**](apps/posts) | Minimal CMS blog with admin interface | [](https://railway.com/deploy/tYtJYp?referralCode=JGcIp6) | |
|
| 19 | + | | [**Bookmarks**](apps/bookmarks) | Minimal link saver with categories and JSON API | [](https://railway.com/deploy/DZfr5P?referralCode=JGcIp6) | |
|
| 20 | + | | [**Library**](apps/library) | Minimal book tracker with Google Books search | [](https://railway.com/deploy/tepdeI?referralCode=JGcIp6) | |
|
| 21 | + | | [**Easel**](apps/easel) | Daily public-domain painting from the Art Institute of Chicago | [](https://railway.com/deploy/0DpuRE?referralCode=JGcIp6) | |
|
| 19 | 22 | ||
| 20 | 23 | ## Shared Crates |
|
| 21 | 24 |
| 1 | 1 | # Bookmarks |
|
| 2 | 2 | ||
| 3 | + |  |
|
| 4 | + | ||
| 3 | 5 | Bookmarks is a single-user link saver. Add links via the admin panel or JSON API, organize them into categories, and view them on a public index page grouped by category. |
|
| 4 | 6 | ||
| 5 | 7 | - Single Rust binary with embedded assets |
|
| 24 | 26 | `BOOKMARKS_PASSWORD` is required to access the admin panel. `BOOKMARKS_API_KEY` is only needed if you want to create links from outside the browser. |
|
| 25 | 27 | ||
| 26 | 28 | ## Deploy |
|
| 29 | + | ||
| 30 | + | ### Railway |
|
| 31 | + | ||
| 32 | + | The easiest way to deploy Bookmarks is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Bookmarks requires `BOOKMARKS_PASSWORD` during the configure step. |
|
| 33 | + | ||
| 34 | + | [](https://railway.com/deploy/DZfr5P?referralCode=JGcIp6) |
|
| 27 | 35 | ||
| 28 | 36 | ### Docker |
|
| 29 | 37 | ||
| 1 | + | # Easel |
|
| 2 | + | ||
| 3 | + |  |
|
| 4 | + | ||
| 5 | + | A self-hosted daily painting viewer built with Rust. One public-domain artwork from the [Art Institute of Chicago](https://api.artic.edu/docs/) per calendar day, persisted to SQLite. |
|
| 6 | + | ||
| 7 | + | - Single Rust binary with embedded assets |
|
| 8 | + | - One artwork per day, picked from AIC's public-domain collection |
|
| 9 | + | - Past days browsable via archive; future days unavailable until populated |
|
| 10 | + | - Atom feed at `/feed.xml` |
|
| 11 | + | - JSON API for today, any day, and the full archive |
|
| 12 | + | - Optional backfill of missing past days on startup |
|
| 13 | + | - Dark themed UI with Commit Mono font |
|
| 14 | + | - SQLite for persistent storage |
|
| 15 | + | ||
| 16 | + | ## Configure |
|
| 17 | + | ||
| 18 | + | ### Environment Variables |
|
| 19 | + | ||
| 20 | + | | Variable | Description | Default | |
|
| 21 | + | |---|---|---| |
|
| 22 | + | | `HOST` | Server bind address | `127.0.0.1` | |
|
| 23 | + | | `PORT` | Server port | `4242` | |
|
| 24 | + | | `EASEL_DB_PATH` | SQLite database file path | `easel.sqlite` | |
|
| 25 | + | | `EASEL_TIMEZONE` | IANA timezone for day boundary | `UTC` | |
|
| 26 | + | | `EASEL_CLASSIFICATIONS` | Comma-separated `classification_title` filter | `painting` | |
|
| 27 | + | | `EASEL_EXCLUDE_TERMS` | Comma-separated phrases excluded across title/description/term/subject/category/classification | `erotic,erotica,shunga` | |
|
| 28 | + | | `EASEL_BACKFILL_DAYS` | On boot, fill missing past N days (0 disables) | `0` | |
|
| 29 | + | | `EASEL_MAX_DEDUP_RETRIES` | Retries when picking a non-duplicate artwork | `10` | |
|
| 30 | + | | `EASEL_BASE_URL` | Public base URL for absolute links in `/feed.xml` | `http://localhost:4242` | |
|
| 31 | + | ||
| 32 | + | ## Deploy |
|
| 33 | + | ||
| 34 | + | ### Railway |
|
| 35 | + | ||
| 36 | + | The easiest way to deploy Easel is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. |
|
| 37 | + | ||
| 38 | + | [](https://railway.com/deploy/0DpuRE?referralCode=JGcIp6) |
|
| 39 | + | ||
| 40 | + | ### Docker |
|
| 41 | + | ||
| 42 | + | ```bash |
|
| 43 | + | cd apps/easel |
|
| 44 | + | cp .env.example .env |
|
| 45 | + | docker compose up -d |
|
| 46 | + | ``` |
|
| 47 | + | ||
| 48 | + | ### Binary |
|
| 49 | + | ||
| 50 | + | Install with Homebrew: |
|
| 51 | + | ||
| 52 | + | ```bash |
|
| 53 | + | brew install stevedylandev/tap/easel |
|
| 54 | + | ``` |
|
| 55 | + | ||
| 56 | + | Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=easel&expanded=true). |
|
| 57 | + | ||
| 58 | + | You can also build from source: |
|
| 59 | + | ||
| 60 | + | ```bash |
|
| 61 | + | cargo build --release -p easel |
|
| 62 | + | ``` |
|
| 63 | + | ||
| 64 | + | The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly. |
|
| 65 | + | ||
| 66 | + | ## Use |
|
| 67 | + | ||
| 68 | + | Visit `/` for today's artwork. Browse past days at `/day/{YYYY-MM-DD}` or the full collection at `/archive`. Subscribe to `/feed.xml` for an Atom feed of new daily paintings. |
|
| 69 | + | ||
| 70 | + | ### Routes |
|
| 71 | + | ||
| 72 | + | | Route | Description | |
|
| 73 | + | |---|---| |
|
| 74 | + | | `GET /` | Today's artwork | |
|
| 75 | + | | `GET /day/{YYYY-MM-DD}` | Specific past day | |
|
| 76 | + | | `GET /archive` | Full archive | |
|
| 77 | + | | `GET /feed.xml` | Atom feed | |
|
| 78 | + | | `GET /api/today` | JSON of today | |
|
| 79 | + | | `GET /api/day/{YYYY-MM-DD}` | JSON of specific day | |
|
| 80 | + | | `GET /api/archive` | JSON list | |
|
| 81 | + | ||
| 82 | + | ## Image source |
|
| 83 | + | ||
| 84 | + | Images served from AIC's IIIF endpoint: |
|
| 85 | + | ||
| 86 | + | ``` |
|
| 87 | + | https://www.artic.edu/iiif/2/{image_id}/full/843,/0/default.jpg |
|
| 88 | + | ``` |
| 1 | 1 | # Library |
|
| 2 | 2 | ||
| 3 | + |  |
|
| 4 | + | ||
| 3 | 5 | A simple, self-hosted book tracker built with Rust. |
|
| 4 | 6 | ||
| 5 | 7 | - Single binary with embedded assets |
|
| 32 | 34 | The `GOOGLE_BOOKS_API_KEY` is optional — searches work without it but are rate-limited. |
|
| 33 | 35 | ||
| 34 | 36 | ## Deploy |
|
| 37 | + | ||
| 38 | + | ### Railway |
|
| 39 | + | ||
| 40 | + | The easiest way to deploy Library is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Library requires `ADMIN_PASSWORD` during the configure step, and optionally `GOOGLE_BOOKS_API_KEY` for book search. |
|
| 41 | + | ||
| 42 | + | [](https://railway.com/deploy/tepdeI?referralCode=JGcIp6) |
|
| 35 | 43 | ||
| 36 | 44 | ### Docker |
|
| 37 | 45 | ||
| 49 | 49 | link: '/apps/cellar', |
|
| 50 | 50 | }, |
|
| 51 | 51 | { |
|
| 52 | + | text: 'Easel', |
|
| 53 | + | link: '/apps/easel', |
|
| 54 | + | }, |
|
| 55 | + | { |
|
| 52 | 56 | text: 'Feeds', |
|
| 53 | 57 | link: '/apps/feeds', |
|
| 54 | 58 | }, |