Repository files navigation

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 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

Sparkdeck

Sparkdeck takes a startup idea and generates a structured validation brief — ICP critique, value proposition, landing page copy, interview questions, GTM plan, fundraising guidance, and next steps. It pressure-tests assumptions before you write product code.

Built with Elixir, Phoenix LiveView, and Postgres. Runs locally via Docker Compose.

What it does

  1. You describe your idea, target customer, and the problem you're solving.
  2. Sparkdeck calls an LLM and generates a full validation brief.
  3. You review the brief and save it if it's useful.
  4. From the saved workspace you can edit inputs, regenerate individual sections, or duplicate the project.

Prerequisites

  • Docker Desktop (or Docker Engine with Compose)
  • An API key for an Ollama-compatible endpoint

Verify Docker:

docker compose version

Setup

1. Create environment file

cp .env.example .env

Edit .env and set:

  • LLM_API_KEY — your API key (required)

Defaults you can leave as-is for local dev:

VariableDefaultDescription
LLM_HOSThttps://ollama.comBase URL for any OpenAI-compatible API
LLM_MODELgpt-oss:120bModel identifier
LLM_PROMPT_VERSIONv1Prompt version tag
PORT4010App port

2. Start the stack

make up

This starts Postgres and the Phoenix app. The app waits for Postgres, runs migrations, and starts on the configured port.

3. Open the app

http://localhost:4010

Usage

Generate a brief

  1. Fill in the idea, target customer, and problem on the home page.
  2. Click Generate brief.
  3. Review the generated validation brief.
  4. Click Save project to persist it, or Discard to start over.

Work with saved projects

From a saved project workspace you can:

  • Edit inputs and save changes
  • Regenerate all to rebuild the entire brief
  • Regenerate individual sections using the section chips
  • Duplicate a project to explore variations

View saved projects

Click Projects in the nav to see all saved projects.

Commands

make up # start the stack
make down # stop containers
make rebuild # wipe database and rebuild from scratch
make logs # tail container logs
make shell # open a shell in the web container
make test# run tests
make format # run formatter

Stack

  • App: Elixir, Phoenix, LiveView
  • Database: PostgreSQL
  • LLM: Instructor (Elixir) with a custom adapter for Ollama-compatible APIs
  • Runtime: Docker Compose

Troubleshooting

App doesn't start: Check Docker is running and .env exists with LLM_API_KEY set. Try make down && make up. If that doesn't work, make rebuild will start fresh (this wipes the database).

Image pull fails: If make up fails pulling images, try pulling them explicitly:

docker pull postgres:16
docker pull hexpm/elixir:1.19.1-erlang-28.0-debian-bullseye-20251117

Then retry make up.

docker-credential-desktop error: If you see executable file not found in $PATH, your Docker credential helper is misconfigured. Fix it by editing ~/.docker/config.json and changing credsStore from desktop to osxkeychain, or remove the credsStore line entirely.

Generation fails: Check make logs for errors. Verify your API key and that the configured model is available on your endpoint.

Port conflict: Change PORT in .env and update the port mapping in docker-compose.yml.

About

Sparkdeck takes a startup idea and generates a structured validation brief

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages