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