Four ground rules
-
Go service
Offline builds
The build runs with the network off, so every dependency has to come from disk. The same source gives the same binary on any machine.
-
Image · sha256
No version drift
Running images are pinned by digest, not by a tag that can move. A year from now we can still name the exact bytes that ran today.
-
PostgreSQL 18
Two databases, kept apart
The main store and the location catalog use separate credentials. If the catalog isn't configured, search is simply off. The main store never stands in for it.
-
Object store · CAS
Content-addressed
Place Packs are stored by content hash, so identical content is kept once. Every release leaves an archive and an event log, and can be rolled back whole.
Architecture
The apps only ever talk to the LCT API. Databases, storage and outside services all sit behind adapters, so any one of them can be swapped without touching the apps.
Dashed boxes are outside services. Upstream timeouts fall back, and providers can be swapped. Keys live only in server environment variables, never in code, images or logs.
Layer by layer
The home page says what each layer does for you. This is how each one is built.
-
L1
Accounts
Email sign-up, email and password sign-in. The database holds only a derived hash.
- Passwords go through Argon2id, with parameters tuned on the actual machine and a hard floor.
- The number of concurrent derivations is capped, so a sign-in rush can't take the server down.
- Access and refresh run on separate clocks, so a dropped connection doesn't log you out.
- Sign-up, sign-in, password changes and refresh each have their own rate limit. Password strength, attempt counts and lockouts are all tunable.
-
L2
Community
Images and text are stored apart, and the whole layer can be switched off. In this release it is.
- Photos live under their own storage root.
- A built-in term filter whose word list updates without a restart.
- Uploads have a hard size cap. Oversized files are refused.
-
L3
Locations
Places ship as whole Place Packs. Each is signed by its publisher, checked against a trust directory, then stored by content hash.
- Packs are staged and locked before release, so nobody reads a half-written one.
- The catalog can sit in its own database. Without one, search is off.
- A place that isn't in the library comes back as unknown.
-
L4
Weather and air
Data comes from QWeather, with an adapter ready for a different provider.
- Live, daily and air-quality caches each keep their own expiry.
- Requests are capped per minute and per day.
- Upstream timeouts fall back, so someone else's outage doesn't land on you.
-
L5
AI assistant
It calls DeepSeek, and both the provider and the endpoint can be changed.
- The layer can be switched off, and then the feature isn't there at all.
- An hourly and a daily quota, so a day's allowance can't vanish in an hour.
- Keys live only in server environment variables.
If the configuration is half there, the service refuses to start. Turn on a feature that sends email without setting up email delivery, and the process won't come up. The alternative is users who never get their mail and no clue on our side about why.
Work with us
Interfaces may still change before launch, but the architecture and deployment are as described above. If you want to integrate, talk about data, or you write Go and want in, one email is enough.
Email donaldkuke@gmail.com. Chinese-speaking readers can also join QQ group 824558022 (see the Chinese page). This page describes what LCT has deployed today. It isn't a promise of an opening date, a feature list or a service level.