Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Synapse

TestsCoverage

Synapse is an intelligent community digest bot designed to aggregate, summarize, and distribute conversations from your community platforms. It helps teams stay on top of important discussions without getting lost in the noise.

Features

  • Multi-Source Ingestion: Seamlessly ingests messages from Discord channels and Discourse forums.
  • Intelligent Summarization: Powered by the Vercel AI SDK, Synapse uses advanced LLMs (like Google Gemini) to generate concise, context-aware summaries of conversations.
  • Slack Destination: Delivers beautifully formatted weekday digests directly to your Slack workspace — weekends are skipped and rolled into Monday's digest.
  • Extensible Design: Built on a modular architecture, making it easily extensible to support additional sources (e.g., GitHub, Telegram) and destinations (e.g., Email, Notion).

Architecture

Synapse operates on a linear pipeline: Source -> Processor -> Destination.

Sources

Sources are responsible for fetching and normalizing messages from external platforms.

  • Discord: Fetches recent messages from configured channels using the discord.js library.
  • Discourse: Polls latest topics and posts via the Discourse API, handling pagination and filtering.

Processor

The core intelligence layer.

  • AiSdkProcessor: Utilizes the Vercel AI SDK to interface with LLMs. It currently supports Google's Gemini models to analyze conversation threads and produce structured summaries. It handles token limits and context management automatically.

Destination

Where the value is delivered.

  • Slack: Formats the summarized data into rich Slack blocks, handling rate limits and message splitting for large digests.

Quickstart

  1. Clone and Install

    git clone <repo-url>cd synapse
    nvm use
    npm install

    Node.js runtime is pinned in .nvmrc and enforced in package.json (engines.node).

  2. Configure Environment Copy .env.example to .env and populate it with your credentials.

    cp .env.example .env
  3. Run Locally

    npm run dev
  4. Build and Start

    npm run build
    npm start

Configuration

Synapse is configured via environment variables.

Core

  • LOG_LEVEL: debug, info, warn, error (default: info)
  • DRY_RUN: true to skip posting to Slack (default: false)

LLM (Gemini)

  • GEMINI_API_KEY: Your Google Gemini API key.
  • GEMINI_MODEL: Model to use (default: gemini-3.6-flash). Note: gemini-2.5-flash is deprecated and shuts down 2026-10-16.
  • MAX_SUMMARY_TOKENS: Max tokens for the summary output.
  • MAX_INPUT_CHARS_PER_GROUP: Maximum characters of conversation content fed to the model per group (default: 100000). Caps prompt size to bound API cost.

Sources

  • Discord: DISCORD_TOKEN, DISCORD_CHANNELS (comma-separated IDs).
  • Discourse: DISCOURSE_BASE_URL, DISCOURSE_API_KEY, DISCOURSE_API_USERNAME.

Destination

  • Slack: SLACK_BOT_TOKEN, SLACK_CHANNEL_ID.

Triage

  • MAINTAINED_PROJECTS: Comma-separated names of the projects this organization maintains (e.g. Zebra,zcashd,Zallet). Optional. The importance rubric names these projects so bug reports, regressions, and crashes against them rate 🔴 high rather than 🟡 medium. Left unset, the rule still applies but the rubric says only "software this organization maintains".

Scripts

  • npm run dev: Run in development mode with hot-reloading.
  • npm run build: Compile TypeScript to JavaScript.
  • npm start: Run the production build.
  • npm test: Run unit tests.
  • npm run test:coverage: Generate report-only coverage output.
  • npm run discord:debug: Validate Discord connectivity.
  • npm run discourse:debug: Validate Discourse connectivity.
  • npm run models:list: List available Gemini models.

Dependency Maintenance

  • Node.js runtime is pinned via .nvmrc, and CI reads from that file.
  • Automated update PRs are configured in .github/dependabot.yml.
  • Review patch/minor updates weekly and schedule major updates intentionally.
  • package.json includes npm overrides for vulnerable transitive packages (diff, undici) so security patches can be applied without forcing a breaking direct dependency downgrade.
  • Keep these overrides only while upstream trees require them; remove once direct dependency updates naturally resolve to patched transitive versions.

Coverage

  • Coverage is generated natively in GitHub Actions (CI - Tests & Coverage) in report-only mode.
  • Open the latest CI run and download the coverage-report artifact for lcov and summary outputs.

Operations

About

POC tool for monitoring community and ecosystem feeds and providing scheduled digests

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages