# share-svc

Tiny Go + SQLite service that stores character-sheet JSON blobs and returns
short, content-addressed IDs, so sheets share as `...?s=<id>` instead of a giant
inline `?c=` payload.

## API

| Method | Path         | Body        | Response            |
| ------ | ------------ | ----------- | ------------------- |
| POST   | `/api/s`     | sheet JSON  | `{"id":"<id>"}`     |
| GET    | `/api/s/{id}`| –           | sheet JSON          |

IDs are `base64url(sha256(json))[:12]`, so identical sheets dedupe and re-sharing
is idempotent. Payloads are stored deflated in a single SQLite file.

### Config (env)

| Var           | Default       | Notes                                            |
| ------------- | ------------- | ------------------------------------------------ |
| `ADDR`        | `:8090`       | Listen address. The unit binds `127.0.0.1:8090`. |
| `DB_PATH`     | `shares.db`   | SQLite file path.                                |
| `CORS_ORIGIN` | _(unset)_     | Set to allow a cross-origin dev frontend.        |

## Deploy

From the repo root:

```sh
just deploy-server                 # build (linux/amd64) + ship + restart
just go-arch=arm64 deploy-server   # if the host is arm64
```

That installs `/usr/local/bin/share-svc` and `share-svc.service`, then
`daemon-reload` + `enable --now` + `restart`. The SQLite DB lives in
`/var/lib/share-svc/` (created by the unit's `StateDirectory`).

### One-time Caddy setup

Add the `/fabula/api/*` reverse-proxy block from `Caddyfile.snippet` to your site
block (before the static `/fabula/*` handler) and reload Caddy.

## Local dev

`webpack serve` (port 8080) does not serve `/api/*`, so `?s=` sharing falls back
to inline `?c=` links. To exercise short links locally, run the service and point
the frontend at it:

```sh
CORS_ORIGIN=http://localhost:8080 go run ./server
```
