- In development
- Release Candidate
Gospod
Romanian local-producer discovery with geospatial search, moderated publishing, and release-gated operations
A mobile-first discovery platform for Romanian local food producers. Buyers search by where they can receive a product, inspect approved availability and delivery terms, and contact producers directly. Producer drafts and exact locations remain private until reviewed. The system is a conditional release candidate for a controlled pilot, not a claim of nationwide production deployment.
- Go
- Next.js
- React
- TypeScript
- PostgreSQL
- PostGIS
- Keycloak
- Nginx
- Transactional Outbox
- ClamAV
- pgBackRest
- Restic
Private producer work becomes a reviewed public discovery surface
Trace public search, producer onboarding, moderated publication, or media processing. Private locations, drafts, originals, and operational state remain behind explicit ownership and approval boundaries.
A buyer searches by where a product can be received
Destination, category, availability, pickup, and delivery constraints reach the Go API through the single Nginx edge. PostgreSQL/PostGIS returns approved producer and product projections without exposing private drafts, exact locations, rejected media, or moderation notes.
- Destination, collection point, pickup, and home-delivery eligibility are first-class filters.
- Only approved projections enter discovery.
- Gospod does not own carts, orders, reservations, payments, invoices, couriers, or delivery.
- Buyers contact producers directly by phone or WhatsApp.
- Buyer → Nginx → Next.js web → Go API / OIDC BFF
- Go API / OIDC BFF → PostgreSQL + PostGIS
A producer application remains private until deliberate submission
The producer saves resumable drafts, supplies a private address or movable map pin, and submits idempotently. Broad OIDC roles are combined with database-backed ownership checks so one producer cannot edit another producer’s application.
- Save, submit, resubmit, archive, and optimistic-concurrency transitions are explicit.
- Exact addresses and unapproved pins remain private.
- Role checks are combined with record ownership.
- Application state and outbox work commit before background processing.
- Producer → Nginx → Next.js web → Go API / OIDC BFF → Keycloak
- Go API / OIDC BFF → PostgreSQL + PostGIS
- Go API / OIDC BFF → Private BlobStore
- Go API / OIDC BFF → Jobs + transactional outbox → Go worker
Moderation publishes reviewed projections rather than mutable drafts
A moderator claims an application, producer revision, product revision, or media item before deciding. The system records diffs and reasons, then approves, requests changes, rejects, suspends, or reactivates without exposing unapproved content.
- Review ownership and optimistic concurrency prevent silent competing decisions.
- Every decision has a typed state, reason, actor, and timestamp.
- Approval creates the public view; drafts stay private.
- Moderation and exports retain request and actor evidence.
- Moderator / admin → Nginx → Next.js web → Go API / OIDC BFF → Keycloak
- Go API / OIDC BFF → PostgreSQL + PostGIS
- Go API / OIDC BFF → Jobs + transactional outbox → Go worker → PostgreSQL + PostGIS
Untrusted uploads are transformed before public delivery
Original media enters private storage. A worker validates type and limits, decodes and re-encodes images, removes metadata, and creates immutable variants. Documents remain unavailable unless the ClamAV profile and its feature coupling are active.
- Raw uploads are never served as public assets.
- Decode/re-encode strips metadata and rejects malformed payloads.
- Unavailable scanning means unavailable document upload.
- Attempts, errors, dead-letter state, and stale-claim recovery stay durable.
- Producer → Nginx → Next.js web → Go API / OIDC BFF → Private BlobStore
- Go API / OIDC BFF → Jobs + transactional outbox → Go worker
- Go worker → ClamAV profile
- Go worker → Private BlobStore
- Go worker → PostgreSQL + PostGIS
- Nginx
Nothing.
- Nginx
Nothing.
- Nginx
Nothing.
- Next.js web
- Go API / OIDC BFF
- Keycloak
- Buyer
- Producer
- Moderator / admin
- Go API / OIDC BFF
- Nginx
Nothing.
- Nginx
- Go API / OIDC BFF
- Keycloak
- PostgreSQL + PostGIS
- Private BlobStore
- Jobs + transactional outbox
- Nginx
- Next.js web
- PostgreSQL + PostGIS
- Private BlobStore
- ClamAV profile
- Jobs + transactional outbox
- Go worker
- Go API / OIDC BFF
Nothing.
- Go API / OIDC BFF
- Go worker
- pgBackRest + Restic
Nothing.
- Go API / OIDC BFF
- Go worker
- pgBackRest + Restic
Nothing.
- Go worker
- PostgreSQL + PostGIS
- Private BlobStore
Nothing.
Only Nginx publishes a host port
Web, API, identity, worker, database, and storage remain on private networks.
Public data is approved data
Pending drafts, exact private locations, internal notes, and unapproved media cannot enter public responses.
A role is not record ownership
Producer mutations require both authenticated role context and database-backed ownership.
Commit before background work
Jobs and outbox records become retryable only after domain state is durable.
Originals are never public assets
Images are decoded and re-encoded; document handling fails closed without scanning.
Controlled-pilot release candidate
Substantial tests and operations tooling do not replace the remaining live-system, staging, restore, immutable-image, DNS/TLS, and legal gates.
Why it exists
Useful local-food discovery depends on destination, pickup, delivery, availability, locality privacy, producer trust, and direct contact—not only a generic product grid.
Gospod treats private onboarding and public discovery as one governed system with durable moderation and operations evidence.
Use cases
- Find products deliverable or collectable in a chosen Romanian locality
- Let producers maintain private drafts without self-publishing unreviewed content
- Moderate applications and revisions with visible decisions and audit
- Operate a controlled pilot with repeatable deployment and recovery
Capabilities
- Geospatial discovery
- PostgreSQL/PostGIS destination and locality search.
- Governed publication
- approved projections are separate from mutable drafts.
- Durable workflows
- jobs and outbox with retry, dead-letter, and stale-claim recovery.
- Safe media
- private originals, sanitation, immutable variants, and fail-closed documents.
- Identity
- OIDC Code + PKCE, opaque hashed sessions, CSRF, trusted origins, roles, and ownership.
- Release evidence
- API parity, fuzz/property/browser/system tests and explicit production gates.
Components
Public discovery
- Destination-based product and producer search
- Availability, pickup, delivery, phone, and WhatsApp actions
- Approved SSR metadata, robots, and sitemap surfaces
Producer workspace
- Resumable private applications and revisions
- Delivery settings and collection-point participation
- Ownership checks and optimistic concurrency
Moderation
- Claim-before-decision queues
- Diffs, reason templates, approval/change/reject/suspend/reactivate
- Audited exports and governance surfaces
Durable core
- Go API, worker, and migrations
- PostgreSQL/PostGIS domain and geospatial state
- Private BlobStore and transactional outbox
Release operations
- One-port topology checks and hardened Compose
- Optional ClamAV, OTel/Grafana, pgBackRest, and Restic profiles
- Documented staging, backup/restore, digest, DNS/TLS, and legal gates
Integrations
Identity and authorization
- Keycloak OIDC Code + PKCE
- Opaque hashed application sessions
- Role, ownership, CSRF, and trusted-origin enforcement
Geospatial data
- PostgreSQL/PostGIS with pg_trgm, unaccent, and pgcrypto
- Destination-oriented discovery
- Versioned migrations and API/OpenAPI parity
Media and documents
- Private BlobStore originals
- Decode/re-encode and metadata removal
- ClamAV-coupled fail-closed document profile
Operations
- Nginx one-port edge and hardened Compose
- Optional OTel/Grafana
- pgBackRest and Restic backup/restore workflows
Outcome
Gospod is presented honestly as a conditional release candidate for a controlled pilot: a governed Romanian discovery platform with geospatial search, private producer workflows, moderated publication, safe media processing, durable background work, and explicit operational release gates.