Skip to content

POC Implementation Guide

The Proof of Concept validates the core Input → Process → Output loop of the Knowledge Hub in three focused implementation steps. Each step builds on the previous one, delivering a functional foundation that the MVP extends.

Status

Complete — superseded by the MVP. See POC Scope & Achievements for deliverables and MVP Scope for what was added next.

What the POC Validated

Before the step-by-step walkthrough, the POC proved:

  • Slack integration patterns (Socket Mode, Bolt SDK)
  • Notion bidirectional sync feasibility
  • AI summary generation with OpenAI
  • Category management and organization
  • Content ingestion from Slack messages and URLs
INPUT LAYER (Slack)
  Message shortcuts, global shortcuts, App Home

PROCESSING LAYER (Symfony)
  Knowledge capture, URL extraction, AI summaries, Notion sync

OUTPUT LAYER
  Notion pages, Slack DMs (digests), App Home dashboard

What the POC Proves

TIP

The POC is intentionally minimal — no subscriptions, no distribution tracking, no digest persistence. It proves the architecture works end-to-end with real data flowing through all layers, including AI-powered summarization.


Implementation Steps

Step 1 — Input: Create Lists & Add Knowledge

Users organize knowledge through Slack. They create themed lists (categories), add knowledge items via a modal, and save any Slack message as knowledge using the message action (three-dot menu).

Three user stories:

  • Story 1.1 — Create a list via modal (name, description, icon) from the App Home
  • Story 1.2 — Add knowledge via App Home button → empty AddKnowledge modal
  • Story 1.3 — Save any Slack message → AddKnowledge modal pre-filled with message text and first URL

Architecture established:

  • Full Orchestrator Pipeline: Controller → Orchestrator → PersistenceService → Repository
  • Mapper pattern for entity ↔ DTO transformation
  • 5 base infrastructure classes (BaseService, BaseDomainService, BaseOrchestrator, BaseMapper, BaseQueryService)
  • Slack message action shortcut registration with pre-fill logic
  • 2 entities (Category, Knowledge) with ORM relationships
MetricValue
Files25 (16 backend, 8 Slack, 1 app entry)
LOC~1,850
API routes4 (POST/GET /api/categories, POST/GET /api/knowledge)

Step 2 — Process: Backend Content Extraction

When a knowledge item is saved with a URL, the backend automatically fetches the page, extracts meaningful content from the HTML, and appends it to the knowledge item's content field. The user's original text is never replaced.

What changes for users:

  • Knowledge items with URLs now contain the full extracted page content appended below the user's notes
  • A urlMetadata JSON field captures extraction details (title, length, truncation status, content type)
  • No new user actions needed — extraction happens automatically during save

Architecture established:

  • Domain Service pattern for content processing (ContentExtractionService)
  • HtmlContentExtractor with smart element selection (<article><main><body>)
  • Value Object pattern (ContentExtractionResult) with factory methods
  • SSRF protection against localhost/private IP URLs
  • Graceful failure handling — extraction errors never block saves
MetricValue
Files3 new (+ 1 modified orchestrator)
LOC~320
Slack changes0

Step 3 — Output: AI-Enhanced Digest & DM Delivery

Users generate an ad-hoc digest for any list. The backend queries knowledge items, generates a 2–3 sentence AI summary for each item, and the Slack app delivers a formatted Block Kit DM with summaries and Notion links.

What users can do:

  • Click "Digest Maken" on the App Home → select a list and time period
  • Receive a formatted DM where each item has an AI-generated summary in Dutch
  • Click through to the item's Notion page via embedded links
  • If no items exist for the period → polite "Geen items gevonden" message

Architecture established:

  • Full AI provider stack: AiProviderInterfaceOpenAIService → OpenAI / OpenRouter
  • KnowledgeHighlightGenerator with hardcoded Dutch prompt template and AI fallback
  • DigestQueryService for read-only domain queries
  • DigestOrchestrator coordinating query → AI generation → Notion URL construction
  • Mock mode support for deterministic testing without API calls
  • Block Kit DM delivery via client.chat.postMessage() with per-item summaries + Notion links
MetricValue
Files12 (9 backend, 3 Slack)
LOC~872
AI provider files5 (reused by MVP)

Scope Boundaries

What's Excluded — MVP Deferral Matrix

A complete mapping of every feature excluded from the POC, why it was deferred, and which MVP phase introduced it.


Quick Stats

MetricTarget
Total files~40
Total LOC~3,042
Backend files28
Slack files12
Implementation steps3
API routes5
Slack modals3
Entities2 (Category, Knowledge)
Base classes5
AI provider files5