Gohper server baked by ATproto
  • Crystal 98.1%
  • Just 1.2%
  • Dockerfile 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Alexander Fortin 659799f737
All checks were successful
Release / build-and-push-1 (push) Successful in 1m18s
Release / build-and-push (push) Successful in 0s
Release / publish-release-1 (push) Successful in 7s
Release / publish-release (push) Successful in 0s
Release / deploy-1 (push) Successful in 3s
Release / deploy (push) Successful in 0s
feat: first draft
2026-10-26 16:18:46 +07:00
.forgejo/workflows feat: first draft 2026-10-26 16:18:46 +07:00
scripts feat: first draft 2026-10-26 16:18:46 +07:00
spec feat: first draft 2026-10-26 16:18:46 +07:00
src feat: first draft 2026-10-26 16:18:46 +07:00
.ameba.yml feat: first draft 2026-10-26 16:18:46 +07:00
.env.example feat: first draft 2026-10-26 16:18:46 +07:00
.gitignore feat: first draft 2026-10-26 16:18:46 +07:00
CHANGELOG.md feat: first draft 2026-10-26 16:18:46 +07:00
Containerfile feat: first draft 2026-10-26 16:18:46 +07:00
justfile feat: first draft 2026-10-26 16:18:46 +07:00
lefthook.yml feat: first draft 2026-10-26 16:18:46 +07:00
LICENSE feat: first draft 2026-10-26 16:18:46 +07:00
README.md feat: first draft 2026-10-26 16:18:46 +07:00
renovate.json feat: first draft 2026-10-26 16:18:46 +07:00
shard.lock feat: first draft 2026-10-26 16:18:46 +07:00
shard.yml feat: first draft 2026-10-26 16:18:46 +07:00

💎 Crystal Goph 💎

A Gopher server backed by an ATproto PDS, written in Crystal.

Serves your Bluesky posts, profile, and images as a Gopher hole over TCP — the PDS is the source of truth.

How to run it

Configuration via environment variables only:

Variable Default Meaning
DID — (required) did:plc:... — the repo owner DID
PDS_URL resolved via plc.directory from the DID optional override, e.g. https://social.l3x.in
LISTEN_BIND 0.0.0.0 bind address
LISTEN_PORT 7070 listen port
ADVERTISE_HOST localhost host written into gophermaps
ADVERTISE_PORT LISTEN_PORT port written into gophermaps
CACHE_DIR ./cache snapshot + blob cache
POLL_INTERVAL 60 seconds between PDS head checks
LOG_LEVEL info debug/info/warn/error/none

Run as:

  • (Podman) container: podman run --rm forge.l3x.in/alex/crystalgoph:latest
  • or build the binary: crystal build --release --output bin/crystalgoth src/main.cr && ./bin/crystalgoth

Flags: --resync forces a full resync, --version, --help.

Development

Requirements:

  • Crystal >= 1.22.0 (runtime)
  • Just >= 1.59.0 (task runner)

Setup

just setup  # Install dev dependencies (Ameba) and build the bin/ameba launcher
just        # List all available commands

License

MIT — see LICENSE.