Skip to content

v0.2.2 - 2026-05-08

Choose a tag to compare

@nduckmink nduckmink released this 07 May 19:31

Release Notes

v0.2.2 - 2026-05-08

New features

Images in wiki pages

PDF documents now extract and persist images during ingestion. Images are embedded inline in wiki pages and rendered in the wiki viewer. The vision model (if configured) analyzes each image with page-level context to produce more accurate captions.

  • New SourceImage model stores image metadata and MinIO keys per source
  • wiki_images router resolves image references to presigned URLs at read time
  • New WikiImage frontend component with lazy loading and fallback state
  • useImageResolver hook fetches presigned URLs on demand

Embedding model catalog

Embedding models are now managed through a structured catalog instead of free-form text input. This eliminates two classes of production bugs: misspelled model IDs and dimension mismatches between stored vectors and the configured model.

  • Supported models: google/gemini-embedding-001, google/gemini-embedding-2, openai/text-embedding-3-small, openai/text-embedding-3-large
  • New Embedding section in Settings with model picker, cost info, and re-embedding progress tracking
  • Background re-embedding job with per-page progress, cancellation support, and status polling
  • Multi-dimensional embedding tables: wiki_page_embeddings_768, _1024, _1536, _3072
  • Admin can switch embedding models and trigger a full re-embed from the UI

Improvements

  • Vision captioning quality - captioning prompt now includes surrounding page text as context, producing more specific and accurate image descriptions
  • Image storage - images are stored with stable UUIDs and referenced from wiki content_md by ID rather than injected as inline captions; this makes wiki content portable across MinIO key changes
  • Wiki compiler - improved handling of image markers in the compilation pipeline

Docker & deployment

  • Self-contained Docker Compose - postgres, redis, and MinIO are now included in docker-compose.yml; no external infrastructure needed
  • MINIO_PUBLIC_ENDPOINT - new env var for presigned URL hostname. Must be set to a browser-accessible address (localhost:9000 for local Docker, <server-ip>:9000 for remote). Without it, presigned image URLs resolve to the internal Docker hostname and fail in the browser
  • POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB - postgres credentials moved from hardcoded values in docker-compose.yml to .env.docker
  • --env-file .env.docker - must now be passed explicitly to docker compose commands to avoid credential mismatch between the local .env and the Docker environment
  • Service name hostnames - MINIO_ENDPOINT, REDIS_HOST, and DATABASE_URL now use Docker Compose service names (minio, redis, postgres) instead of container names with underscores, which caused InvalidRequest (invalid hostname) errors in the MinIO SDK
  • Server deployment guide added to SETUP.md, covering Linux server setup, firewall config, and optional nginx + HTTPS

Bug fixes

  • Fixed MinIO presigned URLs returning 403 when MINIO_PUBLIC_ENDPOINT differed from MINIO_ENDPOINT - the presign client now uses a dedicated Minio instance configured with the public endpoint and pre-seeds the bucket region to avoid internal connectivity checks
  • Fixed SignatureDoesNotMatch on fresh Docker Compose deployments caused by Docker loading .env (local dev config) for variable substitution instead of .env.docker
  • Fixed Invalid Request (invalid hostname) in MinIO SDK caused by underscores in container names

Database migrations

  • 015_multi_dim_embeddings - adds per-dimension embedding tables and an embedding_jobs tracking table
  • 016_source_images - adds source_images table for persisted image metadata

Run after upgrading:

docker exec arkon_api alembic upgrade head

v0.2.0 - 2026-05-06

  • MCP server finalized with full tool set
  • Wiki versioning and draft/approval workflow
  • AI Skills system with department scoping
  • Workspace-scoped wiki and document management
  • Audit logging
  • RBAC v2 with custom roles and granular permissions