Skip to content

MVP Scope — What Was Delivered

Overview

The Yappa Knowledge Hub MVP is a complete, working system that enables teams to capture, organize, and digest knowledge through Slack with AI-generated summaries and Notion integration.

Core Features

1. Knowledge Capture via Slack

Users capture knowledge without leaving Slack:

  • Message Shortcut — Save any Slack message as knowledge via the three-dot menu
  • Global Shortcut — Quick add from anywhere in Slack
  • App Home Button — Add knowledge from the dashboard
  • URL Content Extraction — Automatic page content extraction when a URL is included
  • Auto-sync to Notion — Every knowledge item creates a Notion page

2. Category Management

Organise knowledge into thematic lists:

  • Create categories with name, description, and emoji icon
  • Categories synced to Notion bidirectionally
  • Target groups (audience labels) synced from Notion multi-select
  • Digest configuration per category (frequency, day, time)

3. AI-Powered Summaries

Automatic Dutch-language summaries for knowledge items:

  • 2–3 sentence summaries generated by OpenAI or OpenRouter
  • Lazy generation — summaries created when needed for digests
  • Stored in Knowledge.highlight field
  • Graceful fallback to content truncation on AI failure
  • Single hardcoded prompt optimised for Dutch summaries

4. Digest Generation

AI-enhanced digest reports per category:

  • 7-step pipeline: category → date range → query → AI highlights → format → persist → Notion sync
  • Supports multiple date modes: last N days, date range, all time
  • Dutch-language Markdown formatting with per-item summaries, tags, and read time
  • Immutable snapshots — digests preserve the AI output at generation time
  • Synced to Notion with full content embedding

5. Digest Distribution

Deliver digests to the right people:

  • Slack DM delivery to category subscribers
  • Per-user delivery tracking with retry support (max 3 attempts)
  • Automatic subscriber resolution + initiator inclusion
  • Markdown → Slack mrkdwn conversion
  • Distribution results synced to Notion

6. Subscriptions

User-controlled notification preferences:

  • Subscribe/unsubscribe to categories via App Home overflow menu
  • Soft-delete with history preservation
  • Unique constraint: one subscription per user per category

7. Notion Integration

Bidirectional sync for all data:

  • 4 Notion databases: Knowledge, Categories, Digests, Subscriptions
  • Real-time outbound sync on creation/update
  • On-demand inbound sync from Notion
  • Full Markdown content embedding in Notion digest pages
  • Dual-ID resolution (local integer + Notion UUID)

8. Digest Scheduling

Automated digest generation:

  • Per-category scheduling: frequency (weekly/biweekly/monthly/quarterly)
  • Day of week and time configuration
  • Scheduler service checks due categories and triggers generation

Technical Architecture

Database

AspectImplementation
EngineSQLite
ORMDoctrine ORM with attribute mapping
Entities5: Category, Knowledge, Digest, DigestDelivery, Subscription
MigrationsSchema created via doctrine:schema:create
TimestampsGedmo Timestampable (auto-managed createdAt/updatedAt)

Service Architecture

Controller → Orchestrator → Domain Services → Persistence → Repository

                              AI Provider

                            Notion Sync Service

38 service files organized by domain:

  • Orchestrator layer (2 files) — coordinates multi-step workflows
  • Digest domain (10 files) — generation, formatting, distribution, scheduling, delivery tracking
  • Knowledge domain (3 files) — creation, persistence, query
  • Subscription domain (3 files) — facade + CQRS split
  • Notion domain (11 files) — sync, repositories, page builder, mappers
  • AI domain (2 files) — provider interface + OpenAI/OpenRouter implementation
  • Content domain (2 files) — extraction + HTML parser
  • Transport (2 files) — message transport interface + Slack implementation
  • Root (2 files) — CategoryService + EmojiConverter

API Surface

18 authenticated endpoints across 6 controllers:

ControllerEndpoints
CategoryControllerPOST/GET /api/categories
CategorySettingsControllerGET/PUT /api/categories/{id}/settings/digest
DigestControllerPOST generate, POST distribute, GET delivery-status, POST retry-failed, GET by-category
KnowledgeControllerPOST/GET /api/knowledge
NotionSyncControllerPOST from-notion, POST categories-from-notion, POST to-notion
SubscriptionControllerPOST subscribe, POST unsubscribe, GET user/{userId}, GET category/{categoryId}/subscribers

Authentication

All API endpoints require ROLE_ADMIN via bearer token authentication. The AccessTokenHandler validates tokens configured via environment variables.

AI Provider

Configuration via environment variables: OPENAI_MODEL, OPENAI_API_KEY, OPENAI_API_URL.

Entities

Category

FieldTypeDescription
idint (auto)Primary key
namestring (255)Display name (2-100 chars, required)
descriptionstring (255)Optional description
iconstring (50)Emoji icon, default :file_folder:
targetGroupsJSONAudience labels from Notion
notionIdstringNotion page reference
isActiveboolVisibility flag, default true
sortOrderintDisplay order, default 0
digestEnabledboolWhether scheduled digests are active
digestFrequencyenumweekly/biweekly/monthly/quarterly
digestDayintDay of week for scheduled digests
digestTimestringTime for scheduled digests
lastDigestAtdatetimeWhen last digest was generated
createdAt/updatedAtdatetimeGedmo timestamps

Knowledge

FieldTypeDescription
idint (auto)Primary key
titlestring (255)Title (3-255 chars, required)
contenttextMain content + extracted URL content
tagsJSONUser-defined tags
targetGroupsJSONAudience labels
userIdstringSlack user ID of creator
statusstringpending/Not started/In progress/Done/approved/rejected/archived/draft/published
urlstring (500)Source URL
urlMetadataJSONExtraction details
sourceMessageJSONOriginal Slack message data
highlighttextAI-generated 2-3 sentence Dutch summary
summariesJSONAI summary data from Notion sync
notionId / notionUrlstringNotion references
createdAt/updatedAtdatetimeGedmo timestamps

Digest

FieldTypeDescription
idint (auto)Primary key
titlestring (255)Auto-generated title
contenttextFull Markdown digest
periodstringDate range label
statusstringDone/sent
statisticsJSONhighlightCount, days, tokenCount, cost, durationMs
knowledgeHighlightsJSONImmutable snapshot of highlights at generation time
generatedBystringSlack user who triggered generation
notionId / notionUrlstringNotion references
createdAt/updatedAtdatetimeGedmo timestamps
categoryManyToOneRequired category reference
knowledgesManyToManyLinked knowledge items

DigestDelivery

FieldTypeDescription
idint (auto)Primary key
userIdstringRecipient Slack user ID
deliveryChannelstringslack/notion/email
statusstringpending/sent/failed
retryCountintRetry attempts (max 3)
errorMessagetextFailure details
sentAtdatetimeDelivery timestamp
digestManyToOneRequired digest reference (CASCADE)

Subscription

FieldTypeDescription
idint (auto)Primary key
userIdstringSubscriber Slack user ID
slackUserNamestringDisplay name
isActiveboolDefault true
subscribedAtdatetimeSubscription timestamp
unsubscribedAtdatetimeUnsubscription timestamp (null if active)
notionIdstringNotion page reference
categoryManyToOneRequired category reference (CASCADE)

What's Not in the MVP

FeatureStatusNotes
Per-role AI summariesNot builtSingle summary per item
Prompt template managementNot builtHardcoded prompt constant
Knowledge edit/delete UINot builtOnly create + list
Advanced searchNot builtBasic keyword search only
PDF/RSS/YouTube processingNot builtHTML only
Redis cachingNot builtNot needed for current scale
Symfony MessengerNot builtSynchronous processing
User authentication systemNot builtSimple bearer token
Web dashboardNot builtSlack-only interface