Van Cloud naar Lokaal - Een Council of LLMs voor Development
De afgelopen maanden heb ik intensief gewerkt met cloud-based AI development tools zoals Cursor met Claude. En eerlijk? Ik ben er super blij mee. De kwaliteit, snelheid en integratie zijn fantastisch. Maar er zit een addertje onder het gras: vendor lock-in, privacy concerns bij gevoelige projecten, en vooral - de kosten lopen snel op. Bij intensief gebruik betaal je al gauw β¬100-200/maand voor API calls, en bij heavy development kan dat oplopen tot β¬1000-2000/maand.1
Tijd voor een experiment: een volledig lokale AI development omgeving, waarin niet één maar een heel team van gespecialiseerde LLMs samenwerkt aan software development. Het concept van een 'Council of LLMs' - meerdere AI-agents die samenwerken - is niet nieuw. Platforms zoals AutoGPT, BabyAGI, en MetaGPT hebben dit al verkend,2 en Microsoft Research werkt aan AutoGen voor multi-agent systemen.3 Maar kan dit concept ook lokaal werken? En nog belangrijker: kan een Council of LLMs een menselijk development team vervangen?
Dat is de uitdaging die dit blog probeert te beantwoorden.
β UPDATE: Het Werkt Echt!β
4 januari 2026 - Na het schrijven van dit blog heb ik het concept daadwerkelijk getest. En het werkt. Echt.
De Testβ
Ik heb de Council een simpele opdracht gegeven: "Bouw een REST API voor een contactformulier met validatie." Geen code, geen voorbeelden, alleen deze requirements.
Wat er gebeurde (in 15 seconden):
- Geert (Product Owner) brak het op in 2 user stories met acceptance criteria
- Saskia (Scrum Master) maakte een sprint plan met 3 taken en dependencies
- Johnie (Backend Developer) schreef werkende Flask API code (23 regels)
- Boris (Security Expert) deed een security review en vond 2 echte problemen
- Linda (Test Engineer) genereerde een pytest test suite (103 regels)
Het model: qwen2.5-coder:1.5b (slechts 986MB!)
De output: Werkende, executable code die je direct kunt draaien
De tijd: 15 seconden totaal
De kosten: β¬0 (100% lokaal)
Kwaliteit Checkβ
Johnie's gegenereerde code:
from flask import Flask, request, jsonify
from pydantic import BaseModel, ValidationError
app = Flask(__name__)
class ContactForm(BaseModel):
name: str
email: str
subject: str
message: str
@app.route('/submit-contact', methods=['POST'])
def submit_contact():
try:
form_data = ContactForm.parse_obj(request.json)
submission_id = "12345"
return jsonify({'submission_id': submission_id}), 201
except ValidationError as e:
return jsonify({'error': str(e)}), 400
Dit is geen fake demo. Deze code is echt gegenereerd door een LLM agent. Je kunt het zelf draaien:
# Installeer dependencies
pip install flask pydantic
# Run de API
flask run
# Test het
curl -X POST http://localhost:5000/submit-contact \
-H "Content-Type: application/json" \
-d '{"name":"Test","email":"test@test.com","subject":"Hi","message":"Test message"}'
# Response:
# {"submission_id":"12345"}
Boris's security review was spot-on:
- β Email field heeft geen format validation
- β Message field heeft geen length limit
- β Aanbeveling: Voeg regex validation toe + max length
Linda's tests dekten happy path, edge cases (empty data, invalid email), en error handling.
Wat Dit Betekentβ
Is het perfect? Nee. De code mist logging, docstrings, en de tests hebben enkele bugs.
Is het nuttig? Absoluut. Dit is een solide eerste draft die in 15 seconden werd gegenereerd.
Zou ik een junior developer vervangen? Voor simpele CRUD APIs? Misschien wel.
Zou ik een senior developer vervangen? Nog niet. Maar we zijn dichter dan ik dacht.
De volledige test output staat in council-real-output/ in de repo. Alles is echt. Niets is gesimuleerd.
Lees verder voor hoe je dit zelf opzet β
Waarom Lokaal? We Hebben Toch Cloud?β
Laat ik voorop stellen: cloud-based AI tools zijn geweldig. Cursor met Claude Sonnet heeft me enorm geholpen, en ik blijf het gebruiken voor veel projecten. Maar er zijn goede redenen om ook lokaal te experimenteren:
De Cloud Voordelen (Die We Behouden Willen)β
- Kwaliteit: Claude Sonnet 3.5/4 is extreem goed in code generatie
- Snelheid: No setup, gewoon werken
- Updates: Altijd de nieuwste modellen zonder gedoe
- Integratie: Perfect geΓ―ntegreerd in de IDE
Maar Ook Nadelenβ
- Privacy: Bij gevoelige overheidsprojecten of bedrijfscode is "naar de cloud" niet altijd mogelijk4
- Vendor Lock-in: Afhankelijk van één provider (Anthropic/OpenAI)
- Kosten: Bij intensief gebruik lopen de API calls op
- Controle: Geen invloed op model gedrag of specialisatie
- Offline: Geen internet = geen AI
De Lokale Propositieβ
Wat als we het beste van beide werelden kunnen combineren? Cloud waar het kan, lokaal waar het moet. En wat als we lokaal niet één LLM gebruiken, maar een heel team van gespecialiseerde modellen die samenwerken?
De Tooling: Open Source Stackβ
Dit experiment is volledig gebouwd op open source tooling. Hier zijn de belangrijkste componenten:

Stack overzicht:
- n8n: Workflow orchestration - het zenuwstelsel van ons systeem
- Ollama: Local LLM runtime - draait de modellen
- DeepSeek Coder / Qwen / Llama: De LLM modellen zelf
- OpenCode: Open source AI coding agent (terminal, IDE, desktop)5
- PostgreSQL + pgvector: Vector database voor code embeddings en context6
- Git: Version control en samenwerking
- Playwright/Puppeteer: Browser automation voor testing
Het Concept: Council of LLMsβ
Hier is mijn experiment: in plaats van één generalist LLM, creëer ik een council - een groep gespecialiseerde AI agents die elk een rol hebben in het development proces, vergelijkbaar met een echt dev team.
De Team Structuurβ
Execution Layer: De Developers (4 LLMs)β
2x Frontend LLMs - elk met een net iets ander karakter:
- Anita (Frontend Alpha): Focus op UI/UX, toegankelijkheid, gebruikerservaring
- Context: React best practices, design systems, WCAG richtlijnen
- Karakter: Perfectionistisch op detail, denkt vanuit de gebruiker
- Henk (Frontend Beta): Focus op performance, state management, architectuur
- Context: Performance patterns, bundle optimization, advanced React
- Karakter: Technisch, optimalisatie-gedreven
2x Backend LLMs - ook met specialisaties:
- Johnie (Backend Alpha): Focus op API design, database modeling, business logic
- Context: REST/GraphQL patterns, database normalisatie, domain modeling
- Karakter: Architecturaal, denkt in systemen
- Ingrid (Backend Beta): Focus op security, performance, infrastructure
- Context: Security patterns, caching strategies, scalability
- Karakter: Paranoia (op een goede manier), performance-minded
Management Layer: De Coordinators (3 LLMs)β
Thierry (Lead Tech): De technische vraagbaak en architect
- Beantwoordt technische vragen van Anita, Henk, Johnie en Ingrid
- Maakt architecturale beslissingen
- Lost technische blokkades op
- Context: Breed, alle tech stacks en patterns
Geert (Product Owner): De strategische richting
- Bepaalt feature prioriteit
- Schrijft user stories en acceptance criteria
- Bewaakt de product visie
- Context: Product management, user needs, business value
Saskia (Scrum Master): De dirigent van het orkest
- Stuurt de sprint aan
- Verdeelt werk over Anita, Henk, Johnie en Ingrid
- Bewaakt Definition of Done
- Zorgt voor samenwerking
- Context: Agile methodologie, team management
Quality Layer: De Gatekeepers (2 LLMs)β
Boris (Security Review): De paranoia-agent
- Reviewed alle code op security issues
- Checkt OWASP Top 10, injection attacks, auth flows
- Moet elke PR goedkeuren
- Context: Security best practices, CVE databases, threat modeling
Linda (Test & QA): De quality guardian
- Schrijft en runt tests
- Doet visuele browser testing
- Moet elke PR goedkeuren
- Context: Testing strategies, E2E testing, visual regression
- Special ability: Heeft toegang tot een browser om functionaliteit daadwerkelijk te testen
Hoe Ze Samenwerken: Sprint-Based Developmentβ
Het idee is om te werken in sprints - afgebakende werkpakketten met een duidelijk doel:
Sprint flow in detail:
1. Sprint Planning
ββ> Geert (Product Owner): Definieert features en acceptance criteria
ββ> Saskia (Scrum Master): Breekt af in taken, wijst toe aan developers
2. Development
ββ> Anita, Henk, Johnie, Ingrid: Werken parallel aan toegewezen taken
ββ> Thierry (Lead Tech): Ondersteunt bij blokkades
ββ> Code wordt gecommit als feature branches
3. Code Review
ββ> Partner Review: Anita reviews Henk en vice versa, Johnie reviews Ingrid
ββ> Boris (Security): Checkt alle PRs op security
ββ> Linda (Test): Schrijft tests, test in browser
ββ> Alle drie moeten goedkeuren voor merge
4. Sprint Review
ββ> Saskia: Evalueert wat af is
ββ> Geert: Accepteert of wijst af
ββ> Team: Retrospective input voor volgende sprint
5. Deploy
ββ> Als Definition of Done is bereikt: merge en deploy
Definition of Doneβ
Elke story is pas "done" als:
Checklist detail:
- β Code is geschreven en werkt
- β Partner developer heeft gereviewd en goedgekeurd (Anita β Henk, Johnie β Ingrid)
- β Boris (Security) heeft gereviewd en goedgekeurd
- β Linda (Test) heeft tests geschreven en in browser getest
- β Code voldoet aan style guide en lint regels
- β Acceptance criteria zijn gehaald
- β Geert (Product Owner) heeft geaccepteerd
De Tech Stack: Open Source All The Wayβ
Voor dit experiment kies ik bewust voor open source tooling, passend bij mijn overtuiging dat open source cruciaal is voor digital soevereiniteit7:
OpenCode: De AI Coding Agentβ
OpenCode.ai - De open source AI coding agent voor dit experiment:5
- 45.000+ GitHub stars - bewezen en vertrouwd door 650.000+ developers
- Multi-provider support: 75+ LLM providers via Models.dev, inclusief lokale modellen
- Cross-platform: Terminal, IDE extensie, en desktop app (Windows, Mac, Linux)
- LSP enabled: Automatisch de juiste Language Server Protocols voor LLMs
- Multi-session: Meerdere agents parallel op hetzelfde project
- Privacy-first: Geen code of context data opslag
- Claude Pro support: Log in met je eigen Anthropic account
- Open source: Volledig transparant en community-driven (https://opencode.ai)
Voor ons Council is OpenCode perfect omdat het:
- Native lokale model support heeft via Ollama
- Multi-agent workflows ondersteunt (meerdere sessies parallel)
- LSP integration heeft (agents begrijpen code context beter)
- Cross-platform werkt (Windows, Mac, Linux zonder gedoe)
n8n: De Orchestratorβ
n8n is een open source workflow automation tool die perfect is voor het orkestreren van onze LLM council8:
- Visual workflow builder: Ontwerp de sprint flow visueel
- LLM integrations: Native support voor lokale LLMs (Ollama, LM Studio)
- Git integration: Commit, branch, PR automation
- Browser automation: Voor de Test LLM om visueel te testen
- State management: Houdt sprint state bij (taken, status, reviews)
- Scheduling: Automatische sprint cycles
Voorbeeld n8n Workflow: PR Review Flowβ
Workflow uitleg:
[New PR Created]
ββ> [Trigger] Git webhook
ββ> [Notify] Security LLM: "Review PR #123"
β ββ> [Security LLM analyseert code]
β ββ> [Output] Security review comment
ββ> [Notify] Test LLM: "Test PR #123"
β ββ> [Test LLM schrijft tests]
β ββ> [Test LLM runt browser tests]
β ββ> [Output] Test results + screenshots
ββ> [Notify] Partner LLM: "Review PR #123"
β ββ> [Partner LLM code review]
β ββ> [Output] Code review comments
ββ> [Check] Alle 3 approved?
β ββ> [Yes] β Merge PR + Deploy
β ββ> [No] β Notify developer LLM voor fixes
Lokale LLM Modelsβ
Voor de verschillende rollen gebruik ik verschillende open source modellen via Ollama:
- Dev LLMs: DeepSeek Coder v2 (33B) - excellent voor code generation9
- Review LLMs: Qwen2.5-Coder (32B) - goed in code analysis
- Management LLMs: Llama 3.1 (70B) - sterke reasoning voor planning
- Specialisten: Mix van bovenstaande, plus fine-tuned varianten
Hardware: Dit vereist serieuze GPU kracht. Ik werk met een RTX 4090 (24GB VRAM), wat 33B modellen goed aankan. Voor 70B modellen is quantization nodig (Q4/Q5).
Codebase Structuur: LLM-Safe By Designβ
Een cruciaal onderdeel is hoe we de codebase structureren zodat LLMs effectief en veilig kunnen werken. Hier komt "LLM-safe" architectuur om de hoek.
Principe 1: Modulaire Grenzenβ
Elke agent heeft een duidelijk afgebakend domein waar het aan werkt:
project/
βββ frontend/
β βββ components/ β Anita's domein
β βββ pages/ β Anita's domein
β βββ state/ β Henk's domein
β βββ utils/ β Henk's domein
βββ backend/
β βββ api/ β Johnie's domein
β βββ database/ β Johnie's domein
β βββ auth/ β Ingrid's domein
β βββ infrastructure/ β Ingrid's domein
βββ tests/
βββ e2e/ β Linda's domein
Waarom?
- Voorkomt merge conflicts tussen de agents
- Maakt ownership duidelijk
- Limiteert blast radius van fouten
Principe 2: Context Boundariesβ
Elke agent krijgt alleen de context die het nodig heeft:
anita: # Frontend UI/UX
read_access:
- frontend/components/**
- frontend/pages/**
- shared/types/**
write_access:
- frontend/components/**
- frontend/pages/**
johnie: # Backend API/Business
read_access:
- backend/api/**
- backend/database/**
- shared/types/**
write_access:
- backend/api/**
- backend/database/**
Waarom?
- Voorkomt dat agents buiten hun expertise werken
- Reduceert token gebruik (kleinere context)
- Verbetert focus en kwaliteit
Principe 3: Schema-Driven Developmentβ
Gebruik strikte schemas als contract tussen LLMs:
// shared/types/user.schema.ts
export const UserSchema = z.object({
id: z.string().uuid(),
email: z.string().email(),
role: z.enum(['admin', 'user', 'guest']),
});
export type User = z.infer<typeof UserSchema>;
Frontend LLM weet: "Dit is wat backend stuurt"
Backend LLM weet: "Dit moet ik sturen"
Beide valideren runtime tegen het schema.
Waarom?
- Geen miscommunicatie tussen agents
- Runtime validatie voorkomt bugs
- Duidelijk contract = minder reviews nodig
Principe 4: Automated Guardrailsβ
Implementeer automatische checks die voorkomen dat agents onveilige code schrijven:
// .llm-rules.json
{
"forbidden_patterns": [
"eval\\(", // No eval()
"dangerouslySet", // No dangerouslySetInnerHTML
"SELECT \\* FROM", // No SELECT * queries
"\\.env", // No direct .env access
],
"required_patterns": {
"api/**/*.ts": [
"input\\.validate", // All API routes must validate input
"requireAuth" // All routes must have auth
],
"database/**/*.ts": [
"prepared" // All queries must be prepared statements
]
}
}
Deze rules worden gecheckt:
- Pre-commit: Git hook checkt of code voldoet
- In n8n: Voor een agent code kan committen
- In Security Review: Boris gebruikt deze rules
Waarom?
- Voorkomt common vulnerabilities
- Dwingt best practices af
- Maakt security review efficiΓ«nter
Principe 5: Explicit Dependenciesβ
Maak dependencies explicieit en locked:
// package.json
{
"dependencies": {
"react": "18.2.0", // Exact version, no ^
"express": "4.18.2"
},
"llm-rules": {
"allowed_dependencies": ["react", "express", "zod"],
"forbidden_dependencies": ["eval-*", "*-unsafe", "shell-*"]
}
}
LLMs mogen niet zomaar dependencies toevoegen - dat moet via Geert (Product Owner) als bewuste keuze.
Waarom?
- Voorkomt supply chain attacks
- Voorkomt dependency hell
- Keeps bundle size in check
Security: De Paranoia Layerβ
Boris (Security Review) is cruciaal - hij is de laatste verdedigingslinie tegen vulnerabilities. Hoe zorg ik dat Boris effectief is?
Boris' Context & Promptingβ
Boris krijgt specialized context:
You are a security expert reviewing code for vulnerabilities.
Focus on:
- OWASP Top 10 vulnerabilities
- Input validation and sanitization
- Authentication and authorization flows
- SQL injection, XSS, CSRF
- Secrets management
- Dependency vulnerabilities
For EACH PR, you MUST:
1. Check against forbidden patterns in .llm-rules.json
2. Verify input validation on all API endpoints
3. Check for hardcoded secrets or credentials
4. Verify authentication on protected routes
5. Check SQL queries are parameterized
6. Verify CORS configuration
7. Check dependency versions against CVE databases
Output format:
- [APPROVED] if no issues found
- [REJECTED] with detailed list of issues to fix
Automated Security Scanning Integrationβ
Boris gebruikt ook geautomatiseerde tools:
Tool integratie:
n8n workflow:
[PR Created]
ββ> Run: npm audit (dependency check)
ββ> Run: eslint-plugin-security (static analysis)
ββ> Run: git-secrets (secrets scanning)
ββ> Aggregate results
ββ> Feed to Boris for analysis + human-readable report
Boris interpreteert de tool output en geeft context-aware feedback.
Advanced Security: Beyond Static Analysisβ
Maar we stoppen niet bij static analysis. Security is een layered approach, en Boris krijgt toegang tot geavanceerde security tooling die in de CI/CD pipeline draait:
1. Container Security Scanningβ
Elke Docker image die we bouwen moet door container scanning:
Waarom dit cruciaal is:
- Base images (zoals
node:18) kunnen kwetsbaarheden bevatten - Dependencies in layers kunnen outdated zijn
- Supply chain attacks via compromised images9
- Compliance: we willen weten wat er in onze containers zit
Boris' container review:
Voor elke image:
1. Scan met Trivy[^23], Snyk[^18], Grype
2. Aggregeer CVEs en severity scores
3. Check tegen acceptabel risico-niveau
4. Bij critical/high: block deploy + suggest fixes
- Update base image
- Patch vulnerable dependencies
- Replace compromised packages
5. Bij medium/low: log en monitor
6. Generate SBOM (Software Bill of Materials)[^22]
2. Penetration Testing Automationβ
We integreren automated pentesting in de CI/CD:
# n8n workflow: Weekly Pentest
schedule: '0 2 * * 0' # Zondag 2:00 AM
steps:
- name: OWASP ZAP Active Scan
target: staging.app.local
scan_types:
- SQL injection
- XSS (reflected & stored)
- CSRF
- Authentication bypass
- API security
- name: Nuclei Template Scan
templates:
- cves/
- exposures/
- vulnerabilities/
- misconfigurations/
- name: Custom Fuzzing
tool: ffuf
wordlists:
- api-endpoints
- parameters
- payloads
- name: Boris Analysis
input: aggregated_scan_results
output:
- vulnerability_report
- risk_assessment
- remediation_plan
OWASP ZAP: Automated web app security scanner9 Nuclei: Fast vulnerability scanner met 1000+ templates10 ffuf: Web fuzzer voor endpoint discovery en parameter testing
3. AI-Powered Security: De Toekomstβ
Hier wordt het interessant - AI-enhanced security die verder gaat dan traditionele tools:
A. LLM-Based Code Review (Boris' Superpower)
Boris gebruikt zijn LLM capabilities voor:
# Boris' security prompting
context = """
You are reviewing this code for security issues.
Focus on:
- Logic flaws (business logic vulnerabilities)
- Race conditions in async code
- Subtle injection vulnerabilities
- Authorization bypass opportunities
- Cryptographic misuse
- Time-of-check to time-of-use (TOCTOU) bugs
"""
# Boris analyzes CONTEXT + CODE + PATTERNS
# Output: natuurlijke taal uitleg van subtiele bugs
Waarom LLMs hier beter zijn:
- Traditionele tools missen logic flaws (business logic bugs)
- LLMs kunnen context begrijpen: "deze check kan bypassed worden als..."
- LLMs vinden novel attack vectors die niet in CVE databases staan
- LLMs kunnen impact uitleggen in natuurlijke taal
Voorbeeld: Boris vindt een subtle bug
// Code in PR
if (user.role === 'admin' || user.permissions.includes('delete')) {
await deleteResource(resourceId);
}
// Boris' analyse:
"β οΈ Authorization Logic Flaw gevonden:
De check gebruikt OR in plaats van AND. Een user met alleen
'delete' permission (zonder admin role) kan nu resources deleten,
ook al was de intentie dat dit alleen admins mogen.
Impact: Privilege escalation - regular users met 'delete' permission
kunnen admin-only resources verwijderen.
Fix: Verander naar AND of voeg separate check toe voor admin-only resources."
B. AI-Powered Fuzzing
We gebruiken ML-guided fuzzing voor intelligentere pentesting:8
Tool: AFL++ met MOpt scheduler (ML mutation)
Doel: Find edge cases en crashes
Traditionele fuzzing: random mutations
AI fuzzing: ML leert welke mutations
interessante code paths triggeren
Result: 5-10x snellere bug discovery[^18]
C. Threat Modeling met LLMs
Boris kan automated threat modeling:10
Input: System architecture diagram + code
Boris' prompt:
"Generate a threat model using STRIDE methodology:[^23]
- Spoofing opportunities
- Tampering vectors
- Repudiation risks
- Information disclosure
- Denial of service
- Elevation of privilege
For each threat, provide:
- Attack scenario
- Likelihood & impact
- Mitigation strategy"
Output: Comprehensive threat model per feature
D. Runtime Application Self-Protection (RASP)
We integreren een AI-powered RASP layer:
// In runtime: real-time monitoring
const rasp = require('rasp-shield');
app.use(
rasp.middleware({
ai_model: 'security/anomaly-detection',
detect: [
'sql-injection-attempts',
'unusual-request-patterns',
'rate-limit-violations',
'jwt-tampering',
'suspicious-payload-structure',
],
actions: {
block: true,
alert_boris: true, // Real-time alert naar Boris
log_forensics: true,
},
})
);
Hoe RASP werkt:
- App draait met RASP layer
- RASP monitort alle requests real-time
- AI model detecteert anomalieΓ«n (afwijkend gedrag)
- Bij verdacht gedrag: block + alert Boris
- Boris analyseert: false positive of echte attack?
- Bij echte attack: emergency patch workflow
E. Automated Patch Suggestions
Boris kan automated security patches voorstellen:
Workflow:
1. CVE wordt ontdekt in dependency
2. Boris analyseert:
- Welke code gebruikt deze dependency?
- Wat is de impact op onze app?
- Welke versie fixed de CVE?
3. Boris genereert:
- Update PR voor package.json
- Tests om te checken dat update niet breekt
- Rollback plan als het misgaat
4. Boris assignt aan Johnie/Ingrid voor review
5. Bij approval: automated merge + deploy
F. Security Log Analysis met AI
Boris analyseert security logs met LLM:
Input: 10.000 log regels per dag
Boris' AI analysis:
- Pattern recognition: welke logs horen bij elkaar?
- Anomaly detection: wat is afwijkend?
- Threat correlation: is dit deel van een attack chain?
- Natural language alerting: "Mogelijk brute force attack
op /api/login - 500 failed attempts van IP 1.2.3.4
in laatste 5 minuten"
Output: Actionable security alerts (geen noise)
4. Security in CI/CD Pipelineβ
Volledige security gate:
# .github/workflows/security.yml
name: Security Pipeline
on: [push, pull_request]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
# Static Analysis
- name: SAST (Static Application Security Testing)
run: semgrep --config=auto
# Dependency Scanning
- name: Dependency Check
run: |
npm audit --audit-level=high
snyk test
# Secret Scanning
- name: Secret Detection
run: gitleaks detect --verbose
# Container Scanning
- name: Build & Scan Docker Image
run: |
docker build -t app:${{ github.sha }} .
trivy image app:${{ github.sha }}
# IaC Security (Infrastructure as Code)
- name: Terraform Security
run: tfsec .
# Boris Review
- name: AI Security Analysis
run: |
n8n execute security-review-workflow \
--pr=${{ github.event.number }} \
--commit=${{ github.sha }}
# Security Gate
- name: Check Security Status
run: |
if [[ "$BORIS_APPROVAL" != "true" ]]; then
echo "β Boris blocked this PR due to security concerns"
exit 1
fi
Security metrics we tracken:
- MTTR (Mean Time To Remediate): Hoe snel fixen we CVEs?
- Vulnerability Density: CVEs per 1000 lines of code
- Security Test Coverage: % code gecheckt door security tests
- False Positive Rate: Boris' accuracy (< 5% target)
- Zero-Day Response Time: Hoe snel reageren we op nieuwe CVEs?
Waarom Deze Security Aanpak Werktβ
Layered Defense (Defense in Depth):
- Preventie: Boris blokkeert onveilige code voor merge
- Detection: Container scanning + RASP detecteert runtime issues
- Response: Automated patching + pentesting vindt nieuwe vectors
- Recovery: SBOM + forensics voor incident response
AI als Force Multiplier:
- Boris vindt bugs die tools missen (logic flaws)
- ML-fuzzing vindt edge cases 10x sneller
- Automated threat modeling schaalt met team growth
- Log analysis reduceert alert fatigue (alleen actionable alerts)
Continuous Improvement:
- Boris leert van elke CVE: "deze pattern is vulnerable"
- Team leert van Boris' reviews: "zo denk je als attacker"
- Security metrics tonen improvement over tijd
Dit is niet alleen security - dit is security at scale, waarbij AI ons helpt om sneller, slimmer, en proactief te zijn tegen threats.
Testing: De Visual QA Layerβ
Linda (Test & QA) heeft een special ability: browser toegang voor visuele testing.
Linda's Workflowβ
Workflow detail:
1. Receive: PR with new feature
2. Analyze: Code changes + feature description
3. Generate:
- Unit tests (Jest/Vitest)
- Integration tests (API testing)
- E2E test specs (Playwright)
4. Execute: Run tests
5. Visual Testing:
- Launch browser (via n8n browser automation)
- Navigate feature flow
- Take screenshots at key points
- Compare against expected states
- Check accessibility (WCAG)
6. Report:
- Test coverage metrics
- Passing/failing tests
- Screenshots + visual regression diffs
- Accessibility violations
n8n Browser Automationβ
n8n heeft ingebouwde browser automation (gebaseerd op Puppeteer):
[Test LLM]
ββ> [n8n: Launch Browser Node]
ββ> Navigate to localhost:3000/feature
ββ> Fill form fields
ββ> Click submit button
ββ> Wait for response
ββ> Screenshot result
ββ> Check for error messages
ββ> Validate DOM elements
ββ> Return results to Test LLM
Linda kan zelf test scripts schrijven in Playwright syntax, die n8n uitvoert.
WCAG en Digitale Toegankelijkheid: Linda's Specialiteitβ
Een cruciaal onderdeel van kwaliteit is toegankelijkheid. Linda heeft hiervoor een dedicated workflow met externe tooling:
Automated Accessibility Testing Stack:
Tooling uitleg:
- axe-core: Automated WCAG 2.1 Level AA testing - checkt 57+ accessibility rules10
- Lighthouse CI: Google's accessibility auditing tool - geeft een score 0-100
- Pa11y: Command-line tool die WCAG A, AA, AAA standaarden checkt
- WAVE API: WebAIM's tool die visuele feedback geeft op a11y issues
Linda's toegankelijkheidsworkflow:
1. PR wordt aangemaakt
2. Linda runt parallel alle 4 a11y tools
3. Results worden geaggregeerd:
- Violations per WCAG criterium[^22]
- Severity (critical, serious, moderate, minor)
- Specifieke elementen met problemen
4. Linda analyseert en genereert een rapport met:
- WCAG compliance status (A, AA, of AAA)
- Concrete remediation steps per violation
- Code voorbeelden voor fixes
- Screenshots met problemen gemarkeerd
5. Bij blocking issues: PR wordt geblokkeerd met remediation guide
6. Bij compliance: PR krijgt accessibility approval β
Target compliance: WCAG 2.1 Level AA als minimum, met streven naar AAA waar mogelijk.9
Waarom dit werkt:
- Geautomatiseerd: Elke PR wordt gecheckt, geen handmatig werk
- Vroeg in proces: A11y issues worden gevonden voor merge, niet na deploy
- Educatief: Linda geeft concrete fix-voorbeelden, team leert
- Compliant: Voldoet aan Nederlandse toegankelijkheidseisen (Digitoegankelijk.nl)8
Challenges & Realiteit Checkβ
Laten we eerlijk zijn - dit is een experiment, en er zijn challenges:
Council of LLMs vs. Menselijk Dev Teamβ
Voor we in de challenges duiken, laten we eerst eerlijk zijn: hoe verhoudt dit Council zich tot een echt menselijk development team? Want dat is de relevante vergelijking.
De Menselijke Benchmarkβ
Een typisch menselijk development team voor een middelgroot project:
Team samenstelling (8 personen):
ββ 2x Frontend Developer (β¬60-80k/jaar elk)
ββ 2x Backend Developer (β¬60-80k/jaar elk)
ββ 1x DevOps/Infrastructure (β¬70-90k/jaar)
ββ 1x QA/Tester (β¬50-65k/jaar)
ββ 1x Product Owner (β¬70-85k/jaar)
ββ 1x Scrum Master (β¬65-80k/jaar)
Kosten: β¬535-660k/jaar (excl. overhead, tooling, kantoor)
Capaciteit: ~40 uur/week per persoon = 320 uur/week totaal
De Council Benchmarkβ
Team samenstelling (9 LLMs):
ββ 4x Development LLMs (Anita, Henk, Johnie, Ingrid)
ββ 2x Quality LLMs (Boris, Linda)
ββ 3x Management LLMs (Geert, Saskia, Thierry)
Kosten:
ββ Hardware: RTX 4090 β¬2000 (eenmalig)
ββ Elektriciteit: ~β¬30/maand = β¬360/jaar
ββ Setup & onderhoud: ~40 uur/jaar Γ β¬100 = β¬4000/jaar
Totaal Year 1: β¬6360 | Year 2+: β¬4360/jaar
Capaciteit: 24/7 beschikbaar = 168 uur/week Γ 9 agents = 1512 uur/week
Vergelijking: Wat Zijn De Verschillen?β
Voordelen van het Council (vs. Mensen)β
1. Kosten: 99% goedkoper
- Council: β¬4-6k/jaar vs. Team: β¬535-660k/jaar
- Break-even na 3 maanden
- Geen recruitment kosten, geen onboarding, geen benefits
2. Beschikbaarheid: 5x meer capaciteit
- Council werkt 24/7, geen vakanties, geen ziekte
- 1512 uur/week vs. 320 uur/week
- Geen context switching tussen projecten
3. Consistentie: Geen "bad days"
- LLMs hebben geen slechte dagen, frustraties, of burn-out
- Constante code kwaliteit (binnen model capabilities)
- Geen interpersoonlijke conflicten
4. Schaalbaarheid: Instant scaling
- Voeg een agent toe = 5 minuten
- Menselijk team uitbreiden = 3-6 maanden recruitment + onboarding
- Geen teamdynamiek issues bij groei
5. Documentatie: Perfect memory
- Agents documenteren automatisch alles
- Geen kennis die "in iemands hoofd zit"
- Complete audit trail van alle beslissingen
6. Specialisatie: Hyper-focused
- Elk agent focust 100% op hun domein
- Geen "jack of all trades, master of none"
- Deep expertise per domein
Nadelen van het Council (vs. Mensen)β
1. Creativiteit: LLMs zijn niet innovatief8
- Mensen bedenken nieuwe architecturen, patterns, oplossingen
- LLMs reproduceren bestaande kennis
- Breakthrough innovations komen van mensen, niet van LLMs
2. Begrip: Oppervlakkige context
- Mensen begrijpen de waarom achter requirements
- LLMs volgen instructies, maar missen business context
- Subtiele user needs worden door mensen beter begrepen
3. Communicatie: Geert is geen echte PO
- Stakeholder management vereist empathie, onderhandeling
- LLMs kunnen niet effectief vergaderen met klanten
- Politieke navigatie binnen organisaties is menselijk werk
4. Judgment calls: Geen "gut feeling"
- Ervaren developers voelen aan wat "not quite right" is
- LLMs hebben geen intuΓ―tie, alleen patronen
- Edge cases vereisen menselijke judgment
5. Kwaliteit: Inferieur aan senior developers
- DeepSeek Coder (33B) < Claude Sonnet < Senior Developer
- Code quality: 70-80% van menselijke output9
- Subtiele bugs blijven vaak door de mazen
6. Debugging: Beperkte problem-solving
- "Waarom werkt dit niet?" - mensen debuggen beter
- LLMs kunnen vastlopen op complexe issues
- Root cause analysis is moeilijk voor LLMs
7. Setup complexiteit: Niet plug-and-play
- Menselijk team: onboarden = 2 weken, productief
- Council setup: weken aan configuratie, debugging, tuning
- Maintenance overhead blijft hoog
8. Context limitations: Beperkt geheugen
- Mensen onthouden hele project geschiedenis
- LLMs: beperkte context window (128k tokens β 100 files)
- Vector DB helpt, maar is geen perfect oplossing
De Realistische Sweet Spot: Hybrid Teamsβ
Hier is de waarheid: het is geen Γ³f/Γ³f, maar Γ©n/Γ©n.9
Optimale setup:
Menselijk Team (klein, senior):
ββ 1x Lead Developer (architectuur, moeilijke problemen)
ββ 1x Product Owner (stakeholder management, strategy)
ββ 1x DevOps Engineer (infrastructure, security review)
Council of LLMs (grunt work):
ββ Anita, Henk, Johnie, Ingrid (feature development)
ββ Boris, Linda (automated testing & security)
ββ Saskia, Thierry (documentatie, code review)
Samenwerking:
- Mensen sturen de Council: requirements, architectuur beslissingen
- Council doet het zware tilwerk: code schrijven, tests, reviews
- Mensen reviewen Council output: finale quality gate
- Council amplifieert menselijke productiviteit 5-10x
Kosten hybrid model:
- 3 menselijke seniors: β¬210-270k/jaar
- Council: β¬4-6k/jaar
- Totaal: β¬214-276k/jaar (60% besparing vs. volledig menselijk team)
- Output: Vergelijkbaar met 6-8 persoons team
Waar Werkt Het Council Het Beste?β
β Ideaal voor:
- Maintenance work: Bug fixes, small features, refactoring
- Testing & QA: Automated test generation en execution
- Documentation: Code comments, API docs, README updates
- Security scanning: Continuous security reviews
- Code reviews: First-pass reviews voor obvious issues
- Prototyping: Snel MVPs bouwen voor validatie
β Minder geschikt voor:
- Greenfield projects: Nieuwe architectuur vereist menselijke creativiteit
- Complex problem-solving: Novel bugs, performance issues
- Stakeholder management: Klanten willen met mensen praten
- Critical systems: Waar fouten levensgevaarlijk zijn (medical, aviation)
- Highly regulated: Compliance, legal vereist menselijke accountability
De Eerlijke Conclusieβ
Het Council of LLMs is niet een vervanging voor menselijke developers. Het is een force multiplier.
Denk aan het als:
- Menselijke developers = Architects & Engineers
- Council = Construction crew
De architect ontwerpt het gebouw, de engineer lost de moeilijke problemen op, maar de crew doet het daadwerkelijke bouwen. En die crew werkt 24/7, kost bijna niets, en maakt weinig fouten bij repetitief werk.
Voor mijn experiment: Ik test dit op niet-kritische projecten (personal projects, prototypes). Voor production work blijf ik een hybrid model gebruiken: Cursor/Claude voor complex werk, Council voor grunt work.
De toekomst? Modellen worden beter. Over 2-3 jaar kunnen lokale 100B+ modellen misschien wel senior developer niveau halen.10 Maar voorlopig: Council = junior developers met superkrachten, niet senior developers.
Technical Challengesβ
Challenge 1: Context Managementβ
Probleem: LLMs hebben beperkte context windows. Hoe houden de agents overzicht over een groeiende codebase?
Oplossing:
- Vector database (PostgreSQL + pgvector) met code embeddings6
- Agents querien alleen relevante context voor hun taak
- Semantic search: "find authentication code" β retrieves auth modules
Challenge 2: Performance - Lokaal is Langzamerβ
Probleem: Lokale LLMs zijn significant langzamer dan cloud APIs.
Reality check:
Claude Sonnet 3.5 (Cloud):
- Response tijd: 2-5 seconden
- Tokens/seconde: ~100-150 tokens/sec
- Parallel requests: onbeperkt
DeepSeek Coder (Lokaal RTX 4090):
- Response tijd: 15-45 seconden
- Tokens/seconde: ~20-30 tokens/sec
- Parallel: max 2-3 agents tegelijk (VRAM limiet)
Concrete impact:
- Een feature die Claude in 5 minuten schrijft, duurt lokaal 20-30 minuten
- Code review die 10 seconden duurt in cloud = 1-2 minuten lokaal
- Sprint van 8 uur (menselijk) = 24-48 uur voor Council (lokaal)
Maar hier is het slimme deel:
Dit maakt juist niet uit wanneer je de Council als autonoom team laat draaien:
De 24/7 Strategie:
Vrijdagavond 18:00:
ββ> Geert (PO) krijgt backlog met 10 user stories
ββ> Saskia (SM) plant sprint en verdeelt werk
ββ> Anita, Henk, Johnie, Ingrid starten development
PC draait 24/7 door het weekend:
ββ> Vrijdagnacht: Development (8 uur)
ββ> Zaterdagochtend: Code reviews + fixes (6 uur)
ββ> Zaterdagmiddag: Boris security scans (4 uur)
ββ> Zaterdagavond: Linda test automation (6 uur)
ββ> Zondagochtend: Integratie + deploy (4 uur)
Maandagochtend 09:00:
ββ> 10 features klaar, getest, gedeployed
ββ> Menselijke review: 2 uur voor final check
ββ> Sprint retrospective met metrics
Waarom dit werkt:
- Geen wachttijd: Agents hebben geen meetings, pauzes, of context switching
- Nachtelijke productiviteit: Terwijl jij slaapt, werkt de Council door
- Weekends zijn productief: 48 uur extra dev tijd per week
- Compound effect: Langzaam Γ 24/7 = Meer output dan snel Γ 40 uur/week
Rekensom:
Menselijk team (8 personen):
- 40 uur/week Γ 8 = 320 productive uur/week
- Alleen tijdens kantooruren
- Met meetings, pauzes, context switches
Council (9 agents, 3x langzamer):
- 168 uur/week Γ 9 agents = 1512 beschikbare uur
- Effectief door slowdown: 1512 / 3 = 504 productive uur/week
- Zonder meetings, pauzes, of context switches
- 24/7 beschikbaar
Result: 504 > 320 β Council wint op volume
Trade-off:
- β Niet geschikt voor: Urgent hotfixes, real-time collaboration
- β Perfect voor: Planned work, sprints, background maintenance
- β Ideaal scenario: Vrijdag requirements, maandag results
De persoonlijke use case:
Voor mijn experimenten betekent dit:
- Vrijdag: Ik schrijf user stories (1 uur werk)
- Weekend: Council werkt 48 uur autonoom
- Maandag: Ik review output (2 uur), merge wat goed is
- Resultaat: 3 uur werk van mij = 40+ uur dev output
Performance vs. Convenience:
Lokaal is langzamer per taak, maar bij 24/7 autonomous operation is het sneller per week dan een menselijk team dat 40 uur werkt. Het is de shift van "fast per task" naar "high throughput per sprint".
Challenge 3: Agent Coordination Overheadβ
Probleem: 9 agents coΓΆrdineren is complex. Wat als ze het niet eens zijn?
Oplossing:
- Saskia (Scrum Master) heeft final say bij deadlocks
- Voting system: Bij conflicts stemmen relevante agents
- Escalation: Bij blijvend conflict β human intervention
Challenge 4: Cost vs. Cloudβ
Probleem: Een RTX 4090 kost β¬2000+, elektriciteit loopt op.
Maar wacht - dit is te simpel. Een enkele RTX 4090 kan niet meerdere 33B+ modellen tegelijk draaien voor ons Council. Laten we realistisch zijn over wat je Γ©cht nodig hebt.
De Hardware Investering: Wat Kost Een Echte Council Machine?β
Om 9 agents tegelijk te laten draaien met acceptabele snelheid, heb je serieuze hardware nodig. Hier zijn drie realistische configuraties:
Configuratie 1: Budget - Single GPU (Beperkt Council)β
Wat kan het:
- 1-2 agents tegelijk (33B modellen)
- Veel task switching, langzaam
- Goed voor experimenten, niet voor productie
Hardware:
| Component | Specificatie | Prijs |
|---|---|---|
| GPU | RTX 4090 24GB VRAM | β¬2.000 |
| CPU | AMD Ryzen 9 7950X | β¬550 |
| RAM | 64GB DDR5 6000MHz | β¬250 |
| Moederbord | X670E chipset | β¬350 |
| Voeding | 1000W 80+ Gold | β¬180 |
| Koeling | AIO watercooling | β¬150 |
| Opslag | 2TB NVMe Gen4 | β¬150 |
| Behuizing | ATX case | β¬120 |
| TOTAAL | β¬3.750 |
Elektriciteit: ~500W gemiddeld Γ 24/7 Γ β¬0.40/kWh = β¬175/maand
Year 1 kosten: β¬3.750 + (β¬175 Γ 12) = β¬5.850
Year 2+ kosten: β¬2.100/jaar
Configuratie 2: Production - Dual GPU (Echt Council)β
Wat kan het:
- 4-5 agents parallel (2x 33B + 1x 70B)
- Redelijke snelheid voor development
- Goed voor serious experimenten
Hardware:
| Component | Specificatie | Prijs |
|---|---|---|
| GPU 1 | RTX 4090 24GB VRAM | β¬2.000 |
| GPU 2 | RTX 4090 24GB VRAM | β¬2.000 |
| CPU | AMD Threadripper PRO 5965WX | β¬2.500 |
| RAM | 128GB DDR4 ECC | β¬500 |
| Moederbord | TRX40 met 4x PCIe x16 | β¬700 |
| Voeding | 1600W 80+ Platinum | β¬350 |
| Koeling | Custom watercooling | β¬400 |
| Opslag | 4TB NVMe Gen4 | β¬280 |
| Behuizing | Full Tower | β¬200 |
| TOTAAL | β¬8.930 |
Elektriciteit: ~900W gemiddeld Γ 24/7 Γ β¬0.40/kWh = β¬260/maand
Year 1 kosten: β¬8.930 + (β¬260 Γ 12) = β¬12.050
Year 2+ kosten: β¬3.120/jaar
Configuratie 3: Enterprise - Quad GPU (Full Council)β
Wat kan het:
- Alle 9 agents parallel
- Production-ready snelheid
- Multi-model serving
Hardware:
| Component | Specificatie | Prijs |
|---|---|---|
| GPU 1-4 | 4Γ RTX 4090 24GB VRAM | β¬8.000 |
| CPU | AMD EPYC 7543P 32-core | β¬3.200 |
| RAM | 256GB DDR4 ECC | β¬900 |
| Moederbord | Server board 7x PCIe x16 | β¬1.200 |
| Voeding | 2Γ 1600W 80+ Titanium | β¬800 |
| Koeling | Server watercooling | β¬600 |
| Opslag | 8TB NVMe RAID | β¬600 |
| Behuizing | 4U Server rack | β¬400 |
| TOTAAL | β¬15.700 |
Elektriciteit: ~1600W gemiddeld Γ 24/7 Γ β¬0.40/kWh = β¬460/maand
Year 1 kosten: β¬15.700 + (β¬460 Γ 12) = β¬21.220
Year 2+ kosten: β¬5.520/jaar
RAM & GPU Prijzen: De Realiteit van 2025β
De prijzen zijn aan het zakken, maar high-end AI hardware blijft duur:
GPU Trends (2024-2025):
- RTX 4090 24GB: β¬2.200 (2024) β β¬2.000 (2025) β ~β¬1.700 (2026 verwacht)
- RTX 5090 32GB: Verwacht Q2 2025 voor ~β¬2.500
- Gebruikt RTX 3090 24GB: β¬800-1.000 (goede budget optie!)
RAM Trends:
- DDR5 prijzen dalen: β¬5/GB (2023) β β¬3.90/GB (2025) β ~β¬3/GB (2026)
- DDR4 ECC (voor servers): β¬3.90/GB stabiel
- Voor AI workloads: veel RAM helpt, maar VRAM is kritischer
Waarom GPUs zo duur zijn:
- AI boom = hoge vraag
- TSMC production constraints
- Crypto mining (nog steeds)
- Maar: Prijzen zakken ~15-20% per jaar sinds 2023
VRAM Requirements: Hoeveel Heb Je Nodig?β
Voor verschillende model groottes:
Model Size | VRAM Needed (FP16) | VRAM Needed (Q4 quantized)
-----------|-------------------|---------------------------
7B | 14GB | 4GB
13B | 26GB | 8GB
33B | 66GB | 20GB
70B | 140GB | 40GB
Voor ons Council:
- 4Γ 33B dev models: 4 Γ 20GB = 80GB (met quantization)
- 2Γ 32B review models: 2 Γ 19GB = 38GB
- 3Γ 70B management: 3 Γ 40GB = 120GB (kan met model offloading)
Minimum: 96GB VRAM (4Γ RTX 4090)
Comfortable: 128GB+ VRAM
Praktische oplossing:
- Model offloading: Laad modellen in RAM als ze niet actief zijn
- Quantization: Q4 models zijn 70% kleiner met 5% quality loss
- Sequential loading: Niet alle 9 agents tegelijk, maar in batches
De Echte Kostenberekening: Council vs. Teamβ
Laten we nu de realistische vergelijking maken:
Cloud (Heavy Usage)β
Cursor Pro: β¬20/maand
Claude API (1M tokens/dag): β¬50-200/dag
β Maand: β¬20 + (β¬125 Γ 30) = β¬3.770/maand
β Jaar: β¬45.240/jaar
Break-even: β¬45.240 / β¬12.050 (dual GPU) = 3.8 maanden
Conclusie Cloud: Bij intensief gebruik (council-level) is cloud veel duurder dan lokaal.
Lokale Setup (Dual GPU - Realistisch)β
Year 1: β¬12.050 (hardware + elektriciteit)
Year 2: β¬3.120 (alleen elektriciteit)
Year 3: β¬3.120
Year 4: β¬3.120
Year 5: β¬3.120
5-year total: β¬24.530
β Gemiddeld: β¬4.906/jaar
β Per maand: β¬409
vs. Cloud 5-year: β¬226.200
Saving: β¬201.670 (82% goedkoper)
Maar: Dit gaat ervan uit dat je de hardware 5 jaar gebruikt. GPU's verouderen snel (2-3 jaar cycle).
Alternative: Gebruikt Hardwareβ
Slimme opties om kosten te drukken:
Budget Council Setup:
| Component | Specificatie | Prijs |
|---|---|---|
| GPU 1-2 | 2Γ RTX 3090 24GB (gebruikt) | β¬1.800 |
| CPU | AMD Ryzen 9 5950X (gebruikt) | β¬350 |
| RAM | 128GB DDR4 (gebruikt server RAM) | β¬250 |
| Rest | Nieuw | β¬1.000 |
| TOTAAL | β¬3.400 |
Met deze setup:
- 2-3 agents parallel
- Acceptabele snelheid
- Year 1: β¬5.500 all-in
- Break-even vs. cloud: 1.5 maanden!
Realiteit:
- Voor experimenten: Single RTX 4090 (β¬3.750) is genoeg
- Voor serious development: Dual GPU setup (β¬8.930) is minimum
- Voor production Council: Quad GPU (β¬15.700) of cloud hybrid
De sweet spot: Dual RTX 3090 gebruikt (β¬3.400) β affordable Γ©n capable
Realiteit:
- Dit is een experiment en learning exercise
- Voor productie blijf ik cloud (Cursor/Claude) gebruiken waar het kan
- Lokaal is voor gevoelige projecten of offline scenarios
- Hybrid approach: cloud voor prototyping, lokaal voor production
Challenge 5: Model Qualityβ
Probleem: Zijn lokale modellen (33B) even goed als Claude Sonnet (175B+)?
Eerlijk antwoord: Nee. Claude is superieur in reasoning en code quality.
Maar:
- DeepSeek Coder v2 is verrassend goed voor specifieke taken
- Door specialisatie (elke agent focust op klein domein) compenseert dit
- Door peer review (agents checken elkaar) vang je fouten
- Voor veel taken is "goed genoeg" voldoende
Challenge 6: Setup Complexiteitβ
Probleem: Dit is niet plug-and-play. Setup is complex.
Realiteit:
- Dit is voor gevorderde users die willen experimenteren
- Niet bedoeld als vervanging voor Cursor (nog niet)
- De journey is het doel - leren hoe agents samenwerken
De Roadmap: Iteratief Bouwenβ
Ik bouw dit stap voor stap:
Fase 1: Foundation (Januari 2025) β β
- Hardware: RTX 4090 geΓ―nstalleerd
- Ollama setup met DeepSeek Coder
- n8n geΓ―nstalleerd en geconfigureerd
- OpenCode getest met lokale LLMs
Fase 2: Single LLM Development (Februari 2025)β
- EΓ©n development agent werkend krijgen met n8n (laten we beginnen met Johnie)
- Git workflow automation (commit, branch, PR)
- Basic code generation + review cycle
- Definition of Done implementeren
Fase 3: Council Setup (Maart 2025)β
- Alle 4 development agents actief (Anita, Henk, Johnie, Ingrid)
- Boris (Security) integratie
- Linda (Test) met browser automation
- Sprint workflow in n8n
Fase 4: Management Layer (April 2025)β
- Saskia (Scrum Master) voor coΓΆrdinatie
- Geert (Product Owner) voor backlog
- Thierry (Lead Tech) voor architectuur
- Volledige sprint cycle
Fase 5: Refinement (Mei 2025+)β
- Fine-tuning modellen op onze codebase
- Performance optimalisatie
- Context management met vector DB
- Hybrid cloud/local workflows
Praktische Setup: Stap-voor-Stap Implementatieβ
Nu de theorie duidelijk is, tijd voor de praktijk. Ik heb deze setup zelf uitgevoerd en getest. Hieronder vind je de exacte stappen die nodig zijn om een volledig werkend Council of LLMs op te zetten.
Wat gaan we bouwen:
- β Complete Docker environment met alle services
- β PostgreSQL database met vector search capabilities
- β Ollama runtime met 3 LLM modellen
- β n8n voor workflow orchestration
- β OpenCode IDE configuratie
- β Verificatie dat alles werkt
Totale tijd: ~2-3 uur (vooral model downloads)
Moeilijkheidsgraad: Intermediate
Vereiste kennis: Basic terminal, Docker basics
Je hebt twee opties: Docker (aanbevolen, getest, werkt overal) of Native installatie (advanced, platform-specific).
π Optie 1: Docker Setup (Aanbevolen & Getest)β
Deze methode heb ik volledig uitgevoerd en getest. Het werkt op Windows, Mac, en Linux.
Download de complete setup van GitHub: Council-LLM Docker Setup
Of maak een docker-compose.yml:
version: '3.8'
services:
# PostgreSQL met pgvector voor code embeddings
postgres:
image: pgvector/pgvector:pg16
container_name: council-postgres
environment:
POSTGRES_DB: council
POSTGRES_USER: council
POSTGRES_PASSWORD: change-me-in-production
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- '5432:5432'
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U council']
interval: 10s
timeout: 5s
retries: 5
# Ollama - LLM runtime
ollama:
image: ollama/ollama:latest
container_name: council-ollama
volumes:
- ollama-models:/root/.ollama
ports:
- '11434:11434'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
environment:
- OLLAMA_KEEP_ALIVE=24h
- OLLAMA_NUM_PARALLEL=4
# n8n - Workflow orchestration
n8n:
image: n8nio/n8n:latest
container_name: council-n8n
ports:
- '5678:5678'
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=change-me
- N8N_HOST=localhost
- N8N_PORT=5678
- N8N_PROTOCOL=http
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- POSTGRES_DB=council
- POSTGRES_USER=council
- POSTGRES_PASSWORD=change-me-in-production
volumes:
- n8n-data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
ollama:
condition: service_started
volumes:
postgres-data:
ollama-models:
n8n-data:
Setup Instructies (Windows, Mac, Linux)β
Vereisten:
-
Docker Desktop geΓ―nstalleerd
-
NVIDIA GPU (voor GPU acceleratie)
- Windows: NVIDIA Container Toolkit via WSL2
- Linux: NVIDIA Container Toolkit
- Mac: Helaas geen NVIDIA support, gebruik CPU (langzaam)
Step 1: Start de Stack
# Clone of maak een project folder
mkdir council-llm && cd council-llm
# Sla bovenstaande docker-compose.yml op
# Start alle services
docker-compose up -d
# Check of alles draait
docker-compose ps
Step 2: Download LLM Models
# DeepSeek Coder voor development agents
docker exec council-ollama ollama pull deepseek-coder:33b
# Qwen voor review agents
docker exec council-ollama ollama pull qwen2.5-coder:32b
# Llama voor management agents
docker exec council-ollama ollama pull llama3.1:70b
# Check gedownloade models
docker exec council-ollama ollama list
Step 3: Test de Setup
# Test Ollama API
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-coder:33b",
"prompt": "Write a Python hello world"
}'
# Open n8n
# Browser: http://localhost:5678
# Login: admin / change-me
# Check PostgreSQL
docker exec council-postgres psql -U council -d council -c "SELECT version();"
Step 4: Install Continue (IDE)
Step 4: Install OpenCode (IDE/Terminal/Desktop)
Windows/Mac/Linux - Via installer:
# Via curl (Linux/Mac)
curl -fsSL https://opencode.ai/install | bash
# Via npm
npm install -g opencode
# Via brew (Mac)
brew install opencode
# Windows: Download desktop app
# https://opencode.ai/download
Configure OpenCode met Ollama:
# Start OpenCode
opencode
# In OpenCode, configure model:
# Settings β Models β Add Provider
# Provider: Ollama
# Base URL: http://localhost:11434
# Model: deepseek-coder:33b
Test OpenCode:
# Terminal mode
opencode --model ollama/deepseek-coder:33b "Write a Python hello world"
# IDE mode (VS Code/Cursor extension)
# Install via: code --install-extension Anomaly.opencode
# Desktop app
# Launch OpenCode.app
Optie 2: Native Installatie (Advanced)β
Als je liever alles lokaal install (zonder Docker):
Windows Setup:
# 1. Install Ollama
# Download: https://ollama.ai/download
# Run installer, restart terminal
# Verify
ollama --version
# 2. Install PostgreSQL
# Download: https://www.postgresql.org/download/windows/
# Install with pgAdmin
# Add pgvector extension
# In pgAdmin SQL editor:
CREATE EXTENSION vector;
# 3. Install n8n
# Requires Node.js 18+
npm install -g n8n
# Start n8n
n8n start
# 4. Pull models
ollama pull deepseek-coder:33b
ollama pull qwen2.5-coder:32b
ollama pull llama3.1:70b
Linux Setup:
# 1. Install Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# 2. Install PostgreSQL + pgvector
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo -u postgres psql -c "CREATE EXTENSION vector;"
# 3. Install n8n
npm install -g n8n
# 4. Pull models
ollama pull deepseek-coder:33b
ollama pull qwen2.5-coder:32b
ollama pull llama3.1:70b
Mac Setup:
# 1. Install Ollama
brew install ollama
# 2. Install PostgreSQL + pgvector
brew install postgresql@16
brew install pgvector
# 3. Install n8n
npm install -g n8n
# 4. Pull models
ollama pull deepseek-coder:33b
ollama pull qwen2.5-coder:32b
ollama pull llama3.1:70b
Windows Specifieke Notesβ
GPU Acceleratie op Windows:
Als je een NVIDIA GPU hebt op Windows:
- Installeer WSL2 (Windows Subsystem for Linux)
wsl --install
-
Installeer NVIDIA CUDA drivers voor WSL2
-
Docker Desktop moet WSL2 backend gebruiken
- Settings β General β Use WSL 2 based engine
-
Verify GPU in Docker:
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
Zonder GPU (CPU Only):
Als je geen NVIDIA GPU hebt (Intel/AMD graphics):
- Models draaien op CPU (10-20x langzamer)
- Gebruik kleinere models: 7B ipv 33B
- Of gebruik quantized models (Q4)
- Overweeg cloud hybrid approach
Resource Requirementsβ
Minimum (voor experimenten):
- CPU: 8 cores
- RAM: 32GB
- GPU: RTX 3060 12GB (of CPU only met 64GB RAM)
- Disk: 100GB SSD
- Internet: Voor model downloads (20-50GB)
Recommended (voor Council):
- CPU: 16 cores
- RAM: 64GB
- GPU: RTX 4090 24GB
- Disk: 250GB NVMe
- Internet: Fiber (voor snelle updates)
Troubleshootingβ
Problem: Ollama out of memory
# Reduce parallel requests
export OLLAMA_NUM_PARALLEL=2
# Use smaller models
ollama pull deepseek-coder:6.7b
Problem: n8n can't connect to Ollama
# Check if Ollama is running
curl http://localhost:11434
# Check Docker network
docker network inspect council-llm_default
Problem: PostgreSQL permission denied
# Fix volume permissions
docker-compose down
docker volume rm council-llm_postgres-data
docker-compose up -d
Problem: VS Code Continue can't find models
# Verify Ollama API
curl http://localhost:11434/api/tags
# Check Continue config path:
# Windows: %USERPROFILE%\.continue\config.json
# Mac/Linux: ~/.continue/config.json
Next Stepsβ
Als je setup draait:
- Setup n8n workflows voor de Council agents
- Configure Continue voor je dev agents
- Test single agent voor je dual/quad agent workflows gaat bouwen
- Build incrementeel: Start met 1 agent, voeg er geleidelijk bij toe
- Monitor resources: Check GPU/RAM usage met
nvidia-smienhtop
Volgende blog: Ik zal een detailed guide schrijven over hoe je de eerste n8n workflows bouwt voor agent coΓΆrdinatie. Stay tuned!
