Skip to main content
Repositories

ELVIRA is a constellation, not a repo

The platform is 19 small, focused repositories under @EvilFlowersCatalog — a catalog at the centre, a fleet of workers around it, one protocol tying them together, and the student teams who built the whole thing. Jump to a layer:

Core platform

4 repos

Start here. The four pieces you would actually run — the catalog that holds everything, the portal people log into, the reader they open books in, and the importer that fills it.

Core platformActive

EvilFlowersCatalog

OPDS publication catalog server. Stores publications, exposes them over OPDS 1.2 (Atom) and OPDS 2.0 (JSON), and hosts many libraries from a single install. Django backend, Pydantic schemas, optional Readium LCP lending.

  • OPDS 1.2 and 2.0 endpoints
  • Multi-tenant — separate catalogs, ACLs and themes
  • Borrow / reserve / renew / return via Readium LCP
Python0.13.0 → 0.14.0 (develop)pushed 2026-05-25
Core platformActive

elvira-portal

React + Vite frontend. Catalog browsing, search, user shelves, university SSO. Single codebase, themed per deployment.

  • Per-deployment theming (FIIT STU, Catholic University in Ružomberok)
  • Umami analytics
  • Feature flags
TypeScriptpushed 2026-05-25
Core platformActive

EvilFlowersViewer

Embeddable PDF viewer built on pdf.js. In-document search, citation export (BibTeX/BibLaTeX/RIS), annotation layer, page-range sharing, theming. Ships as an npm package.

  • Citation export — BibTeX, BibLaTeX, RIS
  • Share a page range, not the whole file
  • Annotation and highlight layer
Vuepushed 2026-05-19
Core platformActive

evilflowers-importer

Imports publications from Kramerius and WebDAV sources, then uses an LLM (OpenAI or Ollama) to fill in missing metadata — titles, authors, abstracts. Outputs JSON the catalog can ingest.

Pythonpushed 2025-06-27

Workers

8 repos

The heavy lifting. Independent services on a job queue that read every publication — pulling text, captioning figures, reconstructing equations, transcribing video, encrypting loans — so the catalog can stay simple.

WorkersActive

evilflowers-text-service

Celery worker. Extracts text from PDF publications and emits it back to the catalog for indexing and downstream analysis.

Pythonpushed 2026-05-14
WorkersActive

evilflowers-search-service

Semantic search over the extracted text corpus. Sits behind the catalog search endpoint and consumes output from the text service.

Pythonpushed 2026-05-14
WorkersActive

evilflowers-lcpencrypt-worker

Celery worker wrapping Readium lcpencrypt. AES-256-CBC encryption for EPUB 2/3, PDF, Readium Web Pubs and W3C Audiobooks. Filesystem storage only.

Pythonpushed 2026-03-14
WorkersActive

evilflowers-image-service

Extracts figures from publications and runs captioning (PaliGemma) and classification (ViT / ResNet50). Outputs captions and tags for accessibility and image search.

Pythonpushed 2025-04-27
WorkersActive

evilflowers-equation-service

Detects equations in PDF publications and reconstructs them as LaTeX using the Nougat model.

Pythonpushed 2025-04-27
WorkersActive

evilflowers-video-service

Transcribes audio tracks from video publications using Whisper large-v3. Output is searchable text aligned to timestamps.

Pythonpushed 2025-04-27
WorkersActive

evilflowers-analyzer-service

Pipeline orchestrator. Routes a newly ingested publication to the text, image, equation and video services and aggregates their results.

Pythonpushed 2025-04-27
WorkersActive

evilflowers-ocr-worker

Dockerised Celery worker wrapping ocrmypdf. Adds a searchable text layer to scanned PDFs ingested by the catalog.

Dockerpushed 2024-10-01

Protocol

2 repos

The contract. One OpenAPI definition of how the pieces talk, plus the generated client so you don’t hand-write requests.

ProtocolActive

evilflowers-protocol

OpenAPI 3.1 definition of the EvilFlowers protocol — the wire contract between catalog, portal, importer and third-party clients.

OpenAPIpushed 2026-05-25
ProtocolActive

evilflowers-protocol-python

Python client and Pydantic v2 models generated from the protocol spec.

Pythonpushed 2026-03-31

Student team project

5 repos

The relay. Each FIIT STU student team leaves a repo behind — features and forks defended as thesis work, then handed to the next crew.

Student team projectActive

TP2025-T23

FIIT STU Team 23, 2025/26 academic year. Current student squad.

TypeScriptpushed 2026-05-08
Student team projectActive

elvira-ai-agent

In-portal chat assistant. Searches the catalog, summarises publications and answers questions about library holdings.

TypeScriptpushed 2026-02-11
Student team projectMaintenance

evilflowers-text-service-tp2025

Fork of the text service used by the 2024/25 team. Frozen at the version their thesis was defended against.

Pythonpushed 2025-12-21
Student team projectMaintenance

TP2024-T5

FIIT STU Team 5, 2024/25 academic year.

MDXpushed 2025-05-02
Student team projectMaintenance

TP2022-T16

FIIT STU Team 16, 2021/22 academic year. Where ELVIRA started.

TypeScriptpushed 2023-05-13

There’s more under the hood

Deployment manifests, runtime forks, benchmarks and the external standards ELVIRA implements don’t get cards here — they live on the ecosystem map and in the org. That’s where the wiring is.

In production at
Slovak University of TechnologyCatholic University in Ružomberok