Full security audit completed
The July security audit covered the whole surface: threat modeling, Docker/nginx/MinIO hardening, CI image checks, the production checklist, plus PASETO/OpenAPI and XSS-sensitive frontend paths.
Changelog
Major changes to the site and knowledge base, grouped by month: public content, admin workflows, quality, security, and infrastructure.
The July security audit covered the whole surface: threat modeling, Docker/nginx/MinIO hardening, CI image checks, the production checklist, plus PASETO/OpenAPI and XSS-sensitive frontend paths.
Admin authorization gained sliding server-side sessions: active refresh extends the idle lifetime only up to the absolute lifetime cap, and expired sessions are physically pruned by a daily background task. Team member details now show active sessions with safe device labels and can revoke the current, one, all, or other sessions.
The site gained an updates page with compressed site history focused on major milestones: public content, admin workflows, quality, security, and infrastructure.
The queue gained a shared RU/EN Markdown form with sticky actions, create/reject-and-next and skip flows, while txt/csv/xlsx imports now show a preview, validation errors, and exact duplicates before confirmation. The shared form also gained a provider-agnostic RU→EN workspace with connected field pairs, completeness and identical-text review, direct EN preview, and versioned JSON copy/import that preserves Markdown, code, URLs, and typed wiki links. The separate machine boundary for AI agents now stays at the edge: seven REST operations are mounted in the main Litestar app and reuse its settings, DI, and DB session instead of a separate process and UDS. The dedicated WireGuard-bound nginx mTLS listener forwards only an exact allowlist, while the public listener returns 404 for the internal path and strips forged certificate headers. MCP remains a local stdio bridge to five Draft-only operations. Distinct certificates, scopes, and privacy-safe audit remain; the simplification intentionally shares the backend process, DB role, secrets, and availability.
Owners and administrators can maintain author-isolated people records with contacts and birthdays, tags, typed relationships, Markdown notes, photos, and attachments. Annual memorable dates gained calendar sorting, links to people, tags, notes, and private attachments, with read-only backlinks on people records. Private files stay separate from the public media bucket, are read only through an author-checking backend stream, and return 404 at the public S3 edge.
CI/CD quality, smoke, and deploy jobs are easier to follow, production deploys require manual approval again, while file handling, statistics, mobile admin flows, locale-aware dates, and unsaved-change protection across admin forms received July polish.
Owners and administrators can now inspect cache domains, clear them or start an observable warm independently, and inspect and prune expired sessions.
Articles, matrix questions, and the RU→EN workspace moved from Toast UI to a shared CodeMirror editor with separate pseudo-rendered Editor, plain Source, and sanitized Preview modes, layout-independent shortcuts, smart lists and fences, search, and ordered multi-image insertion. Markdown tables are now interactive while retaining portable plain source: cells form rectangular selections; Delete and Cut adaptively clear cells or remove fully selected rows, columns, and the whole table; edge-only plus controls add rows and columns; and edge drag handles reorder them with visible pickup and drop markers. The grid now reads as part of the editor without card chrome or phantom columns: responsive columns and plus controls stay within the editor width, empty cells open without jumping the page, and lines around a table are not covered. The active cell keeps a caret at the input position even when empty, keeps repeated Chrome and Firefox input in the addressed cell, and does not move the page while typing. The Markdown delimiter takes no visual row, while a protected blank line after the table keeps following prose out of the grid in both Editor and Preview and aligned with its gutter number. Empty rows keep their height, and arrow navigation does not skip ordinary text around a table. A context menu groups structural actions, sorting, and alignment, while TSV and CSV remain available through the clipboard. Wiki-links now have syntax-aware highlighting and two-stage domain/target completion: Draft and Published content is discoverable together, while keyboard-first insertion leaves room for an optional label. The editor now grows with its content instead of scrolling vertically inside itself, while sticky mode controls, a compact all-command icon toolbar, and the shortcut reference remain available throughout long documents. Accessible fullscreen preserves the current text, selections, and undo history, keeps focus inside the editor, and returns the author to the same place in the form on exit.
Articles, matrix question pages, and the engineering case-study gained Angular SSR, metadata, Open Graph, JSON-LD, sitemap, and robots.txt coverage.
Moderators, the question queue, txt/csv/xlsx imports, the matrix structure editor, article validation, and the resume workspace moved into the protected admin.
Query-plan checks, Lighthouse gates, Trivy, pip-audit, Hadolint, Dockle, TaskIQ cache warming, and hotswap deploys with readiness health checks landed.
The public knowledge base moved to Angular with the matrix, articles, RU/EN UI localization, filters, view analytics, and early performance checks.
The frontend gained Angular structure, environments, a typed API client, routing, the base shell, and the first matrix components.
Login, logout, draft/publish actions, matrix question CRUD, nginx subdomains, and HTTPS became part of the working project.
The content editor gained presigned uploads through S3-compatible storage, file-name generation, and a table view for the competency matrix.
ADRs, domain documentation, coverage badges, Valkey cache, Argon2 hashing, auth-layer separation, and Russian admin localization set the project baseline.
Blog posts, GitHub Actions quality checks, coverage badges, deployment workflow, and publication-oriented container work started.
The Litestar UI gained matrix pages, search, the about page, light/dark theme, sitemap.xml, HTML sitemap, robots.txt, basic SEO markup, and Sentry.
FastAPI was replaced with Litestar, the public UI temporarily moved through templates and HTMX, and admin and public contours started to split.
The project gained a backend/frontend split, the first frontend-to-API wiring, Docker Compose, auth tests, MinIO helpers, and README updates for the new shape.
Admin, import/export, and endpoints for sheets, subsections, filtering, and question details became the first working matrix contours.
The first repository version and baseline security pipeline appeared; that is where the site history as a standalone knowledge base begins.