"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[413],{6785(e,r,t){t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"overview","title":"Ramble Overview","description":"AI-powered structured field extraction from unstructured text. A configurable GUI tool that lets users \\"ramble\\" about an idea and extracts structured fields using AI.","source":"@site/docs/overview.md","sourceDirName":".","slug":"/","permalink":"/rob/ramble/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","sidebar_position":1},"sidebar":"docs","next":{"title":"Ramble Configuration","permalink":"/rob/ramble/configuration"}}');var s=t(4848),i=t(8453);const l={slug:"/",sidebar_position:1},d="Ramble Overview",c={},a=[{value:"Project Links",id:"project-links",level:2},{value:"Core Concept",id:"core-concept",level:2},{value:"Key Features",id:"key-features",level:2},{value:"Tech Stack",id:"tech-stack",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Integration",id:"integration",level:2},{value:"Quick Start",id:"quick-start",level:2},{value:"Architecture",id:"architecture",level:2}];function o(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"ramble-overview",children:"Ramble Overview"})}),"\n",(0,s.jsx)(r.p,{children:'AI-powered structured field extraction from unstructured text. A configurable GUI tool that lets users "ramble" about an idea and extracts structured fields using AI.'}),"\n",(0,s.jsx)(r.h2,{id:"project-links",children:"Project Links"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Resource"}),(0,s.jsx)(r.th,{children:"URL"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Git Repository"})}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.a,{href:"https://gitea.brrd.tech/rob/ramble",children:"https://gitea.brrd.tech/rob/ramble"})})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Docker Image"})}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"gitea.brrd.tech/rob/ramble:latest"})})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Local Path"})}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"~/PycharmProjects/ramble"})})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"core-concept",children:"Core Concept"}),"\n",(0,s.jsx)(r.p,{children:"Ramble solves the problem of capturing ideas in a structured format. Instead of filling out rigid forms, you describe what you want in natural language, and AI extracts the structured data."}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{children:'\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 Ramble \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\u2500\u2500\u2500\u2500\u2524\n\u2502 \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\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 "I want a feature that lets users export their data \u2502 \u2502\n\u2502 \u2502 to CSV format. It should support filtering by date \u2502 \u2502\n\u2502 \u2502 and include all fields. Maybe add PDF export too." \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\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502 \u2502\n\u2502 \u25bc AI Extraction \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\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 { \u2502 \u2502\n\u2502 \u2502 "title": "Data Export Feature", \u2502 \u2502\n\u2502 \u2502 "type": "feature", \u2502 \u2502\n\u2502 \u2502 "formats": ["CSV", "PDF"], \u2502 \u2502\n\u2502 \u2502 "filters": ["date"], \u2502 \u2502\n\u2502 \u2502 "scope": "all fields" \u2502 \u2502\n\u2502 \u2502 } \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\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\u2500\u2500\u2500\u2500\u2518\n'})}),"\n",(0,s.jsx)(r.h2,{id:"key-features",children:"Key Features"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Feature"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Free-form Input"})}),(0,s.jsx)(r.td,{children:"Type naturally without structure constraints"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"AI Extraction"})}),(0,s.jsx)(r.td,{children:"Multiple providers (Claude, Codex, Gemini)"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Configurable Fields"})}),(0,s.jsx)(r.td,{children:"Define what fields to extract with custom criteria"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Field Locking"})}),(0,s.jsx)(r.td,{children:"Lock fields you've refined for re-extraction"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"PlantUML Diagrams"})}),(0,s.jsx)(r.td,{children:"Auto-generate diagrams from descriptions"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Headless Mode"})}),(0,s.jsx)(r.td,{children:"CLI usage without GUI"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Programmatic API"})}),(0,s.jsx)(r.td,{children:"Import and use in Python scripts"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Docker Support"})}),(0,s.jsx)(r.td,{children:"Pre-built container for easy deployment"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Image Generation"})}),(0,s.jsx)(r.td,{children:"Stability AI and Pexels integration"})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"tech-stack",children:"Tech Stack"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.strong,{children:"Python 3.10+"})}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"PySide6"})," - Cross-platform GUI"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Multiple AI Providers"})," - Claude, Codex, Gemini, mock"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"PlantUML"})," - Diagram generation"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Docker"})," - Containerized deployment"]}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Feature Requests"}),": Ramble about a feature, get structured spec"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Bug Reports"}),": Describe issue, extract steps/expected/actual"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Meeting Notes"}),": Ramble about discussion, extract action items"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Documentation"}),": Describe concept, get structured outline"]}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"integration",children:"Integration"}),"\n",(0,s.jsx)(r.p,{children:"Ramble integrates with Development Hub to provide a user-friendly way to create new projects and feature requests through natural language input."}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"# Standalone usage\nramble\n\n# With Docker\ndocker run -it --rm \\\n -e DISPLAY=$DISPLAY \\\n -v /tmp/.X11-unix:/tmp/.X11-unix \\\n gitea.brrd.tech/rob/ramble --provider mock\n"})}),"\n",(0,s.jsx)(r.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:'# Install\ncd ~/PycharmProjects/ramble\npip install -e .\n\n# Run GUI with mock provider\nramble --provider mock\n\n# Run with Claude\nramble --provider claude\n\n# Headless mode\nramble --field-values \'{"Title":"My Feature","Summary":"A cool feature"}\'\n'})}),"\n",(0,s.jsx)(r.h2,{id:"architecture",children:"Architecture"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{children:"ramble/\n\u251c\u2500\u2500 src/ramble/\n\u2502 \u251c\u2500\u2500 __init__.py # Public API (open_ramble_dialog, providers)\n\u2502 \u251c\u2500\u2500 cli.py # CLI entry point with argument parsing\n\u2502 \u251c\u2500\u2500 dialog.py # PySide6/PyQt5 GUI implementation\n\u2502 \u2514\u2500\u2500 providers.py # AI provider implementations\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 pyproject.toml\n"})})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},8453(e,r,t){t.d(r,{R:()=>l,x:()=>d});var n=t(6540);const s={},i=n.createContext(s);function l(e){const r=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),n.createElement(i.Provider,{value:r},e.children)}}}]);