How the LCT backend runs

GoPostgreSQL 18Content-addressedSigned releasesUpdated

This page is for partners, developers and anyone thinking of joining. It describes how LCT is actually deployed today, not a plan. The home page covers what it does for photographers; the technical detail lives here.

Four ground rules

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Three products (Mark, Zlens, MuseFrame) connect to the LCT API; beneath it sit the PostgreSQL main store, the location catalog, a content-addressed object store and external upstreams (QWeather, DeepSeek, email delivery). Mark Browser · content & locations Zlens Android · accounts MuseFrame Web + Android · accounts LCT API · single Go binary offline build · image pinned by sha256 · per-action rate limits · upload caps · layered caches PostgreSQL 18 accounts / community Location catalog own PG · own credentials Object store · CAS Place Packs · images Upstreams QWeather · DeepSeek email delivery signed by publisher → checked against trust directory → stored by hash → logged → rolls back whole

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Write to us

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.