🇹🇷 Türkçe için tıklayın: stack.tr.md
Date: 2026-09-15
- Web + API: Axum (Rust), REST under
/v1/. Server-rendered Askama + HTMX, no Node. One repo, one binary. Bot reuses the same endpoints later. - DB: Postgres + sqlx. Row-lock swap transaction + outbox table.
embeddingis a JSONB placeholder for now; real pgvector column arrives with phase C. - Auth: email magic link IMPLEMENTED (15-min single-use tokens, HMAC sessions, LogMailer default / SMTP via SMTP_URL). Swaps, reports and profile edits require login; drops stay open intake.
- Voice storage: local
./data/voicein MVP, served static asvoice_url. No S3 setup. Moves to S3-compatible later without API change. - Deploy: Docker single binary + Fly.io (any Docker host works).
- API contract: openapi.yaml (hand-written, mirrors the code), RFC 9457 errors,
Idempotency-Keyon swap, cursor pagination.
- Modular monolith stays intact: B/C plug into the same REST + outbox, no core change.
- sqlx transaction covers atomic swap (two offers -> matched) with
SELECT ... FOR UPDATE. - pgvector arrives with phase C; until then the
Matchertrait stays fixed for the futureEmbeddingMatcherimpl.
- No microservices, no GraphQL, no S3 setup in MVP.
- Full-lockfile OSV scan: 1 hit,
rsa 0.9.10(RUSTSEC-2023-0071, Marvin timing oracle). - Verdict: NOT reachable. It arrives via
sqlx-macros-core(host/build-time only); the production target graph excludes it (cargo tree: 0 matches) and the binary contains norsa-crate symbols (onlyring/rustlsverification). sqlxusesdefault-features = falseso no MySQL/SQLite drivers ship.- Re-scan on every dependency change.