chore: update og images and docs
832ed794
14 file(s) · +92 −6
| 20 | 20 | | [**Bookmarks**](apps/bookmarks) | Minimal link saver with categories and JSON API | [](https://railway.com/deploy/DZfr5P?referralCode=JGcIp6) | |
|
| 21 | 21 | | [**Library**](apps/library) | Minimal book tracker with Google Books search | [](https://railway.com/deploy/tepdeI?referralCode=JGcIp6) | |
|
| 22 | 22 | | [**Easel**](apps/easel) | Daily public-domain painting from the Art Institute of Chicago | [](https://railway.com/deploy/0DpuRE?referralCode=JGcIp6) | |
|
| 23 | + | | [**Blobs**](apps/blobs) | Minimal web browser for S3-compatible blob storage | [](https://railway.com/deploy/3CH6O6?referralCode=JGcIp6) | |
|
| 23 | 24 | ||
| 24 | 25 | ## Shared packages |
|
| 25 | 26 |
Binary file — no preview.
Binary file — no preview.
Binary file — no preview.
Binary file — no preview.
Binary file — no preview.
Binary file — no preview.
| 1 | - | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> |
|
| 2 | - | <rect width="32" height="32" fill="#121113"/> |
|
| 3 | - | <text x="50%" y="50%" text-anchor="middle" dominant-baseline="central" |
|
| 4 | - | font-family="monospace" font-size="18" font-weight="700" fill="#ffffff">b</text> |
|
| 5 | - | </svg> |
Binary file — no preview.
Binary file — no preview.
| 1 | + | {"name":"blobs","short_name":"blobs","icons":[{"src":"/static/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/static/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#121113","background_color":"#121113","display":"standalone"} |
| 4 | 4 | <meta charset="UTF-8"> |
|
| 5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
| 6 | 6 | <title>{{block "title" .}}blobs{{end}}</title> |
|
| 7 | - | <link rel="icon" href="/static/favicon.svg"> |
|
| 7 | + | <link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png"> |
|
| 8 | + | <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png"> |
|
| 9 | + | <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png"> |
|
| 10 | + | <link rel="manifest" href="/static/site.webmanifest"> |
|
| 8 | 11 | <meta name="theme-color" content="#121113" /> |
|
| 12 | + | <meta property="og:title" content="blobs"> |
|
| 13 | + | <meta property="og:type" content="website"> |
|
| 14 | + | <meta property="og:image" content="/static/og.png"> |
|
| 15 | + | <meta name="twitter:card" content="summary_large_image"> |
|
| 16 | + | <meta name="twitter:image" content="/static/og.png"> |
|
| 9 | 17 | <link rel="stylesheet" href="/assets/darkmatter.css"> |
|
| 10 | 18 | <link rel="stylesheet" href="/static/app.css"> |
|
| 11 | 19 | </head> |
| 1 | + | # Blobs |
|
| 2 | + | ||
| 3 | + | Single-owner web browser for S3-compatible blob storage. Built for Cloudflare R2 but works with any S3-compatible endpoint (AWS S3, MinIO, Backblaze B2, etc). |
|
| 4 | + | ||
| 5 | + | - Single Go binary with embedded assets |
|
| 6 | + | - Password authentication with session cookies |
|
| 7 | + | - Lists every bucket the credentials can see |
|
| 8 | + | - Folder/file navigation with breadcrumbs |
|
| 9 | + | - Inline image thumbnails in folder view |
|
| 10 | + | - File detail page with metadata, presigned download link, and optional static public URL |
|
| 11 | + | - Upload (multi-file), replace, delete, and create folder actions |
|
| 12 | + | - SQLite for session storage |
|
| 13 | + | ||
| 14 | + | ## Configure |
|
| 15 | + | ||
| 16 | + | ### Environment Variables |
|
| 17 | + | ||
| 18 | + | | Variable | Description | Default | |
|
| 19 | + | |---|---|---| |
|
| 20 | + | | `BLOBS_PASSWORD` | Password for admin login | `changeme` | |
|
| 21 | + | | `BLOBS_DB_PATH` | SQLite database file path | `blobs.sqlite` | |
|
| 22 | + | | `HOST` | Server bind address | `127.0.0.1` | |
|
| 23 | + | | `PORT` | Server port | `3000` | |
|
| 24 | + | | `BLOBS_COOKIE_SECURE` | Enable HTTPS-only cookies | `false` | |
|
| 25 | + | | `BLOBS_MAX_UPLOAD_MB` | Single-shot upload cap in MB | `100` | |
|
| 26 | + | | `BLOBS_PRESIGN_TTL_SECONDS` | Presigned download URL lifetime in seconds | `3600` | |
|
| 27 | + | | `S3_ENDPOINT` | Generic S3 endpoint (omit for R2 shortcut) | _(unset)_ | |
|
| 28 | + | | `S3_REGION` | S3 region | `auto` | |
|
| 29 | + | | `S3_ACCESS_KEY_ID` | Access key ID | _(unset)_ | |
|
| 30 | + | | `S3_SECRET_ACCESS_KEY` | Secret access key | _(unset)_ | |
|
| 31 | + | | `R2_ACCOUNT_ID` | Cloudflare account ID (enables R2 endpoint shortcut) | _(unset)_ | |
|
| 32 | + | | `R2_ACCESS_KEY_ID` | R2 access key ID (fallback for `S3_ACCESS_KEY_ID`) | _(unset)_ | |
|
| 33 | + | | `R2_SECRET_ACCESS_KEY` | R2 secret access key (fallback for `S3_SECRET_ACCESS_KEY`) | _(unset)_ | |
|
| 34 | + | | `BLOBS_PUBLIC_URLS` | Per-bucket public URL prefixes (`bucket=url,bucket=url`) | _(unset)_ | |
|
| 35 | + | ||
| 36 | + | Pick one credential style: generic S3 (`S3_ENDPOINT` + `S3_ACCESS_KEY_ID` + `S3_SECRET_ACCESS_KEY`) or Cloudflare R2 (`R2_ACCOUNT_ID` + `S3_ACCESS_KEY_ID` + `S3_SECRET_ACCESS_KEY`). When a bucket appears in `BLOBS_PUBLIC_URLS`, the detail page surfaces a permanent public URL alongside the presigned link. |
|
| 37 | + | ||
| 38 | + | ## Deploy |
|
| 39 | + | ||
| 40 | + | ### Railway |
|
| 41 | + | ||
| 42 | + | The easiest way to deploy Blobs is with the one-click Railway template. See the [Deploying with Railway](/deploy-railway) guide for a walkthrough of the process. Blobs requires `BLOBS_PASSWORD` and either the `S3_*` or `R2_*` credentials to be set during the configure step. |
|
| 43 | + | ||
| 44 | + | [](https://railway.com/deploy/3CH6O6?referralCode=JGcIp6) |
|
| 45 | + | ||
| 46 | + | ### Docker |
|
| 47 | + | ||
| 48 | + | ```bash |
|
| 49 | + | cd apps/blobs |
|
| 50 | + | cp .env.example .env |
|
| 51 | + | # Edit .env with your password and S3/R2 credentials |
|
| 52 | + | docker compose up -d |
|
| 53 | + | ``` |
|
| 54 | + | ||
| 55 | + | This will start Blobs on port `3000` with a persistent volume for the SQLite session database. |
|
| 56 | + | ||
| 57 | + | ### Binary |
|
| 58 | + | ||
| 59 | + | Install with Homebrew: |
|
| 60 | + | ||
| 61 | + | ```bash |
|
| 62 | + | brew install stevedylandev/tap/blobs |
|
| 63 | + | ``` |
|
| 64 | + | ||
| 65 | + | Or grab a prebuilt binary from the [releases page](https://github.com/stevedylandev/andromeda/releases?q=blobs&expanded=true). |
|
| 66 | + | ||
| 67 | + | You can also build from source: |
|
| 68 | + | ||
| 69 | + | ```bash |
|
| 70 | + | cd apps/blobs && go build . |
|
| 71 | + | ``` |
|
| 72 | + | ||
| 73 | + | The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured `.env` file and run it directly. |
|
| 74 | + | ||
| 75 | + | ## Use |
|
| 76 | + | ||
| 77 | + | Log in at `/login` with your configured password. The buckets page lists every bucket your credentials can see. Click into a bucket to browse folders and files, upload new objects, replace or delete existing ones, and create folder markers. The file detail page surfaces metadata plus a presigned download URL (expires after `BLOBS_PRESIGN_TTL_SECONDS`) and, if configured via `BLOBS_PUBLIC_URLS`, a permanent public URL. |
| 41 | 41 | text: 'Apps', |
|
| 42 | 42 | items: [ |
|
| 43 | 43 | { |
|
| 44 | + | text: 'Blobs', |
|
| 45 | + | link: '/apps/blobs', |
|
| 46 | + | }, |
|
| 47 | + | { |
|
| 44 | 48 | text: 'Bookmarks', |
|
| 45 | 49 | link: '/apps/bookmarks', |
|
| 46 | 50 | }, |