Project Overview
What is Yappa Knowledge Hub?
Yappa Knowledge Hub (internally "YapHub") is an AI-powered internal knowledge management tool designed for the team at Yappa. It solves the problem of scattered information across Slack messages, emails, notes, and deal updates by providing a centralised system for capturing, processing, and distributing knowledge.
Internship Context
| Detail | Value |
|---|---|
| Institution | UCLL University of Applied Sciences |
| Programme | Professional Bachelor |
| Duration | ~13 weeks (3 months) |
| Company | Yappa |
| Project | Internal Knowledge Hub (Kennisverzameltool) |
| Current Status | MVP Complete |
MVP Complete
The system is fully functional with knowledge capture, AI-powered summaries, digest generation and distribution, category subscriptions, and bidirectional Notion sync — all accessible through Slack.
Problem Statement
Internal knowledge at Yappa is currently scattered across Slack messages, forwarded emails, notes, deal updates, announcements, and external content. Information shared "in the moment" becomes hard to:
- Find later — no central search across knowledge sources
- Contextualise — different teams need different perspectives on the same information
- Convert into updates — weekly overviews and digests require manual effort
- Keep curated — no moderation or quality control mechanism
Vision
Build a central system that makes internal knowledge:
- Easy to capture — low-friction submission directly from Slack
- Smartly processed — AI summaries in Dutch for quick context
- Actively distributed — periodic digests by thematic list delivered via Slack DM
Core Concepts
Category (Thematische Lijst)
A curated stream of knowledge items for a specific topic. Each category has a name, description, emoji icon, target groups, and digest schedule configuration (frequency, day, time).
Knowledge
A single knowledge item submitted by a user — text, URL, or Slack message. Each item carries metadata, tags, status, and an AI-generated highlight summary.
Target Group
Audience labels (e.g., Developers, Marketers, CEO) stored as JSON arrays on categories and knowledge items. Synced from Notion's multi-select properties. Currently metadata — not used for filtering or routing.
Digest
A generated report per category, containing all knowledge items for a time period with AI summaries, formatted as Dutch Markdown and delivered to subscribers via Slack DM.
What Was Delivered
Technical Stack
| Layer | Technology | Purpose |
|---|---|---|
| Backend | PHP 8.2 + Symfony 7.3 | API, business logic, orchestration |
| Database | SQLite | Local data storage (Doctrine ORM) |
| AI | OpenAI / OpenRouter | AI-powered Dutch summaries |
| Platform | Slack (Bolt SDK) | Primary user interface |
| Sync | Notion API | Secondary storage and collaboration |
| Docs | VitePress + Mermaid | Documentation site |
Entities (5)
| Entity | Purpose |
|---|---|
| Category | Thematic lists with digest settings and target groups |
| Knowledge | Knowledge items with AI highlights, tags, Notion sync |
| Digest | Generated digest reports with statistics and content |
| DigestDelivery | Per-user delivery tracking with retry support |
| Subscription | User category subscriptions with soft-delete |
API Routes (18)
| Domain | Endpoints |
|---|---|
| Categories | POST/GET /api/categories, GET/PUT /api/categories/{id}/settings/digest |
| Knowledge | POST/GET /api/knowledge |
| Digests | POST generate, POST distribute, GET delivery-status, POST retry-failed, GET by category |
| Notion Sync | POST from-notion, POST categories-from-notion, POST to-notion |
| Subscriptions | POST subscribe, POST unsubscribe, GET user subscriptions, GET category subscribers |
Services (38 files across 12 directories)
| Domain | Services |
|---|---|
| Orchestrator | DigestOrchestrator, KnowledgeOrchestrator |
| Digest | 10 services: generation, formatting, creation, persistence, distribution, delivery tracking, scheduling, highlight generation, date parsing, query |
| Knowledge | Creation, persistence, query services |
| Subscription | Facade + query/persistence split |
| Notion | 11 services: sync, repositories, page builder, property extractor, markdown content |
| AI | Provider interface + OpenAI/OpenRouter implementation |
| Content | Content extraction + HTML parser |
| Transport | Message transport interface + Slack implementation |
What Was Not Built
The following were considered during planning but not implemented:
- Per-role AI summaries — The system generates one summary per item, not multiple for different audiences
- Prompt template management — Uses a hardcoded prompt constant
- Knowledge edit/delete UI — Only create and list operations have Slack UI
- Advanced search — Only basic keyword search
- PDF/RSS/YouTube processing — Only HTML content extraction
- Redis, Symfony Messenger — The system is synchronous with SQLite
- User authentication — Simple bearer token auth (ROLE_ADMIN)
Stakeholders
| Decision | Choice | Rationale |
|---|---|---|
| Primary channel | Slack | Where the team already works |
| AI strategy | Provider-agnostic | Flexibility to switch between OpenAI and OpenRouter |
| Ingestion UX | Message Shortcut + Modal | Lowest friction, no commands to memorise |
| MVP scope | Capture + AI highlights + Digests | Highest value, lowest complexity |