Malfestio#
Malfestio is a learning OS: flashcards + notes + lectures + articles, designed for daily study.
Social layer: publish/share/remix learning artifacts; follow curators; discuss.
Personas#
- Learner: studies daily; imports content; wants fast "review queue".
- Creator: makes decks/notes; publishes updates; wants feedback + forks.
- Curator/Teacher: bundles content into learning paths; annotates lectures/articles.
- Moderator/Community admin: handles reports, takedowns, spam.
Principles#
- Local-first study experience; offline study must not feel "second-class".
- Shareable artifacts are portable: Lexicon-defined schemas + stable IDs.
- Privacy by design: progress + recall history are private unless explicitly shared.
Data Model#
- Note: markdown + structure + citations + links to sources.
- Card: front/back (+ optional cloze, audio, image, code block).
- Deck: ordered/clustered cards (+ metadata, tags).
- Lecture: external URL + outline + timestamps + linked notes/cards.
- Article: URL + extracted text (readability style heuristics) + highlights + linked notes/cards.
- Collection/Path: curated bundle of decks + notes + sources.
System Architecture#
Frontend (SolidJS)#
- App shell + router-driven workspaces (Library / Study / Create / Social).
- Signals as primary state primitive; keep study session state in signals/store.
Backend (Rust)#
- Axum API gateway: REST/XRPC-ish endpoints, tower middleware, typed extractors.
- Services (logical, not necessarily microservices):
- Identity/Auth service (local + optional ATProto OAuth integration)
- Content service (notes/cards/decks/sources)
- Study service (queue generation + grading + scheduling)
- Social service (follows, feeds, comments, notifications)
- Search service (indexing + query)
- Moderation service (reports, takedowns, rules)
Storage#
- Postgres: canonical app DB (users, private study state, cache of published records).
- Object storage: images/audio, extracted article snapshots (if you store them).
- Search index: separate system (Meilisearch/Typesense/ZincSearch-pick one later).
Eventing#
- Internal outbox pattern (DB table) for:
- reindex jobs, notification fanout, federation publish steps