@zerwiz/ymir 0.1.5 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.agents/agents/huginn-researcher.md +1 -1
  2. package/.agents/agents/kvasir-scout.md +1 -1
  3. package/.agents/agents/sindri-developer.md +1 -1
  4. package/.agents/backend/README.md +74 -0
  5. package/.agents/backend/model-bridge.py +74 -4
  6. package/.agents/config/cron.yaml +2 -0
  7. package/.agents/config/eindri-dispatch.json +6 -6
  8. package/.agents/migrations/0003-private-data-separation.sh +11 -1
  9. package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
  10. package/.agents/skills/README.md +1 -1
  11. package/.agents/skills/galdr-ymirsystem/SKILL.md +2 -1
  12. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +73 -10
  13. package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +44 -1
  14. package/.agents/skills/galdr-ymirsystem/assets/installation.md +290 -24
  15. package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +3 -1
  16. package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +39 -1
  17. package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +4 -0
  18. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +7 -2
  19. package/.agents/skills/galdr-ymirsystem/assets/registry.md +1 -1
  20. package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +2 -2
  21. package/.agents/skills/galdr-ymirsystem/assets/smidja.md +16 -11
  22. package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +147 -4
  23. package/.agents/skills/groa-update/SKILL.md +20 -0
  24. package/.agents/skills/hamr-adapters/SKILL.md +2 -2
  25. package/.agents/skills/lifecycle/smoke_test.sh +7 -2
  26. package/.agents/skills/ymir-host/SKILL.md +2 -1
  27. package/.agents/skills/ymir-host/assets/install.md +69 -0
  28. package/AGENTS.md +78 -34
  29. package/CHANGELOG.md +1362 -1
  30. package/README.md +1 -1
  31. package/RULES/02-agents.md +2 -2
  32. package/RULES/04-hoard.md +32 -0
  33. package/RULES/06-append-only.md +50 -0
  34. package/RULES/07-config.md +56 -0
  35. package/RULES/09-electron.md +58 -0
  36. package/RULES/README.md +2 -0
  37. package/bin/a2a-mcp.sh +42 -7
  38. package/bin/agents-config.sh +30 -7
  39. package/bin/apodex-smoke-test.sh +14 -1
  40. package/bin/bifrost-bridge.sh +25 -6
  41. package/bin/bootstrap-macos.sh +6 -1
  42. package/bin/brokk-send.sh +14 -1
  43. package/bin/changelog-assemble.sh +154 -0
  44. package/bin/changelog-guard.sh +39 -7
  45. package/bin/crash-sense.sh +14 -1
  46. package/bin/design-check.sh +80 -0
  47. package/bin/design-icon.sh +156 -0
  48. package/bin/docs-guard.sh +2 -2
  49. package/bin/editor-place.sh +33 -15
  50. package/bin/eindri-acclaim.sh +14 -1
  51. package/bin/eindri-seat.sh +83 -0
  52. package/bin/eindri-seen.sh +14 -1
  53. package/bin/eindri-start.sh +14 -1
  54. package/bin/einherjar-spawn.sh +9 -3
  55. package/bin/eir-doctor.sh +89 -1
  56. package/bin/electron-lib.sh +34 -0
  57. package/bin/feature-inventory.sh +73 -0
  58. package/bin/fleet-apply.sh +15 -2
  59. package/bin/github-deploy.sh +14 -1
  60. package/bin/gjallarhorn-expose.sh +43 -9
  61. package/bin/gjallarhorn-notify.sh +14 -1
  62. package/bin/gjallarhorn-purge.sh +14 -1
  63. package/bin/gjallarhorn-tunnel.sh +16 -3
  64. package/bin/groa-update.sh +9 -1
  65. package/bin/hall-snapshot.sh +21 -2
  66. package/bin/herdr-run.sh +23 -2
  67. package/bin/hlidskjalf-agents.sh +172 -0
  68. package/bin/hlidskjalf-usage.sh +196 -0
  69. package/bin/hoard-guard.sh +135 -0
  70. package/bin/hoard-lib.sh +91 -11
  71. package/bin/hodd.sh +28 -4
  72. package/bin/huginn-research-worker.sh +14 -1
  73. package/bin/local-model-lock.sh +22 -3
  74. package/bin/mimir-bridge.py +33 -0
  75. package/bin/mimir-bridge.sh +14 -1
  76. package/bin/mimir-reflect.sh +27 -0
  77. package/bin/mjollnir-webhook.sh +14 -1
  78. package/bin/mjollnir.sh +22 -3
  79. package/bin/model-hardware.sh +17 -3
  80. package/bin/model-resolve.sh +14 -1
  81. package/bin/nornir-job-hall-snapshot.sh +28 -0
  82. package/bin/nornir-job-nsr-compliance.sh +54 -0
  83. package/bin/npm-publish.sh +136 -0
  84. package/bin/omarchy-install.sh +18 -5
  85. package/bin/omarchy-plugins.sh +15 -2
  86. package/bin/omarchy-sense.sh +14 -1
  87. package/bin/pi-model-agnostic.sh +71 -0
  88. package/bin/private-guard.sh +20 -0
  89. package/bin/project-git.sh +18 -4
  90. package/bin/public-guard.sh +3 -2
  91. package/bin/sessrumnir-ensure.sh +1 -1
  92. package/bin/sessrumnir.sh +16 -3
  93. package/bin/smidja-board.sh +136 -0
  94. package/bin/smidja-bootstrap.sh +5 -1
  95. package/bin/smidja-lib.sh +49 -0
  96. package/bin/syn-asset-pretool-check.sh +14 -1
  97. package/bin/syn-spawn-pretool-check.sh +58 -0
  98. package/bin/tailscale-sync.sh +15 -2
  99. package/bin/telegram-bot.sh +14 -1
  100. package/bin/ui-truth-check.sh +75 -0
  101. package/bin/valknut-load.sh +42 -4
  102. package/bin/wedge-notify.sh +14 -1
  103. package/bin/workspace-rag.sh +14 -1
  104. package/bin/ymir-install.sh +257 -57
  105. package/bin/ymir-plan.sh +390 -0
  106. package/bin/ymir-say.sh +14 -1
  107. package/bin/ymir-setup-auth.sh +12 -1
  108. package/bin/ymir-style.sh +108 -0
  109. package/bin/ymir-validate.sh +64 -11
  110. package/bin/ymir.js +82 -34
  111. package/docs/design.md +2 -2
  112. package/docs/lore.md +5 -1
  113. package/docs/runbooks/agents.md +1 -1
  114. package/package.json +13 -3
  115. package/scripts/electron.sh +74 -15
  116. package/scripts/lower.sh +34 -0
  117. package/scripts/raise.sh +42 -0
  118. package/scripts/start.sh +65 -3
  119. package/.agents/config/agents.yaml +0 -50
  120. package/.agents/config/tailscale-sync.yaml +0 -27
  121. package/.agents/memory/kaia.engram +0 -0
  122. package/.agents/memory/kaia.engram-shm +0 -0
  123. package/.agents/memory/kaia.engram-wal +0 -0
  124. package/.agents/memory/well/episodes.jsonl +0 -367
  125. package/.agents/memory/well/workspace.jsonl +0 -27
@@ -1,367 +0,0 @@
1
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"# AI Blog Posts in Dirty Mox Bag Community\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Projects:** AIGeeks & Freaks, Dirty Mox Bag Community\n\n---","hash":"a8af90db1f75d2e0e758c15de4a356851078cd9122ecd15fe79e08ace5302f38"}
2
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## 1. Goal\n\nCreate a system where AI-generated blog posts about agent engineering, MCP development, and swarm orchestration are published to the Dirty Mox Bag community forum. These posts serve as educational content, community engagement, and marketing for AIGeeks & Freaks courses and meetups.\n\n---","hash":"9ff3c11001e0cede063526d5ab5a09a8e6f06a375feb688feee33af6caaf8b1a"}
3
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 2.1 Dirty Mox Bag Community\n\n- **Forum:** Supabase-backed forum with topics and posts\n- **Content Policy:** Function `community_content_allowed()` blocks spam and self-promotion\n- **Authors:** Community members create topics and posts\n- **Moderation:** RLS policies and moderation reports","hash":"62950c4734832084e5a4d137cfea39542c35998ec5dbe98312cf8336b1899657"}
4
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 2.2 AIGeeks & Freaks\n\n- **Content:** No blog currently\n- **Knowledge:** Course materials, meetup recordings, shipped projects\n- **Audience:** Builders, developers, agent engineers\n\n---","hash":"5930aa209266b8e5f9b0dacc043e76871d514a7ab2abb4ee82979217eb919b14"}
5
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 3.1 Content Pillars\n\nAll blog posts fall into one of these categories:\n\n1. **Agent Engineering Deep Dives**\n - How to build effective agent workflows\n - Prompt engineering patterns for production agents\n - MCP server development tutorials\n - Multi-agent orchestration case studies\n\n2. **Course Announcements & Updates**\n - New course launches\n - Course content updates\n - Graduate spotlights\n - Enrollment deadlines\n\n3. **Meetup Recaps & Announcements**\n - What happened at last week's meetup\n - Upcoming meetup previews\n - Builder demos from sessions\n - Community highlights\n\n4. **Shipped Project Showcases**\n - Deep dive into a recently shipped project\n - Lessons learned from the build process\n - Architecture decisions and trade-offs\n - Code walkthroughs\n\n5. **Community News & Updates**\n - Platform updates\n - New features\n - Community milestones\n - Builder spotlights","hash":"4384d2c6f16a4121face76a0dc40406fe2a1364b2ad24fd8f3df6ea216ba635c"}
6
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 3.2 Posting Frequency\n\n- **Weekly:** 1-2 deep-dive technical posts\n- **Bi-weekly:** 1 course or meetup announcement\n- **Monthly:** 1 shipped project showcase\n- **As-needed:** Community news and updates","hash":"00bb4e22feff8c33f368cb992d9db1912c680256c5bc765317732eb1739ad130"}
7
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 3.3 Author Attribution\n\n- Posts authored by the AIGF team (captain as primary author)\n- Community members can co-author posts\n- Posts linked to Dirty Mox Bag community profiles\n- GitHub integration for builder attribution\n\n---","hash":"0cf74970f72a7afaef6aa3d5816198f9e293383140777c69c8cd313dad229793"}
8
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 4.1 Blog Post Storage\n\nStore blog posts as Markdown files in the Dirty Mox Bag project:\n\n```\nWhyNotProductionsHomepage/\n\u251c\u2500\u2500 dirrtymixbag/\n\u2502 \u2514\u2500\u2500 blog/\n\u2502 \u251c\u2500\u2500 agent-engineering/\n\u2502 \u2502 \u251c\u2500\u2500 prompt-patterns-for-production-agents.md\n\u2502 \u2502 \u251c\u2500\u2500 mcp-server-development-guide.md\n\u2502 \u2502 \u2514\u2500\u2500 multi-agent-orchestration-case-study.md\n\u2502 \u251c\u2500\u2500 courses/\n\u2502 \u2502 \u251c\u2500\u2500 crs-100-launch.md\n\u2502 \u2502 \u251c\u2500\u2500 crs-200-update.md\n\u2502 \u2502 \u2514\u2500\u2500 graduate-spotlight-kira.md\n\u2502 \u251c\u2500\u2500 meetups/\n\u2502 \u2502 \u251c\u2500\u2500 w26-showcase-recap.md\n\u2502 \u2502 \u251c\u2500\u2500 w27-2am-bug-fix-preview.md\n\u2502 \u2502 \u2514\u2500\u2500 community-highlights-october.md\n\u2502 \u251c\u2500\u2500 shipped/\n\u2502 \u2502 \u251c\u2500\u2500 mcp-github-issues-deep-dive.md\n\u2502 \u2502 \u251c\u2500\u2500 swarm-orchestrator-architecture.md\n\u2502 \u2502 \u2514\u2500\u2500 eval-harness-skill-lessons-learned.md\n\u2502 \u2514\u2500\u2500 community/\n\u2502 \u251c\u2500\u2500 platform-update-october.md\n\u2502 \u251c\u2500\u2500 builder-spotlight-neo.md\n\u2502 \u2514\u2500\u2500 milestone-1000-builders.md\n```","hash":"cd86628604012b0ebf428c1cba46ea396b418260c531111a310c60cebbeed720"}
9
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 4.2 Blog Post Format\n\nEach blog post is a Markdown file with YAML front matter:\n\n```markdown\n---\ntitle: \"Prompt Patterns for Production Agents\"\nslug: \"prompt-patterns-for-production-agents\"\nauthor: \"Zerwiz\"\nauthorProfile: \"dirrtymixbag/profile/zerwiz\"\ndate: \"2025-10-01\"\ncategory: \"agent-engineering\"\ntags:\n - \"prompt-engineering\"\n - \"production-agents\"\n - \"mcp\"\nexcerpt: \"A deep dive into prompt patterns that work reliably in production agent workflows.\"\nfeatured: true\ncommunityTopic: true\ncommunityTopicSlug: \"prompt-patterns-for-production-agents\"\n---","hash":"c080a5ee15b2053ffd74b0531c1a7206e5606b2b836ee14dda7453a4f1cc20c2"}
10
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## Introduction\n\nWhen building production agents, prompt engineering is not just about getting the right output \u2014 it's about getting consistent, reliable output at scale.","hash":"951fff54ee1b42ecdc9d9555332622d307567f63d930b112541dde97c9f44cbc"}
11
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## The Problem\n\nMost prompt engineering guides focus on single-shot examples. In production, you need patterns that work across thousands of requests.","hash":"16c71d8d1883e5b4d6ec1368c4888ed88e48ed4669d2f5207895789197abb3be"}
12
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## Pattern 1: Role-Based Prompts\n\n[Content continues...]\n```","hash":"8c96b3e0e6509769b656800df149216de7f965f8f6b658d7ab32b5b471d8a408"}
13
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 4.3 Publishing Flow\n\n1. **Draft Creation**\n - Write blog post as Markdown file\n - Add front matter with metadata\n - Store in appropriate category directory\n\n2. **Review**\n - Captain reviews draft\n - Community moderators can comment on draft\n - Edits made as needed\n\n3. **Publishing**\n - Set `published: true` in front matter\n - Create corresponding forum topic in Dirty Mox Bag\n - Link forum topic to blog post\n - Notify community members\n\n4. **Distribution**\n - Post to community forum\n - Share on social media (Postiz integration)\n - Email to course subscribers (Mautic integration)","hash":"3c61da2228ffa41dc7a67e742fe5070b7ce1d83ddb7bcbcbbd169ff295e9a753"}
14
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 4.4 Forum Topic Integration\n\nEach published blog post creates a corresponding forum topic:\n\n- Topic title matches blog post title\n- Topic body contains excerpt and link to full post\n- Topic tags match blog post tags\n- Topic author is the blog post author\n- Topic is pinned to relevant category\n\n---","hash":"aaef55146eecdb690ee52a7c76030cbc2c6adce73e0f18e3b88ea03524e8807c"}
15
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 5.1 Content Generation Process\n\n1. **Topic Selection**\n - Review upcoming courses and meetups\n - Identify knowledge gaps in community\n - Check trending topics in agent engineering\n - Select 2-3 topics for next week\n\n2. **Outline Creation**\n - Create blog post outline\n - Define key points and examples\n - Identify code snippets needed\n - Define target audience level\n\n3. **Draft Generation**\n - Write blog post draft\n - Include code examples where relevant\n - Add links to courses and meetups\n - Keep tone technical but accessible\n\n4. **Review and Edit**\n - Captain reviews draft\n - Technical accuracy check\n - Tone and style check\n - Community policy compliance check\n\n5. **Publishing**\n - Finalize blog post\n - Create forum topic\n - Schedule social media posts\n - Update community feed","hash":"ba3070cd62600c9fdeae99f333014453dc47e13993b31bc521047850a7bdd458"}
16
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 5.2 AI-Assisted Writing\n\nUse AI to assist with:\n\n- **Research:** Gather latest information on topics\n- **Outline Generation:** Create structured outlines\n- **Draft Writing:** Generate initial drafts\n- **Code Examples:** Create working code examples\n- **Review:** Check for technical accuracy\n- **Editing:** Improve clarity and readability","hash":"d1da9150b3e7f10bf8b24a1170b167ec758bd567cb0c5e499b1ff99e73a8e462"}
17
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 5.3 Human-in-the-Loop\n\nAI assists but humans decide:\n\n- **Topic Selection:** Captain chooses topics\n- **Outline Approval:** Captain approves outlines\n- **Draft Review:** Captain reviews all drafts\n- **Final Edit:** Captain makes final edits\n- **Publishing Decision:** Captain decides when to publish\n\n---","hash":"80350a505f9f0f7e1e11506061711a95d4592674adc4f954f699659e4c564016"}
18
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 6.1 Commenting System\n\n- Enable comments on blog posts\n- Comments stored in community forum\n- Comments linked to community profiles\n- Moderation tools for comments","hash":"f776931e8f32be4ae8d831b584b7e322d753aa1c63863ed561cbca7f96ff7a82"}
19
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 6.2 Discussion Topics\n\n- Each blog post creates a discussion topic\n- Community members can ask questions\n- Authors can answer questions\n- Best answers pinned to top","hash":"f9932ac4401de96f44d185217c51802b37af08babec25aa36d2a5db4a935035d"}
20
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 6.3 Builder Contributions\n\n- Community members can submit guest posts\n- Guest posts reviewed by captain\n- Guest authors get community profile links\n- Guest posts follow same format","hash":"1461f72956ba959fbae5eee9354f8a6b08a7b3ad612de2103fa8472a34e58fc3"}
21
- {"timestamp":"2026-09-11T15:31:40Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 6.4 Course and Meetup Links\n\n- Blog posts link to relevant courses\n- Blog posts link to upcoming meetups\n- Course enrollment links in posts\n- Meetup registration links in posts\n\n---","hash":"92a705a3dfe84f8e5c1767c61022e367dec5d5610f0929866cf66a9b63e8a813"}
22
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 7.1 Postiz (Social Media)\n\n- Schedule social media posts for each blog\n- Auto-generate tweet threads from blog posts\n- Schedule LinkedIn posts for technical audience\n- Schedule YouTube shorts for key points","hash":"37b240b5aef3f97fc137025363290ca8f4d03928cb62d5051f7e93f1a66eb7b5"}
23
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 7.2 Mautic (Email)\n\n- Add blog subscribers to mailing list\n- Send weekly digest of new posts\n- Send course announcements with blog links\n- Send meetup recaps with blog links","hash":"b688cbc561d786a3a32ccbee986df38ad66319efeb35dadd528bfc34d8db6218"}
24
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### 7.3 Activepieces (Automation)\n\n- Auto-create forum topic when blog published\n- Auto-notify subscribers of new posts\n- Auto-archive old posts after 6 months\n- Auto-generate social media posts\n\n---","hash":"2aea8e523535d1a8bf4cf449ff625f1c3cb3df7622424312797157ed8fb440be"}
25
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### Phase 1: File Structure (Week 1)\n\n- [ ] Create `dirrtymixbag/blog/` directory structure\n- [ ] Create blog post template\n- [ ] Create category directories\n- [ ] Test file reading in Astro","hash":"2d51f0db66848d8f567309be8cb04d3d57819a9461bfb77c1f2789b6cb1b2a40"}
26
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### Phase 2: Forum Integration (Week 2)\n\n- [ ] Add forum topic creation on publish\n- [ ] Add blog post to forum topic linking\n- [ ] Add comment system integration\n- [ ] Test community engagement flow","hash":"e2bf29c7bcadf99e76aa9702b0d43f4e2bd995ad4a79cbc3d85bd281a498d5c0"}
27
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### Phase 3: AI Workflow (Week 3)\n\n- [ ] Create AI-assisted writing workflow\n- [ ] Create topic selection process\n- [ ] Create review and editing process\n- [ ] Test end-to-end publishing flow","hash":"4ceb9319e32371858398260913ba0565cf0a8092b6b5b4cd7724acd4131b3a65"}
28
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"### Phase 4: Marketing Integration (Week 4)\n\n- [ ] Connect Postiz for social media\n- [ ] Connect Mautic for email\n- [ ] Connect Activepieces for automation\n- [ ] Test full marketing automation\n\n---","hash":"1ad62972cbdb3402d9e1fc2cc7af3f109e495a9df33707d282fd01b5c4455125"}
29
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## 9. Success Criteria\n\n- [ ] Blog posts published weekly\n- [ ] Forum topics created for each post\n- [ ] Community members commenting on posts\n- [ ] Course enrollment increasing from blog traffic\n- [ ] Meetup attendance increasing from blog traffic\n- [ ] Social media engagement increasing\n- [ ] Email subscriber count increasing\n- [ ] Zero spam or policy violations\n\n---","hash":"4807ba2c74cc67ba4cddf5abd77c5e29e1011cb1c724011a152e1268415373ee"}
30
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## 10. Success Metrics\n\n| Metric | Target | Measurement |\n|---|---|---|\n| Blog posts published | 2/week | File count in `blog/` |\n| Forum topics created | 2/week | Topic count in forum |\n| Comments per post | 5+/week | Post count per topic |\n| Course enrollment from blog | 10%/month | Enrollment source tracking |\n| Meetup attendance from blog | 15%/month | Attendance source tracking |\n| Social media engagement | 20%/month | Postiz analytics |\n| Email subscribers | 5%/week | Mautic subscriber count |\n| Spam rate | <1% | Moderation reports |\n\n---","hash":"90811a2882383d0eb98d426425e230d90fdf440f5c6ae904a3ae52965d707d9a"}
31
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-ai-blog-posts-in-community.md","tags":["data"],"content":"## 11. Risks and Mitigations\n\n| Risk | Impact | Mitigation |\n|---|---|---|\n| AI-generated content quality | Medium | Human review of all drafts |\n| Spam in comments | Medium | Moderation tools + rate limits |\n| Copyright issues | High | Original content only, proper attribution |\n| Technical inaccuracies | High | Captain review + community feedback |\n| Low community engagement | Medium | Active moderation + engagement prompts |\n| Content policy violations | Medium | Pre-publish review + automated checks |","hash":"1bfc564f46469008d5c09651e12e0ba8a3eee1182fa55b9ac11874064935d381"}
32
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"# Dirrty Mixbag Blog on AIGeeks & Freaks\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Projects:** AIGeeks & Freaks (`/home/zerwiz/CodeP/aigeeks&freeks`)\n\n---","hash":"013610f4d10f33c506657f04152fe2608a943fb5c9e38bb967218f26ffeff405"}
33
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"## 1. Goal\n\nAdd a blog section to the AIGeeks & Freaks homepage where AI-generated and community-written blog posts about agent engineering, MCP development, and swarm orchestration are published. The blog is separate from but linked to the Dirrty Mixbag community forum \u2014 it lives on the AIGF site and serves as the primary content hub for the AIGF audience.\n\n---","hash":"f1218c6e57e03f0bcc3d784652fadc1347f4e7c30b17cb797ed45238cf0cf869"}
34
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 2.1 AIGeeks & Freaks Homepage\n\n- **Stack:** Next.js 16, port 3800\n- **Pages:** Home, Meetups, Courses, Shipped, Factory, Way of Teams, Login\n- **Content:** All mock data (no real blog, no real content)\n- **Auth:** None currently","hash":"077a4ec5e3e4ebad20978cbd430059481531349e999741b6e2eea5a925205ed3"}
35
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 2.2 Dirrty Mixbag Community\n\n- **Stack:** Astro, Netlify, port 4321\n- **Pages:** Home, Forum, Feed, Profile, Messages, Friends, News\n- **Content:** Forum topics, feed posts, news articles\n- **Auth:** Supabase Auth (email/password, GitHub/Google planned)\n- **News Module:** Already exists at `/dirrtymixbag/news/` with index and article pages\n\n---","hash":"45f1eb738a3439758df15dca839d779f7a11f94ca8be6cebf7b3e3f9b471fc42"}
36
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 3.1 Two-Tier Blog System\n\nThe blog exists in two places, linked together:\n\n1. **AIGF Blog** \u2014 Primary content hub on `aigeeksnfreaks.zerwiz.org/blog`\n - Full blog posts with rich formatting\n - Course and meetup links\n - Builder attribution\n - SEO-optimized for search engines\n\n2. **Dirrty Mixbag News** \u2014 Community discussion on `whynotproductions.netlify.app/dirrtymixbag/news`\n - Forum topics for each blog post\n - Community comments and discussion\n - Community member contributions\n - Cross-linked to AIGF blog","hash":"6a487cdadad707301cacf58d1f36b236d1d6621bf76c6d8888b7540c4dfccea5"}
37
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 3.2 Content Flow\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 CAPTAIN / COMMUNITY \u2502\n\u2502 Creates Blog Post \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 AIGF Blog \u2502\n \u2502 (Primary) \u2502\n \u2502 \u2502\n \u2502 - Full post \u2502\n \u2502 - Code blocks \u2502\n \u2502 - Course links\u2502\n \u2502 - Meetup links\u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u2502 Cross-link\n \u25bc\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 Dirrty Mixbag \u2502\n \u2502 News / Forum \u2502\n \u2502 (Discussion) \u2502\n \u2502 \u2502\n \u2502 - Topic \u2502\n \u2502 - Comments \u2502\n \u2502 - Community \u2502\n \u2502 contributions\u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---","hash":"eae1720cd3a823a32c5bc3ddb1e7621cf628f46d226a6c86e5deb6148774a443"}
38
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 4.1 AIGF Blog Files\n\n```\naigeeks&freeks/\n\u251c\u2500\u2500 data/\n\u2502 \u2514\u2500\u2500 blog/\n\u2502 \u251c\u2500\u2500 agent-engineering/\n\u2502 \u2502 \u251c\u2500\u2500 prompt-patterns-for-production-agents.md\n\u2502 \u2502 \u251c\u2500\u2500 mcp-server-development-guide.md\n\u2502 \u2502 \u2514\u2500\u2500 multi-agent-orchestration-case-study.md\n\u2502 \u251c\u2500\u2500 courses/\n\u2502 \u2502 \u251c\u2500\u2500 crs-100-launch.md\n\u2502 \u2502 \u251c\u2500\u2500 crs-200-update.md\n\u2502 \u2502 \u2514\u2500\u2500 graduate-spotlight-kira.md\n\u2502 \u251c\u2500\u2500 meetups/\n\u2502 \u2502 \u251c\u2500\u2500 w26-showcase-recap.md\n\u2502 \u2502 \u251c\u2500\u2500 w27-2am-bug-fix-preview.md\n\u2502 \u2502 \u2514\u2500\u2500 community-highlights-october.md\n\u2502 \u251c\u2500\u2500 shipped/\n\u2502 \u2502 \u251c\u2500\u2500 mcp-github-issues-deep-dive.md\n\u2502 \u2502 \u251c\u2500\u2500 swarm-orchestrator-architecture.md\n\u2502 \u2502 \u2514\u2500\u2500 eval-harness-skill-lessons-learned.md\n\u2502 \u2514\u2500\u2500 community/\n\u2502 \u251c\u2500\u2500 platform-update-october.md\n\u2502 \u251c\u2500\u2500 builder-spotlight-neo.md\n\u2502 \u2514\u2500\u2500 milestone-1000-builders.md\n```","hash":"dc475a9d10eb21ca5948b77bd161450cfc376be76fac5ec8c3771fb09ab0c045"}
39
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 4.2 Dirrty Mixbag Blog Files\n\n```\nWhyNotProductionsHomepage/\n\u251c\u2500\u2500 Dirrty Mixbag Homepage/\n\u2502 \u2514\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 pages/\n\u2502 \u2514\u2500\u2500 dirrtymixbag/\n\u2502 \u2514\u2500\u2500 blog/\n\u2502 \u251c\u2500\u2500 agent-engineering/\n\u2502 \u251c\u2500\u2500 courses/\n\u2502 \u251c\u2500\u2500 meetups/\n\u2502 \u251c\u2500\u2500 shipped/\n\u2502 \u2514\u2500\u2500 community/\n```\n\n---","hash":"3cb80dbd59fd3c71e6adc743eb49c334fbde023e75c7827f3e9bb664c2c93e68"}
40
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 5.1 Front Matter Fields\n\n| Field | Required | Type | Description |\n|---|---|---|---|\n| `title` | Yes | string | Display title |\n| `slug` | Yes | string | URL slug (e.g., `prompt-patterns-for-production-agents`) |\n| `author` | Yes | string | Author display name |\n| `authorProfile` | No | string | Dirrty Mixbag profile URL |\n| `date` | Yes | ISO date | Publication date |\n| `category` | Yes | string | Category: `agent-engineering`, `courses`, `meetups`, `shipped`, `community` |\n| `tags` | Yes | array | Array of tag strings |\n| `excerpt` | Yes | string | Short excerpt for listing |\n| `featured` | No | boolean | Whether to feature on homepage (default: `false`) |\n| `communityTopic` | No | boolean | Whether to create forum topic (default: `true`) |\n| `communityTopicSlug` | No | string | Dirrty Mixbag forum topic slug |\n| `courseCode` | No | string | Related course code |\n| `meetupId` | No | string | Related meetup ID |\n| `shipProject` | No | string | Related shipped project |","hash":"705c4da308c90b4b4019cf819a9730629f68f33ae02fac944ac1a6adc0620663"}
41
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 5.2 Example Blog Post\n\n```markdown\n---\ntitle: \"Prompt Patterns for Production Agents\"\nslug: \"prompt-patterns-for-production-agents\"\nauthor: \"Zerwiz\"\nauthorProfile: \"/dirrtymixbag/profile/zerwiz\"\ndate: \"2025-10-01\"\ncategory: \"agent-engineering\"\ntags:\n - \"prompt-engineering\"\n - \"production-agents\"\n - \"mcp\"\nexcerpt: \"A deep dive into prompt patterns that work reliably in production agent workflows.\"\nfeatured: true\ncommunityTopic: true\ncommunityTopicSlug: \"prompt-patterns-for-production-agents\"\n---","hash":"26f07546ba99caa939ab1d0b27f32283b26f342dcc5b71b777c46e8142de0336"}
42
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"## Pattern 1: Role-Based Prompts\n\n[Content continues...]","hash":"61ba2add037fcfabd78ae44cb01f30d4b29a2e667a6eb460ada8b9cf16bb3aad"}
43
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"## Related Resources\n\n- [CRS-100: The 30-Min Feature Run](/courses/crs-100)\n- [Join The 2 AM Bug Fix](/meetups/weekly-tue-2am-bug-fix)\n- [Discussion on Dirrty Mixbag](/dirrtymixbag/news/prompt-patterns-for-production-agents)\n```\n\n---","hash":"a66520e834a1c185797c2517a75122a20054316d9ba62fbff13a82fd306b2c50"}
44
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 6.1 Blog Index Page (`/blog`)\n\n- List of recent blog posts\n- Category filters\n- Tag filters\n- Search functionality\n- Pagination (10 posts per page)","hash":"5959cbf9fc33fb04ef362e29c36568ae150767028fb06a0f769c5d78ba7748cf"}
45
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 6.2 Blog Post Page (`/blog/[slug]`)\n\n- Full blog post content\n- Author attribution\n- Related posts\n- Course and meetup links\n- Dirrty Mixbag discussion link\n- Comments section (linked to Dirrty Mixbag forum)","hash":"63228013afa86c28f01f0995fa458bf3e8112be351786fe0dea1e04aefa6cf12"}
46
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 6.3 Category Pages (`/blog/[category]`)\n\n- List of posts in category\n- Category description\n- Related courses and meetups","hash":"c86e14c9d6a20af375bbb8314df6a25a4318a9c5eac856bd5871fe2bf6c06974"}
47
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 6.4 Tag Pages (`/blog/tag/[tag]`)\n\n- List of posts with tag\n- Tag description\n- Related posts\n\n---","hash":"c62450f515a7e59d7b87b085b94330cb77f450ad8d5858bb5a92365ce2bc480f"}
48
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 7.1 News Index (`/dirrtymixbag/news`)\n\n- List of recent news articles\n- Links to AIGF blog posts\n- Community discussion preview","hash":"b892be5f81faa0d1fc92629442969cb67dc4549814888cd775d972dad410d977"}
49
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 7.2 News Article (`/dirrtymixbag/news/[slug]`)\n\n- Blog post excerpt\n- Full article link to AIGF blog\n- Community comments and discussion\n- Related topics in forum\n\n---","hash":"b276a2fa8b43fbb253826f8494445f9b787e2c24cac527950b324a2953999429"}
50
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 8.1 Weekly Content Calendar\n\n| Day | Content Type | Source |\n|---|---|---|\n| Monday | Technical deep-dive | Captain writes |\n| Wednesday | Course or meetup announcement | Captain writes |\n| Friday | Shipped project showcase | Captain + builder input |\n| Sunday | Community highlights | Captain + community input |","hash":"6d71bf12bb7b4b6f4dfb47a3d3a88dc7733a6f840842c16573cfea648872eb50"}
51
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 8.2 Content Creation Steps\n\n1. **Topic Selection** (Monday morning)\n - Review upcoming courses and meetups\n - Check community questions and discussions\n - Select topic for the week\n\n2. **Outline Creation** (Monday afternoon)\n - Create blog post outline\n - Define key points and examples\n - Identify code snippets needed\n\n3. **Draft Writing** (Tuesday-Wednesday)\n - Write blog post draft\n - Include code examples\n - Add links to courses and meetups\n\n4. **Review** (Thursday)\n - Captain reviews draft\n - Technical accuracy check\n - Tone and style check\n\n5. **Publishing** (Friday)\n - Finalize blog post\n - Publish to AIGF blog\n - Create Dirrty Mixbag forum topic\n - Schedule social media posts\n\n---","hash":"7715f07df0d0df36e17f6b806f3122ae93fd24d4579d8bc05cb30f9d69d38070"}
52
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 9.1 Auth-Linked Content\n\nWhen users are logged in via Dirrty Mixbag community:\n\n- Comment on AIGF blog posts\n- Create forum topics for blog posts\n- Leave feedback on courses and meetups\n- See which community members are reading which posts","hash":"2768b332c3fbc129c9ab2dc11f77718e9bc16ae8395b8279c5fcf5a79c83149a"}
53
- {"timestamp":"2026-09-11T15:31:41Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### 9.2 Cross-Platform Features\n\n- Blog posts link to Dirrty Mixbag discussions\n- Dirrty Mixbag topics link to AIGF blog posts\n- Community member contributions featured on AIGF blog\n- Builder reputation carries across both platforms\n\n---","hash":"352e2480749d1f8744a3266b3281807aec9773c0ab615465fb218023d79c1b73"}
54
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### Phase 1: File Structure (Week 1)\n\n- [ ] Create `data/blog/` directory structure in AIGF\n- [ ] Create blog post template\n- [ ] Create category directories\n- [ ] Test file reading in Next.js","hash":"ef52cfcf3acfff35928bde776e31008f4deb0f5b6af23e947060221315b13c50"}
55
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### Phase 2: Blog Pages (Week 2)\n\n- [ ] Create blog index page (`/blog`)\n- [ ] Create blog post page (`/blog/[slug]`)\n- [ ] Create category pages (`/blog/[category]`)\n- [ ] Create tag pages (`/blog/tag/[tag]`)","hash":"6f43f731f9ca8f2ebe4ce81cc6fba3b226e83025298ecaa2fbfc8cdfe5cc6288"}
56
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### Phase 3: Dirrty Mixbag Integration (Week 3)\n\n- [ ] Add blog section to Dirrty Mixbag news\n- [ ] Add forum topic creation on publish\n- [ ] Add comment system integration\n- [ ] Test cross-platform linking","hash":"bf1e8c2db5486e146344865a6c7f8781c12f5f63e9aaa6f35db3110932f7b57b"}
57
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"### Phase 4: SEO and Polish (Week 4)\n\n- [ ] Add SEO metadata to blog pages\n- [ ] Add sitemap for blog posts\n- [ ] Add RSS feed for blog\n- [ ] Performance testing and optimization\n\n---","hash":"e1c042b00d33cfad8b1d863be8a1260aefec81c2a8211d589dfe0df6bc0936fd"}
58
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"## 11. Success Criteria\n\n- [ ] Blog index page lists all posts\n- [ ] Blog post pages render full content\n- [ ] Category and tag filtering works\n- [ ] Dirrty Mixbag forum topics created for each post\n- [ ] Community members can comment on posts\n- [ ] Course and meetup links in posts work\n- [ ] SEO metadata on all blog pages\n- [ ] Zero mock data in blog content\n\n---","hash":"a737b350d15a81e527b78e24d2860764901f1171ed660f80bbbbb4259f764139"}
59
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"## 12. Success Metrics\n\n| Metric | Target | Measurement |\n|---|---|---|\n| Blog posts published | 2/week | File count in `data/blog/` |\n| Forum topics created | 2/week | Topic count in Dirrty Mixbag |\n| Comments per post | 5+/week | Post count per topic |\n| Blog traffic | 10%/month | Next.js analytics |\n| Course enrollment from blog | 10%/month | Enrollment source tracking |\n| Meetup attendance from blog | 15%/month | Attendance source tracking |\n\n---","hash":"65ca5547dde6ae6c4bb7daaf2f6f7961ab4b52fcd074b0d5f5f1ff8c0d7c1dbe"}
60
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-in-aigf-site.md","tags":["data"],"content":"## 13. Risks and Mitigations\n\n| Risk | Impact | Mitigation |\n|---|---|---|\n| Low community engagement | Medium | Active moderation + engagement prompts |\n| Content policy violations | Medium | Pre-publish review + automated checks |\n| Technical inaccuracies | High | Captain review + community feedback |\n| Copyright issues | High | Original content only, proper attribution |\n| Spam in comments | Medium | Moderation tools + rate limits |","hash":"cefb88afe43b5daa60a4da6d5a90759524d8d20e025914f5a6d6bbb2ea6edd6d"}
61
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"# Blog Management Skill for AIGeeks & Freaks\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Projects:** AIGeeks & Freaks, Dirrty Mixbag Community\n\n---","hash":"aa879fd0038ecff0ad46fb91afef557484446a92ed8f5e7aa0285ffe6cd76bbc"}
62
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"## 1. Goal\n\nCreate a skill that allows the captain to manage blog posts from their regular workflow \u2014 creating, editing, and publishing blog posts without having to manually write files or navigate complex interfaces. The skill integrates with the captain's existing agent workflow (Claude Code, Cursor, OpenCode) and leverages the AI's natural language understanding to generate, review, and publish content.\n\n---","hash":"0a061bf71423a5997c001a461a236e3021f014dc5074e7da57deb28ad67a6512"}
63
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 2.1 Captain's Workflow\n\n- Uses Claude Code, Cursor, OpenCode for agent engineering\n- Creates code, reviews PRs, ships projects\n- Communicates via Dirrty Mixbag community\n- Manages courses and meetups","hash":"b25b33ff8d23faea5c7c54f22aa821d3fcb10d1f1b6caefdcd75b55c2b2a9639"}
64
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 2.2 Current Blog State\n\n- No blog exists yet\n- All content is mock data\n- No content management system\n- No publishing workflow\n\n---","hash":"7524b8d639683745f5eb680344b816580c22d684ebc487941f96ebbca7de44b4"}
65
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 3.1 Skill Name\n\n`aigf-blog-manager`","hash":"94c930424c3dc6e9d62172bb5c27a2d6ca0abfc4ed051ce9a3ae689b9e57f45b"}
66
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 3.2 Skill Location\n\n```\nfirstmate/\n\u2514\u2500\u2500 .agents/skills/\n \u2514\u2500\u2500 aigf-blog-manager/\n \u2514\u2500\u2500 SKILL.md\n```","hash":"a74020cb923dcb2e3b8b20a4b968e1fbaba0bb5493882c2ebe7daa3b926665be"}
67
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 3.3 Skill Capabilities\n\nThe skill provides these capabilities:\n\n1. **Create Blog Post**\n - Captain describes topic in natural language\n - Skill generates outline from description\n - Captain approves or edits outline\n - Skill generates draft from approved outline\n - Captain reviews and approves draft\n - Skill publishes draft to AIGF blog and Dirrty Mixbag\n\n2. **Edit Blog Post**\n - Captain describes changes in natural language\n - Skill finds relevant section in post\n - Captain approves changes\n - Skill edits post and republishes\n\n3. **List Blog Posts**\n - Show recent posts\n - Filter by category, tag, date\n - Search by keyword\n\n4. **Archive Blog Post**\n - Move post to archive\n - Update status\n - Notify community\n\n5. **Schedule Blog Post**\n - Set future publish date\n - Skill publishes at scheduled time","hash":"a0c33663ca15d2eb5a3462668bc1630a85e4074caaeecd999e08319e95cc2047"}
68
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 3.4 Skill Commands\n\n| Command | Description | Example |\n|---|---|---|\n| `/blog create` | Create new blog post | `/blog create \"Prompt patterns for production agents\"` |\n| `/blog edit` | Edit existing post | `/blog edit \"prompt-patterns-for-production-agents\" \"Add section on role-based prompts\"` |\n| `/blog list` | List blog posts | `/blog list --category agent-engineering` |\n| `/blog archive` | Archive post | `/blog archive \"old-post-slug\"` |\n| `/blog schedule` | Schedule post | `/blog schedule \"draft-slug\" --date 2025-10-15` |\n| `/blog publish` | Publish scheduled post | `/blog publish \"scheduled-slug\"` |\n\n---","hash":"942818c9de34b5a77cb3fea7398c0579e3092a413f79b4a6f078852f19080d65"}
69
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 4.1 Create Blog Post Workflow\n\n```\n1. Captain: /blog create \"Prompt patterns for production agents\"\n2. Skill: Generate outline with key points\n3. Captain: Approve or edit outline\n4. Skill: Generate draft from approved outline\n5. Captain: Review and approve draft\n6. Skill: Publish to AIGF blog and Dirrty Mixbag\n7. Skill: Notify community of new post\n```","hash":"d99ac54162cfcff4f5c1bc8a0f7b41cca34297911233606803146a6e9c421b3d"}
70
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 4.2 Edit Blog Post Workflow\n\n```\n1. Captain: /blog edit \"post-slug\" \"Add section on role-based prompts\"\n2. Skill: Find relevant section in post\n3. Skill: Generate edit suggestion\n4. Captain: Approve or reject edit\n5. Skill: Apply edit and republish\n```","hash":"e0ed4000275d9f0ac74f29e448e52c91cae0a8566a46cea8cea3182672e0e5af"}
71
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 4.3 List Blog Posts Workflow\n\n```\n1. Captain: /blog list --category agent-engineering\n2. Skill: Query blog files in category\n3. Skill: Display list of posts with metadata\n4. Captain: Select post for further action\n```\n\n---","hash":"672f1fb12101cb63c6f7436880963f4fbcb9319941741d38eb16e9bc804d3462"}
72
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 5.1 AIGF Blog\n\n- Read/write blog files in `data/blog/`\n- Generate static pages from files\n- Update blog index and category pages\n- Add SEO metadata to pages","hash":"a045b4b14df8583513ed3d2a2137ff6f704c0ff51fe805c90c2d11b4d22c094d"}
73
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 5.2 Dirrty Mixbag Community\n\n- Create forum topics for new posts\n- Update forum topics when posts are edited\n- Link forum topics to blog posts\n- Notify community of new posts","hash":"a05f25ba8a2ecc66e6709016cbfd4c2bef6e36525b832dca6f21f282aa061876"}
74
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 5.3 Marketing Stack\n\n- Postiz: Schedule social media posts\n- Mautic: Add subscribers to mailing list\n- Activepieces: Automate cross-platform publishing","hash":"2a2daf70fb2433e53beec1840cb8459077abe59331a23eebb6d965556b311488"}
75
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 5.4 GitHub Integration\n\n- Link blog posts to GitHub commits\n- Attribute builder contributions\n- Show builder reputation on posts\n\n---","hash":"a7320eb6b1c348c9192f417c57752942fafbdffd445f04c86a38079b88c06026"}
76
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 6.1 Skill Metadata\n\n```yaml\nname: aigf-blog-manager\nversion: 1.0.0\ndescription: Manage blog posts for AIGeeks & Freaks from your regular workflow\ninternal: true\ntrigger: /blog\n```","hash":"26bf5149e3636723b677833fa9805f19d5cf755c889c8dbfb465147b51dfbe88"}
77
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 6.2 Skill Instructions\n\nThe skill contains these instructions:\n\n1. **Post Creation**\n - Parse captain's natural language request\n - Generate outline from request\n - Present outline for captain approval\n - Generate draft from approved outline\n - Present draft for captain approval\n - Publish to AIGF blog and Dirrty Mixbag\n\n2. **Post Editing**\n - Parse captain's edit request\n - Find relevant section in post\n - Generate edit suggestion\n - Present suggestion for captain approval\n - Apply edit and republish\n\n3. **Post Listing**\n - Query blog files\n - Filter by category, tag, date\n - Display list with metadata\n\n4. **Post Archiving**\n - Move post to archive\n - Update status\n - Notify community\n\n5. **Post Scheduling**\n - Set future publish date\n - Store scheduled post\n - Publish at scheduled time\n\n---","hash":"1952483fd13fae14a1f261527cbec773bc847e62fa17aad084e87fb9a013c628"}
78
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### Phase 1: Skill Structure (Week 1)\n\n- [ ] Create `aigf-blog-manager` skill directory\n- [ ] Create SKILL.md with metadata and instructions\n- [ ] Define skill commands and workflows\n- [ ] Test skill loading in firstmate","hash":"643b28ca1e0cfb8ad8de9f0e44528cf2a7c9bbfd17b54e773cfb91909a94fb64"}
79
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### Phase 2: Post Creation (Week 2)\n\n- [ ] Implement `/blog create` command\n- [ ] Implement outline generation\n- [ ] Implement draft generation\n- [ ] Implement publishing to AIGF blog\n- [ ] Implement publishing to Dirrty Mixbag","hash":"d25bdb6d008fbf9c249800a8b1dbe448a3ca58a2b462da445ae671178211a50f"}
80
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### Phase 3: Post Management (Week 3)\n\n- [ ] Implement `/blog edit` command\n- [ ] Implement `/blog list` command\n- [ ] Implement `/blog archive` command\n- [ ] Implement `/blog schedule` command\n- [ ] Implement `/blog publish` command","hash":"5fc3cbfd239fa4f5e88c19725b0be2517138b0ef3d191eef0f2676f755e74237"}
81
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### Phase 4: Integration (Week 4)\n\n- [ ] Connect Postiz for social media\n- [ ] Connect Mautic for email\n- [ ] Connect Activepieces for automation\n- [ ] Connect GitHub for builder attribution\n- [ ] Test end-to-end workflow\n\n---","hash":"b90585ba50c1a0aecbeb59d98d580a5bdbbd5ed73e5834ff520d5045e4ba9385"}
82
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"## 8. Success Criteria\n\n- [ ] Captain can create blog post with natural language\n- [ ] Captain can edit blog post with natural language\n- [ ] Captain can list blog posts with filters\n- [ ] Captain can archive blog posts\n- [ ] Captain can schedule blog posts\n- [ ] Blog posts published to AIGF blog\n- [ ] Blog posts published to Dirrty Mixbag\n- [ ] Social media posts scheduled automatically\n- [ ] Email notifications sent automatically\n- [ ] Builder attribution linked to GitHub\n\n---","hash":"6fc1539bb55fa591d2077e459d07ed968e57fce73bcc18ba11428fcc6ab6db49"}
83
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"## 9. Success Metrics\n\n| Metric | Target | Measurement |\n|---|---|---|\n| Blog posts created via skill | 80%+ | Command usage count |\n| Captain satisfaction | 4/5 | Captain feedback |\n| Time to publish | <30 min | Time from command to publish |\n| Error rate | <5% | Failed command count |\n| Community engagement | 5+/comment | Comments per post |\n\n---","hash":"3cabd3ef7e47060e7982d729db5d957bab1f6ee2e9512024ef40babb68510de0"}
84
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"## 10. Risks and Mitigations\n\n| Risk | Impact | Mitigation |\n|---|---|---|\n| AI-generated content quality | Medium | Human review of all drafts |\n| Skill command errors | Low | Clear error messages + fallback |\n| Publishing failures | Medium | Retry logic + error notifications |\n| Content policy violations | Medium | Pre-publish review + automated checks |\n| Low captain adoption | Medium | Simple commands + clear documentation |\n\n---","hash":"08a85b82e9eb3bb5b85b6597a5c067c0a93623d64c94079716b044527c6e3042"}
85
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 11.1 AI-Assisted Writing\n\n- Auto-generate outlines from course materials\n- Auto-generate drafts from meetup recordings\n- Auto-generate code examples from shipped projects\n- Auto-generate community highlights from forum discussions","hash":"cb5d1b110e6c1a5987293bfab6a827b16c6b4ca9caeae51eb263953aad0d0138"}
86
- {"timestamp":"2026-09-11T15:31:42Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 11.2 Community Contributions\n\n- Allow community members to submit guest posts\n- Auto-review guest post submissions\n- Auto-approve guest posts from trusted members\n- Auto-notify captains of new guest post submissions","hash":"f04005065e3d7cb5a80dc33fcf3afa37722be1a06bcaf1025e6103b891658198"}
87
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 11.3 Analytics Integration\n\n- Track blog post views\n- Track course enrollment from blog\n- Track meetup attendance from blog\n- Generate monthly content reports","hash":"f4e3108f4d249e1cacd429201a99aa06ee0ee168e24405c07ceb31dd3d60cd42"}
88
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-blog-management-skill.md","tags":["data"],"content":"### 11.4 Multi-Language Support\n\n- Auto-translate blog posts to other languages\n- Auto-detect reader language preference\n- Auto-display posts in preferred language","hash":"0081a17be78a865a7603535b71176a79ae1aa71bbb8d173de0fcae34be2198b1"}
89
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"# Courses & Meetups \u2014 File-per-Item Folder Structure\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Projects:** AIGeeks & Freaks (`/home/zerwiz/CodeP/aigeeks&freeks`)\n\n---","hash":"423523cd418b077a02eea1a2b05f49ea959c91b7b11c2703bd9b9cbb324cc772"}
90
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## 1. Goal\n\nReplace the hardcoded `EVENTS`, `COURSES`, and related mock arrays with one-file-per-course and one-file-per-meetup text documents. Each file is a single source of truth for that course or meetup \u2014 title, description, outcome, schedule, prerequisites, and metadata. The frontend reads these files at build time or runtime to populate the catalog and event listings.\n\n---","hash":"0988165b68320ac79e9f66b2254c8093c0240f02bd74088baf454fb6bf6de616"}
91
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## 2. Folder Structure\n\n```\naigeeks&freeks/\n\u251c\u2500\u2500 data/\n\u2502 \u251c\u2500\u2500 courses/\n\u2502 \u2502 \u251c\u2500\u2500 CRS-100.md\n\u2502 \u2502 \u251c\u2500\u2500 CRS-200.md\n\u2502 \u2502 \u251c\u2500\u2500 CRS-300.md\n\u2502 \u2502 \u2514\u2500\u2500 CRS-400.md\n\u2502 \u2514\u2500\u2500 meetups/\n\u2502 \u251c\u2500\u2500 weekly-tue-2am-bug-fix.md\n\u2502 \u251c\u2500\u2500 monthly-fri-showcase.md\n\u2502 \u251c\u2500\u2500 quarterly-masterclass.md\n\u2502 \u2514\u2500\u2500 archive/\n\u2502 \u251c\u2500\u2500 W26-showcase-night-5.md\n\u2502 \u251c\u2500\u2500 W25-mcp-deep-dive.md\n\u2502 \u2514\u2500\u2500 W24-factory-workshop.md\n```\n\n---","hash":"f6e752fc6ded0670eeafc3b062bcb25440ab48f6fce6c07368e6e498feed0980"}
92
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## 3. Course File Format\n\nEach course file is a Markdown document with a YAML front matter block and a body section.","hash":"47dfc234778f3fe93d48a5fe8437969b775b5f57b6a6a82970a64b5a8cdcde00"}
93
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 3.1 Front Matter Fields\n\n| Field | Required | Type | Description |\n|---|---|---|---|\n| `code` | Yes | string | Unique course code (e.g., `CRS-100`) |\n| `title` | Yes | string | Display title |\n| `outcome` | Yes | string | One-sentence learning outcome |\n| `level` | Yes | string | Level label (e.g., `LVL 100`) |\n| `lvlColor` | Yes | string | Color token: `lime`, `cyan`, `amber` |\n| `stack` | Yes | array | Array of tool names (e.g., `[\"Claude Code\", \"Cursor\"]`) |\n| `duration` | Yes | string | Duration label (e.g., `3h \u00b7 self-paced`) |\n| `lessons` | Yes | integer | Number of lessons |\n| `price` | Yes | string | Price display (e.g., `$0`, `$49`) |\n| `priceNote` | No | string | Price note (e.g., `open access`) |\n| `includes` | Yes | string | Included infrastructure |\n| `prereq` | No | string | Prerequisites |\n| `status` | No | string | `active`, `draft`, `archived` (default: `active`) |\n| `featured` | No | boolean | Whether to highlight in catalog (default: `false`) |\n| `path` | No | array | Array of path step labels |\n| `createdAt` | No | ISO date | Creation date |\n| `updatedAt` | No | ISO date | Last update date |","hash":"265ef6fcdc3b2f4849cd9335a3e65eb037ce21cb2d0335def39e8b3a2e854a70"}
94
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 3.2 Body Section\n\nThe body contains the full course description, lesson-by-lesson breakdown, and any additional context. This is what gets rendered on the course detail page.","hash":"0041b1227224bef32fa5ff9d1dadce7115ac783f227298abe263bba1e0f0c0d6"}
95
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 3.3 Example Course File\n\n```markdown\n---\ncode: \"CRS-100\"\ntitle: \"The 30-Min Feature Run\"\noutcome: \"Take a fuzzy feature request from idea to merged PR in one focused 30-minute loop \u2014 prompt, plan, code, review, ship.\"\nlevel: \"LVL 100\"\nlvlColor: \"lime\"\nstack:\n - \"Claude Code\"\n - \"Cursor\"\n - \"OpenCode\"\nduration: \"3h \u00b7 self-paced\"\nlessons: 14\nprice: \"$0\"\npriceNote: \"open access\"\nincludes: \"Community Discord + shared OpenChamber sandbox\"\nprereq: \"None \u2014 a browser and an idea are enough.\"\nstatus: \"active\"\nfeatured: false\npath:\n - \"Prompt\"\n - \"Plan\"\n - \"Code\"\n - \"Review\"\n - \"Ship\"\n---","hash":"ebdacf61725501c232724a3532a9ffc2ed31e7fd939c2d80b79f36983ab3e6f8"}
96
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Overview\n\nThis course teaches you to take a feature request from zero to merged PR in a single focused session. You will learn the prompt-to-ship loop that turns fuzzy requirements into working code.","hash":"1830d034afc1803b3659c66d65dbb26a92d9e735ead287a610f908cc3a8cf7e4"}
97
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## What You Will Learn\n\n- How to write prompts that produce working code on the first try\n- Planning strategies for 30-minute feature sprints\n- Code review patterns that catch real bugs\n- Ship workflows that merge to main without breaking CI","hash":"163d48b01378b2ecf23ccc668b483ac9fd3cb7fee0198230c8ad5a30d95e3a1d"}
98
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Lesson Breakdown\n\n1. **The one-prompt loop** (15m) \u2014 Write prompts that produce working code\n2. **Planning the feature** (20m) \u2014 Break down requirements into actionable steps\n3. **Code generation patterns** (30m) \u2014 Prompt patterns for different code styles\n4. **Review and iterate** (25m) \u2014 How to review AI-generated code effectively\n5. **Ship to main** (15m) \u2014 Merge workflows and CI gates","hash":"3c9bf9a6ab4662939b58969a9be96dcc8ea936e4003b03750dcb5b104ff3502e"}
99
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Included Infrastructure\n\nCommunity Discord + shared OpenChamber sandbox","hash":"ec13c77795ec1feb121720e47d818bc3cedc9d9f20942a105dcc37f34f2fd96c"}
100
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Price\n\n$0 \u2014 open access\n```\n\n---","hash":"c4f7c471b833c3663fcfbffafaef2ae7d81c73f87efa92f5643f3738bf3d52ce"}
101
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## 4. Meetup File Format\n\nEach meetup file is a Markdown document with a YAML front matter block and a body section.","hash":"ed318c422cd6bcd08107a0fed1f8882126a0e2db84680c007d93933aac87f3ec"}
102
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 4.1 Front Matter Fields\n\n| Field | Required | Type | Description |\n|---|---|---|---|\n| `id` | Yes | string | Unique identifier (slug) |\n| `title` | Yes | string | Display title |\n| `kind` | Yes | string | Event type: `weekly`, `monthly`, `masterclass`, `showcase`, `one-off` |\n| `description` | Yes | string | Full event description |\n| `hostName` | No | string | Host display name |\n| `status` | No | string | `upcoming`, `live`, `completed`, `cancelled` (default: `upcoming`) |\n| `isRecurring` | No | boolean | Whether this is a recurring event (default: `false`) |\n| `recurrence` | No | string | Recurrence pattern (e.g., `weekly-tue`, `monthly-first-fri`) |\n| `dayOfWeek` | No | string | Day abbreviation (e.g., `TUE`, `FRI`) |\n| `time` | No | string | Start time (e.g., `02:00`, `19:00`) |\n| `timezone` | No | string | Timezone (default: `CET`) |\n| `startDate` | No | ISO date | First occurrence date |\n| `endDate` | No | ISO date | Last occurrence date (for finite series) |\n| `replayUrl` | No | string | YouTube or recording URL |\n| `viewCount` | No | integer | Number of views (default: `0`) |\n| `maxAttendees` | No | integer | Capacity limit |\n| `discordChannelId` | No | string | Discord channel ID for this event |\n| `createdAt` | No | ISO date | Creation date |\n| `updatedAt` | No | ISO date | Last update date |","hash":"693b9e67d330ae145a163003f59e9832353318ce7109de05456349d679d10f94"}
103
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 4.2 Body Section\n\nThe body contains the full event description, agenda, what to bring, and any additional context. This is what gets rendered on the event detail page.","hash":"6c8a7f21ee7544a4eb7cc53d8e346a90105da3d0bd2fae6298f674460bde2a96"}
104
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 4.3 Example Upcoming Meetup File\n\n```markdown\n---\nid: \"weekly-tue-2am-bug-fix\"\ntitle: \"The 2 AM Bug Fix\"\nkind: \"weekly\"\ndescription: \"Live screen-share office hours every Tuesday at 2 AM CET. Bring a stuck agent, a half-built demo, or a bug that won't reproduce. We'll pair on it together.\"\nhostName: \"The Factory\"\nstatus: \"upcoming\"\nisRecurring: true\nrecurrence: \"weekly-tue\"\ndayOfWeek: \"TUE\"\ntime: \"02:00\"\ntimezone: \"CET\"\nmaxAttendees: 40\ndiscordChannelId: \"channel-id-here\"\n---","hash":"3e2fefb9d27d625bf4adc4b77716cc360d0cfaed3363537ce2332044c6da425c"}
105
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## What Happens\n\nLive screen-share office hours where builders bring their hardest problems and get help in real time. This is not a presentation \u2014 it's a working session.","hash":"7b1ff6e42aaff30e1f718726e6e7633061d292bece08bd4907ce08836ffa8c61"}
106
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## What to Bring\n\n- A stuck agent that won't cooperate\n- A half-built demo that needs finishing\n- A bug that only reproduces on Tuesdays\n- A PR review you want done live","hash":"1b153d1e17a06e785d60f156c238c31a3fbc51fa05d8e14bde5e74afe0051f87"}
107
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## How It Works\n\n1. Join the Discord voice channel at the scheduled time\n2. Share your screen and describe the problem\n3. The community pairs with you to solve it\n4. If it ships, it goes on the wall","hash":"e2daacd3c44173a73164b73a85c53abbbe9e80703609ea7e9bd9b1b5f547a4a0"}
108
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Replay\n\nPast sessions are recorded and linked here when available.\n```","hash":"69afe270dad4a232dc99f33cdc06fff80209b888c0996fd794edf417d01b8570"}
109
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 4.4 Example Archive Meetup File\n\n```markdown\n---\nid: \"W26-showcase-night-5\"\ntitle: \"W26 Showcase Night #5\"\nkind: \"showcase\"\ndescription: \"Fifth showcase night of the year. Three builders demo what they shipped in the previous week.\"\nhostName: \"Showcase Committee\"\nstatus: \"completed\"\nstartDate: \"2025-06-28T19:00:00Z\"\nendDate: \"2025-06-28T21:00:00Z\"\nreplayUrl: \"https://youtube.com/watch?v=example\"\nviewCount: 342\nmaxAttendees: 40\n---","hash":"757983a2748d7f6d93c3632be8c8fa41c5bb5c054a58fcb8696c205c39896936"}
110
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Agenda\n\n- 19:00 \u2014 Doors open, Discord voice channel active\n- 19:15 \u2014 Welcome and rules\n- 19:20 \u2014 Builder 1 demo (10 min)\n- 19:30 \u2014 Builder 2 demo (10 min)\n- 19:40 \u2014 Builder 3 demo (10 min)\n- 19:50 \u2014 Open Q&A\n- 20:30 \u2014 Wrap and next showcase announcement","hash":"68b6e6aeff04b54b69693adeddc1ded0df1011f1c6d49a472b6a831f3c3119f4"}
111
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## Shown This Session\n\n- @kira \u2014 mcp-github-issues\n- @neo \u2014 swarm-orchestrator\n- @holt \u2014 eval-harness-skill\n```\n\n---","hash":"9242394c17e44035bfb386e4ba5784a5656c01526db84416c00eb3cedba9c4cd"}
112
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 5.1 Build-Time Reading (Static Generation)\n\nAt build time, the Next.js app reads all files in `data/courses/` and `data/meetups/`, parses the front matter, and generates static pages or API responses. This is the default path for production.","hash":"f67e15b1b6f5348130ab187dc07c13dc7bc10541e9393c8410f306190e1099a1"}
113
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 5.2 Runtime Reading (Dynamic Content)\n\nFor admin-created or frequently updated content, the app reads files at runtime on each request. This adds a small overhead but allows instant updates without rebuilds.","hash":"8fe6c913b0f5000a4a70ca878da6532e8bdf295704316ce134009d90c949fceb"}
114
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 5.3 Hybrid Approach\n\nBuild-time for stable content (courses, past events), runtime for active content (upcoming events, live status). This gives the best of both worlds.\n\n---","hash":"f7616ddd768be8552bf96df1ccbd00cb6d6de98ea0bdb2be889bdcf5808f08ee"}
115
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 6.1 Creating a New Course\n\n1. Copy an existing course file from `data/courses/`\n2. Update the front matter fields\n3. Write the body section\n4. Set `status: \"active\"` when ready to publish","hash":"83a653db5179f0c11d962b71ce6d2f2f9cdcc62f23bf5541e6a340ce34721e59"}
116
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 6.2 Creating a New Meetup\n\n1. Copy an existing meetup file from `data/meetups/`\n2. Update the front matter fields\n3. Write the body section\n4. Set `status: \"upcoming\"` for future events","hash":"362f0f4b553cb5c3d409f8a0fb583b3e5ce24f4c5ef5f3fe2f5428519b7e601e"}
117
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 6.3 Archiving a Past Meetup\n\n1. Open the meetup file\n2. Change `status` from `upcoming` to `completed`\n3. Add the `replayUrl` when the recording is available\n4. Move the file to `data/meetups/archive/`\n\n---","hash":"750a83b890fc716dd4da6c740c95bdc1b4bd4b2adde26cdedfaf9a4b209d40dc"}
118
- {"timestamp":"2026-09-11T15:31:43Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 7.1 Auth-Linked Content\n\nWhen users are logged in via the Dirty Mox Bag community (Supabase Auth), they can:\n\n- Comment on course pages\n- Leave feedback on meetup pages\n- Create subtopics in the community forum linked to specific courses or meetups\n- See which community members are enrolled in which courses","hash":"669d40b482a6a094455df37940ec24127b9a4063a3c60ca1b99cb0e1e3389ac3"}
119
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### 7.2 Cross-Platform Features\n\n- Course enrollment tracked in community profiles\n- Meetup attendance tracked in community profiles\n- AI blog posts (see separate document) linked to both platforms\n- Builder reputation carries across both communities\n\n---","hash":"8396e593424b8971b7b73e997a8719d860c7f8511a3866e2d2e4e6999302b230"}
120
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### Phase 1: File Structure Setup\n\n- Create `data/courses/` and `data/meetups/` directories\n- Convert existing mock data arrays to individual files\n- Verify file reading works in development","hash":"e59e2343f57f5652434b821f9ca318ba7db68e89516ca8827520eeecbb1c6783"}
121
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### Phase 2: Frontend Integration\n\n- Update course catalog page to read from files\n- Update meetup listing page to read from files\n- Add course detail and meetup detail pages\n- Add admin interface for file management","hash":"70e5bf50127f560bb8d9823e2e23cf024b0a366d70421b9fb055caea0588b7ae"}
122
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"### Phase 3: Community Integration\n\n- Link community auth to course/meetup interactions\n- Add community forum topics for each course and meetup\n- Enable cross-platform reputation\n\n---","hash":"31267ab604027ebea7a6d2c520bcdfe20a8c2e3308f6cb182f629d4775fa5e2d"}
123
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-courses-meetups-file-structure.md","tags":["data"],"content":"## 9. Success Criteria\n\n- [ ] Every course has its own file in `data/courses/`\n- [ ] Every meetup has its own file in `data/meetups/`\n- [ ] Past meetups are archived in `data/meetups/archive/`\n- [ ] Frontend reads files and displays correct data\n- [ ] Admin can create/update/archive content via files\n- [ ] Community auth is linked to course/meetup interactions\n- [ ] Zero mock data arrays remain in any component","hash":"51b78702795f53835ba3a8640fa0d845b44c604c4f7756be35b20426e81888f0"}
124
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"# GitHub & Google Login Integration Plan\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Projects:** AIGeeks & Freaks, Dirty Mox Bag Community\n\n---","hash":"e018c3cc3fb60d51fb557dca40e8352ead5ce29702e35f64c58c325dfde48889"}
125
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"## 1. Goal\n\nEnable users to log in to both AIGeeks & Freaks and the Dirty Mox Bag community using GitHub or Google accounts. This leverages the existing Supabase Auth infrastructure in the Dirty Mox Bag community and extends it to support AIGeeks & Freaks as a second tenant.\n\n---","hash":"c8fc18bb7a89a1f198795ef5df92b24d9a1936c5bb323fd3884cc4f8a1e37b30"}
126
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 2.1 Dirty Mox Bag Community\n\n- **Auth:** Supabase Auth (email/password only currently)\n- **DB:** PostgreSQL via Supabase\n- **Tables:** `community_profiles`, `community_topics`, `community_posts`, etc.\n- **Tenant:** `dirrtymixbag`\n- **RLS:** Row Level Security policies per tenant\n- **Frontend:** Astro-based site at `/dirrtymixbag`","hash":"8722f2b6ae42337fd40376d86d6c8fe2c24b83a5f27c07aef5a0a9249adf3195"}
127
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 2.2 AIGeeks & Freaks\n\n- **Auth:** None currently (login page exists but not functional)\n- **DB:** Prisma with SQLite (local dev)\n- **Schema:** `User`, `Post` models only\n- **Frontend:** Next.js 16 site at `aigeeksnfreaks.zerwiz.org`\n\n---","hash":"2ae3e18a0bae51ab2fc8060e0d23b5fc58225ccff130a795eaecd90e5d5de0f7"}
128
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 3.1 Single Auth Provider (Supabase)\n\nUse Supabase Auth as the single authentication provider for both platforms. This means:\n\n- One Supabase project handles auth for both tenants\n- GitHub and Google OAuth providers configured in Supabase\n- Users log in once and get profiles in both communities\n- RLS policies enforce tenant isolation","hash":"04b65de1eeeb6fa02f19e2b001a5a9d72658f6e5145f31250b7a98e99287c907"}
129
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 3.2 Multi-Tenant Profile Model\n\nExtend the existing `community_profiles` table to support multiple tenants:\n\n- `tenant_slug` field already exists (currently defaults to `dirrtymixbag`)\n- Add `aigf` as a second tenant slug\n- Users get profiles in both tenants automatically on signup\n- Each tenant has its own profile data (bio, avatar, preferences)\n\n---","hash":"365e66eb16e93aa450853eddfa3c5f99bcc0ca2c14523819adf90a12fe96ba55"}
130
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 1: Supabase OAuth Configuration\n\n**Goal:** Enable GitHub and Google login in Supabase.\n\n1. **GitHub OAuth App**\n - Create GitHub OAuth application\n - Get client ID and secret\n - Configure callback URL: `https://whynotproductions.netlify.app/dirrtymixbag/login/`\n - Store credentials in Supabase project settings\n\n2. **Google OAuth App**\n - Create Google Cloud OAuth application\n - Get client ID and secret\n - Configure authorized redirect URI\n - Store credentials in Supabase project settings\n\n3. **Supabase Provider Configuration**\n - Enable GitHub provider in Supabase dashboard\n - Enable Google provider in Supabase dashboard\n - Set provider URLs and scopes\n - Configure email template overrides\n\n4. **Environment Variables**\n - Add `GITHUB_CLIENT_ID` and `GITHUB_SECRET` to Supabase\n - Add `GOOGLE_CLIENT_ID` and `GOOGLE_SECRET` to Supabase\n - Add to Netlify deploy settings\n - Add to local `.env` files","hash":"b896bdfa9705680dac3e710eba9ae84ba598f9e23c0204ca6bf8e888ac4b1fca"}
131
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 2: Frontend Auth Integration\n\n**Goal:** Add GitHub and Google login buttons to both platforms.\n\n1. **Dirty Mox Bag Login Page**\n - Add GitHub login button\n - Add Google login button\n - Keep email/password login as fallback\n - Handle OAuth callback flow\n - Redirect to community home after login\n\n2. **AIGeeks & Freaks Login Page**\n - Add GitHub login button\n - Add Google login button\n - Keep email/password login as fallback\n - Handle OAuth callback flow\n - Redirect to AIGF home after login\n\n3. **Session Management**\n - Use Supabase client-side session management\n - Store session in localStorage\n - Auto-refresh sessions\n - Handle session expiry gracefully","hash":"06c988ba31763370033263cfd7406f29c59e5335e67c2b54d2b5f17126903eeb"}
132
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 3: Multi-Tenant Profile Sync\n\n**Goal:** Auto-create profiles in both tenants when users sign up.\n\n1. **Supabase Trigger**\n - Extend `handle_new_user_profile()` function\n - Create profile in `dirrtymixbag` tenant\n - Create profile in `aigf` tenant\n - Link profiles by `auth.users.id`\n\n2. **Profile Data Sharing**\n - Allow users to set shared display name and avatar\n - Allow tenant-specific bio and preferences\n - Sync gamer tag across tenants (optional)\n\n3. **RLS Policy Updates**\n - Add `aigf` tenant to existing RLS policies\n - Ensure cross-tenant data isolation\n - Test policy enforcement","hash":"a1ce06d6950517212607206c0d6eae8883738a4937069b15bb4aac80c2e1e0c7"}
133
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 4: AIGF-Specific Auth Features\n\n**Goal:** Enable AIGF-specific auth flows.\n\n1. **Ship Attribution**\n - Link GitHub commits to user profiles\n - Show builder reputation on AIGF pages\n - Enable community forum topics per course/meetup\n\n2. **Course Enrollment**\n - Track enrollment via Supabase\n - Link to community profile\n - Enable progress tracking\n\n3. **Meetup Attendance**\n - Track attendance via Supabase\n - Link to community profile\n - Enable replay access for attendees\n\n---","hash":"de9c848d0af0ccbd516ea316df49ef5df5638b9a36400af3b7986eb555f9de88"}
134
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 5.1 OAuth Security\n\n- Use PKCE flow for all OAuth requests\n- Validate state parameter to prevent CSRF\n- Store client secrets server-side only\n- Use HTTPS for all auth endpoints","hash":"670d181e007c0728c6d65cbdd13374ddb5bc883a353404c6c9a75ce36b31895e"}
135
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 5.2 Session Security\n\n- Use Supabase JWT tokens for session management\n- Set appropriate token expiry (7 days default)\n- Implement token refresh on expiry\n- Invalidate sessions on password change","hash":"64180f4069daec3b42d39e027c56d395cc7b51663590ce61a313d2219b80c8a5"}
136
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 5.3 RLS Security\n\n- Enforce tenant isolation at database level\n- Never trust client-side tenant claims\n- Use Supabase row-level security policies\n- Test policies with different user roles","hash":"109766b0f945b4e1f5798f4eefef8a100b04f818c9865ded104daa2530ebad5c"}
137
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### 5.4 Rate Limiting\n\n- Implement login rate limits (10 attempts per hour)\n- Implement signup rate limits (3 per hour)\n- Implement password reset rate limits (5 per hour)\n- Use Supabase built-in rate limiting where available\n\n---","hash":"97ab21da9a266b809e92e16f3933298057c9b2a6b83f0d4d43fc9c009185f4c1"}
138
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 1: Setup (Week 1)\n\n- [ ] Create GitHub OAuth application\n- [ ] Create Google OAuth application\n- [ ] Configure Supabase providers\n- [ ] Add environment variables\n- [ ] Test OAuth flow in development","hash":"4d2bdad151b5b255aef49d2a18a77a9807760de8686e2f456ca14f870b38f1fa"}
139
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 2: Frontend (Week 2)\n\n- [ ] Add login buttons to Dirty Mox Bag\n- [ ] Add login buttons to AIGF\n- [ ] Implement OAuth callback handling\n- [ ] Test session management\n- [ ] Test cross-tenant profile creation","hash":"92047b5b14ac4e577aaa278de5406dbf04dd3fa5d317c9d1f9022fdbe3a70ca0"}
140
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 3: Integration (Week 3)\n\n- [ ] Extend Supabase trigger for multi-tenant profiles\n- [ ] Update RLS policies for `aigf` tenant\n- [ ] Add ship attribution flow\n- [ ] Add course enrollment tracking\n- [ ] Add meetup attendance tracking","hash":"45ce958860c882f546e28a3de227a8c36b0bd1378bada68791bfb18507d88bc7"}
141
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"### Phase 4: Polish (Week 4)\n\n- [ ] Add logout flow\n- [ ] Add profile management for both tenants\n- [ ] Add session expiry handling\n- [ ] Add error states for auth failures\n- [ ] Performance testing and optimization\n\n---","hash":"4881023ad0ae9e150c806cc4a6521c81a42e4c78d7a36f073c6dd7b69b830395"}
142
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"## 7. Success Criteria\n\n- [ ] Users can log in with GitHub on both platforms\n- [ ] Users can log in with Google on both platforms\n- [ ] Users get profiles in both communities automatically\n- [ ] Session persists across page reloads\n- [ ] Logout works correctly\n- [ ] RLS enforces tenant isolation\n- [ ] Rate limiting prevents abuse\n- [ ] OAuth flow works in production\n\n---","hash":"df05a626e8217cb0260b3222c2ff9d24933aba72ffaae9e0c0f33400d2cf4265"}
143
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"## 8. Dependencies\n\n- GitHub Developer account (for OAuth app)\n- Google Cloud account (for OAuth app)\n- Supabase project access (for provider configuration)\n- Netlify access (for environment variables)\n- AIGF codebase access (for login page updates)\n- Dirty Mox Bag codebase access (for login page updates)\n\n---","hash":"23947c4982c685e2b5722f063c8101d13f1acac5196ba1d83dbb413862fe5482"}
144
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-github-google-login-plan.md","tags":["data"],"content":"## 9. Risks and Mitigations\n\n| Risk | Impact | Mitigation |\n|---|---|---|\n| GitHub OAuth app rejection | Medium | Use personal account initially, migrate later |\n| Google OAuth app verification delay | High | Use test users initially, request verification early |\n| RLS policy bugs | High | Test thoroughly with different user roles |\n| Session hijacking | High | Use HTTPS, secure cookies, regular token refresh |\n| Rate limit bypass | Medium | Implement server-side rate limiting |\n| Cross-tenant data leak | Critical | Test RLS policies, use Supabase audit logs |","hash":"927650cdb1f631ef0f3e61a39a41cfd6cca60e1281a4a6a2f882a726ad39ac77"}
145
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"# AIGeeks & Freaks \u2014 Master Planning Index\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Projects:** AIGeeks & Freaks, Dirrty Mixbag Community, WhyNot Productions\n\n---","hash":"73222839dc28f1ede4f002fc3105a894e944d0c4843fcbda618ebdaee935ef32"}
146
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"## Overview\n\nThis document indexes all planning documents for the AIGeeks & Freaks real data migration, authentication integration, blog system, and content management skill. All work is text-only planning \u2014 no code yet.\n\n---","hash":"bbf92e700db6d6b6310e44dd41f6fb6a1e5ae80ce4c905ab483625412876cc2b"}
147
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### 1. Real Data Migration Plan\n\n**Path:** `data/aigf-real-data-migration-plan.md`\n**Covers:** Database schema, API routes, mock data inventory, migration phases\n\n**Key Points:**\n- Replace all mock data arrays with real database queries\n- New Prisma schema: `User`, `Course`, `Event`, `Ship`, `Agent`, `Workspace`, etc.\n- API routes for hero metrics, meetups, courses, shipped items\n- 6-phase migration: Foundation \u2192 Meetups \u2192 Courses \u2192 Shipped \u2192 Join CTA \u2192 Integration\n- Estimated effort: 17-23 days","hash":"7c07d472dd229b46931b775b4f1f2e8360d0a68b5cbc4168eaed5ff856f99a71"}
148
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### 2. Courses & Meetups File Structure\n\n**Path:** `data/aigf-courses-meetups-file-structure.md`\n**Covers:** One-file-per-course and one-file-per-meetup folder structure\n\n**Key Points:**\n- Folder structure: `data/courses/`, `data/meetups/`, `data/meetups/archive/`\n- YAML front matter + Markdown body for each file\n- Build-time or runtime file reading strategy\n- Admin workflow for creating, updating, archiving content\n- Integration with Dirrty Mixbag community auth","hash":"9b91519fbbf0ce1cad8c53d1a0a85d739ca573277448fdae5f7bb534c032c93a"}
149
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### 3. GitHub & Google Login Plan\n\n**Path:** `data/aigf-github-google-login-plan.md`\n**Covers:** Supabase Auth integration, OAuth configuration, multi-tenant profile sync\n\n**Key Points:**\n- Single Supabase project handles auth for both platforms\n- GitHub and Google OAuth providers\n- Multi-tenant profile model (`dirrtymixbag` + `aigf`)\n- 4-phase implementation: OAuth config \u2192 Frontend \u2192 Profile sync \u2192 AIGF features\n- Security: PKCE flow, JWT sessions, RLS policies, rate limiting","hash":"969659b77569f4a45704e0ca8d8e5d62923af4f418acf9e7cc5ac93745780796"}
150
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### 4. AI Blog Posts in Dirrty Mixbag\n\n**Path:** `data/aigf-ai-blog-posts-in-community.md`\n**Covers:** Blog content strategy, AI-assisted writing workflow, community engagement\n\n**Key Points:**\n- 5 content pillars: Agent Engineering, Courses, Meetups, Shipped Projects, Community News\n- Blog posts stored as Markdown files in `dirrtymixbag/blog/`\n- AI-assisted writing with human-in-the-loop review\n- Forum topic integration for each post\n- Marketing stack integration: Postiz, Mautic, Activepieces","hash":"03fcb640535055ae996e98671fe71cb8450e0ea544d1b3e003ede4f16e747c9a"}
151
- {"timestamp":"2026-09-11T15:31:44Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### 5. Blog on AIGF Site\n\n**Path:** `data/aigf-blog-in-aigf-site.md`\n**Covers:** AIGF blog pages, Dirrty Mixbag news integration, content flow\n\n**Key Points:**\n- Two-tier blog system: AIGF blog (primary) + Dirrty Mixbag news (discussion)\n- Blog files in `aigeeks&freeks/data/blog/`\n- Pages: Blog index, post page, category pages, tag pages\n- Content flow: Captain writes \u2192 AIGF blog \u2192 Dirrty Mixbag forum topic\n- SEO optimization, sitemap, RSS feed","hash":"28432f552baa659d3d8d419824a63dfb65f3978cd63a56003c2379b2a31330dd"}
152
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### 6. Blog Management Skill\n\n**Path:** `data/aigf-blog-management-skill.md`\n**Covers:** Captain-facing skill for creating/editing/publishing blog posts\n\n**Key Points:**\n- Skill name: `aigf-blog-manager`\n- Commands: `/blog create`, `/blog edit`, `/blog list`, `/blog archive`, `/blog schedule`, `/blog publish`\n- Natural language workflow: Captain describes topic \u2192 AI generates outline \u2192 Captain approves \u2192 AI generates draft \u2192 Captain approves \u2192 Publish\n- Integration with AIGF blog, Dirrty Mixbag, marketing stack, GitHub\n\n---","hash":"c9548ac945c8ab154b4756c08b70ebc0e2c0cf3f431d65f99b371269215a9f2e"}
153
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"## How It All Fits Together\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 CAPTAIN'S WORKFLOW \u2502\n\u2502 \u2502\n\u2502 /blog create \"Prompt patterns\" \u2502\n\u2502 /blog edit \"Add section on X\" \u2502\n\u2502 /blog list --category agent-engineering \u2502\n\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 BLOG MANAGEMENT SKILL \u2502\n\u2502 (aigf-blog-manager) \u2502\n\u2502 \u2502\n\u2502 - Generates outline from natural language \u2502\n\u2502 - Generates draft from approved outline \u2502\n\u2502 - Publishes to AIGF blog and Dirrty Mixbag \u2502\n\u2502 - Schedules social media posts \u2502\n\u2502 - Sends email notifications \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 AIGF BLOG (Primary) \u2502\n\u2502 aigeeksnfreaks.zerwiz.org/blog \u2502\n\u2502 \u2502\n\u2502 - Full blog posts with rich formatting \u2502\n\u2502 - Course and meetup links \u2502\n\u2502 - Builder attribution via GitHub \u2502\n\u2502 - SEO-optimized for search engines \u2502\n\u2502 - File-based: data/blog/*.md \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u2502 Cross-link\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 DIRRTY MIXBAG NEWS / FORUM \u2502\n\u2502 whynotproductions.netlify.app/dirrtymixbag \u2502\n\u2502 \u2502\n\u2502 - Forum topic for each blog post \u2502\n\u2502 - Community comments and discussion \u2502\n\u2502 - Community member contributions \u2502\n\u2502 - Supabase-backed with RLS \u2502\n\u2502 - Auth: GitHub, Google, email/password \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 MARKETING STACK \u2502\n\u2502 \u2502\n\u2502 - Postiz: Social media scheduling \u2502\n\u2502 - Mautic: Email notifications \u2502\n\u2502 - Activepieces: Automation \u2502\n\u2502 - GitHub: Builder attribution \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---","hash":"f3d4b4d434e8b66a647927e28af83367845ee6da5f41eab4567b7dea3510677a"}
154
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### Phase 0: Foundation (Week 1)\n\n1. **Database Schema** \u2014 `aigf-real-data-migration-plan.md` Phase 1\n - Create Prisma schema with all models\n - Set up PostgreSQL database\n - Run migrations\n - Seed initial data\n\n2. **File Structure** \u2014 `aigf-courses-meetups-file-structure.md`\n - Create `data/courses/` and `data/meetups/` directories\n - Convert existing mock data to files\n - Test file reading\n\n3. **Blog Structure** \u2014 `aigf-blog-in-aigf-site.md`\n - Create `data/blog/` directory structure\n - Create blog post template\n - Test file reading in Next.js","hash":"07b558a97f268388385e987a43de6548ea16e3779bdc758b85d77effd278de5f"}
155
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### Phase 1: Authentication (Week 2)\n\n4. **GitHub & Google Login** \u2014 `aigf-github-google-login-plan.md` Phase 1-2\n - Create GitHub OAuth application\n - Create Google OAuth application\n - Configure Supabase providers\n - Add login buttons to both platforms","hash":"4aaf7d5d48fa7c06eae71398904dede7443b0e96a8754b099c5564c0cb136016"}
156
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### Phase 2: Content System (Week 3)\n\n5. **API Routes** \u2014 `aigf-real-data-migration-plan.md` Phase 1-2\n - Create `/api/status` endpoint\n - Create `/api/events` endpoint\n - Create `/api/courses` endpoint\n - Create `/api/ships` endpoint\n\n6. **Blog Pages** \u2014 `aigf-blog-in-aigf-site.md` Phase 2\n - Create blog index page (`/blog`)\n - Create blog post page (`/blog/[slug]`)\n - Create category pages\n - Create tag pages","hash":"2ec4aa729268dc242fd4fb03488e75ed4a16da222dd7498771c583a89e554252"}
157
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### Phase 3: Community Integration (Week 4)\n\n7. **Dirrty Mixbag Integration** \u2014 `aigf-ai-blog-posts-in-community.md`\n - Add blog section to Dirrty Mixbag news\n - Add forum topic creation on publish\n - Add comment system integration\n\n8. **Blog Management Skill** \u2014 `aigf-blog-management-skill.md` Phase 1-2\n - Create skill directory and SKILL.md\n - Implement `/blog create` command\n - Implement outline generation\n - Implement draft generation\n - Implement publishing","hash":"1f30260ebcdc17d4c00a0a980c2c8c4f9a1864fd13e17b08ff22c301fcff62b1"}
158
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### Phase 4: Marketing Integration (Week 5)\n\n9. **Marketing Stack** \u2014 `aigf-ai-blog-posts-in-community.md` Phase 4\n - Connect Postiz for social media\n - Connect Mautic for email\n - Connect Activepieces for automation\n\n10. **GitHub Integration** \u2014 `aigf-github-google-login-plan.md` Phase 3\n - Link GitHub commits to user profiles\n - Show builder reputation on AIGF pages\n - Enable community forum topics per course/meetup","hash":"378fbf9dc1c18e379fde3daf44f3f2096f51a70889916fbac39d3c0040af9384"}
159
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"### Phase 5: Polish (Week 6)\n\n11. **SEO and Performance** \u2014 `aigf-blog-in-aigf-site.md` Phase 4\n - Add SEO metadata to blog pages\n - Add sitemap for blog posts\n - Add RSS feed for blog\n - Performance testing and optimization\n\n12. **Skill Polish** \u2014 `aigf-blog-management-skill.md` Phase 3-4\n - Implement `/blog edit` command\n - Implement `/blog list` command\n - Implement `/blog archive` command\n - Implement `/blog schedule` command\n - Implement `/blog publish` command\n\n---","hash":"7b00ef4ec5767d54b9a2aa7c3f22b3d6b87f0e3b935b711de6ecc0a8378446fe"}
160
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"## Success Criteria Summary\n\n| Area | Success Criteria | Document |\n|---|---|---|\n| Database | Zero mock data arrays remain | `aigf-real-data-migration-plan.md` |\n| Auth | Users can log in with GitHub or Google | `aigf-github-google-login-plan.md` |\n| Courses | Each course has its own file | `aigf-courses-meetups-file-structure.md` |\n| Meetups | Each meetup has its own file | `aigf-courses-meetups-file-structure.md` |\n| Blog | Blog posts published weekly | `aigf-ai-blog-posts-in-community.md` |\n| Blog Pages | Blog index, post, category, tag pages work | `aigf-blog-in-aigf-site.md` |\n| Community | Forum topics created for each post | `aigf-ai-blog-posts-in-community.md` |\n| Skill | Captain can create posts with natural language | `aigf-blog-management-skill.md` |\n| Marketing | Social media, email, automation integrated | `aigf-ai-blog-posts-in-community.md` |\n| Attribution | Builder reputation linked to GitHub | `aigf-github-google-login-plan.md` |\n\n---","hash":"5014a4a1a885fe776bcb15d3232a070071e28f881262dd2867439045f9a82f2d"}
161
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"## Next Steps\n\n1. **Captain review** \u2014 Review all planning documents and provide feedback\n2. **Prioritize** \u2014 Decide which areas to tackle first\n3. **Approve** \u2014 Give approval to start implementation\n4. **Execute** \u2014 Begin Phase 0: Foundation\n\n---","hash":"56eee8759bfbc913cc8f9b84f48df7546ce0f1f31f1b713a487a00a862248021"}
162
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-master-planning-index.md","tags":["data"],"content":"## File Index\n\nAll planning documents are stored in `/home/zerwiz/firstmate/data/`:\n\n| File | Purpose |\n|---|---|\n| `aigf-real-data-migration-plan.md` | Database schema, API routes, mock data migration |\n| `aigf-courses-meetups-file-structure.md` | One-file-per-course and one-file-per-meetup structure |\n| `aigf-github-google-login-plan.md` | GitHub and Google login integration |\n| `aigf-ai-blog-posts-in-community.md` | AI blog posts in Dirrty Mixbag community |\n| `aigf-blog-in-aigf-site.md` | Blog on AIGF site with Dirrty Mixbag integration |\n| `aigf-blog-management-skill.md` | Blog management skill for captain's workflow |\n| `discord-server-integration-planning.md` | Discord server integration planning (existing) |\n| `ecosystem-planning.md` | Ecosystem planning (existing) |","hash":"7085a9626d9a8436bf12212a02882bd111e6442da3b7f2b6625bbe4853567c96"}
163
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"# AI Geeks & Freaks \u2014 Real Data Migration Plan\n\n**Status:** Planning\n**Last updated:** 2025-10-01\n**Project:** `/home/zerwiz/CodeP/aigeeks&freeks`\n**Homepage:** `aigeeksnfreaks.zerwiz.org` (Next.js 16, port 3800)\n\n---","hash":"f21e5dd1f99882ffbe20d67106470972e7f38b46ae578d7fbf057704ac9e43ae"}
164
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 1. Problem Statement\n\nThe AIGeeks & Freaks homepage currently displays **all mock data** \u2014 hardcoded arrays, `Math.random()` generators, and static strings. There is **zero real data** flowing from any backend. The Prisma schema has only `User` and `Post` models with no application-specific tables.\n\n**Goal:** Replace every mock data source with real, queryable data from a proper database schema, backed by API routes, with data entry points from Discord, the marketing stack (Mautic/Activepieces), and manual admin operations.\n\n---","hash":"a4338683583ec3e9e5cd60f4dca08d81ac762ec94ed7ad567f40333d3a17bd03"}
165
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.1 Hero Section (`src/components/site/hero.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `TICKER` array (8 items) | Static strings: \"12 AGENTS ACTIVE\", \"1,284 BUILDS SHIPPED\", etc. | Live system status from agent registry, build pipeline, workspace pool |\n| \"12 agents active\" | Hardcoded | `Agent` model \u2014 count of active agents |\n| \"1,284 builds shipped\" | Hardcoded | `Ship` model \u2014 count of completed ships |\n| \"6 workspaces live\" | Hardcoded | `Workspace` model \u2014 count of active workspaces |\n| \"2,140 builders online\" | Hardcoded | `User` model \u2014 count of active builders |\n| \"28m avg build\" | Hardcoded | `Ship` model \u2014 average build time |\n| \"12 seats left\" (alpha) | Hardcoded | `Cohort` model \u2014 remaining seats |","hash":"b78c2b1d33c717e337de508cd37bb78d134246bf6e11ede3ce2af943a2fd59cf"}
166
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.2 Community Metrics (`src/components/site/community-metrics.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `METRICS` array (6 items) | Static: \"2,140 Builders\", \"1,284 Shipped\", \"12 Agents\", \"40 Cohort cap\", \"96.1% Success Rate\", \"+12% MoM\" | Aggregated from `User`, `Ship`, `Agent`, `Cohort`, `Workspace` models |\n| `TICKER_ITEMS` array (12 items) | Static strings: \"@kira shipped mcp-weather-skill\", etc. | Live `Ship` feed \u2014 recent completed ships |","hash":"3a37784a06d305385d91fbc7f9d1c594bc300b87e61615de8cf0cf224023698d"}
167
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.3 Meetups Page (`src/components/pages/meetups-content.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `EVENTS` array (3 items) | Hardcoded events: \"The 2 AM Bug Fix\", \"Geek & Freak Showcases\", \"Factory Workshop: MCP Deep Dive\" | `Event` model \u2014 recurring and one-off events with host, schedule, status |\n| `ARCHIVE` array (8 items) | Static: \"W26 Showcase night #5\", view counts | `Event` model \u2014 past events with replay URLs and view counts |\n| `CHANNELS` array (8 items) | Static Discord channels with member counts | `DiscordChannel` model \u2014 synced from Discord API |\n| `BRING` array (4 items) | Static: \"A stuck agent\", \"A half-built demo\", etc. | **No change needed** \u2014 this is static marketing copy |\n| `HOST_PERKS` array (3 items) | Static: \"Host a session\", \"Founding-member flair\", \"Recognition\" | **No change needed** \u2014 static marketing copy |\n| `FAQ` array (5 items) | Static FAQ | **No change needed** \u2014 static marketing copy |\n| `LEADERS` array (5 items) | Static: \"@kira 24 ships\", \"@neo 21 ships\", etc. | `User` model \u2014 leaderboard by ship count |\n| Community stats strip | \"1,200+ members\", \"100+ live sessions\", \"80k replay views\", \"40 builders cap\" | Aggregated from `User`, `Event`, `Ship` models |","hash":"1881450c40cbbad294d86ee6d1e3f45d6d980d3b30325e4aba1a9f2b8e13d659"}
168
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.4 Courses Page (`src/components/pages/courses-content.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `COURSES` array (4 items) | Hardcoded: CRS-100 through CRS-400 with prices, outcomes, stacks | `Course` model \u2014 full course catalog with pricing, prerequisites, status |\n| `SYLLABUS` array (4 modules) | Static lesson lists | `Lesson` model \u2014 linked to `Course` |\n| `COHORT` array (4 items) | Static: \"OCT 05, 18/40 seats\" | `Cohort` model \u2014 active cohorts with enrollment counts |\n| `QUOTES` array (3 items) | Static testimonials: \"@vee\", \"@rune\", \"@sachi\" | `Testimonial` model \u2014 verified graduate quotes |\n| `FAQ` array (5 items) | Static FAQ | **No change needed** \u2014 static marketing copy |\n| Academy stats strip | \"700+ builders graduated\", \"21h curriculum\", \"70+ lessons\", \"100% ship\" | Aggregated from `User`, `Course`, `Lesson`, `Ship` models |","hash":"1898964e45709346bd4158b6c42c3a08ae9626457dd28fb953b55069d6a84da7"}
169
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.5 Wall of Shipped (`src/components/site/wall-of-shipped.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `mkShip()` function | `Math.random()` generates random builder, project, commit hash, branch, build time, LOC, agents | `Ship` model \u2014 real git commits from GitHub integration |\n| `BUILDERS` array (14 names) | Static: \"@kira\", \"@neo\", etc. | `User` model \u2014 active builders |\n| `PROJECTS` array (12 items) | Static project names | `Project` model \u2014 shipped projects |\n| `totalShipped` state | Starts at 1284, increments via `setInterval` | `Ship` model \u2014 `COUNT(*)` |\n| Live feed (14 items) | Random ships every 4.2s | Real-time `Ship` feed via API polling or SSE |\n| Side stats | \"Avg build: 28m\", \"Agents/run: 8.4\", \"Today: 42\", \"Velocity: +12%\" | Aggregated from `Ship` model |\n| Top stacks | \"claude-code 92%\", \"cursor 74%\", etc. | `Ship` model \u2014 stack distribution |","hash":"cea9e545e6a7c85515baa986bfd3e3c833c2c48818280aad0fd67bdcd1e23f3a"}
170
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.6 Shipped Page (`src/components/pages/shipped-content.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `mkShip()` function | Same random generator as wall-of-shipped | `Ship` model |\n| `BUILDERS` array (20 names) | Static | `User` model |\n| `PROJECTS_BY_CATEGORY` (5 categories) | Static project lists | `Project` model with `category` field |\n| `STATS` array (6 items) | Static: \"1,284 all-time\", \"47 this week\", etc. | Aggregated from `Ship` model |\n| `TOP_SHIPPERS` array (8 items) | Static leaderboard | `User` model \u2014 ranked by ship count |\n| `MARQUEE_PROJECTS` array (20 items) | Static project names | `Project` model \u2014 recent ships |\n| Category counts | \"10 more in feed\" | `Project` model \u2014 count per category |","hash":"246f7351e28da5d55e76e4e18fe8add4e03f6ec9fdd334f30679fbc7fbed1439"}
171
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.7 Footer (`src/components/site/footer.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| \"all systems nominal\" | Static | System health check endpoint |\n| \"build 0xa1f9c2\" | Static | Current deployment commit hash |\n| \"latency 14ms\" | Static | Health check response time |\n| \"\u00a9 2025\" | `new Date().getFullYear()` | **No change needed** \u2014 already dynamic |","hash":"c920f0dbf559749eae9a56d64c14776fb679f8ea8334107eddc995e55cb70637"}
172
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.8 Homepage Meetups Section (`src/components/site/meetups.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `EVENTS` array (3 items) | Same hardcoded events as meetups page | `Event` model |\n| `ARCHIVE` array (8 items) | Same hardcoded archive | `Event` model \u2014 past events |\n| Community stats | \"1,200+ members on stage\", \"100+ live sessions\", \"80k replay views\", \"40 builders cap\" | Aggregated from `User`, `Event`, `Ship` models |","hash":"231610f56d9d303b06c6c6c6d6465753d387871a04956f756d584a48954e24ad"}
173
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.9 Homepage Academy Section (`src/components/site/academy.tsx`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| `COURSES` array (3 items) | CRS-100, CRS-200, CRS-300 (missing CRS-400) | `Course` model \u2014 full catalog |","hash":"a0868cdc9ff12ad8aae0f7682d58958bd861af76d60faec3ebbb582eddaa40d2"}
174
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 2.10 Homepage Join CTA (`src/components/site/footer.tsx` \u2014 `JoinCta`)\n\n| Mock Element | Current Value | Real Source Needed |\n|---|---|---|\n| \"12 seats remaining\" | Hardcoded | `Cohort` model \u2014 remaining seats |\n| \"Builders: 2,140\", \"Shipped: 1,284\", \"Agents: 12\", \"Cohort cap: 40\" | Hardcoded | Aggregated from `User`, `Ship`, `Agent`, `Cohort` models |\n\n---","hash":"0077e331638a4b629fe22f11cb396085862ebb4565e06d928dc4c4f8477bd6d6"}
175
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 3.1 Prisma Schema (`prisma/schema.prisma`)\n\n```prisma\n// === USERS & COMMUNITY ===\n\nmodel User {\n id String @id @default(cuid())\n email String? @unique\n name String?\n discordId String? @unique\n githubId String? @unique\n role String @default(\"member\") // member, builder, host, moderator, admin\n isGraduate Boolean @default(false)\n enrolledCourses String[] @default([]) // course codes\n shipCount Int @default(0)\n totalLoc Int @default(0)\n successRate Float @default(0)\n stack String @default(\"claude\") // claude, cursor, opencode, jido\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n lastActive DateTime @default(now())\n\n ships Ship[]\n events EventAttendee[]\n testimonials Testimonial[]\n}\n\n// === COURSES ===\n\nmodel Course {\n id String @id @default(cuid())\n code String @unique // CRS-100, CRS-200, etc.\n title String\n outcome String\n level String // LVL 100, LVL 200, etc.\n lvlColor String // lime, cyan, amber\n stack String[] // [\"Claude Code\", \"Cursor\", \"OpenCode\"]\n duration String // \"3h \u00b7 self-paced\"\n lessonCount Int @default(0)\n price Float @default(0)\n priceNote String? // \"open access\", \"with Pro+ plan\"\n includes String // \"Community Discord + shared OpenChamber sandbox\"\n prereq String // \"None \u2014 a browser and an idea are enough.\"\n path String[] // [\"Prompt\", \"Plan\", \"Code\", \"Review\", \"Ship\"]\n status String @default(\"active\") // active, draft, archived\n featured Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n lessons Lesson[]\n cohorts Cohort[]\n enrollments Enrollment[]\n ships Ship[]\n}\n\nmodel Lesson {\n id String @id @default(cuid())\n courseCode String\n module String // CRS-100, CRS-200, etc.\n order Int // 1, 2, 3...\n title String // \"01 \u00b7 The one-prompt loop\"\n description String\n duration String? // \"15m\", \"2h\"\n content String? // markdown content\n videoUrl String?\n isPublished Boolean @default(false)\n\n course Course @relation(fields: [courseCode], references: [id])\n\n @@unique([courseCode, order])\n}\n\nmodel Cohort {\n id String @id @default(cuid())\n courseCode String\n startDate DateTime\n endDate DateTime?\n maxSeats Int\n enrolledSeats Int @default(0)\n status String @default(\"open\") // open, full, cancelled, completed\n isLive Boolean @default(false)\n replayUrl String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n course Course @relation(fields: [courseCode], references: [id])\n enrollments Enrollment[]\n\n @@index([courseCode, status])\n}\n\nmodel Enrollment {\n id String @id @default(cuid())\n userId String\n courseCode String\n cohortId String?\n enrolledAt DateTime @default(now())\n completedAt DateTime?\n status String @default(\"enrolled\") // enrolled, completed, dropped\n progress Float @default(0) // 0-100\n\n user User @relation(fields: [userId], references: [id])\n cohort Cohort? @relation(fields: [cohortId], references: [id])\n\n @@unique([userId, courseCode, cohortId])\n}\n\n// === EVENTS & MEETUPS ===\n\nmodel Event {\n id String @id @default(cuid())\n title String\n kind String // weekly, monthly, masterclass, showcase, one-off\n description String\n hostId String?\n hostName String? // denormalized for display\n status String @default(\"upcoming\") // upcoming, live, completed, cancelled\n isRecurring Boolean @default(false)\n recurrence String? // \"weekly-tue\", \"monthly-first-fri\"\n dayOfWeek String? // TUE, FRI, SAT\n time String? // \"02:00\", \"19:00\", \"15:00\"\n timezone String @default(\"CET\")\n startDate DateTime\n endDate DateTime?\n replayUrl String?\n viewCount Int @default(0)\n maxAttendees Int?\n discordChannelId String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n host User? @relation(\"EventHost\", fields: [hostId], references: [id])\n attendees EventAttendee[]\n ships Ship[]\n\n @@index([status])\n @@index([startDate])\n}\n\nmodel EventAttendee {\n id String @id @default(cuid())\n eventId String\n userId String\n attendedAt DateTime?\n role String @default(\"attendee\") // attendee, host, moderator\n\n event Event @relation(fields: [eventId], references: [id])\n user User @relation(fields: [userId], references: [id])\n\n @@unique([eventId, userId])\n}\n\n// === SHIPS ===\n\nmodel Ship {\n id String @id @default(cuid())\n builderId String\n builderName String // denormalized for display\n project String\n projectUrl String? // GitHub URL\n commit String // git commit hash\n branch String // main, feat/swarm, dev, release, exp\n buildTimeMin Int // minutes\n loc Int // lines of code added\n agentCount Int @default(1)\n stack String // claude, cursor, opencode, jido+mcp\n category String // skills, workflows, mcp, workspaces, apps\n description String?\n status String @default(\"shipped\") // building, shipped, archived\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n builder User @relation(fields: [builderId], references: [id])\n courseCode String?\n course Course? @relation(fields: [courseCode], references: [id])\n eventId String?\n event Event? @relation(fields: [eventId], references: [id])\n\n @@index([builderId])\n @@index([project])\n @@index([category])\n @@index([createdAt])\n @@index([stack])\n}\n\n// === AGENTS ===\n\nmodel Agent {\n id String @id @default(cuid())\n name String\n type String // assistant, orchestrator, evaluator, reviewer\n status String @default(\"active\") // active, idle, offline\n harness String // claude, cursor, opencode, jido\n mcpEnabled Boolean @default(false)\n currentTask String?\n ships Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([status])\n @@index([harness])\n}\n\n// === WORKSPACES ===\n\nmodel Workspace {\n id String @id @default(cuid())\n name String\n userId String?\n status String @default(\"active\") // active, paused, expired\n plan String @default(\"free\") // free, pro, team\n repoUrl String?\n agents Int @default(0)\n mcpServers Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([status])\n @@index([userId])\n}\n\n// === DISCORD ===\n\nmodel DiscordChannel {\n id String @id @default(cuid())\n discordId String @unique\n name String\n type String // text, voice, category, thread\n description String?\n memberCount Int @default(0)\n isPinned Boolean @default(false)\n lastMessageAt DateTime?\n syncedAt DateTime @default(now())\n}\n\nmodel DiscordRole {\n id String @id @default(cuid())\n discordId String @unique\n name String\n color String?\n permissions String[] @default([])\n memberCount Int @default(0)\n syncedAt DateTime @default(now())\n}\n\n// === TESTIMONIALS ===\n\nmodel Testimonial {\n id String @id @default(cuid())\n userId String?\n author String // \"@vee\", \"@rune\", etc.\n role String // \"skills \u00b7 grad CRS-300\"\n quote String\n verified Boolean @default(false)\n courseId String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([verified])\n}\n\n// === SYSTEM STATUS ===\n\nmodel SystemStatus {\n id String @id @default(cuid())\n key String @unique // agents_active, builds_shipped, avg_build_time, etc.\n value String // numeric or status string\n unit String? // \"agents\", \"builds\", \"m\", \"percent\"\n updatedAt DateTime @default(now())\n}\n\n// === MILESTONES (for MoM velocity) ===\n\nmodel Milestone {\n id String @id @default(cuid())\n metric String @unique // ships_this_week, active_builders, etc.\n value Float\n period String // week, month\n periodStart DateTime\n periodEnd DateTime\n createdAt DateTime @default(now())\n\n @@index([metric, periodStart])\n}\n```\n\n---","hash":"d805f4715919698471bcf5701a9a767cc554d7ddac675ae1a4edf19a55b7e21a"}
176
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 3.2.1 Hero & Community Metrics\n\n| Route | Method | Returns | Used By |\n|---|---|---|---|\n| `/api/status` | GET | `{ agents: N, ships: N, workspaces: N, builders: N, avgBuild: N, seatsLeft: N }` | Hero, CommunityMetrics, Footer |\n| `/api/status/health` | GET | `{ systems: \"nominal\", build: \"0xa1f9c2\", latency: 14 }` | Footer status strip |\n| `/api/leaderboard` | GET | `{ top: [{ handle, shipped, loc, success, stack }], byStack: [{ name, pct }] }` | CommunityMetrics ticker, WallOfShipped side stats |","hash":"4db5f7e0575f414cd64f55546453918234639dbfa42cda53dad2ec4ebe72ae7c"}
177
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 3.2.2 Meetups\n\n| Route | Method | Returns | Used By |\n|---|---|---|---|\n| `/api/events` | GET | `{ upcoming: Event[], live: Event[], archive: Event[] }` | MeetupsContent, Homepage Meetups section |\n| `/api/events/:id` | GET | Single event with host, attendees, replay | MeetupsContent detail |\n| `/api/events/live` | GET | Currently live events | MeetupsContent live badge |\n| `/api/channels` | GET | `{ channels: [{ name, description, members, pinned }] }` | MeetupsContent channels section |","hash":"dc90b108811f997fa412eecdeb5d2f3bb541763da9bbb819b2f051aedf69e287"}
178
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 3.2.3 Courses\n\n| Route | Method | Returns | Used By |\n|---|---|---|---|\n| `/api/courses` | GET | `{ courses: Course[], stats: { graduates, totalLessons, curriculumHours, shipRate } }` | CoursesContent, Homepage Academy section |\n| `/api/courses/:code` | GET | Single course with syllabus | CoursesContent detail |\n| `/api/cohorts` | GET | `{ active: [{ code, start, seats, status }], all: Cohort[] }` | CoursesContent cohort calendar |\n| `/api/testimonials` | GET | `{ quotes: [{ author, role, quote }] }` | CoursesContent graduates section |\n| `/api/courses/stats` | GET | `{ graduates: N, lessons: N, hours: N, shipRate: N }` | CoursesContent stats strip |","hash":"6d90291fe3582ce7356c4c1618fa74ac312fbcd5abd86c8e73dc9b63b08db822"}
179
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 3.2.4 Wall of Shipped\n\n| Route | Method | Returns | Used By |\n|---|---|---|---|\n| `/api/ships` | GET | `{ ships: Ship[], total: N, stats: { avgBuild, agentsPerRun, today, velocity } }` | WallOfShipped, ShippedContent |\n| `/api/ships/:id` | GET | Single ship detail | ShippedContent latest build |\n| `/api/ships/stream` | SSE | Real-time ship events | WallOfShipped live feed |\n| `/api/ships/stats` | GET | `{ allTime, thisWeek, medianBuild, successRate, velocity, activeBuilders }` | ShippedContent stats strip |\n| `/api/ships/top` | GET | `{ shippers: [{ rank, handle, shipped, loc, success, tier }] }` | ShippedContent leaderboard |\n| `/api/ships/categories` | GET | `{ categories: [{ name, count, projects }] }` | ShippedContent categories section |","hash":"48af673c1778ee1fc41f9f77a8dc54e5d360d1fec6f248bee02b3a4fccba4c86"}
180
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 3.2.5 Admin (internal)\n\n| Route | Method | Returns | Used By |\n|---|---|---|---|\n| `/api/admin/seed` | POST | `{ seeded: N }` | One-time data seeding |\n| `/api/admin/status` | POST | `{ updated: key }` | Update system status values |\n| `/api/admin/events` | POST | `{ created: eventId }` | Create/manage events |\n| `/api/admin/ships` | POST | `{ created: shipId }` | Log new ships |\n| `/api/admin/courses` | POST | `{ updated: courseCode }` | Update course catalog |\n\n---","hash":"f66934ea2134f84f8001b281b9a3cd09aee32e52e5e6f0d2a9b0596441ad468f"}
181
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### Phase 1: Foundation (Week 1-2)\n\n**Goal:** Database schema, API routes for core data, seed initial data.\n\n- [ ] **1.1** Update `prisma/schema.prisma` with full schema (Section 3.1)\n- [ ] **1.2** Set up PostgreSQL database (or keep SQLite for dev, migrate to Postgres for prod)\n- [ ] **1.3** Run Prisma migrations: `npx prisma migrate dev`\n- [ ] **1.4** Generate Prisma client: `npx prisma generate`\n- [ ] **1.5** Create API route `/api/status` \u2014 hero metrics endpoint\n- [ ] **1.6** Create API route `/api/status/health` \u2014 footer health check\n- [ ] **1.7** Create API route `/api/leaderboard` \u2014 top builders + stack distribution\n- [ ] **1.8** Seed initial data: users, agents, workspaces, system status\n- [ ] **1.9** Update `hero.tsx` \u2014 replace `TICKER` and metric chips with API calls\n- [ ] **1.10** Update `community-metrics.tsx` \u2014 replace `METRICS` and `TICKER_ITEMS` with API calls\n- [ ] **1.11** Update `footer.tsx` \u2014 replace static status strip with API calls","hash":"26b929583f6b74f5601aab784be5e18cad4c447a3afcb3a21c7a54f2f84aecd1"}
182
- {"timestamp":"2026-09-11T15:31:45Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### Phase 2: Meetups & Events (Week 2-3)\n\n**Goal:** Event management, Discord channel sync, meetup pages live.\n\n- [ ] **2.1** Create API route `/api/events` \u2014 event listing with filters\n- [ ] **2.2** Create API route `/api/events/live` \u2014 currently live events\n- [ ] **2.3** Create API route `/api/channels` \u2014 Discord channel sync\n- [ ] **2.4** Build Discord bot integration (or use Discord API webhook) for channel sync\n- [ ] **2.5** Update `meetups-content.tsx` \u2014 replace `EVENTS`, `ARCHIVE`, `CHANNELS`, `LEADERS` with API calls\n- [ ] **2.6** Update `meetups.tsx` (homepage section) \u2014 same event data source\n- [ ] **2.7** Build admin interface for event creation/management (or use Prisma Studio)\n- [ ] **2.8** Seed initial events data from existing mock data","hash":"84c5c577bce243abe62f5c79611633dd120e53283533eb96c76b392c17f92ce2"}
183
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### Phase 3: Courses & Academy (Week 3-4)\n\n**Goal:** Course catalog, cohort management, enrollment tracking.\n\n- [ ] **3.1** Create API route `/api/courses` \u2014 full course catalog\n- [ ] **3.2** Create API route `/api/courses/:code` \u2014 single course with syllabus\n- [ ] **3.3** Create API route `/api/cohorts` \u2014 active cohort calendar\n- [ ] **3.4** Create API route `/api/testimonials` \u2014 verified graduate quotes\n- [ ] **3.5** Create API route `/api/courses/stats` \u2014 academy statistics\n- [ ] **3.6** Update `courses-content.tsx` \u2014 replace all mock arrays with API calls\n- [ ] **3.7** Update `academy.tsx` (homepage section) \u2014 replace `COURSES` with API calls\n- [ ] **3.8** Build enrollment flow (integrate with Mautic/Activepieces)\n- [ ] **3.9** Seed course data from existing mock data (add CRS-400)","hash":"c173ad173e4100cb7c2dee3b7f9890b41cd5761eda196368b694d5fd963b77a1"}
184
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### Phase 4: Wall of Shipped (Week 4-5)\n\n**Goal:** Real ship feed, leaderboard, category filtering.\n\n- [ ] **4.1** Create API route `/api/ships` \u2014 paginated ship feed\n- [ ] **4.2** Create API route `/api/ships/stream` \u2014 SSE for real-time updates\n- [ ] **4.3** Create API route `/api/ships/stats` \u2014 aggregated statistics\n- [ ] **4.4** Create API route `/api/ships/top` \u2014 leaderboard\n- [ ] **4.5** Create API route `/api/ships/categories` \u2014 category breakdown\n- [ ] **4.6** Update `wall-of-shipped.tsx` \u2014 replace `mkShip()`, `BUILDERS`, `PROJECTS` with API calls\n- [ ] **4.7** Update `shipped-content.tsx` \u2014 replace all mock data with API calls\n- [ ] **4.8** Build GitHub integration for automatic ship detection (webhook)\n- [ ] **4.9** Seed ship data from existing mock data","hash":"3cbcca299b7a3a28aa6643d7d60b3a6c7ed98b73a01873490d8fac81a2d792b7"}
185
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### Phase 5: Join CTA & Footer (Week 5)\n\n**Goal:** Dynamic Join CTA, live footer status.\n\n- [ ] **5.1** Update `footer.tsx` `JoinCta` \u2014 replace hardcoded \"12 seats remaining\" with cohort data\n- [ ] **5.2** Update `footer.tsx` `JoinCta` metrics \u2014 replace hardcoded numbers with API calls\n- [ ] **5.3** Update footer status strip \u2014 replace static \"all systems nominal\" with health check\n- [ ] **5.4** Update footer build hash \u2014 read from `git rev-parse HEAD` at build time","hash":"79e32751a32c9d144ad8b2c038aa277ac6630ebbfcc35a3d464f706a3d24fd32"}
186
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### Phase 6: Integration & Polish (Week 5-6)\n\n**Goal:** Marketing stack integration, real-time updates, performance.\n\n- [ ] **6.1** Integrate Discord bot for real-time event updates and member sync\n- [ ] **6.2** Integrate Mautic for course enrollment tracking\n- [ ] **6.3** Integrate Activepieces for automated event notifications\n- [ ] **6.4** Implement SSE for live ship feed (Phase 4.2)\n- [ ] **6.5** Add caching headers to API routes (Redis or Next.js cache)\n- [ ] **6.6** Add rate limiting to API routes\n- [ ] **6.7** Add authentication to admin routes\n- [ ] **6.8** Performance testing and optimization\n- [ ] **6.9** Analytics integration (PostHog or Plausible)\n\n---","hash":"e3c3c947c9c56c46caf2f67c44bb0ade4ec882a2bfaf53f2a02d3bdd4ea90857"}
187
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 5. Data Flow Architecture\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 DISCORD SERVER \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 Bot (sync) \u2502 \u2502 Webhooks \u2502 \u2502 Member events \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u25bc \u25bc \u25bc \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 DATABASE (PostgreSQL) \u2502 \u2502\n\u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502\n\u2502 \u2502 \u2502 User \u2502 \u2502 Event \u2502 \u2502 Ship \u2502 \u2502 Course \u2502 \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u2502 \u2502Discord \u2502 \u2502Attendee\u2502 \u2502Builder \u2502 \u2502Cohort \u2502 \u2502 \u2502\n\u2502 \u2502 \u2502Channel \u2502 \u2502 \u2502 \u2502Project \u2502 \u2502Enroll \u2502 \u2502 \u2502\n\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502\n\u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502\n\u2502 \u2502 \u2502Agent \u2502 \u2502Work- \u2502 \u2502Testi- \u2502 \u2502System \u2502 \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502space \u2502 \u2502monial \u2502 \u2502Status \u2502 \u2502 \u2502\n\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502\n \u25bc \u25bc \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Mautic \u2502 \u2502 Activepieces \u2502 \u2502 GitHub \u2502\n\u2502 (enrollment) \u2502 \u2502 (notifications)\u2502 \u2502 (webhooks) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---","hash":"1f95f2e25a21917df15156d4222777b63b38443ff5c23fcd2050f75d8aab14a3"}
188
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 6.1 Components That Need Full Replacement\n\n| Component | File | Mock Data | Real Data Source |\n|---|---|---|---|\n| Hero | `hero.tsx` | `TICKER`, metric chips | `/api/status` |\n| Community Metrics | `community-metrics.tsx` | `METRICS`, `TICKER_ITEMS` | `/api/status`, `/api/leaderboard` |\n| Meetups Content | `meetups-content.tsx` | `EVENTS`, `ARCHIVE`, `CHANNELS`, `LEADERS` | `/api/events`, `/api/channels` |\n| Courses Content | `courses-content.tsx` | `COURSES`, `SYLLABUS`, `COHORT`, `QUOTES` | `/api/courses`, `/api/cohorts`, `/api/testimonials` |\n| Wall of Shipped | `wall-of-shipped.tsx` | `mkShip()`, `BUILDERS`, `PROJECTS` | `/api/ships`, `/api/ships/stream` |\n| Shipped Content | `shipped-content.tsx` | `mkShip()`, `BUILDERS`, `PROJECTS_BY_CATEGORY`, `STATS`, `TOP_SHIPPERS` | `/api/ships`, `/api/ships/top`, `/api/ships/categories` |\n| Footer | `footer.tsx` | Static status strip | `/api/status/health` |\n| Join CTA | `footer.tsx` | Hardcoded seats, metrics | `/api/cohorts`, `/api/status` |\n| Academy (homepage) | `academy.tsx` | `COURSES` (3 items) | `/api/courses` |\n| Meetups (homepage) | `meetups.tsx` | `EVENTS`, `ARCHIVE`, stats | `/api/events` |","hash":"c51fba10992abea07aa3521484eb5e007104cb2f4a3abee2c786526fb61a15aa"}
189
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 6.2 Components That Stay Static (No Change)\n\n| Component | File | Reason |\n|---|---|---|\n| Atoms | `atoms.tsx` | UI primitives |\n| Sound Context | `sound-context.tsx` | Audio utility |\n| Interactive Terminal | `interactive-terminal.tsx` | UI component |\n| Copy Command | `copy-command.tsx` | UI utility |\n| Theme Provider | `theme-provider.tsx` | Next-themes wrapper |\n| Page Banner | `page-banner.tsx` | UI component |\n| Header | `header.tsx` | Navigation |\n| Principles | `principles.tsx` | Static marketing copy |\n| The Loop | `the-loop.tsx` | Static marketing copy |\n| Tools | `tools.tsx` | Static marketing copy |\n| Factory Content | `factory-content.tsx` | Needs separate review |\n| Software Factory Content | `software-factory-content.tsx` | Needs separate review |\n| Way of Teams Content | `way-of-teams-content.tsx` | Needs separate review |\n| Login Content | `login-content.tsx` | Auth flow |\n\n---","hash":"1685abbae3c436b6a8733427a31391e38724240c4870697d62f73b12863fb6f5"}
190
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 7.1 API Route Pattern\n\nAll API routes should follow this pattern:\n\n```typescript\n// Example: src/app/api/status/route.ts\nimport { NextResponse } from \"next/server\";\nimport { db } from \"@/lib/db\";\n\nexport async function GET() {\n const [agentCount, shipCount, workspaceCount, userCount, cohorts] =\n await Promise.all([\n db.agent.count({ where: { status: \"active\" } }),\n db.ship.count(),\n db.workspace.count({ where: { status: \"active\" } }),\n db.user.count(),\n db.cohort.aggregate({\n where: { status: \"open\" },\n _sum: { enrolledSeats: true, maxSeats: true },\n }),\n ]);\n\n const avgBuild = await db.ship.aggregate({ _avg: { buildTimeMin: true } });\n\n return NextResponse.json({\n agents: agentCount,\n ships: shipCount,\n workspaces: workspaceCount,\n builders: userCount,\n avgBuild: Math.round(avgBuild._avg.buildTimeMin ?? 0),\n seatsLeft: cohorts._sum.maxSeats! - cohorts._sum.enrolledSeats!,\n });\n}\n```","hash":"0649cdca6d404ad381e03a1bcf195509c9f2c553e769aea0421087a1431af2b9"}
191
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 7.2 Client-Side Data Fetching\n\nUse `use` hook (React 19) or `fetch` with caching:\n\n```typescript\n// Example: hero.tsx\nasync function fetchStatus() {\n const res = await fetch(\"/api/status\", {\n next: { revalidate: 30 }, // 30s cache\n });\n return res.json();\n}\n\nexport function Hero() {\n const status = React.use(fetchStatus());\n // Use status.agents, status.ships, etc.\n}\n```","hash":"9f7c14e2538f83be4b2d88ffcbfe5c7412f2c5bf32f9db9649ec3bf3fc668142"}
192
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 7.3 Real-Time Updates\n\nFor the ship feed, use Server-Sent Events:\n\n```typescript\n// src/app/api/ships/stream/route.ts\nimport { NextRequest, NextResponse } from \"next/server\";\n\nexport function GET(request: NextRequest) {\n const stream = new ReadableStream({\n async start(controller) {\n const send = (data: string) => {\n controller.enqueue(new TextEncoder().encode(`data: ${data}\\n\\n`));\n };\n\n // Send initial state\n const ships = await db.ship.findMany({\n orderBy: { createdAt: \"desc\" },\n take: 14,\n });\n send(JSON.stringify({ type: \"init\", ships }));\n\n // Listen for new ships via webhook or polling\n const interval = setInterval(async () => {\n const newShip = await db.ship.findFirst({\n orderBy: { createdAt: \"desc\" },\n });\n if (newShip) send(JSON.stringify({ type: \"new\", ship: newShip }));\n }, 5000);\n\n request.signal.addEventListener(\"abort\", () => {\n clearInterval(interval);\n controller.close();\n });\n },\n });\n\n return new NextResponse(stream.body, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n },\n });\n}\n```","hash":"37a3cbad2278512f2db8f1af49255f5822366bc51ae58a76e8aea543b2e4866e"}
193
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 7.4 Data Seeding\n\nCreate a seed script (`prisma/seed.ts`) to populate initial data from existing mock data:\n\n```typescript\n// prisma/seed.ts\nimport { PrismaClient } from \"@prisma/client\";\nconst db = new PrismaClient();\n\nasync function main() {\n // Seed users from mock builders\n const builders = [\n { handle: \"@kira\", name: \"Kira\", role: \"builder\" },\n { handle: \"@neo\", name: \"Neo\", role: \"builder\" },\n // ... etc\n ];\n\n for (const b of builders) {\n await db.user.upsert({\n where: { name: b.name },\n update: {},\n create: { ...b, email: `${b.name.toLowerCase()}@aigf.local` },\n });\n }\n\n // Seed courses from mock data\n await db.course.createMany({\n data: [\n {\n code: \"CRS-100\",\n title: \"The 30-Min Feature Run\",\n outcome: \"Take a fuzzy feature request from idea to merged PR...\",\n level: \"LVL 100\",\n // ... etc\n },\n // ... all courses\n ],\n });\n\n // Seed events\n await db.event.createMany({\n data: [\n {\n title: \"The 2 AM Bug Fix\",\n kind: \"weekly\",\n description: \"Live screen-share office hours...\",\n dayOfWeek: \"TUE\",\n time: \"02:00\",\n status: \"upcoming\",\n isRecurring: true,\n recurrence: \"weekly-tue\",\n },\n // ... all events\n ],\n });\n\n console.log(\"Seed complete\");\n}\n\nmain();\n```\n\n---","hash":"ac1880d1f3a8d1a38da18283a7aa3395ba44432239bfb710a80da749a54ea986"}
194
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 8.1 New Dependencies\n\n```bash\nnpm install @prisma/client\nnpm install -D prisma\nnpm install eventsource-parser # For SSE client\nnpm install discord.js # For Discord bot integration\n```","hash":"5464fc2787bba0e5fea20c5aadaa5b718c639762d67f80e01b111443ab4692d7"}
195
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 8.2 Environment Variables\n\n```bash","hash":"e0e692dfc617806c80bc663b6c7edd22714bb8b9652486cae41275bfb92769e0"}
196
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"# Database\n\nDATABASE_URL=\"postgresql://user:pass@localhost:5432/aigf\"","hash":"e0da60ea478854c408fe27b98057e68af6c2f131994e258000405f4ef5b6badd"}
197
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"# Discord\n\nDISCORD_BOT_TOKEN=\"bot_token_here\"\nDISCORD_SERVER_ID=\"server_id_here\"","hash":"bb3e42bd943ebc406b98c78f427f0afe6f812bc0206b19330f2fb8be075d3dcf"}
198
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"# GitHub (for ship webhook)\n\nGITHUB_TOKEN=\"github_token_here\"\nGITHUB_WEBHOOK_SECRET=\"webhook_secret_here\"","hash":"cfdf51193d7ddacf67d4701a1c13c0f0ce7fe1631a33bdcb85162b48724c8840"}
199
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"# Mautic (for enrollment)\n\nMAUTIC_SITE_ID=\"site_id\"\nMAUTIC_API_KEY=\"api_key\"","hash":"b8c0c63e36908801176cdfa557ccb69563838e327e2dea903c8c4b833482c3f5"}
200
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"# Activepieces (for automation)\n\nACTIVEPIECES_URL=\"http://localhost:8080\"\nACTIVEPIECES_API_KEY=\"api_key\"\n```","hash":"6a51edff3977f6fa7633e24a0f1a98d991858ccd4f65e3e9c1f49e54cf88230a"}
201
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"### 8.3 Infrastructure Changes\n\n| Current | New | Notes |\n|---|---|---|\n| SQLite | PostgreSQL (prod) | SQLite OK for dev |\n| No bot | Discord.js bot | For channel sync, member events |\n| No webhooks | GitHub webhook | For automatic ship detection |\n| Manual data entry | Mautic API | For course enrollment tracking |\n| Manual notifications | Activepieces | For event notifications |\n\n---","hash":"a079c4de521ef0c1f7430962efdde448f97dedc44ef1247c461eb6f448d43a39"}
202
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 9. Risk Assessment\n\n| Risk | Impact | Mitigation |\n|---|---|---|\n| Discord API rate limits | Medium | Cache channel data, poll at reasonable intervals |\n| GitHub webhook delivery failures | Medium | Retry logic, fallback to polling |\n| Database migration downtime | High | Use zero-downtime migration patterns |\n| SSE connection drops | Low | Client-side reconnection with exponential backoff |\n| Mautic/Activepieces integration complexity | Medium | Start with manual data entry, automate later |\n| Real data quality issues | Medium | Admin dashboard for data correction |\n\n---","hash":"7bfb66a5927b863d312d2a65b79149aba023ef038dacd7722b43ad99e1a27fa3"}
203
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 10. Success Criteria\n\n- [ ] Zero mock data arrays remain in any component\n- [ ] All hero metrics reflect real database values\n- [ ] Meetup events are created/managed via database, not hardcoded\n- [ ] Course catalog is queryable from database\n- [ ] Ship feed shows real git commits\n- [ ] Leaderboard reflects actual builder statistics\n- [ ] Footer status strip shows live system health\n- [ ] Join CTA shows real cohort seat counts\n- [ ] All API routes have proper error handling\n- [ ] Database schema supports all current and near-future use cases\n- [ ] Admin interface exists for data management\n- [ ] Discord bot syncs channels and members\n- [ ] GitHub webhook detects new ships automatically\n\n---","hash":"510f1f82a61ca0c86a16c37284ce5eb4b627cf1e6d3adda8146f5fcb0c62c8ec"}
204
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 11. Estimated Effort\n\n| Phase | Effort | Dependencies |\n|---|---|---|\n| Phase 1: Foundation | 3-4 days | None |\n| Phase 2: Meetups | 3-4 days | Phase 1 |\n| Phase 3: Courses | 3-4 days | Phase 1 |\n| Phase 4: Wall of Shipped | 4-5 days | Phase 1 |\n| Phase 5: Join CTA & Footer | 1-2 days | Phase 1, 3 |\n| Phase 6: Integration & Polish | 3-4 days | All phases |\n| **Total** | **~17-23 days** | |\n\n---","hash":"0a2d3565da592f622e271d6a7d387d79c319d4fdcf95a794c5dc146e8d03d6a9"}
205
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 12. Related Planning Documents\n\nThis plan covers the database and API migration. The following companion documents cover additional work:\n\n| Document | Path | Covers |\n|---|---|---|\n| Courses & Meetups File Structure | `data/aigf-courses-meetups-file-structure.md` | One-file-per-course and one-file-per-meetup folder structure, file formats, admin workflow |\n| GitHub & Google Login | `data/aigf-github-google-login-plan.md` | Supabase Auth integration, OAuth configuration, multi-tenant profile sync |\n| AI Blog Posts in Dirrty Mixbag | `data/aigf-ai-blog-posts-in-community.md` | Blog content strategy, AI-assisted writing workflow, community engagement |\n| Blog on AIGF Site | `data/aigf-blog-in-aigf-site.md` | AIGF blog pages, Dirrty Mixbag news integration, content flow |\n| Blog Management Skill | `data/aigf-blog-management-skill.md` | Captain-facing skill for creating/editing/publishing blog posts from natural language |","hash":"15a7bb0036d1a6eeecc4d5e200789a5059abd74fa2b9557cc689ec9d69aab572"}
206
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/aigf-real-data-migration-plan.md","tags":["data"],"content":"## 13. Next Immediate Actions\n\n1. **Captain approval** \u2014 Review and approve this plan and all companion documents\n2. **Database decision** \u2014 SQLite (keep current) or PostgreSQL (recommended for prod)\n3. **Dirrty Mixbag auth** \u2014 Enable GitHub and Google login in Supabase\n4. **File structure** \u2014 Create `data/courses/` and `data/meetups/` directories\n5. **Blog structure** \u2014 Create `data/blog/` directory structure\n6. **Start Phase 1** \u2014 Schema, migrations, seed data, core API routes","hash":"54a747e406a16d81c28abc840e203079efdeb5044e6a6c81048c14d5fba281e6"}
207
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/captain.md","tags":["data"],"content":"## Captain Identity\n\n- Captain: zerwiz","hash":"4e79839db5f9b9637cf576397c47d828b12a2568d5b3538866adaa49336bc26b"}
208
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/captain.md","tags":["data"],"content":"## Local Model Constraints\n\n- Only one local model can be active at a time.\n- Subagents (crewmates, scouts, secondmates) cannot run on local models \u2014 they require remote models.\n- When using local models, firstmate operates in single-agent mode only.","hash":"7f0210ffcba816854dfa9e0a1d1a6f04d214aea21b271ff9f8a35b16870c5eb1"}
209
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/captain.md","tags":["data"],"content":"## WayOf Command \u2014 Subagent Factory & Local Model Lab\n\n- `/home/zerwiz/command` is the **subagent factory** \u2014 running multiple subagents concurrently for testing and operations.\n- Heavy **local model testing** happens here \u2014 evaluating models, architectures, and agent configurations.\n- The factory is part of the broader WayOf ecosystem (WayOfTeams, Software Factory, CloudSync, etc.).\n- Local model testing and subagent experimentation are active, ongoing work surfaces.","hash":"84ed179ffdc0d4b25ab0e1b48ba3c3769ab7f397dc9712b70104961360a856f3"}
210
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"## AI Geeks n Freaks (AG&F) \u2014 Community, Meetings & Marketing\n\n**Date:** 2025-01-10\n**Status:** Planning Phase\n**Owner:** zerwiz (WayOf)\n**Related:** [`plans/communication/discord-integration-plan.md`](https://github.com/Way-Of/command/tree/main/plans/communication/discord-integration-plan.md), [`plans/masterplan/marketing.md`](https://github.com/Way-Of/command/tree/main/plans/masterplan/marketing.md)\n\n---","hash":"fba5ace038da1c8010581622b5f162072a0111609acf72ed0517a4244110212f"}
211
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"## \ud83c\udfaf Executive Summary\n\nThis document defines the complete plan for using the **AI Geeks n Freaks** Discord server as the primary community and meeting platform for the WayOf ecosystem's public-facing project. It covers:\n\n1. **Homepage integration** \u2014 how visitors discover, register, and join the Discord server from `aigeeksnfreaks.zerwiz.org`\n2. **Course & meetup marketing** \u2014 how we promote and manage courses and meetups through Discord + AG&F\n3. **Meeting flow** \u2014 how community meetings are scheduled, promoted, and executed\n4. **Bot automation** \u2014 the Discord bot that bridges Discord \u2194 AG&F \u2194 WayOfTeams\n5. **Marketing funnel** \u2014 how Discord drives community growth and converts to paying users\n\n---","hash":"e4dc650a3c0cf5d94c0c908ed3070a28be89a7189946ffdf855de1c2c7a12b53"}
212
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### What We Already Have\n\n| Asset | Status | Location |\n|-------|--------|----------|\n| **Discord Server** | \u2705 Live | WayOf server (channels listed below) |\n| **AG&F Homepage** | \u2705 Live | `aigeeksnfreaks.zerwiz.org` (Next.js 16, port 3800) |\n| **Marketing Stack** | \u2705 Deployed | Postiz (socials), Mautic (email), Activepieces (automation) |\n| **Discord Integration Plan** | \u2705 Draft | `plans/communication/discord-integration-plan.md` |\n| **Marketing System Plan** | \u2705 Draft | `plans/masterplan/marketing.md` |","hash":"a87c9203f1d9467b04d0904207e95ce87cd1ee2be36d9492bcc3cc22b92753bf"}
213
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Current Discord Server Structure (WayOf Server)\n\n```\n\ud83d\udcc1 moderator-only\n\u251c\u2500\u2500 #mod\n\u251c\u2500\u2500 #logging\n\u251c\u2500\u2500 #admin\n\u251c\u2500\u2500 \ud83d\udd0a Mod\n\u2514\u2500\u2500 \ud83d\udd0a admin\n\n\ud83d\udcc1 Welcome\n\u251c\u2500\u2500 \ud83d\udfe1 welcome\n\u251c\u2500\u2500 \ud83d\ude80 start-here\n\n\ud83d\udcc1 WayOf\n\u251c\u2500\u2500 \ud83d\udce2 way-of-announcements\n\u251c\u2500\u2500 \ud83d\udea8 look-at-it\n\u251c\u2500\u2500 \ud83d\udcec news\n\u251c\u2500\u2500 \ud83d\udcaa thursdays-at-2000-2200\n\u251c\u2500\u2500 \u2615 co-fika\n\n\ud83d\udcc1 Community\n\u251c\u2500\u2500 \ud83d\udc4b hello\n\u251c\u2500\u2500 \ud83d\udde3\ufe0f community-announcements\n\u251c\u2500\u2500 \ud83d\udcac community-forum\n\u251c\u2500\u2500 \ud83d\udd0d general\n\u251c\u2500\u2500 \ud83d\ude91 support\n\u251c\u2500\u2500 \ud83e\udd1d collab\n\u251c\u2500\u2500 \ud83d\udccc project-hubs\n\u251c\u2500\u2500 \ud83e\ude84 devs\n\u2514\u2500\u2500 \ud83e\udd16 ai-agency\n\n\ud83d\udcc1 R\u00f6stkanaler (Swedish channels)\n\u251c\u2500\u2500 \ud83d\udde3\ufe0f Freelancer-Random-Talk\n\u251c\u2500\u2500 \ud83d\ude0e Everything\n\u251c\u2500\u2500 \u23f0 Meeting 1\u20133\n\u251c\u2500\u2500 \u2615 Co-Fika\n\u251c\u2500\u2500 \ud83e\udef6 Thursdays at 20:00-21:00\n\u251c\u2500\u2500 \ud83d\udca1 Sundays at 20:00-21:00\n\u251c\u2500\u2500 Break out Room 1\u20136\n\u251c\u2500\u2500 AFK\n\n\ud83d\udcc1 Private\n\u2514\u2500\u2500 (restricted access)\n```","hash":"37073a91aceb6b451ceabacae93a6720159b3aa905a8e358e1a28d00660d27ef"}
214
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Key Observations\n\n- **AG&F has no dedicated Discord server** \u2014 it shares the WayOf server\n- **No AG&F-specific channels** exist yet (no courses, meetups, or community channels)\n- **Swedish channels exist** \u2014 indicates a Swedish-speaking audience segment\n- **Meeting channels exist** (Meeting 1\u20133, Break out Rooms) but no structured meeting system\n- **Bot integration is planned** but not yet built (see `discord-integration-plan.md`)\n\n---","hash":"e34aff56583388ac9e003a362ff0481b8e0939d0b1430f501aa232ea1ca6041e"}
215
- {"timestamp":"2026-09-11T15:31:46Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 1.1 Proposed New Categories for AG&F\n\nWe need to add a new top-level category to the WayOf Discord server specifically for **AI Geeks n Freaks**:\n\n```\n\ud83d\udcc1 AI GEKS & FREAKS (NEW CATEGORY)\n\u251c\u2500\u2500 \ud83d\ude80 start-here-agf # New member onboarding\n\u251c\u2500\u2500 \ud83d\udce2 announcements-agf # Official AG&F announcements\n\u251c\u2500\u2500 \ud83d\udc4b introductions-agf # Meet the community\n\u2502\n\u251c\u2500\u2500 \ud83d\udcda courses-agf # Course discussions & support\n\u2502 \u251c\u2500\u2500 \ud83d\udcd6 course-general # All courses\n\u2502 \u251c\u2500\u2500 \ud83d\udc1b course-help # Course Q&A\n\u2502 \u2514\u2500\u2500 \ud83c\udfc6 course-showcase # Student projects\n\u2502\n\u251c\u2500\u2500 \ud83c\udfaf meetups-agf # Meetup planning & execution\n\u2502 \u251c\u2500\u2500 \ud83d\udcc5 upcoming-meetups # Upcoming events\n\u2502 \u251c\u2500\u2500 \ud83d\udcdd meetup-recaps # Post-meeting summaries\n\u2502 \u2514\u2500\u2500 \ud83c\udfa4 meetup-speakers # Speaker coordination\n\u2502\n\u251c\u2500\u2500 \ud83d\udcac ai-chat-agf # General AI discussion\n\u2502 \u251c\u2500\u2500 \ud83e\udde0 llms-ai # LLMs & AI models\n\u2502 \u251c\u2500\u2500 \ud83c\udfa8 generative-ai # Generative AI & art\n\u2502 \u251c\u2500\u2500 \ud83d\udcca data-science # Data science & analytics\n\u2502 \u2514\u2500\u2500 \ud83d\udd27 tools-frameworks # AI tools & frameworks\n\u2502\n\u251c\u2500\u2500 \ud83e\udd1d collab-agf # Collaboration & projects\n\u2502 \u251c\u2500\u2500 \ud83d\udee0\ufe0f active-projects # Open projects seeking contributors\n\u2502 \u251c\u2500\u2500 \ud83d\udce6 project-showcase # Completed projects\n\u2502 \u2514\u2500\u2500 \ud83e\udd1d collaboration # Partnership opportunities\n\u2502\n\u251c\u2500\u2500 \ud83c\udf93 learning-agf # Learning resources\n\u2502 \u251c\u2500\u2500 \ud83d\udcda resources # Curated learning materials\n\u2502 \u251c\u2500\u2500 \ud83d\udcd6 tutorials # Step-by-step tutorials\n\u2502 \u2514\u2500\u2500 \ud83c\udfc6 achievements # Community achievements\n\u2502\n\u2514\u2500\u2500 \ud83d\udcca feedback-agf # Community feedback\n \u251c\u2500\u2500 \ud83d\udca1 suggestions # Feature & content suggestions\n \u2514\u2500\u2500 \ud83d\udcc8 surveys # Community surveys & polls\n```","hash":"76d7333a5efcb52c54dd187cc3cae911731e1ad444f803ce60b38bd68889ae0b"}
216
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 1.2 Role Hierarchy for AG&F\n\n| Role | Permissions | How to Get |\n|------|-------------|------------|\n| `@everyone` | Default | Anyone in server |\n| `AG&F Member` | Read all AG&F channels | Join Discord + verify email |\n| `AG&F Student` | +Course channels | Enroll in a course |\n| `AG&F Graduate` | +Alumni channels | Complete a course |\n| `AG&F Speaker` | +Meetup planning | Invited by organizers |\n| `AG&F Contributor` | +Project channels | Contribute to AG&F projects |\n| `AG&F Moderator` | +Moderate AG&F channels | Appointed by admin |\n| `AG&F Admin` | Full AG&F access | Server admin |","hash":"ee25eff919764465e6739276fd75a8ad687fa7d597f5ba7dc9f2e0c0778757e4"}
217
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 1.3 Bot Requirements\n\n| Bot | Purpose | Implementation |\n|-----|---------|----------------|\n| **AG&F Bot** (custom) | Main integration bot | Python/discord.py \u2192 AG&F API + WayOfTeams API |\n| **Moderation Bot** (MEE6/Dyno) | Auto-moderation, welcome messages | Existing or new |\n| **Meeting Bot** (custom) | Meeting scheduling, reminders, recordings | Part of AG&F Bot |\n| **Course Bot** (custom) | Course enrollment, progress tracking | Part of AG&F Bot |\n\n---","hash":"1fd2ec60d97a07f5102e6307a4c9ab532d31c581b3168b684ce37e59d5ed74c4"}
218
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 2.1 User Journey: Visitor \u2192 Community Member\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 VISITOR JOURNEY \u2502\n\u2502 \u2502\n\u2502 1. Landing Page (aigeeksnfreaks.zerwiz.org) \u2502\n\u2502 \u251c\u2500\u2500 Hero: \"Join the AI Geeks n Freaks Community\" \u2502\n\u2502 \u251c\u2500\u2500 Live member count: \"500+ community members\" \u2502\n\u2502 \u251c\u2500\u2500 Upcoming meetups: \"Next meetup: Jan 15, 2025\" \u2502\n\u2502 \u251c\u2500\u2500 Featured courses: \"Popular courses this month\" \u2502\n\u2502 \u2514\u2500\u2500 CTA: \"Join Discord\" / \"Browse Courses\" \u2502\n\u2502 \u2502\n\u2502 2. Click \"Join Discord\" \u2502\n\u2502 \u251c\u2500\u2500 Option A: Direct Discord invite link (fastest) \u2502\n\u2502 \u251c\u2500\u2500 Option B: Register on AG&F first \u2192 auto-join Discord \u2502\n\u2502 \u2514\u2500\u2500 Option C: Login with Discord OAuth2 \u2502\n\u2502 \u2502\n\u2502 3. Post-Join Experience \u2502\n\u2502 \u251c\u2500\u2500 Welcome DM from AG&F Bot \u2502\n\u2502 \u251c\u2500\u2500 Auto-assign \"AG&F Member\" role \u2502\n\u2502 \u251c\u2500\u2500 Guide through channel tour \u2502\n\u2502 \u2514\u2500\u2500 Invite to next meetup \u2502\n\u2502 \u2502\n\u2502 4. Homepage (Logged In) \u2502\n\u2502 \u251c\u2500\u2500 Personalized dashboard \u2502\n\u2502 \u251c\u2500\u2500 Course progress tracking \u2502\n\u2502 \u251c\u2500\u2500 Meetup RSVP history \u2502\n\u2502 \u2514\u2500\u2500 Community activity feed \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```","hash":"ccfb70d63bbccc9da647e42b84b9c2e7db0c31c66d67504b0af155bc3b1934d3"}
219
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 2.2 Homepage Sections to Build/Update\n\n| Section | Current | Needed | Priority |\n|---------|---------|--------|----------|\n| Hero CTA | Basic | \"Join Discord\" button + live member count | **HIGH** |\n| Meetups | Missing | Upcoming meetups + RSVP widget | **HIGH** |\n| Courses | Missing | Course catalog + enrollment | **HIGH** |\n| Community | Missing | Member count, activity feed | **MEDIUM** |\n| Blog | \u2705 Live | Already exists, needs Discord integration | **MEDIUM** |\n| Login | \u2705 Live | Add Discord OAuth2 option | **MEDIUM** |","hash":"13cf0f94fd14ccc8d95ce158f2abbe6acb2d65c76df5975700473c8328c5c16e"}
220
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 2.3 Technical Integration Points\n\n```\nHomepage (AG&F) Discord Bot Discord Server\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Discord \u2502 \u2502 AG&F Bot \u2502 \u2502 Discord \u2502\n\u2502 OAuth2 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 (Python) \u2502\u25c4\u2500\u2500\u2500\u25ba\u2502 Server \u2502\n\u2502 Login \u2502 \u2502 \u2502 \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502\n \u25bc \u25bc \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 User DB \u2502 \u2502 Event \u2502 \u2502 Channels \u2502\n\u2502 (SQLite) \u2502 \u2502 Bus \u2502 \u2502 + Roles \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 WayOfTeams \u2502\n \u2502 API \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---","hash":"b542693672b7fbb20f39cd791083d01e17c325996a977958bcd334249ca5b3ed"}
221
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 3.1 Course Funnel\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 COURSE MARKETING FUNNEL \u2502\n\u2502 \u2502\n\u2502 1. Awareness (Top of Funnel) \u2502\n\u2502 \u251c\u2500\u2500 Blog posts on AG&F \u2502\n\u2502 \u251c\u2500\u2500 Social media (Postiz \u2192 X, LinkedIn, Reddit) \u2502\n\u2502 \u251c\u2500\u2500 Discord announcements \u2502\n\u2502 \u2514\u2500\u2500 Free webinar/meetup \u2502\n\u2502 \u2502\n\u2502 2. Interest (Middle of Funnel) \u2502\n\u2502 \u251c\u2500\u2500 Free mini-course (lead magnet) \u2502\n\u2502 \u251c\u2500\u2500 Discord community access \u2502\n\u2502 \u251c\u2500\u2500 Email nurture sequence (Mautic) \u2502\n\u2502 \u2514\u2500\u2500 Case studies/testimonials \u2502\n\u2502 \u2502\n\u2502 3. Conversion (Bottom of Funnel) \u2502\n\u2502 \u251c\u2500\u2500 Paid course enrollment \u2502\n\u2502 \u251c\u2500\u2500 Discord course channel access \u2502\n\u2502 \u251c\u2500\u2500 Live Q&A sessions \u2502\n\u2502 \u2514\u2500\u2500 1:1 coaching upsell \u2502\n\u2502 \u2502\n\u2502 4. Retention (Post-Purchase) \u2502\n\u2502 \u251c\u2500\u2500 Course completion certificates \u2502\n\u2502 \u251c\u2500\u2500 Alumni Discord channel \u2502\n\u2502 \u251c\u2500\u2500 Advanced course offers \u2502\n\u2502 \u2514\u2500\u2500 Community leadership opportunities \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```","hash":"52b60b46849e1686231d78eb044f3ab744f47d3c55d0bdd25643e24c02f706c7"}
222
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 3.2 Course Structure in Discord\n\n| Channel | Purpose | Access |\n|---------|---------|--------|\n| `#course-general` | All course announcements | All members |\n| `#course-help` | Q&A for all courses | Students + Instructors |\n| `#course-[name]` | Specific course discussion | Enrolled students only |\n| `#course-showcase` | Student project showcases | All members |\n| `#course-alumni` | Graduate network | Graduates only |","hash":"c647536e4698d17ec2e642c6b8514d9c766a37a1bcf7b470c72741f885cf5450"}
223
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 3.3 Course Bot Features\n\n```python","hash":"139a21d2dfae04e4dd669866ac544f0cdea3c4c6596a881b77f16e5214717058"}
224
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"# Course Bot Commands\n\n/courses # List all available courses\n/enroll <course> # Enroll in a course (requires payment)\n/progress # View course progress\n/certificate # Download completion certificate\n/ask <question> # Ask a question in course channel\n/review # Submit course review\n```\n\n---","hash":"73bb54755f52dc74a86d6e1ca1ac84d0a1f78e6ca3355e637f41c6eb51fefc30"}
225
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 4.1 Meetup Lifecycle\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 MEETUP LIFECYCLE \u2502\n\u2502 \u2502\n\u2502 Phase 1: Planning (2-4 weeks before) \u2502\n\u2502 \u251c\u2500\u2500 Topic selection via Discord poll \u2502\n\u2502 \u251c\u2500\u2500 Speaker invitation & confirmation \u2502\n\u2502 \u251c\u2500\u2500 Create Discord event + AG&F meetup page \u2502\n\u2502 \u2514\u2500\u2500 Marketing push (socials, email, Discord) \u2502\n\u2502 \u2502\n\u2502 Phase 2: Promotion (1-2 weeks before) \u2502\n\u2502 \u251c\u2500\u2500 Daily countdown posts in Discord \u2502\n\u2502 \u251c\u2500\u2500 Social media teaser content \u2502\n\u2502 \u251c\u2500\u2500 Email newsletter feature \u2502\n\u2502 \u2514\u2500\u2500 Speaker Q&A session in Discord \u2502\n\u2502 \u2502\n\u2502 Phase 3: Execution (Day Of) \u2502\n\u2502 \u251c\u2500\u2500 Auto-create voice channel 30 min before \u2502\n\u2502 \u251c\u2500\u2500 Send join link to all RSVP'd members \u2502\n\u2502 \u251c\u2500\u2500 Live updates in text channel \u2502\n\u2502 \u251c\u2500\u2500 Record session (opt-in) \u2502\n\u2502 \u2514\u2500\u2500 Real-time Q&A in Discord \u2502\n\u2502 \u2502\n\u2502 Phase 4: Follow-up (1-3 days after) \u2502\n\u2502 \u251c\u2500\u2500 Post recording to Discord + AG&F \u2502\n\u2502 \u251c\u2500\u2500 Share meetup recap blog post \u2502\n\u2502 \u251c\u2500\u2500 Collect feedback via Discord poll \u2502\n\u2502 \u2514\u2500\u2500 Announce next meetup date \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```","hash":"72623f2765cde8fbf90cb1fc62b6cd189f7589206609541f5abc5f3fa09c7ef5"}
226
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 4.2 Meetup Types\n\n| Type | Frequency | Duration | Format | Platform |\n|------|-----------|----------|--------|----------|\n| **AI Talk** | Monthly | 60 min | Speaker + Q&A | Discord Voice + Video |\n| **Workshop** | Bi-weekly | 90 min | Hands-on coding | Discord Screen Share |\n| **Show & Tell** | Weekly | 30 min | Community demos | Discord Voice |\n| **Guest Speaker** | Monthly | 60 min | External expert | Discord Voice + Video |\n| **Community Sync** | Weekly | 30 min | Standup format | Discord Voice |","hash":"f13c3d2cea7f48a1a19252fac71a0fdddeae06006866a551a3e1534d36a8bfca"}
227
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 4.3 Meetup Marketing Channels\n\n| Channel | Tool | Action |\n|---------|------|--------|\n| **Discord** | AG&F Bot | Event creation, reminders, RSVP |\n| **AG&F Homepage** | Next.js | Meetup page, RSVP widget |\n| **Postiz** | Social Scheduler | Cross-post to X, LinkedIn, Reddit |\n| **Mautic** | Email Marketing | Newsletter feature, reminder emails |\n| **Telegram** | Telegram Bot | Group announcements |\n\n---","hash":"cfde3fd9ab1c186cbeb195933e6c94001f5f1f72f29817ee93739ddadb009192"}
228
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 5.1 Meeting Bot Architecture\n\n```python","hash":"08b70f4d18dbd54f46e07184d09619d0079492b63a88bb41a91216f09d365f35"}
229
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"# Meeting Bot Core Functions\n\nclass MeetingBot:\n def on_event_created(self, event):\n \"\"\"When a meetup is created in AG&F or Discord\"\"\"\n - Create Discord event\n - Create voice channel (Meeting 1)\n - Send announcement to #meetups-agf\n - Add to AG&F meetup calendar\n - Schedule reminders (24h, 1h, 15min)\n\n def on_rsvp(self, user, event):\n \"\"\"When someone RSVPs to a meetup\"\"\"\n - Add user to event attendees\n - Send confirmation DM\n - Update AG&F meetup page\n\n def on_reminder(self, event):\n \"\"\"When a reminder is due\"\"\"\n - Post in #meetups-agf\n - DM all attendees\n - Create voice channel if < 30 min\n\n def on_meeting_start(self, event):\n \"\"\"When meeting starts\"\"\"\n - Announce in text channel\n - Pin join instructions\n - Start recording (if enabled)\n\n def on_meeting_end(self, event):\n \"\"\"When meeting ends\"\"\"\n - Stop recording\n - Upload recording to cloud\n - Post recap template\n - Send feedback survey\n```","hash":"75fe490a9a10495240ff772064b43031258feb6ece5a24e61d98238d9a78e7c1"}
230
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 5.2 Meeting Channel Management\n\n```yaml","hash":"9b5a870d8639da13b0640568eaf69c1f1e064c8df966045d3dfb208ba1823e30"}
231
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"# Auto-created per meeting\n\nchannel:\n name: \"meeting-[topic]-[date]\"\n type: voice\n parents: \"AI Geeks n Freaks\"\n permissions:\n attendees: speak, video, stream\n moderators: mute, deafen, move members\n auto_archive: 24h after end\n recording:\n enabled: true\n storage: cloud (S3/Cloudflare R2)\n access: public (unless marked private)\n```\n\n---","hash":"bda2dcf73f97e76d204824750a501280cd34259ae42fe04e339d99cff412c665"}
232
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 6.1 Cross-Platform Content Flow\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 MARKETING CONTENT FLOW \u2502\n\u2502 \u2502\n\u2502 Content Creation (AG&F Blog) \u2502\n\u2502 \u2514\u2500\u2500 Agent writes post \u2192 Review \u2192 Publish \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc \u2502\n\u2502 Distribution \u2502\n\u2502 \u251c\u2500\u2500 Discord: Auto-post to #announcements-agf \u2502\n\u2502 \u251c\u2500\u2500 Socials: Postiz schedules to X, LinkedIn, Reddit \u2502\n\u2502 \u251c\u2500\u2500 Email: Mautic adds to newsletter \u2502\n\u2502 \u2514\u2500\u2500 Telegram: Bot posts to relevant groups \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc \u2502\n\u2502 Engagement Tracking \u2502\n\u2502 \u251c\u2500\u2500 Discord: Track reactions, replies, new members \u2502\n\u2502 \u251c\u2500\u2500 Socials: Postiz analytics \u2502\n\u2502 \u251c\u2500\u2500 Email: Mautic open/click rates \u2502\n\u2502 \u2514\u2500\u2500 AG&F: Page views, time on page, CTA clicks \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc \u2502\n\u2502 Conversion \u2502\n\u2502 \u251c\u2500\u2500 Discord \u2192 Course enrollment \u2502\n\u2502 \u251c\u2500\u2500 Socials \u2192 Discord join / newsletter signup \u2502\n\u2502 \u251c\u2500\u2500 Email \u2192 Meetup RSVP / course purchase \u2502\n\u2502 \u2514\u2500\u2500 AG&F \u2192 Discord join / course enrollment \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```","hash":"f123c9b6e64a9bae212c65843d64c07579f1d5fe5f4a42f1058f2971e5fd3818"}
233
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 6.2 Automated Marketing Workflows\n\n| Workflow | Trigger | Action |\n|----------|---------|--------|\n| **New Member Welcome** | User joins Discord | Send DM + assign role + guide to channels |\n| **Course Enrollment** | Payment received | Grant course channel access + send welcome |\n| **Meetup Reminder** | 24h before event | Post in Discord + email to RSVP'd users |\n| **Inactive Member Re-engagement** | 30 days no activity | Send re-engagement DM + offer |\n| **New Blog Post** | Post published | Post to Discord + socials + email |\n| **Course Completion** | Certificate issued | Grant alumni role + invite to alumni channel |","hash":"ba9c09ea54b8ddde21c418d31b6df45d53f6bfa9a7339d53900da33d8ffb1c9f"}
234
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 6.3 Lead Capture & Nurturing\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 LEAD NURTURE FLOW \u2502\n\u2502 \u2502\n\u2502 Lead Sources \u2502\n\u2502 \u251c\u2500\u2500 Discord join (via homepage CTA) \u2502\n\u2502 \u251c\u2500\u2500 Course free trial signup \u2502\n\u2502 \u251c\u2500\u2500 Meetup RSVP \u2502\n\u2502 \u2514\u2500\u2500 Blog newsletter signup \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc \u2502\n\u2502 Mautic Segmentation \u2502\n\u2502 \u251c\u2500\u2500 Segment: \"Discord Members\" \u2502\n\u2502 \u251c\u2500\u2500 Segment: \"Course Prospects\" \u2502\n\u2502 \u251c\u2500\u2500 Segment: \"Meetup Attendees\" \u2502\n\u2502 \u2514\u2500\u2500 Segment: \"Blog Readers\" \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc \u2502\n\u2502 Nurture Campaigns \u2502\n\u2502 \u251c\u2500\u2500 Welcome series (3 emails over 7 days) \u2502\n\u2502 \u251c\u2500\u2500 Course recommendation (based on interests) \u2502\n\u2502 \u251c\u2500\u2500 Meetup invitations (monthly) \u2502\n\u2502 \u2514\u2500\u2500 Alumni offers (advanced courses, coaching) \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc \u2502\n\u2502 Conversion \u2502\n\u2502 \u251c\u2500\u2500 Free trial \u2192 Paid course \u2502\n\u2502 \u251c\u2500\u2500 Meetup attendee \u2192 Course enrollment \u2502\n\u2502 \u251c\u2500\u2500 Course student \u2192 Advanced course \u2502\n\u2502 \u2514\u2500\u2500 All \u2192 Coaching/consulting \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---","hash":"4e86d5f859e103b10b3457966726b9ab1496dd4671e38a73ecc1a41662a5044c"}
235
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Phase 1: Foundation (Weeks 1-2)\n\n| Task | Owner | Status |\n|------|-------|--------|\n| Create AG&F Discord category + channels | Admin | **NOT STARTED** |\n| Define AG&F roles + permissions | Admin | **NOT STARTED** |\n| Set up AG&F Bot repository | Dev | **NOT STARTED** |\n| Configure Discord OAuth2 for AG&F | Dev | **NOT STARTED** |\n| Add \"Join Discord\" CTA to homepage | Dev | **NOT STARTED** |\n| Set up welcome automation | Dev | **NOT STARTED** |","hash":"deb7a2d603fec5ace6cfdc6efcafacc1c7a78cfc68deea4723242289684edc5f"}
236
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Phase 2: Core Features (Weeks 3-4)\n\n| Task | Owner | Status |\n|------|-------|--------|\n| Build AG&F Bot (basic commands) | Dev | **NOT STARTED** |\n| Implement course enrollment flow | Dev | **NOT STARTED** |\n| Build meetup creation system | Dev | **NOT STARTED** |\n| Connect Discord \u2194 AG&F database | Dev | **NOT STARTED** |\n| Set up meeting voice channel automation | Dev | **NOT STARTED** |\n| Add live member count to homepage | Dev | **NOT STARTED** |","hash":"ebe57ee0f89b83ba98ad1b3691f8f207e3e33012affe29807f69ac63a234c719"}
237
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Phase 3: Marketing Integration (Weeks 5-6)\n\n| Task | Owner | Status |\n|------|-------|--------|\n| Wire AG&F Bot \u2192 Postiz (auto-post) | Dev | **NOT STARTED** |\n| Wire AG&F Bot \u2192 Mautic (lead capture) | Dev | **NOT STARTED** |\n| Build course marketing funnel | Marketing | **NOT STARTED** |\n| Build meetup marketing campaign | Marketing | **NOT STARTED** |\n| Set up email nurture sequences | Marketing | **NOT STARTED** |\n| Create Discord community guidelines | Admin | **NOT STARTED** |","hash":"229b28a68afdebc8cd8b19892a125e5a202bfe80363f56f0c17d1f94905e12f1"}
238
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Phase 4: Launch & Optimize (Weeks 7-8)\n\n| Task | Owner | Status |\n|------|-------|--------|\n| Soft launch to existing community | Admin | **NOT STARTED** |\n| Gather feedback + iterate | All | **NOT STARTED** |\n| Full public launch | Marketing | **NOT STARTED** |\n| Monitor metrics + optimize | Marketing | **NOT STARTED** |\n| Document everything | Admin | **NOT STARTED** |\n\n---","hash":"2d651c69bbc227cce4d94af8e32c7c23abd93bb277f70b399ea59e17dc881e85"}
239
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 8.1 Community Growth Metrics\n\n| Metric | Target (Month 1) | Target (Month 3) | Target (Month 6) |\n|--------|------------------|------------------|------------------|\n| Discord members | 200 | 500 | 1,000 |\n| Homepage visitors | 500 | 1,500 | 3,000 |\n| Discord \u2192 Homepage conversion | 10% | 15% | 20% |\n| Homepage \u2192 Discord join rate | 25% | 30% | 35% |","hash":"d6e7bd56414c629ade974189dc63ca0d6e19c90d0bdca5674816f40f1f0e2661"}
240
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 8.2 Engagement Metrics\n\n| Metric | Target |\n|--------|--------|\n| Daily active Discord users | > 30% of total |\n| Meetup attendance rate | > 60% of RSVP'd |\n| Course enrollment from Discord | > 20% of enrolled members |\n| Blog posts shared to Discord | 100% of published |","hash":"cbb6da50045c3248fb256b30f011f64a1bbfb126aed694380b5e5af852b268ff"}
241
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### 8.3 Revenue Metrics\n\n| Metric | Target (Month 6) |\n|--------|------------------|\n| Course sales from Discord | 50 sales |\n| Meetup attendees (paid) | 100 attendees |\n| Email newsletter subscribers | 1,000 |\n| Coaching/consulting leads | 10 qualified leads |\n\n---","hash":"68369f86e96d9a44ac5410c4f98b0ff9ca02d4a438f2e95a5cd79c28dd012ab1"}
242
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"## 9. Risks & Mitigations\n\n| Risk | Impact | Likelihood | Mitigation |\n|------|--------|------------|------------|\n| Low initial Discord engagement | Medium | High | Aggressive onboarding, daily engagement prompts |\n| Bot reliability issues | High | Medium | Fallback to manual processes, monitoring |\n| Discord ToS violations | High | Low | Follow Discord guidelines, regular audits |\n| Spam/bot attacks | Medium | Medium | CAPTCHA verification, auto-moderation |\n| Content moderation overhead | Medium | High | Community self-moderation, clear guidelines |\n| Technical debt in bot | Medium | Medium | Regular refactoring, documentation |\n\n---","hash":"0e96b5cb32a5d87b0136b779c6a709a12ae5a13cf8ad8043550659b41566535f"}
243
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Technical Dependencies\n\n| Dependency | Status | Notes |\n|------------|--------|-------|\n| Discord Bot token | **NOT ACQUIRED** | Need Discord Developer Portal app |\n| AG&F API endpoints | **PARTIAL** | Need new endpoints for Discord integration |\n| Discord OAuth2 app | **NOT CREATED** | Need Discord Developer Portal app |\n| Cloud storage for recordings | **NOT SET UP** | S3 or Cloudflare R2 |\n| Meeting recording service | **NOT CHOSEN** | Need to evaluate options |","hash":"8cd01123ee95f9715846d509be8a77eb0ac6826dba5baefe46b09ddef38dcbea"}
244
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### Business Dependencies\n\n| Dependency | Status | Notes |\n|------------|--------|-------|\n| Course content ready | **PARTIAL** | Some courses exist, more needed |\n| Meetup speakers confirmed | **NOT STARTED** | Need 3-5 regular speakers |\n| Marketing budget | **NOT DEFINED** | For paid promotion |\n| Community guidelines | **NOT DRAFTED** | Need before launch |\n| Moderation team | **NOT ASSEMBLED** | Need 2-3 moderators |\n\n---","hash":"da3fde56faa692a972f550a75e15c9b422490b26869afafe98ddb846bd97319c"}
245
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### For Immediate Action (This Week)\n\n- [ ] Create Discord Developer application for AG&F Bot\n- [ ] Add AG&F category + channels to WayOf Discord server\n- [ ] Define AG&F roles + permissions\n- [ ] Draft community guidelines document\n- [ ] Add \"Join Discord\" CTA to AG&F homepage hero section\n- [ ] Set up Discord invite link for AG&F","hash":"5f555468d7d69bacf3c47b00751d9a92ccf68c22e0adfb8faa733a111fa6872a"}
246
- {"timestamp":"2026-09-11T15:31:47Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### For Next Two Weeks\n\n- [ ] Build AG&F Bot skeleton (Python/discord.py)\n- [ ] Implement Discord OAuth2 login for AG&F\n- [ ] Create course enrollment flow (Discord \u2194 AG&F)\n- [ ] Set up meetup creation system\n- [ ] Configure welcome automation\n- [ ] Add live member count widget to homepage","hash":"27c9695a85b48d79bfc7269ee2af8581476abaf8ac93b578bdb09903aecd307e"}
247
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### For First Month\n\n- [ ] Launch AG&F Discord category\n- [ ] Publish first AG&F blog post + share to Discord\n- [ ] Host first AG&F meetup\n- [ ] Set up email nurture sequence for new Discord members\n- [ ] Connect Postiz to Discord for auto-posting\n- [ ] Track all KPIs + iterate\n\n---","hash":"b1572843da4249e09ad0c5a62d0b479a70de110128de659d9414a8167474a818"}
248
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### A. Discord Bot Command Reference (Draft)\n\n```","hash":"8592a9b7ba2e39d31662e7d675b3f005f705462e40904fd9ba988927844b5de6"}
249
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"# Community Commands\n\n/join-agf # Connect Discord account to AG&F\n/profile # View AG&F profile\n/courses # List available courses\n/meetups # List upcoming meetups\n/rsvp <event> # RSVP to a meetup","hash":"475e27c2f99dd596b0954a8ea2a5116a365cdb126923d7d31129a90dea6d32c5"}
250
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"# Course Commands\n\n/enroll <course> # Enroll in a course\n/progress # View course progress\n/certificate # Download certificate","hash":"047862ceb0ae2429961d73117291cf9067798c5ecdf379a5be0a5a0afb762e25"}
251
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"# Admin Commands (Moderator+)\n\n/poll <question> # Create a poll\n/schedule <event> # Schedule a meetup\n/ban <user> # Remove a member\n/kick <user> # Kick a member\n```","hash":"e4f74623c34de9ee8f5fc561be07c3d74a08f0f01c1413a252bf97dded8ef8da"}
252
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### B. AG&F Homepage Wireframe (Text)\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 LOGO NAV: Courses Meetups Blog Join Discord\u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502\n\u2502 HERO SECTION \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 AI Geeks n Freaks \u2502 \u2502\n\u2502 \u2502 Join our community of AI enthusiasts \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502\n\u2502 \u2502 [\ud83d\ude80 Join Discord] [\ud83d\udcda Browse Courses] \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502\n\u2502 \u2502 \ud83d\udc65 500+ Members \ud83d\udcc5 Next Meetup: Jan 15 \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502\n\u2502 FEATURED COURSES \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 Course 1 \u2502 \u2502 Course 2 \u2502 \u2502 Course 3 \u2502 \u2502\n\u2502 \u2502 [View] \u2502 \u2502 [View] \u2502 \u2502 [View] \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502\n\u2502 UPCOMING MEETUPS \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 \ud83d\udcc5 AI Talk: LLMs in Production - Jan 15 \u2502 \u2502\n\u2502 \u2502 \ud83d\udcc5 Workshop: Build Your First AI Agent - Jan 22 \u2502 \u2502\n\u2502 \u2502 [View All Meetups] \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2502\n\u2502 COMMUNITY SPOTLIGHT \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 \"Best AI community I've joined!\" - @member \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502\n\u2502 \u2502 [Join the Conversation \u2192] \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```","hash":"dccd0dc67c8099dbd88f494510a524eb79496a85066967562ab6a5bd4c8fdbe1"}
253
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/discord-server-integration-planning.md","tags":["data"],"content":"### C. Related Documents\n\n- [`plans/communication/discord-integration-plan.md`](https://github.com/Way-Of/command/tree/main/plans/communication/discord-integration-plan.md) \u2014 Bot architecture + commands\n- [`plans/masterplan/marketing.md`](https://github.com/Way-Of/command/tree/main/plans/masterplan/marketing.md) \u2014 Full marketing system\n- [`data/ecosystem-planning.md`](./ecosystem-planning.md) \u2014 WayOf ecosystem overview\n- [`plans/communication/blog-incoming-messages-plan.md`](https://github.com/Way-Of/command/tree/main/plans/communication/blog-incoming-messages-plan.md) \u2014 Blog integration\n- [`plans/communication/telegram-bot-plan.md`](https://github.com/Way-Of/command/tree/main/plans/communication/telegram-bot-plan.md) \u2014 Parallel Telegram integration\n\n---\n\n**Document Version:** 2.0\n**Last Updated:** 2025-01-10\n**Next Review:** 2025-01-17\n**Author:** zerwiz (WayOf)\n**Reviewed by:** Pending","hash":"c9ddfdfa6407595e768c1cf9d2f2a56cb7406961e93dea480d454a78f8ad1cd2"}
254
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"# WayOf Ecosystem \u2014 Planning & Organization\n\n> **Source:** `/home/zerwiz/command/plans/masterplan/` \u2014 the masterplan lives in\n> the coding repo (`command`). This file is the **firstmate summary** \u2014 the\n> planning/organizing view. When the captain needs to plan, organize, or\n> review the ecosystem, read this file first, then drill into `command` for\n> details.\n>\n> **Last synced:** 2025-09-09\n\n---","hash":"ded50fa3a58f201808cae6b2bb6fb86e24671089526068a606a128058cfa42ff"}
255
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Product Platforms\n\n| Product | Domain | Role |\n|---|---|---|\n| **Ona** | Family / personal | Personal AI orchestrator & squad (Solin + specialists). Dual Telegram bots, web UI, Electron, PWA. |\n| **WayOfTeams** | Work / production | Main SaaS at `teams.zerwiz.org`. Multi-tenant: tickets, kanban, standups, skills, AI chat, analytics. |\n| **Software Factory (`wayoffactory`)** | Engineering | Agents-plus-code pipelines. Equal to factory, better stack. Productized as WayOfTeams feature. |\n| **CloudSync** | Sync hub | Headless canonical sync hub. Edges push/pull/bootstrap/stream; LWW conflict resolution. |\n| **AG&F (aigeeksandfreaks)** | Marketing | Marketing platform + blog (`aigeeksnfreaks.zerwiz.org`). Blog posts, landing pages, funnels. |\n| **NorthStar Rules (NSR)** | Compliance | Canonical core ruleset for every Way-Of project. Mandatory doc structure, `.agents/skills/` automation, `.factory/` deterministic harness. |","hash":"3dcdc8f91df6721e4b0db4fc9115cd27e08c9d260a6bb62b8ab53a0fdfc2c3ec"}
256
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Marketing Stack (on zerwizserver)\n\n| Tool | Port | Role |\n|---|---|---|\n| **Postiz** | `4007` | Social media scheduler (X, LinkedIn, Reddit, Threads, FB, YouTube) |\n| **Activepieces** | `8080` | Workflow automation (scrapers, posting, integrations) |\n| **Mautic** | `8001` | Email marketing automation (campaigns, cron sends, forms) |\n| **Playwright MCP** | `\u2014` | Browser automation \u2014 scraping, social posting, testing, form filling via MCP |\n| Temporal | `7233` | Postiz durable workflows |\n| Grafana | `3003` | Dashboards |","hash":"f5a2d35a3ed8d689db02858171ffc7cac4ae53805e85ec830a43b3bddd981a78"}
257
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Integration Layers\n\n| Layer | Role |\n|---|---|\n| **MCP Gateway** | Exposes every internal tool/resource/prompt to any AI client |\n| **A2A mesh** | Agents talk to agents (a2abridge, per-agent MCP bridge) |\n| **LiteLLM** | Unified model gateway \u2014 one key to all providers (cloud + local) |\n| **CloudSync protocol** | State sync between instances/edges |","hash":"73f9c2fb672636590298768b9c258a87930b97dfbd322ee96c6d57328dfabf94"}
258
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Machines\n\n| Asset | Role |\n|---|---|\n| `zerwiz` (Linux, `100.100.93.103`) | Primary dev box; a2abridge hub `:7777`; local LM Studio/Ollama/llama.cpp |\n| `zerwizserver` (`100.88.238.83`) | Production host: WayOfTeams, CloudSync, Supabase, SearXNG, Forgejo, etc. |\n| `zerwiz-1` (Windows) | Mirror workstation |\n| `craigema` (Fedora/Podman/llama.cpp) | Third environment, miniforum server |\n\n---","hash":"7e755d65549d1657101d39ae6fd76b66b7324959ea9c59969fc10fa7eb92609b"}
259
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"## 2. Decisions Log (Locked)\n\n| # | Decision | Status |\n|---|---|---|\n| D-001 | Masterplan lives in `plans/masterplan/`; ecosystem AGENTS.md inside it | **Locked** |\n| D-002 | `wayofpackets` monorepo is the target home for the refactored ecosystem | **Locked** |\n| D-003 | Masterplan is design + decisions + open-questions (not a build spec) | **Locked** |\n| D-004 | Dead products consolidated: CTO Dashboard \u2192 wayofteams; LinkableWork \u2192 domain-core; Way of Work \u2192 jido-agents + factory | **Locked** |\n| D-005 | Packet model: `packages/` (composable) + `apps/` (entry shells) + `tools/` | **Locked** |\n| D-006 | Stack pillars documented as **target** \u2014 confirm each before locking | Candidate |\n| D-007 | **NSR is the compliance layer** \u2014 every repo must pass NSR harness | **Locked** |\n| D-008 | Integration via MCP gateway + A2A mesh (not bespoke bridges) | Candidate |\n| D-009 | **factory is reference only.** We build **`wayoffactory`** on a better stack | **Locked** |\n| D-010 | **UX principle: \"spaces, not everything at once.\"** | **Locked** |\n| D-011 | **Client-first product.** Designed for external paying customers | **Locked** |\n| D-012 | **Every project ships project-specific skills** (D-012) | **Locked** |\n| D-013 | **Ona + Ona-Sphere are new builds.** Netlify apps are demos | **Locked** |\n| D-014 | Repo layout fixed: `~/CodeP/ona`, `~/CodeP/sphere` | **Locked** |\n| D-015 | **Multi-runtime agent strategy** (Jido + coding agents + Rust + pipeline) | Candidate |\n| D-016 | **AG&F is our marketing platform** \u2014 socials via Postiz, email via Mautic, automations via Activepieces | **Locked** |\n\n---","hash":"6a4eeeedd554ec48037c3357c373aad4305741bf19fbd90d126682994ec5cfd8"}
260
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"## 3. NorthStar Rules (NSR) \u2014 Key Principles\n\nNSR is the **canonical core ruleset** for every Way-Of project. It is what keeps everything compliant.","hash":"caa523ae1b759de7796f78bb6b2a21f44648bc95df78765560269434ff9ed662"}
261
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Core Principles (non-negotiable)\n\n1. **Dual-layer docs** \u2014 root routing files + granular sub-documents\n2. **Zero ad-hoc shell commands** \u2014 all operations via `.agents/skills/` scripts\n3. **Dual factory** \u2014 Embedded Agent Skill Factory + Standalone Electron Factory App\n4. **Deterministic harness (`.factory/`)** \u2014 Core Four config, code-based gates, typed envelopes\n5. **WayOfTeams sync** \u2014 Kanban, Knowledge Base, Anchor Memory via MCP\n6. **No feature duplication** \u2014 every feature registered in `FEATURES.md`\n7. **Subfolder AGENTS.md** \u2014 every functional subfolder defines scoped boundaries\n8. **Env-driven config** \u2014 no hardcoded values; secrets never committed\n9. **Multi-deployment + multi-tenant** \u2014 env tiers, per-client deployments\n10. **Relative paths only** \u2014 absolute paths forbidden and gated\n11. **Cross-platform** \u2014 Mac/Linux/Windows (WSL/Git Bash)\n12. **Hosting safety** \u2014 `docs/HOSTING/` documents every hosting\n13. **Developer setup** \u2014 `docs/DEVELOPER_SETUP/` documents every dev\n14. **Tech-stack mapping** \u2014 `TECH_STACK.md` maps every feature to its pinned stack\n15. **Work with agents per the operating manual** \u2014 agents are bounded nodes\n16. **Factory-ready skill set** \u2014 every project implements the skills in `docs/project-skills.md`\n\n---","hash":"1d8f490dbe4442a43b75378eab2be458589c11e246734a0b16f14dfe52fbfafd"}
262
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Phase 0 \u2014 Scaffold masterplan (in progress)\n\n- [x] Create `plans/masterplan/` folder + ecosystem AGENTS.md\n- [x] Inventory (`ecosystem.md`)\n- [x] Target architecture (`architecture.md`)\n- [x] Target monorepo layout (`packets.md`)\n- [x] NSR compliance layer (`northstar-rules.md`)\n- [x] UX principles (`ui-ux.md`)\n- [x] Decisions + open questions (`decisions.md`, `open-questions.md`)\n- [x] Migration map (`migration-map.md`)\n- [x] Link from root `command/AGENTS.md` + `README.md` to the masterplan\n- [ ] Record masterplan in WayOfTeams memory/knowledge; open tracking tickets","hash":"0d8ccea8085a1429010ec1858395083b2639a570ac65bf972f8a292a7f5a97fa"}
263
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Phase 1 \u2014 Audit & confirm\n\n- [ ] Audit every live repo against NSR acceptance criteria\n- [ ] Confirm each stack pillar \u2192 lock ADRs in `decisions.md`\n- [ ] Decide monorepo tooling (pnpm vs mix umbrella hybrid)\n- [ ] Decide MCP gateway shape + A2A federation scope\n- [ ] Decide `core-rust` approach (fresh vs extract Ona's Rust)\n- [ ] Decide fate of `wayofcollab`, `wayofinvestready`, ona-sphere","hash":"361ef4165639fcff5488d5b61d01b138b6d73cd60231f3fb1aedda7f4009f6f4"}
264
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Phase 2 \u2014 NSR compliance bootstrap\n\n- [ ] Run `.factory/installer/` in target repos\n- [ ] Stand up `TECH_STACK.md` / `FEATURES.md` / `STRUCTURE.md` per repo\n- [ ] Add `.agents/skills/` lifecycle/git-ops/features/factory scripts\n- [ ] **Author project-specific skills (D-012)**\n- [ ] Pass env/paths/platform gates everywhere\n- [ ] Wire WayOfTeams MCP sync per repo","hash":"aecd783fb134a344a25d4c67a25940ba5c25a0755f7f4172c1ac6a6862118bcc"}
265
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Phase 3 \u2014 Refactor to packets/apps\n\n- [ ] Establish `packages/` baseline\n- [ ] Consolidate dead products\n- [ ] Fold `apps/*` onto shared packets\n- [ ] **UX spaces (D-010)** \u2014 define each app's landing + named spaces\n- [ ] Universal MCP gateway + A2A mesh verified","hash":"d5906b94c67a580ab2995ff30792668e167a8b19b7b4c192fcbc5d3ab8e80ac2"}
266
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Phase 4 \u2014 Validation\n\n- [ ] `tools/dev.sh` starts each app standalone AND the whole stack\n- [ ] Factory factory run against refactored repos\n- [ ] CloudSync hub reconciles multi-edge state\n- [ ] NSR acceptance gates pass for every migrated repo\n- [ ] Trace UI + Langfuse observability","hash":"3edc2a0a74262a601dca88bdda99a57822d33df81b7bece3167b9121d2f40619"}
267
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Phase 5 \u2014 Productization\n\n- [ ] Factory-as-feature shipped in WayOfTeams\n- [ ] Pilot client on NSR-compliant `wayoffactory` distribution\n- [ ] Ona \u2194 WayOfTeams \u2194 Factory full A2A/MCP interop in production","hash":"635b1c812fd0c6c02dce9bce7fd15fdf9a70a0e233dc9b0f85fc5855754aa00f"}
268
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Priority Order\n\n1. **Phase 1 audit** (know where we stand)\n2. **NSR compliance** (the standard everything hangs off)\n3. **`packages/domain-core` + `jido-agents` extraction** (biggest leverage)\n4. **MCP gateway + A2A** (integration backbone)\n5. **`apps/*` consolidation** (Ona/WayOfTeams/Factory/CloudSync on shared core)\n\n---","hash":"b4324cfaaf7a5f846dbe4c09144d8312b266ff3808d3544ee678fa794ffc408c"}
269
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Platform\n\n- **Live site:** `https://aigeeksnfreaks.zerwiz.org` (Cloudflare tunnel \u2192 `localhost:3800`)\n- **App:** Next.js 16 + Tailwind + shadcn/ui + Prisma (SQLite)\n- **Pages:** homepage, meetups, courses, factory, software-factory, way-of-teams, shipped, login, admin API","hash":"3f231b1622b75a773a79ad575be651e157fcb60a7709865fe9e8935143461a79"}
270
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Capabilities\n\n| Capability | Tool | How we drive it |\n|---|---|---|\n| **Social posting** (X, LinkedIn, Reddit, Threads, FB, YouTube) | Postiz | Postiz API/UI; scheduled via cron |\n| **Auto-manage WhatsApp / Telegram groups** | Telegram bot (pi) + agents | `telegram-message-handler` skill |\n| **Blog posts** | AG&F (Next.js + Prisma) | factory write \u2192 review \u2192 publish \u2192 Post record |\n| **Landing pages + marketing funnels** | AG&F pages | agents update page content; funnels tracked with UTM |\n| **Email campaigns on cron** | Mautic | Mautic campaigns + cron workers |\n| **Scrape potential clients** | Activepieces + crawl4ai | scrapers as workflows: find leads, enrich, drop into Mautic/AG&F |\n| **Content calendar** | Postiz + AG&F | Postiz scheduling; AG&F admin |\n| **Newsletter / digests** | Mautic | cron sends, segment-based |\n| **Discord** | Discord bot | `discord-integration-plan` |","hash":"c45a3300b4bcc8cbdff37d134b7dfd4235cf11b9b882c4592ca4c9da57c550ae"}
271
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Marketing Skills (callable from workflow)\n\n| Skill/agent | Does |\n|---|---|\n| `marketing-content-creator` | write posts/articles/threads from outline; repurpose across channels |\n| `marketing-scheduler` | schedule content (Postiz calendar, Mautic sends, cron) |\n| `marketing-publisher` | publish to channels (Postiz, AG&F blog, Discord/Telegram) |\n| `social-manager` | take care of socials: X, LinkedIn, Reddit, Threads; post + reply |\n| `group-manager` | handle WhatsApp/Telegram groups (via Telegram bot) |\n| `blog-writer` | write + publish AG&F blog posts |\n| `funnel-updater` | update landing pages + marketing funnels (AG&F pages, UTM) |\n| `email-campaigner` | build + send Mautic email campaigns (cron) |\n| `client-scraper` | scrape potential clients (Activepieces + crawl4ai), enrich, hand to sales |\n| `analytics-reporter` | pull engagement/reach/conversion (Postiz + Mautic + AG&F) |","hash":"c0ebaf28fdc6c868f3f274f9aa15df866127eb8468cf703488319c76265adcae"}
272
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Marketing Open Items\n\n- [ ] Wire **Activepieces** \u2192 **Postiz** + **Mautic** + **AG&F** automations\n- [ ] Connect **social accounts** to Postiz (X, LinkedIn, Reddit, Threads\u2026)\n- [ ] Configure **Mautic** email domain + campaigns; test cron sends\n- [ ] Build the **client-scraper** workflows (Activepieces + crawl4ai)\n- [ ] Build marketing **skills** into `.agents/skills/`\n- [ ] AG&F **blog publishing pipeline** (factory factory \u2192 Post \u2192 rebuild)\n- [ ] **Telegram/WhatsApp group** management via the Telegram bot (pi)\n- [ ] Track **funnels** with UTM + Mautic + Postiz analytics\n\n---","hash":"ac1eb185416c3d6778d929348129f6adddd1a5168ba8a67be920d718a6ae90ea"}
273
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Stack\n\n- [ ] Lock each stack pillar? (Elixir, Rust, LiteLLM, Postgres/DuckDB)\n- [ ] DuckDB vs Postgres analytics split in practice\n- [ ] Ona core runtime \u2014 Rust-native vs under shared Elixir core\n- [ ] Qdrant vs pgvector for RAG/memory\n- [ ] Langfuse self-host vs OpenTelemetry-only observability\n- [ ] LiteLLM deployment \u2014 on zerwizserver, per-machine, or both?","hash":"404407a87944f9965a59d47601db3ca2844fb40f4eb0eae9846a6f5e0fbac9e6"}
274
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Agent Routing & Integration\n\n- [ ] MCP gateway: one global vs per-product MCP servers\n- [ ] A2A federation scope \u2014 stay on zerwiz hub or federate?\n- [ ] `AGENTS.md`/YAML routing manifests \u2014 single canonical format or per-tool?\n- [ ] LiteLLM routing granularity \u2014 per-product vs one shared catalog\n- [ ] Multi-runtime split \u2014 confirm which workloads run on which runtime\n- [ ] Jido scope \u2014 which agents stay Jido vs move to deterministic code","hash":"28c6e874dc73703333e5f71ed68aab5bce4be6c8e96675dc9c799c3dfd9da6bd"}
275
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Migration / Refactor\n\n- [ ] Monorepo tooling \u2014 pnpm workspaces or mix umbrella + pnpm?\n- [ ] `core-rust` packet \u2014 build fresh or extract Ona's existing Rust?\n- [ ] `wo-agent` / `wo-ai` split \u2014 map as-is or restructure?\n- [ ] WayOfTeams audit follow-ups \u2014 13 Jido agents + 10 Oban workers + 13 MCP v2 servers\n- [ ] Ona audit follow-ups \u2014 Rust workspace `systems/*`\n- [ ] Sphere audit follow-ups \u2014 scaffold phase: pick runtime\n- [ ] justfile rollout \u2014 every packet/app gets a `justfile`\n- [ ] NSR rollout order \u2014 which repos go NorthStar-compliant first?","hash":"9236a05f7c543b5378afcfa2633edafedb9d019bd0252c31a03f21c0e8f1df74"}
276
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Marketing (AG&F)\n\n- [ ] Activepieces \u2192 Postiz + Mautic + AG&F wiring\n- [ ] Postiz social accounts \u2014 connect X, LinkedIn, Reddit, Threads, FB, YouTube\n- [ ] Mautic email domain + campaigns \u2014 configure sending domain, test cron sends\n- [ ] Client scraper workflows \u2014 Activepieces + crawl4ai\n- [ ] Marketing skills into `.agents/skills/`\n- [ ] AG&F blog publishing pipeline \u2014 factory factory write\u2192review\u2192publish\n- [ ] Telegram/WhatsApp group management\n- [ ] Funnel tracking \u2014 UTM + Mautic + Postiz analytics","hash":"e56c6786bdb401d8e2a08d15c5369d376b511aae931328a2ea659dd8bfb09df9"}
277
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Compliance (NSR)\n\n- [ ] NSR vs this masterplan's structure \u2014 how does `plans/masterplan/` comply?\n- [ ] NSR harness in existing repos \u2014 run everywhere or bootstrap incrementally?\n- [ ] Enforcement owner \u2014 who/when runs the acceptance gates?","hash":"8845ef13f00a001f5e4a412a89795110d1e592faebce8772af07d8f382063329"}
278
- {"timestamp":"2026-09-11T15:31:48Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Productization\n\n- [ ] Factory-as-feature \u2014 pricing, tenant scoping, resource limits\n- [ ] Client onboarding \u2014 do clients get NSR-compliant repos by default?\n- [ ] sphere \u2014 role once the new build lands\n- [ ] Client lifecycle \u2014 signup, tenant provisioning, billing/payment, support","hash":"cb861145eaedf1bb50b1422991ebddbc9f2d2c1aba353e85cb5ced42da29c61a"}
279
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### UX / Product\n\n- [ ] Define each app's landing + named spaces (\u22647 top-level spaces)\n- [ ] Space naming \u2014 pick plain, user-facing names\n- [ ] Landing litmus test \u2014 confirm each surface lets a new user complete their #1 reason in ~3 clicks / 30s\n- [ ] Agent UX defaults \u2014 standard prompt/response guidance\n\n---","hash":"321e2036de8eb5520d093affcd5ae28f3e8be36fbd8ad498d18739bcff034e24"}
280
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"## 7. Key Files in `command` (for drilling in)\n\n| File | Purpose |\n|---|---|\n| `plans/masterplan/ecosystem.md` | Full ecosystem inventory |\n| `plans/masterplan/architecture.md` | Cross-cutting concerns + compliance layer |\n| `plans/masterplan/decisions.md` | ADRs + decision log |\n| `plans/masterplan/open-questions.md` | Unresolved questions |\n| `plans/masterplan/TODO.md` | Build sequence (phases) |\n| `plans/masterplan/marketing.md` | Full marketing system plan |\n| `plans/masterplan/northstar-rules.md` | NSR compliance layer |\n| `plans/masterplan/packets.md` | Target monorepo layout |\n| `plans/masterplan/ui-ux.md` | UX principles |\n| `plans/masterplan/migration-map.md` | How existing repos become compliant |\n| `plans/masterplan/project-skills.md` | Project-specific skills policy |\n| `plans/masterplan/AGENTS.md` | Ecosystem agent rules |\n| `plans/masterplan/README.md` | File map |\n\n---","hash":"771e23d6f89b30b07cc8c8399b5fffe3ed09b3b8c4cfd2960a97cdddaed46cad"}
281
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"## 8. Server Inventory (zerwizserver)\n\n> **IP:** `100.88.238.83` \u00b7 **User:** `zerwizserver` \u00b7 **OS:** Ubuntu 24.04.4 LTS\n> **Last scanned:** 2025-09-09","hash":"26696d9b4763fa085f8d2705229e99340e0205a77642852ae28dd331482400bb"}
282
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Cloudflare Tunnels (active hostnames)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `teams.zerwiz.org` | 4321 | WayOfTeams main app |\n| `teamsapp.zerwiz.org` | 4000 | WayOfTeams teamsapp |\n| `investwayofteams.zerwiz.org` | 5179 | Investor data room |\n| `ws1.zerwiz.org` \u2013 `ws10.zerwiz.org` | 3101\u20133110 | WebSocket workers |\n| `prdteams.zerwiz.org` | 3910 | Prod teams app (bun) |\n| `collab.zerwiz.org` | 4003 | WayOfCollab |\n| `anchor.zerwiz.org` | 42777 | Anchor app |\n| `cloudsync.zerwiz.org` | 4214 | CloudSync hub |\n| `zerwiz.org` / `www.zerwiz.org` | 4322 | WhyNot Homepage |\n| `supabase.zerwiz.org` | 8000 | Supabase stack |\n| `aigeeksnfreaks.zerwiz.org` | 3800 | AG&F blog/marketing |\n| `dojo.zerwiz.org` | 8038 | Dojo |\n| `linuxcommand.zerwiz.org` | 4601 | Factory visualizer |\n| `masterplan.zerwiz.org` | 3900 | Masterplan homepage |\n| `obsidian-sync.zerwiz.org` | 5984 | Obsidian LiveSync |\n| `obsidian.zerwiz.org` | 15323 | Obsidian |\n| `opticat.zerwiz.org` | 8083 | OptiCat web server |\n| `forgejo.zerwiz.org` | 3030 | Forgejo git server |\n| `casaos.zerwiz.org` | 80 | CasaOS gateway |","hash":"bd0a1ddb256154417f98f6dcfceba1b68d3b9dbd33a3026b1fd757b42886c898"}
283
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Running Services\n\n| Service | Port | Notes |\n|---|---|---|\n| WayOfTeams (beam.smp) | 4321, 4000 | ~3 days uptime |\n| Anchor (beam.smp) | 42777 | ~9 days uptime |\n| WayOfCollab (beam.smp) | 4003 | \u2014 |\n| WhyNot Homepage (node) | 4322 | \u2014 |\n| Postiz (Docker) | 4007 | Social scheduler |\n| Mautic (Docker) | 8001 | Email marketing |\n| Activepieces (Docker) | 8080 | Workflow automation |\n| Temporal (Docker) | 7233 | Durable workflows |\n| Grafana (Docker) | 3003 | Dashboards |\n| Forgejo (Docker) | 3030 | Git server |\n| CloudSync (Docker) | 4214 | Sync hub (healthy) |\n| Homepage (Docker) | 3000 | Service dashboard |\n| PostgreSQL | 5432 | Multiple instances |\n| Redis | 6379 | Multiple instances |\n| Samba | 139, 445 | File sharing |\n| SSH | 22 | Tailscale + standard |","hash":"f319e935cb1d3e77d9920013a61316512a58b126f8c232e1c03f7dbbfb41f713"}
284
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Docker Containers (20+)\n\n- `forgejo`, `docker-cloudsync-1`, `homepage`, `postiz`, `postiz-postgres`, `postiz-redis`\n- `mautic-web`, `mautic-db`, `mautic-cron`, `mautic-worker`\n- `activepieces`, `activepieces-postgres`, `activepieces-redis`\n- `temporal`, `temporal-postgresql`, `temporal-elasticsearch`, `temporal-ui`, `temporal-admin-tools`\n- `grafana`, `crafty-container`, `immich-redis`, `docker-postgres-1`","hash":"4fe1c88ecfe0b016a7abaa11e7c844828f8603a50985dde44ce2181f39268457"}
285
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/ecosystem-planning.md","tags":["data"],"content":"### Projects on Server (`/home/zerwizserver/`)\n\n`wayofteams`, `prdteams`, `cloudsync`, `aigeeksandfreaks`, `anchor`, `wayofcollab`, `investwayofteams`, `masterplanhomepage`, `whynothomepage`, `opticat`, `sensualdojocouple`, `obsidian-livesync`, `forgejo`, `forgejo-backups`, `searxng`, `backups`, `flutter`\n\n---\n\n*This file is the firstmate planning summary. For full details, read the source files in `/home/zerwiz/command/plans/masterplan/`.*","hash":"a3469c4ca2269e84e1f2ae2678c6e10e7854ba5474c8bccd22dd7c143ca8aa89"}
286
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"## Task\n\nCreate a comprehensive operational knowledge base for the zerwizserver (100.88.238.83) \u2014 all services, tunnels, programs, and how to manage them.","hash":"2501f5416d083c3bf3871867872d53321cadab1790065de64b94fd970baa468e"}
287
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"## Model Host\n\n- **Ollama** running on zerwizserver at `http://127.0.0.1:11434`\n- **Model:** `qwen3.5:2b` (2.3B params, 262K context max \u2014 use 20K context for efficiency)\n- **LM Studio** also available at `http://127.0.0.1:1234` (OpenAI-compatible API)","hash":"405a969678a7f3d807bcf9b39e493c7b6a2a3c91f207b8c174d7862a2ad42913"}
288
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"## Scope\n\n- **Server:** zerwizserver (Tailscale IP 100.88.238.83, user `zerwizserver`, SSH key `~/.ssh/id_ed25519`)\n- **Goal:** Document everything running on the server so any crewmate can manage services without asking the captain","hash":"1029cc8c8862a793d3a6264f030b45f7580988aa2658dbd386a2cfa8abae4507"}
289
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 1. Cloudflare Tunnels\n\n- List all cloudflared tunnel processes\n- Read each config file in `/home/zerwizserver/.cloudflared/`\n- Document what each tunnel exposes (URLs, ports, services)\n- How to start/stop/restart each tunnel","hash":"c656a9d1215688140523b5e809cccc3540cf8aa7ed063df2afeda3bff7d0a7a5"}
290
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 2. Running Services & Processes\n\n- Run `ps aux` to identify all non-system processes\n- Map each process to its service (Anchor, WayOfTeams, CloudSync, WayOfCollab, Dojo, SearXNG, Forgejo, etc.)\n- Document ports, protocols, and dependencies","hash":"adc3e6268ae0ac861ab392c4dc9ae38147b577ec7f6ef849f9e6cbbe6d43b935"}
291
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 3. Devbox Projects\n\n- List all devbox project directories under `/home/zerwizserver/`\n- For each project: what it is, how to start it, how to stop it\n- Check for devbox config files (`.devbox.json`, `.cmd.sh`, etc.)","hash":"12a90d9f98167b7b6fd8ef4452d10b7d422320ab3e7004a5ee5d2ec624eac353"}
292
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 4. Docker Containers\n\n- Check Docker container status\n- Document what's running in containers (CloudSync, Temporal, etc.)","hash":"4bf4d5c70c2b76aa6fc62f3649400da67186c2683df0cfdf4a74f369f8561f45"}
293
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 5. Web Applications\n\n- investwayofteams (Vite preview on port 5179)\n- wayofteams (Astro preview on port 4321)\n- chat-server (port 9877)\n- aigeeksandfreaks (Bun on port 3800)\n- How to start/stop each","hash":"57a33b7f4118f0c4a790a7bd060b585037d1d65811950646a6a58b72ec7aba8b"}
294
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 6. Databases\n\n- PostgreSQL instances (anchor, wayofteams, cloudsync, wayofcollab, temporal)\n- How to connect, start/stop","hash":"72f1acbea799cbb7a768aaad49513a236ac8d591ffe4881ba6bea97b5725d91e"}
295
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"### 7. Utility Services\n\n- CasaOS, LM Studio, CUPS, SSH, dnsmasq, etc.","hash":"687d67fa540a09f6ec360941140d361125147c3ff10f952489584effb8252744"}
296
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"## Output\n\nWrite to: `data/server-knowledge.md`","hash":"182f64c0e5f23f8f5073893f1b40231a5844499e9000e12d6ecfeef94d41d03b"}
297
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"## Format\n\n- Markdown with clear sections\n- Tables for services (name, port, process, start command, stop command)\n- Code blocks for commands\n- Status indicators (currently running / not running / unknown)","hash":"a82d041f316b4a7ea608a80ad2b3c064b874313f4f51c2b11ac0f25a4a606756"}
298
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge/brief.md","tags":["data"],"content":"## Constraints\n\n- **Read-only investigation** \u2014 do NOT modify the server\n- Use SSH commands to gather information\n- Be thorough \u2014 document everything you find\n- Include exact commands for starting, stopping, and restarting each service\n- Note any services that are NOT managed by devbox or systemd\n- Check if any services have systemd unit files\n- Document the relationship between services (dependencies)\n- Note which services are behind Cloudflare tunnels vs direct access\n- Include the server access details (SSH, Tailscale IP, user)\n- Check for any startup scripts or cron jobs\n- Check for any environment variables or config files that affect services\n- Check disk usage and any storage concerns\n- Check for any backup mechanisms","hash":"36da1a7232e04178a866c993244bf91087cf6c80d4c7acf220a9a2dc647ab3f6"}
299
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Server Knowledge Base \u2014 zerwizserver (100.88.238.83)\n\n**Last Updated:** 2026-09-09\n**Server:** zerwizserver (Tailscale IP: 100.88.238.83, user: `zerwizserver`)\n**SSH Key:** `~/.ssh/id_ed25519`\n**OS:** Ubuntu-based (systemd, devbox, Docker)\n\n---","hash":"8b96bd5e1377e58dae180da62f7e372409406187824d2764e8609bc868bd94dc"}
300
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 1. Cloudflare Tunnels\n\nAll tunnels run via `cloudflared` as systemd services or background processes. Configs in `/home/zerwizserver/.cloudflared/`.\n\n| Tunnel Config | Hostname(s) | Local Service | Port | Tunnel ID | Status |\n|---------------|-------------|---------------|------|-----------|--------|\n| `config.yml` (default) | `aigeeksnfreaks.zerwiz.org` | aigeeksandfreaks | 3800 | e3a203ac... | Active |\n| `config-anchor.yml` | `anchor.zerwiz.org` | Anchor MCP | 42777 | 4a1c9ad2... | Active |\n| `config-casaos.yml` | `casaos.zerwiz.org` | CasaOS | 80 | 97afb921... | Active |\n| `config-cloudsync.yml` | `cloudsync.zerwiz.org` | CloudSync Hub | 4214 | 5b1ab09b... | Active |\n| `config-forgejo.yml` | `forgejo.zerwiz.org` | Forgejo | 3030 | 9525857c... | Active |\n| `config-masterplan.yml` | `masterplan.zerwiz.org` | Masterplan | 3900 | 31df7acd... | Active |\n| `config-obsidian-livesync.yml` | `obsidian-sync.zerwiz.org` | Obsidian LiveSync (CouchDB) | 5984 | 636a31d9... | Active |\n| `config-obsidian.yml` | `obsidian.zerwiz.org` | Obsidian | 15323 | c5d8408e... | Active |\n| `config-opticat.yml` | `opticat.zerwiz.org` | Opticat | 8083 | 4ba48d45... | Active |\n| `config-prdteams.yml` | `prdteams.zerwiz.org` | PRD Teams | 3910 | 3d7c8887... | Active |\n| `config-wayofcollab.yml` | `collab.zerwiz.org` | WayOfCollab | 4003 | 8818d377... | Active |\n| `config-wayofteams.yml` | `teams.zerwiz.org` | WayOfTeams Phoenix | 4321 | 9485e944... | Active |\n| | `teamsapp.zerwiz.org` | WayOfTeams Astro | 4000 | | |\n| | `investwayofteams.zerwiz.org` | Invest WayOfTeams | 5179 | | |\n| | `ws1-10.zerwiz.org` | Workspaces 1-10 | 3101-3110 | | |\n| `config-whynot.yml` | `zerwiz.org`, `www.zerwiz.org` | WhyNot Homepage | 4322 | 9bd8bec7... | Active |\n| | `supabase.zerwiz.org` | Supabase | 8000 | | |","hash":"cb21c16921ead3c34a4c8efd0a61c1dab3dc8bc08d1f72fc9f0e63596afae1d7"}
301
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Tunnel Management\n\n```bash","hash":"4c2e00719b7e818cecc4bae1178f4e1fd9f72e53ea27101c77bffe61c07d25b7"}
302
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Start a specific tunnel\n\ncloudflared tunnel --no-autoupdate --config /home/zerwizserver/.cloudflared/config-<name>.yml run","hash":"b34a05da5ca160afd2ae0cd5ee8cd9b51bcb856afcc19b2a76446217d84fd1e5"}
303
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Check tunnel status\n\npgrep -f \"cloudflared.*config-<name>.yml\"","hash":"ac031caa973230235ccde4dd1de5ceeff55cbb304565eeecb55273ff36c36ed0"}
304
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# View logs\n\ntail -f /home/zerwizserver/tunnel-<name>.log","hash":"f01ed1050bca750621a51cae3501446b03408438aaf903c244c091f90df1546b"}
305
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Systemd services (auto-start on boot)\n\nsystemctl status cloudflared-aigeeksandfreaks.service\nsystemctl status cloudsync-tunnel.service\n```\n\n---","hash":"29f2106265fed290f71f914bc7bc378f202ba765010662db8557b15130ee2d95"}
306
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Core Infrastructure\n\n| Service | Process / Container | Port(s) | PID / Container | Start Command |\n|---------|---------------------|---------|-----------------|---------------|\n| **Ollama** | `/usr/local/bin/ollama serve` | 11434 | PID 3176 | `systemctl start ollama` |\n| **LM Studio** | (user-managed) | 1234 | N/A | Manual / Desktop app |\n| **PostgreSQL (system)** | `postgres` (multiple clusters) | 5432, 5444, 5433... | PIDs 4569, 4591, 4620, 5704... | `systemctl start postgresql@16-main` |\n| **Redis** | `redis-server *:6379` | 6379 | PIDs 4589, 4636, 4839 | `systemctl start redis-server` |\n| **MariaDB** | `mariadbd` | 3306 | PID 4754 | `systemctl start mariadb` |\n| **Docker** | `dockerd` | N/A | N/A | `systemctl start docker` |\n| **CasaOS** | Multiple systemd services | 80 | N/A | `systemctl start casaos` |\n| **NGINX** | `nginx: worker process` | 80/443 | PIDs 8258-8265 | `systemctl start nginx` |\n| **Apache** | `apache2 -DFOREGROUND` | 80 | PIDs 8607-8611 | `systemctl start apache2` |\n| **Grafana** | `grafana server` | 3003 | Container `grafana` | `docker start grafana` |\n| **Elasticsearch** | `org.elasticsearch.bootstrap.Elasticsearch` | 9200/9300 | PID 8169 (container) | `docker start temporal-elasticsearch` |\n| **Temporal** | `temporal-server` + UI + admin | 7233, 8082 | Container `temporal`, `temporal-ui` | `docker compose up -d` |","hash":"056fc0ee36919e984f0e9ec0ab0020570262203bb08d201e6974f82bcd75f6ab"}
307
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Devbox Projects (Elixir/Phoenix)\n\n| Project | Path | Port | DB | Start Script | Status |\n|---------|------|------|----|--------------|--------|\n| **Anchor** | `/home/zerwizserver/anchor` | 42777 | anchor_prod (PG 5432) | `scripts/startzerwiz.sh` | Config ready |\n| **CloudSync** | `/home/zerwizserver/cloudsync` | 4214 | cloudsync (Docker PG) | `scripts/startprod.sh` | Running (container) |\n| **WayOfCollab** | `/home/zerwizserver/wayofcollab` | 4003 | wayofcollab_prod (PG 5444) | `scripts/startprod.sh` | Config ready |\n| **WayOfTeams** | `/home/zerwizserver/wayofteams` | 4000/4321 | wayofteams_prod (PG 5432) | `scripts/cloudflare/startprod.sh` | Config ready |","hash":"95e4a2cc109146c00f23b3f69c13c978a433b3e467b58437d9c079e3307caf93"}
308
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Web Applications (Node/Next.js)\n\n| App | Path | Port | Framework | Start Command | Tunnel |\n|-----|------|------|-----------|---------------|--------|\n| **Invest WayOfTeams** | `/home/zerwizserver/investwayofteams` | 5179 | Vite | `npm run preview` | `investwayofteams.zerwiz.org` |\n| **WayOfTeams (Astro)** | `/home/zerwizserver/wayofteams/astro` | 4321 | Astro | `npm run preview` | `teams.zerwiz.org` |\n| **Chat Server** | `/home/zerwizserver/wayofteams/chat-server` | 9877 | Node (ESM) | `node chat-server.mjs` | Internal |\n| **AI Geeks & Freaks** | `/home/zerwizserver/aigeeksandfreaks` | 3800 | Next.js (Bun) | `bun .next/standalone/server.js` | `aigeeksnfreaks.zerwiz.org` |\n| **PRD Teams** | `/home/zerwizserver/prdteams` | 3910 | Next.js | `npm run start` | `prdteams.zerwiz.org` |\n| **Opticat** | `/home/zerwizserver/opticat` | 8083 | Next.js/Electron | `npm run start` | `opticat.zerwiz.org` |\n| **WhyNot Homepage** | `/home/zerwizserver/whynothomepage` | 4322 | Next.js | `npm run start` | `zerwiz.org` |\n| **Masterplan Homepage** | `/home/zerwizserver/masterplanhomepage` | 3900 | Next.js | `npm run start` | `masterplan.zerwiz.org` |","hash":"baea252fcfe3344c00bdce1ebc9989225c363c71697256b5649abab43bce4eff"}
309
- {"timestamp":"2026-09-11T15:31:49Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Docker Containers (Running)\n\n| Container | Image | Ports | Purpose |\n|-----------|-------|-------|---------|\n| `docker-cloudsync-1` | `cloudsync:latest` | 4214 | CloudSync Hub |\n| `homepage` | `ghcr.io/gethomepage/homepage` | 3000 | Dashboard |\n| `activepieces` | `ghcr.io/activepieces/activepieces` | 8080 | Automation |\n| `temporal` | `temporalio/auto-setup` | 7233 | Temporal Server |\n| `temporal-ui` | `temporalio/ui` | 8082 | Temporal UI |\n| `temporal-admin-tools` | `temporalio/admin-tools` | \u2014 | Temporal CLI |\n| `temporal-elasticsearch` | `elasticsearch:7.17.27` | 9200/9300 | Temporal ES |\n| `temporal-postgresql` | `postgres:16` | 5432 | Temporal DB |\n| `postiz` | `gitroomhq/postiz-app` | 4007 | Social Scheduler |\n| `postiz-postgres` | `postgres:17-alpine` | 5432 | Postiz DB |\n| `postiz-redis` | `redis:7.2` | 6379 | Postiz Redis |\n| `mautic-web` | `mautic/mautic` | 8001 | Marketing |\n| `mautic-cron` | `mautic/mautic` | \u2014 | Mautic Cron |\n| `mautic-worker` | `mautic/mautic` | \u2014 | Mautic Worker |\n| `mautic-db` | `mariadb:10.11` | 3306 | Mautic DB |\n| `forgejo` | `codeberg.org/forgejo/forgejo` | 3030 | Git Forge |\n| `grafana` | `grafana/grafana` | 3003 | Metrics |\n| `crafty-container` | `crafty-controller` | 8112, 8443, 25500-25600 | Minecraft Manager |\n| `immich-redis` | `redis:6.2.20-alpine` | 6379 | Immich Redis |","hash":"20d978472abf7275ed0dedacdb0f46c06c875b8d79291bae784dcaa560e54484"}
310
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Database Instances\n\n| Database | Host | Port | User | Database(s) | Access |\n|----------|------|------|------|-------------|--------|\n| PostgreSQL (system) | localhost | 5432 | wayofteams, anchor, forgejo, postiz | wayofteams_prod, anchor_prod, forgejo, postiz-db-local | Local + Tunnel |\n| PostgreSQL (WayOfCollab) | localhost | 5444 | wayofcollab | wayofcollab_prod | Local |\n| PostgreSQL (Docker) | localhost | 5432 (various) | various | temporal, postiz, mautic | Container |\n| MariaDB | localhost | 3306 | mautic | mautic | Local |\n| Redis | localhost | 6379 | \u2014 | \u2014 | Local |\n| Elasticsearch | localhost | 9200 | \u2014 | temporal | Container |\n| CouchDB | localhost | 5984 | \u2014 | obsidian-sync | Tunnel |\n\n---","hash":"f3455a4fe5bcdc7cb759049289f7dbb7a86e8cfb30d7794eb7c79af54cbd6906"}
311
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Anchor\n\n- **Path:** `/home/zerwizserver/anchor`\n- **Port:** 42777 (MCP), 5432 (PG)\n- **Database:** `anchor_prod` (user: `anchor`)\n- **Start:** `./scripts/startzerwiz.sh` / `./scripts/startzerwiz.sh --no-tunnel`\n- **Tunnel:** `anchor.zerwiz.org` \u2192 localhost:42777\n- **Env:** `.env.production` (DB_PASS, ANCHOR_API_KEYS, EMBED_MODEL, SUMMARIZE_MODEL)","hash":"5cd3b90d1200b1bc10e70ff52cd9b03968c700fdc4d5f9b08aa2ba3419cc0c67"}
312
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### CloudSync\n\n- **Path:** `/home/zerwizserver/cloudsync`\n- **Port:** 4214\n- **Database:** PostgreSQL in Docker (`postgres:5432`)\n- **Start:** `./scripts/startprod.sh` (uses Docker Compose)\n- **Tunnel:** `cloudsync.zerwiz.org` \u2192 localhost:4214\n- **Env:** `.env.production` \u2192 `docker/app.env`\n- **Systemd:** `cloudsync-tunnel.service`","hash":"3c823b1b9ac590a5f62998581f4b3b3334ca772bebbaf411f39bd446cf78f018"}
313
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### WayOfCollab\n\n- **Path:** `/home/zerwizserver/wayofcollab`\n- **Port:** 4003 (Phoenix), 5444 (PG)\n- **Database:** `wayofcollab_prod` (user: `wayofcollab`, PGDATA: `~/.pgdata-collab`)\n- **Start:** `./scripts/startprod.sh`\n- **Tunnel:** `collab.zerwiz.org` \u2192 localhost:4003\n- **Env:** `.env` (DATABASE_URL, SECRET_KEY_BASE)","hash":"d8952e266565aa57642e752ad9dd942bb5640f59d7e9e8664fbbadbc19fbe38f"}
314
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### WayOfTeams\n\n- **Path:** `/home/zerwizserver/wayofteams`\n- **Ports:** 4000 (API), 4321 (Phoenix), 9877 (Chat), 3002 (PostgREST), 4321 (Astro), 3101-3110 (Workspaces)\n- **Database:** `wayofteams_prod` (user: `wayofteams`, PG 5432)\n- **Start (dev):** `./scripts/cloudflare/start.sh`\n- **Start (prod):** `./scripts/cloudflare/startprod.sh`\n- **Tunnels:** `config-wayofteams.yml` (multi-hostname)\n- **Env:** `.env` (prod), `.env.example` (template)\n\n---","hash":"59c711f7c9061591cfc21da985e8fafa4f1e6735b574f800113a91b0ef1bbd99"}
315
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 4. Utility Services\n\n| Service | Description | Management |\n|---------|-------------|------------|\n| **CasaOS** | App platform/dashboard | `systemctl start/stop/status casaos*` |\n| **CUPS** | Printing | `systemctl start/stop cups cups-browsed` |\n| **dnsmasq** | Local DNS/DHCP | `systemctl start/stop dnsmasq` |\n| **SSH** | Remote access | `systemctl start/stop ssh` |\n| **Forgejo Backup** | Daily backup timer | `systemctl start/stop forgejo-backup.timer` |\n| **logrotate** | Log rotation | `systemctl start/stop logrotate.timer` |\n\n---","hash":"e0e79926890d58ccf71564718184e27f0f984af4a533ff93ae26a6ee29b75545"}
316
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### WayOfTeams (Primary)\n\n```bash","hash":"b34af6f98d35ad2b4a4b37d63c9d15aaac79ad786909d33d710cb48f3275514c"}
317
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Development\n\ncd /home/zerwizserver/wayofteams && ./scripts/cloudflare/start.sh","hash":"4b0da212039edfdc896a8339598718c633fa59dac121e08a8f04103a2e32acb5"}
318
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Production\n\ncd /home/zerwizserver/wayofteams && ./scripts/cloudflare/startprod.sh","hash":"400b91d336914731fe5cd1c47b1b1c257b00f7353f4c50aa3d914e09d946975e"}
319
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Stop all\n\n./scripts/cloudflare/stop-all.sh\n```","hash":"14348d6c7112c232f77126d8860256bb5c3e5eced43ddd9e1e161700287fc4d0"}
320
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### CloudSync\n\n```bash\ncd /home/zerwizserver/cloudsync && ./scripts/startprod.sh","hash":"bd4c682a6516f673f6fe8cf138b6622990da468beac313c5bbd3292e19e26874"}
321
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Uses Docker Compose: docker compose -f docker/docker-compose.yml up -d\n\n```","hash":"9e43f44c52f13f137b2297c6dc765589c5c465ccd5dbc9cb907c30f3ae70c303"}
322
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Anchor\n\n```bash\ncd /home/zerwizserver/anchor && ./scripts/startzerwiz.sh","hash":"27bd35252ce56b5b075b03e683a1b7c78b8394e17a2a6c769d34a6bf2fa55f72"}
323
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# With --no-tunnel flag to skip Cloudflare\n\n```","hash":"cd2ddb6d2b1387b568b4f820f84e410de8cae14bc9445d88df23e6f9109c8b1e"}
324
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### WayOfCollab\n\n```bash\ncd /home/zerwizserver/wayofcollab && ./scripts/startprod.sh","hash":"2e730969fad120678ab2679e57f91dab3927c5dd7618672060bd2d92b2143dc8"}
325
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Sets up own PG on 5444, runs migrations, starts Phoenix, restarts tunnel\n\n```","hash":"f84518c9741b7941798dfd32e8211cdec44292257d2607330ddd744a1def64c1"}
326
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Web Apps (Next.js/Vite)\n\n```bash","hash":"d1ae6e9943280411e34dad0f091450f09218cdb0e9bfa92c9c28582947c6152a"}
327
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# All use similar pattern\n\ncd /home/zerwizserver/<app> && npm run build && npm run start","hash":"6b1efc79cf49b76d56dccfd89a3a50fc37c2f1612ee7c395d311f71899628060"}
328
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Or for Bun-based: bun .next/standalone/server.js\n\n```\n\n---","hash":"65bb3c8a8eb1a7cd40b0b697eba6b026580dddc7a916e335e945da00e2e49f59"}
329
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 6. Service Dependencies\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 zerwizserver \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Systemd Services \u2502\n\u2502 \u251c\u2500\u2500 ollama.service \u2192 Ollama (port 11434) \u2502\n\u2502 \u251c\u2500\u2500 postgresql@16-main \u2192 System PG (port 5432) \u2502\n\u2502 \u251c\u2500\u2500 redis-server \u2192 Redis (port 6379) \u2502\n\u2502 \u251c\u2500\u2500 mariadb \u2192 MariaDB (port 3306) \u2502\n\u2502 \u251c\u2500\u2500 docker.service \u2192 Docker Engine \u2502\n\u2502 \u251c\u2500\u2500 casaos*.service \u2192 CasaOS (port 80) \u2502\n\u2502 \u251c\u2500\u2500 nginx \u2192 Reverse proxy (80/443) \u2502\n\u2502 \u251c\u2500\u2500 cloudflared-*.service \u2192 Cloudflare Tunnels \u2502\n\u2502 \u2514\u2500\u2500 cloudsync-tunnel.service \u2192 CloudSync Tunnel \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Docker Compose Stacks \u2502\n\u2502 \u251c\u2500\u2500 Temporal Stack (temporal, temporal-ui, \u2502\n\u2502 \u2502 temporal-postgresql, temporal-elasticsearch) \u2502\n\u2502 \u251c\u2500\u2500 CloudSync Stack (cloudsync + postgres) \u2502\n\u2502 \u251c\u2500\u2500 Postiz Stack (postiz + postgres + redis) \u2502\n\u2502 \u251c\u2500\u2500 Mautic Stack (mautic-web/worker/cron + mariadb) \u2502\n\u2502 \u251c\u2500\u2500 Forgejo (forgejo + postgres) \u2502\n\u2502 \u251c\u2500\u2500 Grafana \u2502\n\u2502 \u2514\u2500\u2500 Immich (postgres + redis) \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Devbox Projects (require devbox, Elixir, Node) \u2502\n\u2502 \u251c\u2500\u2500 Anchor (PG 5432) \u2192 config-anchor.yml tunnel \u2502\n\u2502 \u251c\u2500\u2500 CloudSync (Docker PG) \u2192 config-cloudsync.yml tunnel \u2502\n\u2502 \u251c\u2500\u2500 WayOfCollab (PG 5444) \u2192 config-wayofcollab.yml tunnel \u2502\n\u2502 \u2514\u2500\u2500 WayOfTeams (PG 5432) \u2192 config-wayofteams.yml tunnel \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Web Apps (Node/Bun) \u2502\n\u2502 \u251c\u2500\u2500 investwayofteams (5179) \u2192 wayofteams tunnel \u2502\n\u2502 \u251c\u2500\u2500 wayofteams/astro (4321) \u2192 wayofteams tunnel \u2502\n\u2502 \u251c\u2500\u2500 chat-server (9877) \u2192 internal \u2502\n\u2502 \u251c\u2500\u2500 aigeeksandfreaks (3800) \u2192 config.yml tunnel \u2502\n\u2502 \u251c\u2500\u2500 prdteams (3910) \u2192 config-prdteams.yml tunnel \u2502\n\u2502 \u251c\u2500\u2500 opticat (8083) \u2192 config-opticat.yml tunnel \u2502\n\u2502 \u251c\u2500\u2500 whynothomepage (4322) \u2192 config-whynot.yml tunnel \u2502\n\u2502 \u2514\u2500\u2500 masterplanhomepage (3900) \u2192 config-masterplan.yml \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---","hash":"ef301b7dbba1aa337eb7c8416135bc0ca26d115105e1bb8a557338e3bd5fd697"}
330
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 7. Backup Mechanisms\n\n| Backup | Schedule | Location | Retention | Command |\n|--------|----------|----------|-----------|---------|\n| **Forgejo** | Daily (systemd timer) | `/home/zerwizserver/forgejo-backups/` | 14 days | `/home/zerwizserver/forgejo-backup.sh` |\n| **WayOfTeams DB** | On deploy (startprod.sh) | `/home/zerwizserver/wayofteams/.deploy-backups/` | Manual | `pg_dump` in startprod.sh |\n| **Anchor DB** | On deploy (startprod.sh) | `/home/zerwizserver/wayofteams/.deploy-backups/` | Manual | `pg_dump` in startprod.sh |\n| **WayOfCollab DB** | On deploy (startprod.sh) | `/home/zerwizserver/wayofcollab/.deploy-backups/` | Manual | `pg_dump` in startprod.sh |\n| **CloudSync** | Manual | N/A | N/A | Docker volume backup |\n| **General** | Manual | `/home/zerwizserver/backups/` | Manual | User-initiated |\n\n---","hash":"880bda91f0c4559109aed4a8c2f6c78616766a92ef050ec720a16829d059769c"}
331
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 8. Disk Usage\n\n```\nFilesystem Size Used Avail Use% Mounted on\n/dev/sdb2 228G 184G 32G 86% /\n```\n\n**Note:** 86% usage \u2014 monitor and clean Docker images, old logs, backups periodically.\n\n---","hash":"d632b46a9f660e94eef6a6da97cc78e9c7b570d8bcf7e9bd6916d9c598283279"}
332
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 9. Key Configuration Files\n\n| File | Purpose |\n|------|---------|\n| `/home/zerwizserver/.cloudflared/config-*.yml` | Cloudflare tunnel configs |\n| `/home/zerwizserver/.cloudflared/*.json` | Tunnel credentials (keep secure) |\n| `/home/zerwizserver/<project>/.env*` | Environment variables per project |\n| `/home/zerwizserver/.pgpass` | PostgreSQL password file (chmod 600) |\n| `/home/zerwizserver/<project>/devbox.json` | Devbox package definitions |\n| `/home/zerwizserver/forgejo-backup.sh` | Forgejo backup script |\n| `/etc/systemd/system/forgejo-backup.service` | Forgejo backup systemd unit |\n| `/etc/systemd/system/forgejo-backup.timer` | Forgejo backup timer |\n| `/home/zerwizserver/wayofteams/scripts/cloudflare/*.sh` | WayOfTeams start/stop/deploy scripts |\n\n---","hash":"32e28d373102bd0d7ea8317d96224315e37a05ce1d7d39726d15212430b02367"}
333
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Check Service Health\n\n```bash","hash":"7a2b0f59f5248c0e4e15dcce32934c66d9a9ebde1000fdd7ad2fb642ded14f17"}
334
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# All Phoenix apps\n\ncurl http://localhost:4000/health # WayOfTeams API\ncurl http://localhost:4321/health # WayOfTeams Phoenix\ncurl http://localhost:4003/health # WayOfCollab\ncurl http://localhost:42777/health # Anchor\ncurl http://localhost:4214/health # CloudSync","hash":"a070f301448cf753cb062934ee7be8e5ab2dcaebd2e7224c7c7eb4a041adeb02"}
335
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Web apps\n\ncurl http://localhost:5179/ # Invest WayOfTeams\ncurl http://localhost:3800/ # AI Geeks & Freaks\ncurl http://localhost:8083/ # Opticat\ncurl http://localhost:4322/ # WhyNot Homepage\n```","hash":"5f5d51ae71feab086b5f8a912aac8f9c195993c056458740ac3716060ba4b3a1"}
336
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Restart a Service\n\n```bash","hash":"f594283565c5d1f67bbfe54637330d044aa4c2759000f6978e9d5c312096fe81"}
337
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Systemd services\n\nsystemctl restart ollama\nsystemctl restart postgresql@16-main\nsystemctl restart docker\nsystemctl restart cloudflared-aigeeksandfreaks","hash":"868270ebe91d030186b94c29b1f195f9cc3fbec9defdadb040b9db83161cd22f"}
338
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Docker containers\n\ndocker restart <container-name>","hash":"b82d5c26899509af83f08268556a0b0a51cac1e997562bf6416503110741bde3"}
339
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Devbox projects (from project root)\n\n./scripts/cloudflare/stop-all.sh && ./scripts/cloudflare/startprod.sh","hash":"7a1e147917fef51ea38ec621f5217a207db8315c1cb69297584ebae1e35693b9"}
340
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Web apps (Next.js)\n\npkill -f \"next-server\" && npm run start\n```","hash":"d54399ec47c48581de582d6ba8ab4c79ece26bc212d141caec1230bdf7b079f6"}
341
- {"timestamp":"2026-09-11T15:31:50Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### View Logs\n\n```bash","hash":"4c0e410f9cb67a0563929111619bbfb503c86c12dc37983ada1bd5c9dbf065fa"}
342
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Systemd\n\njournalctl -u ollama -f\njournalctl -u postgresql@16-main -f","hash":"4f363cc643b4caa257e18ada9aa4f190636b97b046c40ac802712e7e397374b0"}
343
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Devbox projects\n\ntail -f /home/zerwizserver/<project>/tunnel-*.log\ntail -f /tmp/wayofteams-*.log\ntail -f /tmp/anchor-*.log","hash":"3b6dc74a7742b4f20c0cf1d656bc64c39ad01496b1d55e93eb677dbe8c35467b"}
344
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Docker\n\ndocker logs -f <container-name>","hash":"2a8a3bc777a025225eaefedc503c2fa9a9168064d2a3e930e3fb55b82ec4db3c"}
345
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Cloudflare tunnels\n\ntail -f /home/zerwizserver/tunnel-*.log\n```","hash":"f1968b027b595e807ff890376cc787ea3d0905dff7f1e35e131f68c9ee983af7"}
346
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"### Database Access\n\n```bash","hash":"cfb175d237a1bf7258a1daef4eac50ee575b64247400848ff305e6fb5ed91d2e"}
347
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# System PostgreSQL\n\npsql -h localhost -p 5432 -U wayofteams -d wayofteams_prod\npsql -h localhost -p 5432 -U anchor -d anchor_prod\npsql -h localhost -p 5432 -U forgejo -d forgejo","hash":"c6b38e62dc5e7eab627ed47073ec95cd1681df7633eb8bb2898ec507be6148e5"}
348
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# WayOfCollab PostgreSQL (port 5444)\n\npsql -h localhost -p 5444 -U wayofcollab -d wayofcollab_prod","hash":"92264af35334ef20e3237e138030595e461ecf864439f2e57c4e9b4d7ba79e6e"}
349
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"# Docker PostgreSQL\n\ndocker exec -it temporal-postgresql psql -U temporal -d temporal\ndocker exec -it postiz-postgres psql -U postiz -d postiz\n```\n\n---","hash":"dbf0be02c7423426757d055b1b30659fef51113468c506a185277dd1ee444043"}
350
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 11. Environment Variables (Key)\n\n| Variable | Used By | Typical Location |\n|----------|---------|------------------|\n| `DATABASE_URL` | All Elixir apps | `.env`, `.env.production` |\n| `SECRET_KEY_BASE` | Phoenix apps | `.env` (prod) |\n| `PHX_HOST` | WayOfTeams prod | `.env` |\n| `ANCHOR_API_KEYS` | Anchor | `.env.production` |\n| `LLM_MODEL` | LLM selection | `qwen3.5:2b` (Ollama) |\n| `OLLAMA_MODEL` | Anchor LLM | `qwen3.6-35b-a3b@iq3_s` |\n| `CHAT_PROVIDER` | WayOfTeams chat | `ollama` / `lmstudio` |\n| `POSTGREST_JWT_SECRET` | PostgREST | `.env` |\n| `BACKUP_CIPHER_PASSWORD` | Encrypted backups | `.env` (optional) |\n\n---","hash":"05ede3c0c6d4cfd89331693fb4a335a9a273a63d5e9424688d3cb19195fa8f03"}
351
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 12. Security Notes\n\n- **Tunnel credentials** in `/home/zerwizserver/.cloudflared/*.json` \u2014 keep private\n- **Database passwords** in `.env*` files and `.pgpass` (chmod 600)\n- **Forgejo DB password** in `/home/zerwizserver/.config/forgejo/db-password`\n- **SSH access** via Tailscale + ed25519 key only\n- **Cloudflare tunnels** expose only specified hostnames; all else returns 404\n- **Production deploys** verify DB roles exist; never auto-create (WOTEAMS-268)\n- **Backup encryption** available via `BACKUP_CIPHER_PASSWORD` (AES)\n\n---","hash":"e0d4756ae661eeebdca515c70c9d9bf3de32b0b8a249baff0836c942c24a9a5c"}
352
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 13. Troubleshooting\n\n| Symptom | Likely Cause | Fix |\n|---------|--------------|-----|\n| Tunnel not connecting | cloudflared process dead | `systemctl restart cloudflared-<name>` or manual start |\n| Phoenix won't start | Port in use / stale beam | `./scripts/cloudflare/stop-all.sh` then restart |\n| PG connection failed | PG not running / wrong port | `systemctl status postgresql@16-main` check port |\n| Docker container unhealthy | Health check failing | `docker logs <container>` check dependencies |\n| High disk usage | Old Docker images/logs | `docker system prune -a`, clean logs |\n| LLM not available | Ollama/LM Studio not running | `systemctl start ollama` or start LM Studio |\n\n---","hash":"44a14f7f16f51bcca0c2cd9b7d8443482455d66ac9e8caa0c4858eb19432797b"}
353
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/server-knowledge.md","tags":["data"],"content":"## 14. Adding a New Service\n\n1. **Create project directory** under `/home/zerwizserver/<name>/`\n2. **Add devbox.json** if Elixir/Node project\n3. **Create Cloudflare tunnel config** in `/home/zerwizserver/.cloudflared/config-<name>.yml`\n4. **Run `cloudflared tunnel login`** and create tunnel, get credentials\n5. **Add systemd service** for auto-start (optional)\n6. **Document start/stop commands** in project's scripts/\n7. **Update this knowledge base**\n\n---","hash":"b5ade06abe3cb88edf67041c321fc28f4b4ecbc1520b2c88174d138255e0cf02"}
354
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"# zerwizserver \u2014 Live Server Inventory\n\n**Server:** `zerwizserver` \u2014 Tailscale IP `100.88.238.83`\n**OS:** Ubuntu 24.04.4 LTS (Noble Numbat)\n**SSH:** `ssh zerwizserver@100.88.238.83` (user: `zerwizserver`, key: `~/.ssh/id_ed25519`)\n**Last scanned:** 2025-09-09\n\n---","hash":"e6bceb820c78eb92f6d2b990a43203464b0b76e50ebe800f786dff4eebb297fe"}
355
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### wayofteams tunnel (`9485e944`)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `teams.zerwiz.org` | 4321 | WayOfTeams main app (Node/Elixir) |\n| `teamsapp.zerwiz.org` | 4000 | WayOfTeams teamsapp (beam.smp) |\n| `investwayofteams.zerwiz.org` | 5179 | Investor data room (Node) |\n| `ws1.zerwiz.org` \u2013 `ws10.zerwiz.org` | 3101\u20133110 | WebSocket workers |","hash":"7d72b2d173c5bbf8c522fd6b47f1bc4fd4dde81115028173a844daca1a21bcf1"}
356
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### prdteams tunnel (`3d7c8887`)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `prdteams.zerwiz.org` | 3910 | Bun-based prod teams app |","hash":"76db1483bd191a4e89444feb34d71d2db42263b378dd20c4d8e5c32654e4b90d"}
357
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### wayofcollab tunnel (`8818d377`)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `collab.zerwiz.org` | 4003 | WayOfCollab (beam.smp) |","hash":"5de3583c79aa562be0feb23065a7f1d989a50616d1cd222d8b9496e12abd8303"}
358
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### anchor tunnel (`4a1c9ad2`)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `anchor.zerwiz.org` | 42777 | Anchor app (beam.smp) |","hash":"230684eeafc445a6e1fa945bfd57a6f32eddcf105970a1958615529a4f4c491e"}
359
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### cloudsync tunnel (`5b1ab09b`)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `cloudsync.zerwiz.org` | 4214 | CloudSync hub (Docker, healthy) |","hash":"ecc530557e9aef6749c8c7e2351ba966234d9962547235270974472f651d463a"}
360
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### whynot tunnel (`9bd8bec7`)\n\n| Hostname | Port | Service |\n|---|---|---|\n| `zerwiz.org` / `www.zerwiz.org` | 4322 | WhyNot Homepage (Node) |\n| `supabase.zerwiz.org` | 8000 | Supabase stack (Crafty controller) |","hash":"0de2de4b69ec6575ac792c93766a302f7e4c7c238493d135d51143389f80a3be"}
361
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### Other tunnels\n\n| Tunnel | Hostname | Port | Service |\n|---|---|---|---|\n| `aigeeksandfreaks` | `aigeeksandfreaks.zerwiz.org` | 3800 | Next.js blog/marketing (bun) |\n| `dojo` | `dojo.zerwiz.org` | 8038 | Dojo (beam.smp) |\n| `dojo-dev` | \u2014 | \u2014 | Dojo dev (no routes) |\n| `dojo-dual-chat` | \u2014 | \u2014 | Dojo dual chat (no routes) |\n| `dojo-fallback` | \u2014 | \u2014 | Dojo fallback (no routes) |\n| `dojo-prod` | \u2014 | \u2014 | Dojo prod (no routes) |\n| `linuxcommand` | `linuxcommand.zerwiz.org` | 4601 | Factory visualizer (bun) |\n| `masterplanhomepage` | `masterplan.zerwiz.org` | 3900 | Masterplan homepage (bun) |\n| `obsidian-livesync` | `obsidian-sync.zerwiz.org` | 5984 | Obsidian LiveSync (bun) |\n| `obsidian` | `obsidian.zerwiz.org` | 15323 | Obsidian (bun) |\n| `opticat` | `opticat.zerwiz.org` | 8083 | OptiCat web server (Python) |\n| `todo` | `todo.zerwiz.org` | \u2014 | Todo (no active routes) |\n| `casaos` | `casaos.zerwiz.org` | 80 | CasaOS gateway |\n| `zerwiz-win` | `zerwiz-win.zerwiz.org` | \u2014 | Windows mirror tunnel (no routes) |\n| `forgejo` | `forgejo.zerwiz.org` | 3030 | Forgejo git server (Docker) |\n\n---","hash":"d07e6b7ae4d6b6070cfdcf4b027a0ce4cd5ddde390704501e95318bd68d56648"}
362
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### Elixir/Beam Applications\n\n| Process | App | Port | Uptime |\n|---|---|---|---|\n| `beam.smp` (pid 467486) | WayOfTeams (phx.server) | 4321, 4000 | ~3 days |\n| `beam.smp` (pid 470171) | WayOfTeams (secondary) | \u2014 | ~3 days |\n| `beam.smp` (pid 126487) | Anchor | 42777 | ~9 days |\n| `beam.smp` (pid 468885) | WayOfTeams (node proxy) | 4321 | \u2014 |\n| `beam.smp` (pid 467486) | WayOfCollab | 4003 | \u2014 |","hash":"66084abec7f65a3ff4c50b67c2356b17771b493aede24356c74022df5e18ec25"}
363
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### Node.js Applications\n\n| Process | App | Port |\n|---|---|---|\n| `server.mjs` (pid 1799) | WhyNot Homepage | 4322 |\n| `Postiz API` (pm2) | Postiz social scheduler | 4007 (Docker) |\n| `Postiz Worker` (pm2) | Postiz worker | \u2014 |\n| `Mautic web` (pm2) | Mautic email marketing | 8001 (Docker) |\n| `Activepieces` (Docker) | Workflow automation | 8080 (Docker) |\n| `Temporal` (Docker) | Durable workflows | 7233 (Docker) |\n| `aigeeksandfreaks` (pm2) | Next.js marketing blog | 3800 |\n| `prdteams` (bun) | Prod teams app | 3910 |\n| `linuxcommand` (bun) | Factory visualizer | 4601 |\n| `masterplanhomepage` (bun) | Masterplan homepage | 3900 |\n| `obsidian-livesync` (bun) | Obsidian sync | 5984 |\n| `opticat` (Python) | OptiCat web server | 8083 |","hash":"1ff1b90248b81eee04b3c717be40a9ea0f11e723356e1c4a08208b130af98e39"}
364
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### Docker Containers\n\n| Container | Image | Port Mapping | Status |\n|---|---|---|---|\n| `forgejo` | codeberg.org/forgejo/forgejo:16.0.2 | 3030 | Up 2 days |\n| `docker-cloudsync-1` | cloudsync:latest | 127.0.0.1:4214 | Up 6 days (healthy) |\n| `homepage` | gethomepage/homepage:latest | 127.0.0.1:3000 | Up 9 days (healthy) |\n| `postiz` | gitroomhq/postiz-app:latest | 127.0.0.1:4007 | Up 9 days (healthy) |\n| `postiz-postgres` | postgres:17-alpine | 5432 | Up 9 days (healthy) |\n| `postiz-redis` | redis:7.2 | 6379 | Up 9 days (healthy) |\n| `mautic-web` | mautic/mautic:7.0.1-apache | 127.0.0.1:8001 | Up 9 days |\n| `mautic-db` | mariadb:10.11 | 3306 | Up 9 days (healthy) |\n| `mautic-cron` | mautic/mautic:7.0.1-apache | 80 | Up 9 days |\n| `mautic-worker` | mautic/mautic:7.0.1-apache | 80 | Up 9 days |\n| `activepieces` | ghcr.io/activepieces/activepieces:latest | 8080 | Up 9 days |\n| `activepieces-postgres` | postgres:16-alpine | 5432 | Up 9 days (healthy) |\n| `activepieces-redis` | redis:7-alpine | 6379 | Up 9 days |\n| `temporal` | temporalio/auto-setup:1.28.1 | 7233 | Up 9 days (healthy) |\n| `temporal-postgresql` | postgres:16 | 5432 | Up 9 days (healthy) |\n| `temporal-elasticsearch` | elasticsearch:7.17.27 | 9200, 9300 | Up 9 days (healthy) |\n| `temporal-ui` | temporalio/ui:2.34.0 | 127.0.0.1:8082 | Up 9 days (healthy) |\n| `temporal-admin-tools` | temporalio/admin-tools | \u2014 | Up 9 days |\n| `grafana` | grafana/grafana:13.0.1 | 0.0.0.0:3003 | Up 9 days |\n| `crafty-container` | crafty-controller/crafty-4:4.10.4 | 8111, 8112, 19132, 25500-25600 | Up 9 days |\n| `immich-redis` | redis:6.2.20-alpine | 6379 | Up 9 days |\n| `docker-postgres-1` | postgres:16-alpine | 5432 | Up 9 days (healthy) |","hash":"6f4d153e95db568c93fb5e4724cf171972d386249d52363519f83a2eeddc61a0"}
365
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"### Other Services\n\n| Service | Port | Notes |\n|---|---|---|\n| PostgreSQL (host) | 5432 | Multiple instances (WayOfTeams, CloudSync, etc.) |\n| Redis (host) | 6379 | Multiple instances (dnsmasq/pid-based) |\n| Elasticsearch | 9200, 9300 | Docker (temporal) |\n| Samba | 139, 445 | File sharing |\n| SSH | 22 | Tailscale + standard |\n| LM Studio (local) | 1234 | On server? (likely local machine) |\n| Ollama | 11434 | On server? (likely local machine) |\n| CUPS | 631 | Printing |\n| systemd-resolved | 53 | DNS |\n\n---","hash":"e107615892361b62ab700b46c04c2228e65662feb7c42452aa4db57f61f51d3d"}
366
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"## Projects on Server (`/home/zerwizserver/`)\n\n| Project | Description |\n|---|---|\n| `wayofteams` | Main SaaS app (Phoenix, 44 dirs) |\n| `prdteams` | Prod teams app (7 dirs) |\n| `cloudsync` | CloudSync hub service |\n| `aigeeksandfreaks` | Marketing blog/platform |\n| `anchor` | Anchor app |\n| `wayofcollab` | WayOfCollab (17 dirs) |\n| `investwayofteams` | Investor data room |\n| `masterplanhomepage` | Masterplan homepage |\n| `whynothomepage` | WhyNot Productions homepage |\n| `opticat` | OptiCat HVAC app (41 dirs) |\n| `sensualdojocouple` | Sensual Dojo (19 dirs) |\n| `obsidian-livesync` | Obsidian sync service |\n| `forgejo` / `forgejo-backups` | Git server + backups |\n| `searxng` | Search engine |\n| `backups` | Backup storage |\n| `flutter` | Flutter SDK |\n\n---","hash":"5f81ed970fb317c2dd2c650135dbee91658dbce4453051b95c3a0c9e676e1782"}
367
- {"timestamp":"2026-09-11T15:31:51Z","source":"assets/data/zerwizserver.md","tags":["data"],"content":"## Key Facts\n\n- **Production host** for the entire WayOf ecosystem\n- **26 Cloudflare tunnels** configured (many with no active DNS routes)\n- **3 Elixir/Beam apps** running: WayOfTeams, Anchor, WayOfCollab\n- **Docker** runs 20+ containers (Postiz, Mautic, Activepieces, Temporal, Grafana, Forgejo, CloudSync, etc.)\n- **CasaOS** installed for app management\n- **Crafty controller** running (Minecraft server? ports 19132, 25500-25600)\n- **Forgejo** self-hosted Git (codeberg.org/forgejo/forgejo:16.0.2)\n- **Supabase** stack behind `supabase.zerwiz.org` (port 8000 via Crafty)\n- **SearXNG** private search engine\n- **Obsidian LiveSync** for document sync\n- **Temporal** for durable workflow orchestration\n- **Grafana** for dashboards (port 3003)\n- **Postiz** for social media scheduling\n- **Mautic** for email marketing\n- **Activepieces** for workflow automation","hash":"6e0bf2aa889e2e867745214df2d79cd82e774d4ffbb9fa96b9ca827fa10f79d4"}