Changelog¶
All notable changes to Lingo are documented here. Format follows Keep a Changelog.
[0.5.5] - 2026-03-27¶
Fixed¶
- Export endpoint auth (P0):
GET /api/v1/exportnow requires authentication viaCurrentUserdependency. Previously any unauthenticated caller could paginate the entire glossary with no token required. Fixes #9.
[0.5.4] - 2026-03-26¶
Added¶
- Integration test infrastructure:
tests/integration/conftest.pywith real Postgres fixtures — runs Alembic migrations once per session, NullPool engine per test, TRUNCATE for isolation between tests, lifespan override to skip scheduler/MCP, and safedependency_overridesteardown. - Integration tests for terms API:
tests/integration/test_terms.pycoversPOST /api/v1/terms(201, field validation, auth required) andGET /api/v1/terms(200, correct shape, created terms appear). - Makefile:
make test,make test-unit,make test-integration,make db-up,make db-down.
[0.5.3] - 2026-03-26¶
Added¶
- CORS middleware (P0):
CORSMiddlewareadded withallow_origins=[settings.app_url]— scoped to the configured app URL (default:http://localhost:8000, overridable viaLINGO_APP_URL).
[0.5.2] - 2026-03-26¶
Fixed¶
- Concurrent vote race condition (P1): Vote insert, count, and status transition now use a CAS
UPDATE ... WHERE status=<expected> AND version=<seen>— two concurrent requests both hitting the threshold now result in exactly one status transition. - API shape mismatch (P0):
GET /api/v1/termsnow returns{items, total, offset, limit, counts_by_status}envelope instead of a bare array. - Auth bypass (P0):
X-User-Idheader now gated behindsettings.dev_mode; rejected with 401 in production. - TermDetail crash (P0):
term.relationshipsguarded with?? []— accessing.lengthon the missing field was crashing the detail panel on every open. - Form state on cancel (P1): AddTermModal Cancel button now resets all fields and validation errors before closing.
- Status filter counts (P1): Backend returns
counts_by_statusin the list response — per-status counts now reflect all terms across all pages. - Alembic downgrade (P1):
downgrade()now dropsjobtype,jobstatus, andrelationshiptypeenum types, preventing "type already exists" error on re-upgrade. - Double-submit race (P2): AddTermModal submit button now uses
isPendingfrom TanStack Query mutation instead of localsubmittingstate.
Added¶
TermsListResponsePydantic schema withitems,total,offset,limit, andcounts_by_statusfields.VoteResponseTypeScript type infrontend/src/types/index.ts.
[0.5.0] - 2026-03-26¶
Added¶
- React + Vite + Tailwind v4 SPA frontend (
frontend/) compiled intosrc/lingo/static/. SearchBarwith live search and//Cmd+Kkeyboard shortcut.StatusFilterwith filter pills and live per-status counts.TermRow,TermDetail,AddTermModal,DevModeBannercomponents.- TanStack Query hooks (
useTerms,useTermDetail,useAddTerm,useVoteTerm,useDisputeTerm). - FastAPI SPA fallback route serving
index.htmlfor all unmatched paths. - 47 Vitest + React Testing Library tests.
Fixed¶
- Alembic migration template (
alembic/script.py.mako) was missing from the repo. - Initial database schema migration — creates all 7 tables.
[0.4.0] - 2026-03-26¶
Added¶
lingoCLI entry point via Typer:define,add,list,exportcommands.- CLI reads
LINGO_APP_URL,LINGO_API_TOKEN, andLINGO_DEV_USER_ID. - 16 new unit tests covering all CLI commands and error paths.
[0.3.0] - 2026-03-26¶
Added¶
- APScheduler
AsyncIOSchedulerwired into FastAPI lifespan. LingoDiscoveryJob— daily 2 AM Slack acronym scan.LingoStalenessJob— weekly Monday 3 AM stale-term DMs.- Both jobs persist a
Jobrow with status,progress_json, and error. - 17 new unit tests covering scheduler setup and both jobs.
[0.2.0] - 2026-03-26¶
Added¶
- Slack bot via
slack-boltAsyncApp in Socket Mode. /lingo define,/lingo add,/lingo vote,/lingo exportslash commands.send_dispute_dm,send_promotion_notification,send_staleness_dmnotification helpers.staleness_confirmandstaleness_updateBlock Kit action handlers.- 17 new unit tests covering all handlers.
Changed¶
handle_lingo_addnow requires a linked Lingo account; anonymous term creation via Slack is rejected.
[0.1.0] - 2026-03-01¶
Added¶
- Initial project scaffold (FastAPI, SQLAlchemy async, Alembic, uv).
- Full REST API for terms, votes, disputes, history, relationships, export.
- OIDC/SSO auth middleware (HS256 JWT) and MCP Bearer token auth.
- FastMCP app mounted at
/mcpwithget_term,search_terms,list_termstools. - Dev mode auth (
LINGO_DEV_MODE=true,X-User-Idheader). - Docker + docker-compose setup.