···1# ligo.at
23-A decentralized links page powered by the [AT Protocol][atproto].
45## dependencies
6···1011Use the `generate_secrets.py` script or run `make .env`.
12000013## run
1415Either start a debug server with `make debug` or a production one with `make run`. Production needs the `PORT` environment variable.
1600000017[atproto]: https://atproto.com
18[uv]: https://docs.astral.sh/uv/
0
···1# ligo.at
23+A decentralized links page on top of [AT Protocol][atproto].
45## dependencies
6···1011Use the `generate_secrets.py` script or run `make .env`.
1213+## synchronization
14+15+`ligo.at` reads directly from the users' PDS. A small cache is used to serve profile pages quicker. The cache is updated on every profile write, and when requesting a profile with the `?reload` query parameter (any value, even empty). `ligo.at` also reads from the [Jetstream][jetstream], so updates made to a profile outside of `ligo.at` should also be available instantly.
16+17## run
1819Either start a debug server with `make debug` or a production one with `make run`. Production needs the `PORT` environment variable.
2021+The Jetstream ingestor can be started with `make ingestor`.
22+23+### systemd
24+25+Two systemd service files are found in the `dist` folder. They can be used to run both the server and the jetstream ingestor.
26+27[atproto]: https://atproto.com
28[uv]: https://docs.astral.sh/uv/
29+[jetstream]: https://atproto.wiki/en/wiki/reference/networking/jetstream
+1-1
pyproject.toml
···2name = "ligo-at"
3version = "0.0.1"
4description = "Decentralized links page on top of AT Protocol"
5-readme = "readme.md"
6requires-python = ">=3.13"
7dependencies = [
8 "aiodns>=3.5.0",
···2name = "ligo-at"
3version = "0.0.1"
4description = "Decentralized links page on top of AT Protocol"
5+readme = "README.md"
6requires-python = ">=3.13"
7dependencies = [
8 "aiodns>=3.5.0",