Merge pull request #18 from stevedylandev/chore/docs-updates a8922ef7
chore/docs updates
Steve Simkins · 2026-04-10 21:41 19 file(s) · +428 −460
docs/docs/components/Landing.tsx +3 −6
7 7
			style={{
8 8
				position: "relative",
9 9
				width: "100%",
10 -
				background: "#121113 url('/bg.png') center center / cover no-repeat",
10 +
				background: "#121113 url('/bg.webp') center center / cover no-repeat",
11 11
			}}
12 12
		>
13 13
			<div
20 20
					justifyContent: "center",
21 21
					gap: "3rem",
22 22
					padding: "1rem",
23 -
					background: "rgba(0, 0, 0, 0.65)",
24 23
				}}
25 24
			>
26 25
				<div
34 33
					<h1
35 34
						style={{
36 35
							textAlign: "center",
37 -
							fontSize: "48px",
38 -
							fontWeight: 700,
36 +
							fontSize: "92px",
37 +
							fontWeight: 400,
39 38
							fontFamily: '"Commit Mono", monospace, sans-serif',
40 -
							textTransform: "uppercase",
41 39
							color: "#ffffff",
42 40
						}}
43 41
					>
50 48
							fontWeight: 400,
51 49
							fontFamily: '"Commit Mono", monospace, sans-serif',
52 50
							color: "#ffffff",
53 -
							opacity: 0.7,
54 51
						}}
55 52
					>
56 53
						Minimal, self-hosted personal software in Rust
docs/docs/pages/apps/cellar.mdx (added) +81 −0
1 +
# Cellar
2 +
3 +
![demo of cellar](https://files.stevedylan.dev/cellar-demo.png)
4 +
5 +
A simple, self-hosted wine collection app built with Rust.
6 +
7 +
- Single binary with embedded assets
8 +
- Password authentication with session cookies
9 +
- Add, edit, and delete wines from your collection
10 +
- AI-powered tasting notes via Claude
11 +
- Pentagon and bar visualizations for wine profiles
12 +
- Image upload with automatic JPEG processing
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 +
| `CELLAR_PASSWORD` | Password for login authentication | `changeme` |
23 +
| `CELLAR_DB_PATH` | SQLite database file path | `cellar.sqlite` |
24 +
| `ANTHROPIC_API_KEY` | Anthropic API key for AI features | |
25 +
| `HOST` | Server bind address | `127.0.0.1` |
26 +
| `PORT` | Server port | `3000` |
27 +
| `COOKIE_SECURE` | Enable HTTPS-only cookies | `false` |
28 +
29 +
The `ANTHROPIC_API_KEY` is optional but required for AI-powered tasting notes and image analysis.
30 +
31 +
## Deploy
32 +
33 +
### Railway
34 +
35 +
The easiest way to deploy Cellar is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Cellar requires `CELLAR_PASSWORD` during the configure step, and optionally `ANTHROPIC_API_KEY` if you want AI-powered tasting notes and image analysis.
36 +
37 +
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/MNprVh?referralCode=JGcIp6)
38 +
39 +
### Docker
40 +
41 +
```bash
42 +
git clone https://github.com/stevedylandev/cellar.git
43 +
cd cellar
44 +
cp .env.example .env
45 +
# Edit .env with your password and Anthropic API key
46 +
docker compose up -d
47 +
```
48 +
49 +
This will start Cellar on port `3000` with a persistent volume for the SQLite database.
50 +
51 +
### Binary
52 +
53 +
Install with Homebrew:
54 +
55 +
```bash
56 +
brew install stevedylandev/tap/cellar
57 +
```
58 +
59 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=cellar&expanded=true).
60 +
61 +
You can also build from source:
62 +
63 +
```bash
64 +
cargo build --release -p cellar
65 +
```
66 +
67 +
The resulting binary at `./target/release/cellar` is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly.
68 +
69 +
## Use
70 +
71 +
Your wine collection is publicly viewable at `/` with individual wine pages at `/wines/{short_id}`.
72 +
73 +
### Admin
74 +
75 +
Log in at `/admin/login` with your configured password to access the admin pages.
76 +
77 +
| Page | Description |
78 +
|---|---|
79 +
| `/admin` | Admin dashboard listing every wine in your collection |
80 +
| `/admin/new` | Add a new wine, optionally using AI image analysis to prefill details |
81 +
| `/admin/edit/{short_id}` | Edit an existing wine |
docs/docs/pages/apps/feeds.mdx +50 −51
1 1
# Feeds
2 -
3 -
Minimal RSS Feeds
4 -
5 -
## Overview
2 +
#
3 +
![demo of feeds](https://files.stevedylan.dev/feeds-demo.png)
6 4
7 5
Feeds is a minimal RSS reader that mimics the original experience of RSS. It's just a list of posts. No categories, no marking a post read or unread, and there is no in-app reading. With this approach you have to read the post on the author's personal website and experience it in its original context.
8 6
12 10
- Feeds API with JSON and OPML export
13 11
- Dark themed UI with Commit Mono font
14 12
15 -
## Quickstart
16 -
17 -
```bash
18 -
git clone https://github.com/stevedylandev/andromeda.git
19 -
cd andromeda
20 -
cargo run -p feeds
21 -
# Server running on http://localhost:3000
22 -
```
13 +
## Configure
23 14
24 15
### Environment Variables
25 16
26 17
| Variable | Description | Default |
27 18
|---|---|---|
19 +
| `DEFAULT_FEED` | Comma-separated list of RSS feed URLs to load when no `?url=` or `?urls=` query param is provided | -- |
28 20
| `FRESHRSS_URL` | URL of your FreshRSS instance | -- |
29 21
| `FRESHRSS_USERNAME` | FreshRSS username | -- |
30 22
| `FRESHRSS_PASSWORD` | FreshRSS password | -- |
31 23
| `ADMIN_PASSWORD` | Password for the admin panel | -- |
32 24
| `COOKIE_SECURE` | Enable HTTPS-only cookies | `false` |
33 25
34 -
## Usage
26 +
The FreshRSS credentials are only needed if you want to source feeds from a FreshRSS instance.
27 +
28 +
## Deploy
29 +
30 +
### Railway
31 +
32 +
The easiest way to deploy Feeds is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Feeds requires `ADMIN_PASSWORD` to enable the admin panel, and optionally the `FRESHRSS_*` variables if you want to source feeds from a FreshRSS instance.
33 +
34 +
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/Ezvmhx?referralCode=JGcIp6)
35 +
36 +
### Docker
37 +
38 +
```bash
39 +
cd apps/feeds
40 +
cp .env.sample .env
41 +
# Edit .env with your credentials
42 +
docker compose up -d
43 +
```
44 +
45 +
### Binary
46 +
47 +
Install with Homebrew:
48 +
49 +
```bash
50 +
brew install stevedylandev/tap/feeds
51 +
```
52 +
53 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=feeds&expanded=true).
54 +
55 +
You can also build from source:
56 +
57 +
```bash
58 +
cargo build --release -p feeds
59 +
```
60 +
61 +
The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly.
62 +
63 +
## Use
35 64
36 65
There are several built-in ways to source RSS feeds.
37 66
47 76
48 77
```
49 78
?urls=https://bearblog.dev/discover/feed/,https://bearblog.stevedylan.dev/feed/
79 +
```
80 +
81 +
### Default Feed
82 +
83 +
Set the `DEFAULT_FEED` environment variable to a comma-separated list of feed URLs and the app will load them whenever no `?url=` or `?urls=` query param is provided:
84 +
85 +
```
86 +
DEFAULT_FEED=https://bearblog.dev/discover/feed/,https://bearblog.stevedylan.dev/feed/
50 87
```
51 88
52 89
### OPML File
75 112
/feeds?format=json
76 113
/feeds?format=opml
77 114
```
78 -
79 -
## Structure
80 -
81 -
```
82 -
feeds/
83 -
├── src/
84 -
│   ├── main.rs        # Axum server with routing, templates, and static asset serving
85 -
│   ├── feeds.rs       # Feed fetching, OPML parsing, and FreshRSS API integration
86 -
│   ├── auth.rs        # Session-based authentication with constant-time password verification
87 -
│   └── models.rs      # Data structures for feeds and FreshRSS responses
88 -
├── templates/         # Askama HTML templates
89 -
├── assets/            # Static assets embedded at compile time via rust-embed
90 -
├── Dockerfile
91 -
└── docker-compose.yml
92 -
```
93 -
94 -
## Deployment
95 -
96 -
### Railway
97 -
98 -
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/Ezvmhx?referralCode=JGcIp6)
99 -
100 -
### Docker
101 -
102 -
```bash
103 -
cd apps/feeds
104 -
cp .env.sample .env
105 -
# Edit .env with your credentials
106 -
docker compose up -d
107 -
```
108 -
109 -
### Binary
110 -
111 -
```bash
112 -
cargo build --release -p feeds
113 -
```
114 -
115 -
The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly.
docs/docs/pages/apps/jotts.mdx +19 −35
1 1
# Jotts
2 2
3 -
A minimal notes app
4 -
5 -
## Overview
3 +
![demo of jotts](https://files.stevedylan.dev/jotts-demo.png)
6 4
7 5
A simple, self-hosted markdown note app built with Rust.
8 6
13 11
- Dark themed UI with Commit Mono font
14 12
- SQLite for persistent storage
15 13
16 -
## Quickstart
17 -
18 -
```bash
19 -
git clone https://github.com/stevedylandev/andromeda.git
20 -
cd andromeda
21 -
cp apps/jotts/.env.example .env
22 -
# Edit .env with your password
23 -
cargo run -p jotts
24 -
```
14 +
## Configure
25 15
26 16
### Environment Variables
27 17
33 23
| `PORT` | Server port | `3000` |
34 24
| `COOKIE_SECURE` | Enable HTTPS-only cookies | `false` |
35 25
36 -
## Structure
37 -
38 -
```
39 -
jotts/
40 -
├── src/
41 -
│   ├── main.rs        # App entrypoint, env vars, starts server
42 -
│   ├── server.rs      # Axum router, HTTP handlers, and templates
43 -
│   ├── auth.rs        # Password verification and session management
44 -
│   └── db.rs          # SQLite database layer (notes, sessions)
45 -
├── templates/         # Askama HTML templates
46 -
│   ├── base.html      # Base layout with header and nav
47 -
│   ├── login.html     # Login page
48 -
│   ├── index.html     # Note list
49 -
│   ├── view.html      # Single note display
50 -
│   ├── new.html       # Create note form
51 -
│   └── edit.html      # Edit note form
52 -
├── static/            # Favicons, og:image, styles, and webmanifest
53 -
├── assets/            # Commit Mono font files
54 -
├── Dockerfile
55 -
└── docker-compose.yml
56 -
```
26 +
## Deploy
57 27
58 -
## Deployment
28 +
### Railway
59 29
60 -
### Railway
30 +
The easiest way to deploy Jotts is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Jotts requires `JOTTS_PASSWORD` to be set during the configure step.
61 31
62 32
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/DLhUhH?referralCode=JGcIp6)
63 33
74 44
75 45
### Binary
76 46
47 +
Install with Homebrew:
48 +
49 +
```bash
50 +
brew install stevedylandev/tap/jotts
51 +
```
52 +
53 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=jotts&expanded=true).
54 +
55 +
You can also build from source:
56 +
77 57
```bash
78 58
cargo build --release -p jotts
79 59
```
80 60
81 61
The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly.
62 +
63 +
## Use
64 +
65 +
Log in at `/login` with your configured password. From there you can create, edit, and delete markdown notes. Notes support GitHub-flavored markdown including strikethrough, tables, and task lists.
docs/docs/pages/apps/og.mdx +19 −28
1 1
# OG
2 2
3 -
A simple web tool for inspecting Open Graph tags on any URL.
4 -
5 -
## Overview
3 +
![demo of og](https://files.stevedylan.dev/og-demo.png)
6 4
7 5
A self-hosted Open Graph tag inspector built with Rust. Enter any URL and instantly see its OG metadata.
8 6
11 9
- Dark themed UI with Commit Mono font
12 10
- No database needed -- fully stateless
13 11
14 -
## Quickstart
15 -
16 -
```bash
17 -
git clone https://github.com/stevedylandev/andromeda.git
18 -
cd andromeda
19 -
cargo run -p og
20 -
```
12 +
## Configure
21 13
22 14
### Environment Variables
23 15
25 17
|---|---|---|
26 18
| `PORT` | Server port | `3000` |
27 19
28 -
## Structure
20 +
## Deploy
29 21
30 -
```
31 -
og/
32 -
├── src/
33 -
│   ├── main.rs        # Entry point and server startup
34 -
│   ├── server.rs      # Axum routes and request handling
35 -
│   └── og.rs          # Open Graph tag fetching and parsing
36 -
├── templates/         # Askama HTML templates
37 -
│   ├── base.html      # Base layout
38 -
│   ├── index.html     # Search form
39 -
│   └── results.html   # OG tag results display
40 -
├── static/            # Fonts, favicons, and styles
41 -
├── Dockerfile
42 -
└── docker-compose.yml
43 -
```
22 +
### Railway
44 23
45 -
## Deployment
46 -
47 -
### Railway
24 +
The easiest way to deploy OG is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. OG is fully stateless and needs no environment variables beyond the defaults.
48 25
49 26
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/OdXBt_?referralCode=JGcIp6)
50 27
57 34
58 35
### Binary
59 36
37 +
Install with Homebrew:
38 +
39 +
```bash
40 +
brew install stevedylandev/tap/og
41 +
```
42 +
43 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=og&expanded=true).
44 +
45 +
You can also build from source:
46 +
60 47
```bash
61 48
cargo build --release -p og
62 49
```
63 50
64 51
The resulting binary is self-contained with all assets embedded. Copy it to your server and run it directly.
52 +
53 +
## Use
54 +
55 +
Enter any URL to inspect its Open Graph tags including title, description, and image. Results are displayed instantly with no account or configuration needed.
docs/docs/pages/apps/parcels.mdx +20 −33
1 1
# Parcels
2 2
3 -
A minimal package tracking app
3 +
![demo of parcels](https://files.stevedylan.dev/parcels-demo.png)
4 +
4 5
5 6
:::warning
6 7
This app originally used USPS, but starting April 1st 2026, it has become much harder to obtain/maintain API keys.
7 8
:::
8 -
9 -
## Overview
10 9
11 10
A self-hosted package tracker for USPS. Track your packages without logging into USPS every time.
12 11
16 15
- Track USPS packages with custom labels
17 16
- Delete packages you no longer want to track
18 17
19 -
## Quickstart
20 -
21 -
```bash
22 -
git clone https://github.com/stevedylandev/andromeda.git
23 -
cd andromeda
24 -
cp apps/parcels/.env.example .env
25 -
# Edit .env with your USPS API credentials and app password
26 -
cargo run -p parcels
27 -
```
18 +
## Configure
28 19
29 20
You'll need a [USPS Web Tools API](https://developer.usps.com) account to get your `USPS_CLIENT_ID` and `USPS_CLIENT_SECRET`.
30 21
39 30
| `PORT` | Server port | `3000` |
40 31
| `COOKIE_SECURE` | Enable HTTPS-only cookies | `false` |
41 32
42 -
## Structure
33 +
## Deploy
43 34
44 -
```
45 -
parcels/
46 -
├── src/
47 -
│   ├── main.rs        # Axum web server, routes, and app state
48 -
│   ├── auth.rs        # Password verification and session management
49 -
│   ├── db.rs          # SQLite database layer (packages, events, sessions)
50 -
│   └── usps.rs        # USPS API integration with OAuth2 token caching
51 -
├── templates/         # Askama HTML templates
52 -
│   ├── base.html      # Base layout
53 -
│   ├── index.html     # Package list
54 -
│   ├── detail.html    # Package detail with tracking events
55 -
│   ├── add.html       # Add package form
56 -
│   └── login.html     # Login page
57 -
├── static/            # Fonts, favicons, and images
58 -
├── Dockerfile
59 -
└── docker-compose.yml
60 -
```
35 +
### Railway
61 36
62 -
## Deployment
63 -
64 -
### Railway
37 +
The easiest way to deploy Parcels is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Parcels requires `APP_PASSWORD`, `USPS_CLIENT_ID`, and `USPS_CLIENT_SECRET` to be set during the configure step.
65 38
66 39
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/HNQUs4?referralCode=JGcIp6)
67 40
78 51
79 52
### Binary
80 53
54 +
Install with Homebrew:
55 +
56 +
```bash
57 +
brew install stevedylandev/tap/parcels
58 +
```
59 +
60 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=parcels&expanded=true).
61 +
62 +
You can also build from source:
63 +
81 64
```bash
82 65
cargo build --release -p parcels
83 66
```
84 67
85 68
The resulting binary is self-contained (~7MB). Copy it to your server with a configured `.env` file and run it directly.
69 +
70 +
## Use
71 +
72 +
Log in with your configured password, then add packages by entering a USPS tracking number and an optional label. Your packages and their tracking events are displayed on the main page. Delete packages you no longer need to track.
docs/docs/pages/apps/posts.mdx +19 −42
1 1
# Posts
2 2
3 -
A minimal CMS blog with admin interface
4 -
5 -
## Overview
3 +
![demo of posts](https://assets.andromeda.build/posts-demo.png)
6 4
7 5
A self-hosted blog CMS built with Rust.
8 6
16 14
- Dark themed UI with Commit Mono font
17 15
- SQLite for persistent storage
18 16
19 -
## Quickstart
20 -
21 -
```bash
22 -
git clone https://github.com/stevedylandev/andromeda.git
23 -
cd andromeda
24 -
cp apps/posts/.env.example .env
25 -
# Edit .env with your password
26 -
cargo run -p posts
27 -
```
17 +
## Configure
28 18
29 19
### Environment Variables
30 20
38 28
| `PORT` | Server port | `3000` |
39 29
| `COOKIE_SECURE` | Enable HTTPS-only cookies | `false` |
40 30
41 -
## Structure
31 +
## Deploy
42 32
43 -
```
44 -
posts/
45 -
├── src/
46 -
│   ├── main.rs        # App entrypoint, env vars, starts server
47 -
│   ├── server.rs      # Axum router, HTTP handlers, and templates
48 -
│   ├── auth.rs        # Password verification and session management
49 -
│   └── db.rs          # SQLite database layer (posts, pages, files, settings, sessions)
50 -
├── templates/         # Askama HTML templates
51 -
│   ├── base.html            # Public base layout
52 -
│   ├── index.html           # Blog home page
53 -
│   ├── post.html            # Single post view
54 -
│   ├── posts.html           # Post listing
55 -
│   ├── page.html            # Static page view
56 -
│   ├── login.html           # Login page
57 -
│   ├── admin_base.html      # Admin layout
58 -
│   ├── admin_index.html     # Admin dashboard
59 -
│   ├── admin_post_form.html # Create/edit post form
60 -
│   ├── admin_pages.html     # Admin page listing
61 -
│   ├── admin_page_form.html # Create/edit page form
62 -
│   ├── admin_files.html     # File upload management
63 -
│   └── admin_settings.html  # Blog settings
64 -
├── static/            # Favicons, fonts, and styles
65 -
├── uploads/           # Uploaded files directory
66 -
├── Dockerfile
67 -
└── docker-compose.yml
68 -
```
33 +
### Railway
69 34
70 -
## Deployment
71 -
72 -
### Railway
35 +
The easiest way to deploy Posts is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Posts requires `POSTS_PASSWORD` and `SITE_URL` to be set during the configure step.
73 36
74 37
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/tYtJYp?referralCode=JGcIp6)
75 38
86 49
87 50
### Binary
88 51
52 +
Install with Homebrew:
53 +
54 +
```bash
55 +
brew install stevedylandev/tap/posts
56 +
```
57 +
58 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=posts&expanded=true).
59 +
60 +
You can also build from source:
61 +
89 62
```bash
90 63
cargo build --release -p posts
91 64
```
92 65
93 66
The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly.
67 +
68 +
## Use
69 +
70 +
Log in at `/login` with your configured password to access the admin panel. From there you can manage blog posts, static pages, file uploads, and site settings including custom CSS. Your blog's RSS feed is available at `/feed.xml`.
docs/docs/pages/apps/shrink.mdx +19 −25
1 1
# Shrink
2 2
3 -
A minimal image compression app
4 -
5 -
## Overview
3 +
![demo of shrink](https://files.stevedylan.dev/shrink-demo.png)
6 4
7 5
A simple self-hosted tool for compressing and resizing images. Upload an image, set your desired quality and optional width, and download the compressed JPEG.
8 6
11 9
- Optional resize by width (preserves aspect ratio)
12 10
- 20MB upload limit
13 11
14 -
## Quickstart
15 -
16 -
```bash
17 -
git clone https://github.com/stevedylandev/andromeda.git
18 -
cd andromeda
19 -
cargo run -p shrink
20 -
```
12 +
## Configure
21 13
22 14
### Environment Variables
23 15
26 18
| `HOST` | Server bind host | `127.0.0.1` |
27 19
| `PORT` | Server bind port | `3000` |
28 20
29 -
## Structure
30 -
31 -
```
32 -
shrink/
33 -
├── src/
34 -
│   ├── main.rs        # Entry point and server startup
35 -
│   └── server.rs      # Axum routes and image compression logic
36 -
├── templates/
37 -
│   └── index.html     # Upload UI
38 -
├── static/            # Fonts and static assets
39 -
├── Dockerfile
40 -
└── docker-compose.yml
41 -
```
42 -
43 -
## Deployment
21 +
## Deploy
44 22
45 23
### Railway
24 +
25 +
The easiest way to deploy Shrink is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Shrink needs no environment variables beyond the defaults.
46 26
47 27
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/enYUFb?referralCode=JGcIp6)
48 28
57 37
58 38
### Binary
59 39
40 +
Install with Homebrew:
41 +
42 +
```bash
43 +
brew install stevedylandev/tap/shrink
44 +
```
45 +
46 +
Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=shrink&expanded=true).
47 +
48 +
You can also build from source:
49 +
60 50
```bash
61 51
cargo build --release -p shrink
62 52
```
63 53
64 54
The resulting binary is self-contained. Copy it to your server and run it directly.
55 +
56 +
## Use
57 +
58 +
Upload an image, set your desired quality (1-100) and an optional target width, then download the compressed JPEG. Aspect ratio is preserved when resizing.
docs/docs/pages/apps/sipp.mdx +46 −82
1 1
# Sipp
2 2
3 -
Minimal code sharing
4 -
5 -
## Overview
3 +
![demo of sipp](https://files.stevedylan.dev/sipp-demo.png)
6 4
7 5
A single binary for code sharing with a web server and interactive TUI.
8 6
15 13
A small demo instance runs at [sipp.so](https://sipp.so). All snippets created there are public and might be deleted at any time; host your own instance with your own API key for personal use!
16 14
:::
17 15
18 -
## Quickstart
16 +
## Install
17 +
18 +
Sipp can be installed several ways:
19 +
20 +
### Homebrew
19 21
20 22
```bash
21 -
cargo install sipp-so
22 -
sipp --help
23 +
brew install stevedylandev/tap/sipp-so
23 24
```
24 25
25 -
Start a server and create a snippet:
26 +
### Cargo
26 27
27 28
```bash
28 -
sipp server --port 3000
29 +
cargo install sipp-so
29 30
```
30 31
31 -
```bash
32 -
# Path to file
33 -
sipp path/to/file.rs
32 +
### Releases
34 33
35 -
# Or use the interactive TUI
36 -
sipp
37 -
```
34 +
Visit the [releases](https://github.com/stevedylandev/sipp/releases) page for binaries and install scripts.
38 35
39 -
### Install
36 +
## Configure
40 37
41 -
Sipp can be installed several ways:
38 +
### Environment Variables
42 39
43 -
#### Homebrew
40 +
| Variable | Description |
41 +
|---|---|
42 +
| `SIPP_API_KEY` | API key for protecting endpoints |
43 +
| `SIPP_AUTH_ENDPOINTS` | Comma-separated list of endpoints requiring auth: `api_list`, `api_create`, `api_get`, `api_delete`, `all`, or `none` (defaults to `api_delete,api_list`) |
44 +
| `SIPP_MAX_CONTENT_SIZE` | Maximum snippet content size in bytes (defaults to `512000` / 500 KB) |
45 +
| `SIPP_DB_PATH` | Custom path for the SQLite database file (defaults to `sipp.sqlite`) |
46 +
47 +
## Deploy
48 +
49 +
### Railway
50 +
51 +
The easiest way to deploy a Sipp server is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Set `SIPP_API_KEY` during the configure step to protect your authenticated endpoints.
52 +
53 +
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/Axcf_D?referralCode=JGcIp6)
54 +
55 +
### Docker
44 56
45 57
```bash
46 -
brew install stevedylandev/tap/sipp-so
58 +
SIPP_API_KEY=your-secret-key docker compose up -d
47 59
```
48 60
49 -
#### Cargo
61 +
### Binary
50 62
51 63
```bash
52 -
cargo install sipp-so
64 +
cargo build --release -p sipp
53 65
```
54 66
55 -
#### Releases
67 +
The resulting binary is self-contained with all assets embedded. Copy it to your server with your environment variables configured and run it directly.
56 68
57 -
Visit the [releases](https://github.com/stevedylandev/sipp/releases) page for binaries and install scripts.
69 +
## Use
58 70
59 -
## CLI
71 +
### CLI
60 72
61 73
```
62 74
sipp [OPTIONS] [FILE] [COMMAND]
63 75
```
64 76
65 -
### Commands
77 +
#### Commands
66 78
67 79
| Command | Description |
68 80
|---|---|
70 82
| `tui` | Launch the interactive TUI |
71 83
| `auth` | Save remote URL and API key to config file |
72 84
73 -
### Arguments
85 +
#### Arguments
74 86
75 87
| Argument | Description |
76 88
|---|---|
77 89
| `[FILE]` | File path to create a snippet from |
78 90
79 -
### Options
91 +
#### Options
80 92
81 93
| Option | Description |
82 94
|---|---|
83 95
| `-r, --remote <URL>` | Remote server URL (env: `SIPP_REMOTE_URL`) |
84 96
| `-k, --api-key <KEY>` | API key for authenticated operations (env: `SIPP_API_KEY`) |
85 97
86 -
## Server
98 +
### Server
87 99
88 -
Sipp includes a built-in web server powered by Axum. Start it with:
100 +
Start the web server with:
89 101
90 102
```bash
91 103
sipp server --port 3000 --host localhost
92 104
```
93 105
94 -
### Environment Variables
95 -
96 -
| Variable | Description |
97 -
|---|---|
98 -
| `SIPP_API_KEY` | API key for protecting endpoints |
99 -
| `SIPP_AUTH_ENDPOINTS` | Comma-separated list of endpoints requiring auth: `api_list`, `api_create`, `api_get`, `api_delete`, `all`, or `none` (defaults to `api_delete,api_list`) |
100 -
| `SIPP_MAX_CONTENT_SIZE` | Maximum snippet content size in bytes (defaults to `512000` / 500 KB) |
101 -
| `SIPP_DB_PATH` | Custom path for the SQLite database file (defaults to `sipp.sqlite`) |
102 -
103 -
### API Endpoints
106 +
#### API Endpoints
104 107
105 108
| Method | Endpoint | Description |
106 109
|---|---|---|
112 115
113 116
Authenticated endpoints require an `x-api-key` header.
114 117
115 -
### Raw Output for CLI Tools
118 +
#### Raw Output for CLI Tools
116 119
117 120
When you access a snippet URL (`/s/{short_id}`) with `curl`, `wget`, or `httpie`, the server returns the raw content as plain text instead of HTML:
118 121
120 123
curl https://sipp.so/s/abc123
121 124
```
122 125
123 -
## TUI
126 +
### TUI
124 127
125 128
The Sipp TUI makes it easy to create, copy, share, and manage your snippets either locally or remotely.
126 129
135 138
sipp -r https://sipp.so -k your-api-key
136 139
```
137 140
138 -
### Local Access
141 +
#### Local Access
139 142
140 143
If you are running `sipp` in the same directory as the `sipp.sqlite` file created by the server instance, the TUI will automatically access the database locally.
141 144
142 -
### Remote Access
145 +
#### Remote Access
143 146
144 147
To access a remote instance:
145 148
- Set the `SIPP_API_KEY` variable in your server instance
146 149
- Run `sipp auth` to enter your server URL and API key, stored under `$HOME/.config/sipp`
147 150
148 -
### Keybindings
151 +
#### Keybindings
149 152
150 153
| Key | Action |
151 154
|---|---|
163 166
| `r` | Refresh snippets (remote only) |
164 167
| `q` | Quit |
165 168
| `?` | Toggle help |
166 -
167 -
## Structure
168 -
169 -
```
170 -
sipp/
171 -
├── src/
172 -
│   ├── main.rs        # CLI argument parsing and entry point
173 -
│   ├── lib.rs         # Library exports
174 -
│   ├── server.rs      # Axum web server, routes, and templates
175 -
│   ├── tui.rs         # Interactive terminal UI
176 -
│   ├── db.rs          # SQLite database layer
177 -
│   ├── backend.rs     # Local/remote backend abstraction
178 -
│   ├── config.rs      # Config file management
179 -
│   └── highlight.rs   # Syntax highlighting with custom themes
180 -
├── templates/         # Askama HTML templates
181 -
├── static/            # Fonts, favicons, and styles
182 -
├── Dockerfile
183 -
└── docker-compose.yml
184 -
```
185 -
186 -
## Deployment
187 -
188 -
### Railway
189 -
190 -
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/Axcf_D?referralCode=JGcIp6)
191 -
192 -
### Docker
193 -
194 -
```bash
195 -
SIPP_API_KEY=your-secret-key docker compose up -d
196 -
```
197 -
198 -
### Binary
199 -
200 -
```bash
201 -
cargo build --release -p sipp
202 -
```
203 -
204 -
The resulting binary is self-contained with all assets embedded. Copy it to your server with your environment variables configured and run it directly.
docs/docs/pages/deploy-railway.mdx (added) +46 −0
1 +
# Deploying with Railway
2 +
3 +
[Railway](https://railway.com) is halfway between a VPS (virtual private server) and a hosting platform like Netlify or Vercel. It's the perfect place to host an Andromeda app if you're a beginner, and every Andromeda app has a one-click Railway template to make it even easier.
4 +
5 +
This guide walks through the general process of deploying the Andromeda app [posts](/apps/posts) to Railway. For app-specific environment variables and configuration, check the corresponding app's page.
6 +
7 +
::::steps
8 +
### Deploy
9 +
10 +
On the app's page, click the `Deploy on Railway` button. If you haven't signed up for Railway yet you'll be prompted to do so before continuing.
11 +
12 +
### Configure
13 +
14 +
Railway will show a `Configure` button, and when you click on it you will need to fill in the environment variables for that app. Most Andromeda apps share a couple of common ones:
15 +
16 +
- `SITE_URL` - The public URL your app will be hosted at. If you don't know what that URL will be yet, you can put a placeholder like `https://example.com` and update it once Railway gives you a hosted URL.
17 +
- A password variable (e.g. `POSTS_PASSWORD`, `JOTTS_PASSWORD`, `CELLAR_PASSWORD`) - The password used to access the admin dashboard for that app.
18 +
19 +
Check the specific app's page for the full list of environment variables it accepts.
20 +
21 +
![railway deploying app](https://assets.andromeda.build/docs/railway-deploy-app_compressed.jpg)
22 +
23 +
Once you have filled these out click the `Save Config` button at the bottom, then click `Deploy`.
24 +
25 +
### Use
26 +
27 +
Your app is now live. Click on the square with your app to see the hosted URL for it.
28 +
29 +
![railway deployment with hosted url](https://assets.andromeda.build/docs/railway-deployment.png)
30 +
31 +
If your app uses a `SITE_URL` variable, copy the hosted URL, go into the `Variables` tab, click `Edit` for the `SITE_URL` variable, and paste in the new value. This makes sure the app is fully functional.
32 +
33 +
![railway edit existing variable](https://assets.andromeda.build/docs/railway-edit-variable.png)
34 +
35 +
Those Railway URLs are not pretty, so if you have a custom domain, visit the `Settings` tab and under the `Networking` section click `+ Custom Domain` to set it up. Make sure to update the `SITE_URL` variable again after you do this.
36 +
::::
37 +
38 +
Check out the other available Andromeda apps! Each one has its own one-click Railway template on its page, along with the full list of environment variables it accepts.
39 +
40 +
- [Posts](/apps/posts) - A minimal CMS blog with an admin interface.
41 +
- [Jotts](/apps/jotts) - A minimal self-hosted markdown notes app.
42 +
- [Cellar](/apps/cellar) - A minimal wine collection tracker.
43 +
- [Feeds](/apps/feeds) - A minimal RSS reader that sends you back to the author's site to read posts in their original context.
44 +
- [Shrink](/apps/shrink) - A simple self-hosted tool for compressing and resizing images.
45 +
- [Sipp](/apps/sipp) - A single binary for code sharing with a web server and interactive TUI.
46 +
- [OG](/apps/og) - A simple web tool for inspecting Open Graph tags on any URL.
docs/docs/pages/diy/skills.mdx +11 −59
1 1
# Skills
2 2
3 -
Andromeda apps are scaffolded using [Claude Code](https://claude.ai/code) with a custom skill called `rust-crud`. This page explains how to use it to build your own apps in the same style.
3 +
Andromeda ships with two [Claude Code](https://claude.ai/code) skills that make it easy to build new apps in the same style. Both live in the repo at [`skills/`](https://github.com/stevedylandev/andromeda/tree/main/skills).
4 4
5 -
## What is rust-crud?
5 +
## andromeda-stack
6 6
7 -
`rust-crud` is a Claude Code skill that scaffolds a complete Rust CRUD web application matching the Andromeda stack:
7 +
[`andromeda-stack`](https://github.com/stevedylandev/andromeda/blob/main/skills/andromeda-stack/SKILL.md) scaffolds a complete Rust CRUD web app matching the Andromeda stack:
8 8
9 9
- Axum web server with routing
10 10
- SQLite database with rusqlite
11 11
- Askama HTML templates
12 -
- API key authentication
12 +
- `andromeda-auth` for session or API key auth
13 13
- Embedded static assets via rust-embed
14 14
- Dockerfile and docker-compose.yml for deployment
15 15
16 -
## Using the Skill
16 +
New apps land under `apps/` in the workspace and share dependencies via the root `Cargo.toml`.
17 17
18 -
In Claude Code, invoke the skill when you want to create a new app:
18 +
## darkmatter-styles
19 19
20 -
```
21 -
/rust-crud
22 -
```
20 +
[`darkmatter-styles`](https://github.com/stevedylandev/andromeda/tree/main/skills/darkmatter-styles/SKILL.md) applies the shared Andromeda aesthetic: dark background, white borders, Commit Mono, minimal layout, no frameworks. Use it when building new pages or components that need to match the rest of the lineup.
23 21
24 -
Describe what you want to build and the skill will generate a complete, working app that follows the same patterns as every other Andromeda app.
22 +
## Installing
25 23
26 -
## Building Your Own App
27 -
28 -
If you want to add a new app to the workspace manually, follow these steps:
29 -
30 -
### 1. Create the app directory
24 +
Use [`npx skills add`](https://github.com/vercel-labs/skills) to pull either skill directly from the repo:
31 25
32 26
```bash
33 -
mkdir -p apps/my-app/src
34 -
mkdir -p apps/my-app/templates
35 -
mkdir -p apps/my-app/static
36 -
```
37 -
38 -
### 2. Add to workspace
39 -
40 -
Add your app to the root `Cargo.toml` workspace members:
41 -
42 -
```toml
43 -
[workspace]
44 -
members = [
45 -
    "apps/my-app",
46 -
    # ...existing apps
47 -
]
27 +
npx skills add stevedylandev/andromeda/skills
48 28
```
49 29
50 -
### 3. Set up Cargo.toml
51 -
52 -
```toml
53 -
[package]
54 -
name = "my-app"
55 -
version = "0.1.0"
56 -
edition = "2021"
57 -
58 -
[dependencies]
59 -
axum = "0.8"
60 -
tokio = { version = "1", features = ["full"] }
61 -
rusqlite = { version = "0.32", features = ["bundled"] }
62 -
askama = "0.12"
63 -
askama_axum = "0.4"
64 -
rust-embed = "8"
65 -
tower-http = { version = "0.6", features = ["cors"] }
66 -
serde = { version = "1", features = ["derive"] }
67 -
dotenvy = "0.15"
68 -
```
69 -
70 -
### 4. Follow the pattern
71 -
72 -
Use the [Stack](/diy/stack) page as a reference for how to structure your `main.rs`, `server.rs`, and `db.rs` files. Look at any existing app in `apps/` for a working example.
73 -
74 -
### 5. Build and run
75 -
76 -
```bash
77 -
cargo run -p my-app
78 -
```
30 +
Once installed, invoke them in Claude Code by describing what you want to build — the skills trigger automatically based on their descriptions.
docs/docs/pages/quickstart.mdx +8 −0
86 86
This will start Posts on port `3000` with a persistent volume for the SQLite database and uploads. Visit `http://localhost:3000` and log in at `/login` with your configured password.
87 87
::::
88 88
89 +
90 +
## Keep Reading
91 +
92 +
[What is Andromeda?](/what-is-andromeda)
93 +
94 +
[More Apps](/apps/feeds)
95 +
96 +
[Build Your Own](/diy/stack)
docs/docs/pages/what-is-andromeda.mdx +4 −33
1 -
# What is Andromeda
1 +
# What is Andromeda?
2 2
3 -
Andromeda is a Rust workspace of minimal, self-hosted web apps. Each app compiles to a single binary powered by [Axum](https://github.com/tokio-rs/axum), [SQLite](https://github.com/rusqlite/rusqlite), and [Askama](https://github.com/djc/askama) templates.
4 -
5 -
## Philosophy
3 +
Andromeda is a collection of apps that focus on minimalism, portability, and efficiency. It all started with my own desire to have a place where I could write a quick note and access it on any browser. Sure there are plenty out there, but what if I want to own my data? What if I want it to look a certain way? This was the beginning of [Jotts](/apps/jotts), and shortly thereafter slew of other small apps that accent my day to day life. 
6 4
7 -
Every app in Andromeda follows the same principles:
5 +
Each one of these apps is written in Rust, and if you're not a programmer, it simply means that these run on very little memory and CPU power. It's not another massive app that will slow down your computer. More importantly, these are web apps designed to be hosted on a server. Instead of depending on a provider, their terms of service, or another subscription, these apps just need a place to run; a computer in the cloud. Even if you're not that technical, I've designed these to be simple to setup through a hosting service called [Railway](https://railway.com). All you have to do is click a button, then enter a few details like a password. Check out the [quickstart](/quickstart) if you haven't already to give it a try. 
8 6
9 -
- **Single binary** - Each app compiles to one small binary (~7MB) with all assets embedded at compile time
10 -
- **Minimal resource usage** - Apps average around ~10MB of RAM
11 -
- **Self-hosted** - You own your data and run it on your own infrastructure
12 -
- **Simple deployment** - One binary, one optional `.env` file, no external dependencies
13 -
- **Consistent stack** - All apps share the same Rust stack so patterns are transferable
14 -
15 -
## Apps
16 -
17 -
| App | Description |
18 -
|---|---|
19 -
| [Sipp](/apps/sipp) | Code sharing with web UI and TUI |
20 -
| [Feeds](/apps/feeds) | RSS reader with FreshRSS and OPML support |
21 -
| [Parcels](/apps/parcels) | Package tracking (USPS) |
22 -
| [Jotts](/apps/jotts) | Markdown notes |
23 -
| [OG](/apps/og) | Open Graph tag inspector |
24 -
| [Shrink](/apps/shrink) | Image compression and resizing |
25 -
26 -
## Shared Crates
27 -
28 -
| Crate | Description |
29 -
|---|---|
30 -
| `andromeda-auth` | Session-based password authentication |
31 -
32 -
The `andromeda-auth` crate provides a shared authentication layer used across apps that require login, including session cookies and constant-time password verification.
33 -
34 -
## License
35 -
36 -
[MIT](https://github.com/stevedylandev/andromeda/blob/main/LICENSE)
7 +
The goal of Andromeda is to provide free, minimal, and efficient open source apps, that empower people to run their own software. If you're a developer, check out the [stack for Andromeda](/diy/stack) and start building similar apps. Take control of your apps, and make them serve you; not the other way around.
docs/docs/public/bg.png (deleted) +0 −0

Binary file — no preview.

docs/docs/public/bg.webp (added) +0 −0

Binary file — no preview.

docs/docs/public/icon.png (added) +0 −0

Binary file — no preview.

docs/docs/public/og.png (added) +0 −0

Binary file — no preview.

docs/vocs.config.ts +81 −64
2 2
3 3
export default defineConfig({
4 4
  title: 'Andromeda',
5 +
  iconUrl: "/icon.png",
6 +
  ogImageUrl: "/og.png",
5 7
  markdown: {
6 8
    code: {
7 9
      themes: {
8 -
        light: "github-dark-high-contrast",
9 -
        dark: "github-dark-high-contrast",
10 +
        light: "github-light-default",
11 +
        dark: "github-dark-default",
10 12
      },
11 13
    },
12 14
  },
13 -
  theme: {
15 +
  socials: [
16 +
    {
17 +
      icon: "github",
18 +
      link: "https://github.com/stevedylandev/andromeda",
19 +
    }
20 +
  ],
21 +
  aiCta: false,
22 +
  sidebar: [
23 +
    {
24 +
      text: 'Intro',
25 +
      items: [
26 +
        {
27 +
          text: 'Quickstart',
28 +
          link: '/quickstart',
29 +
        },
30 +
        {
31 +
          text: 'What is Andromeda',
32 +
          link: '/what-is-andromeda',
33 +
        },
34 +
        {
35 +
          text: 'Deploying with Railway',
36 +
          link: '/deploy-railway',
37 +
        },
38 +
      ],
39 +
    },
40 +
    {
41 +
      text: 'Apps',
42 +
      items: [
43 +
        {
44 +
          text: 'Cellar',
45 +
          link: '/apps/cellar',
46 +
        },
47 +
        {
48 +
          text: 'Feeds',
49 +
          link: '/apps/feeds',
50 +
        },
51 +
        {
52 +
          text: 'Jotts',
53 +
          link: '/apps/jotts',
54 +
        },
55 +
        {
56 +
          text: 'OG',
57 +
          link: '/apps/og',
58 +
        },
59 +
        {
60 +
          text: 'Parcels',
61 +
          link: '/apps/parcels',
62 +
        },
63 +
        {
64 +
          text: 'Posts',
65 +
          link: '/apps/posts',
66 +
        },
67 +
        {
68 +
          text: 'Shrink',
69 +
          link: '/apps/shrink',
70 +
        },
71 +
        {
72 +
          text: 'Sipp',
73 +
          link: '/apps/sipp',
74 +
        },
75 +
      ],
76 +
    },
77 +
    {
78 +
      text: 'DIY',
79 +
      items: [
80 +
        {
81 +
          text: 'Stack',
82 +
          link: '/diy/stack',
83 +
        },
84 +
        {
85 +
          text: 'Skills',
86 +
          link: '/diy/skills',
87 +
        },
88 +
      ],
89 +
    },
90 +
  ],
91 +
    theme: {
14 92
    colorScheme: "dark",
15 93
    accentColor: "#ffffff",
16 94
    variables: {
145 223
      },
146 224
    },
147 225
  },
148 -
  sidebar: [
149 -
    {
150 -
      text: 'Intro',
151 -
      items: [
152 -
        {
153 -
          text: 'Quickstart',
154 -
          link: '/quickstart',
155 -
        },
156 -
        {
157 -
          text: 'What is Andromeda',
158 -
          link: '/what-is-andromeda',
159 -
        },
160 -
      ],
161 -
    },
162 -
    {
163 -
      text: 'Apps',
164 -
      items: [
165 -
        {
166 -
          text: 'Feeds',
167 -
          link: '/apps/feeds',
168 -
        },
169 -
        {
170 -
          text: 'Jotts',
171 -
          link: '/apps/jotts',
172 -
        },
173 -
        {
174 -
          text: 'Sipp',
175 -
          link: '/apps/sipp',
176 -
        },
177 -
        {
178 -
          text: 'OG',
179 -
          link: '/apps/og',
180 -
        },
181 -
        {
182 -
          text: 'Shrink',
183 -
          link: '/apps/shrink',
184 -
        },
185 -
        {
186 -
          text: 'Parcels',
187 -
          link: '/apps/parcels',
188 -
        },
189 -
        {
190 -
          text: 'Posts',
191 -
          link: '/apps/posts',
192 -
        },
193 -
      ],
194 -
    },
195 -
    {
196 -
      text: 'DIY',
197 -
      items: [
198 -
        {
199 -
          text: 'Stack',
200 -
          link: '/diy/stack',
201 -
        },
202 -
        {
203 -
          text: 'Skills',
204 -
          link: '/diy/skills',
205 -
        },
206 -
      ],
207 -
    },
208 -
  ],
209 226
})
skills/darkmatter-styles/SKILL.md +2 −2
1 1
---
2 2
name: darkmatter-styles
3 -
description: Use when building any web UI for Steve - applies his personal dark aesthetic with Commit Mono font, #121113 background, white borders, minimal layout, and max-width centered content. Use for new pages, components, or when asked to match his existing style.
3 +
description: Applies the Darkmatter aesthetic - Commit Mono font, #121113 background, white borders, minimal layout, and max-width centered content. Use for new pages, components, or when asked to match the Andromeda style.
4 4
---
5 5
6 6
# Darkmatter Styles
7 7
8 8
## Overview
9 9
10 -
Steve's personal web aesthetic: dark, minimal, monospace. No frameworks, no decorative flourishes. Everything is functional and stark.
10 +
The Darkmatter aesthetic: dark, minimal, monospace. No frameworks, no decorative flourishes. Everything is functional and stark.
11 11
12 12
## Core Palette
13 13