尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A tool for electronic enthusiasts
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Your voice-first electronics companion. Ask about circuits, components, microcontrollers, and maker hardware, then get live captions, spoken responses, and instant visual cards.
Clitronic turns natural language questions into rich, animated UI cards. It is not a chatbot UI with a transcript dump. It is a dynamic UI engine for electronics with realtime voice layered on top.
Mic input → Realtime transcription → Validated StructuredResponse → Cards + exact speech
Ask "What resistor for a red LED on 5V?" and get a calculation card with the formula, inputs, and result. Ask "Compare Arduino Uno vs Raspberry Pi Pico" and get a side-by-side comparison. Ask "Show me what a breadboard looks like" and get a real photo with attribution.
| Component | Use Case |
|---|---|
| Spec Card | Specs and features of a component |
| Comparison Card | Side-by-side qualitative comparison |
| Explanation Card | How something works, key concepts |
| Image Block | Real product photos or circuit diagrams |
| Recommendation Card | What to buy or use |
| Troubleshooting Card | Debug steps for broken circuits |
| Calculation Card | Formulas with inputs and results |
| Pinout Card | IC pin layouts with color-coded types |
| Chart Card | Numeric comparisons as bar charts |
| Wiring Card | Step-by-step wiring instructions |
gpt-5.6-luna with structured JSON outputgpt-4o-mini-transcribegpt-4o-mini-tts audio generated from the validated card responseNo database or user authentication. Conversation cards live only in the current browser session; demo quota metadata uses local storage, while rate limits and image caches remain process-local.
git clone https://github.com/sergiopesch/clitronic.git
cd clitronic
nvm use
npm ci
Node 24.x is the supported runtime for both the web app and the CLI. The repo includes .nvmrc, .node-version, and engines.node, so local development stays aligned with CI and Vercel.
Create .env.local from .env.example:
cp .env.example .env.local
Edit .env.local and set OPENAI_API_KEY to a project-scoped key. Leave
BRAVE_API_KEY empty unless you use Brave image search. Keys must remain server-side: never commit
.env.local or use a NEXT_PUBLIC_ prefix for either credential.
npm run dev
Open http://localhost:3000.
npm run dev.http://localhost:3000 in a Chromium-based browser or Safari.show me an Arduino image.Good smoke tests:
show me an Arduino imagetell me about the ESP32 then show me onecompare Arduino Uno vs Raspberry Pi Picomy LED is not blinkingnpm run dev # Dev server
npm run build # Production build
npm run validate # Type check + lint + format check
npm test # Runtime schema/normalization tests
npm run audit:prod # Audit production dependencies
npm run release:check # Complete deterministic web + CLI release gate
bash autoresearch/run_quality_experiment.sh # Credentialed quality gate for model/search changes
npm run scaffold:component -- --name "Signal Meter" --kind chart
The quality runner reads exported process variables rather than loading .env.local; see the
AutoResearch guide. Security disclosures and credential
handling are covered in SECURITY.md.
The web app and CLI intentionally use different providers today.
That split is deliberate rather than accidental:
If you want to use the CLI as well:
cd cli
nvm use
npm ci
export ANTHROPIC_API_KEY=your_key_here
npm run start -- --help
app/
├── api/chat/route.ts # LLM endpoint orchestration
├── api/chat/response-normalizer.ts # Shape rescue + component normalization
├── api/chat/response-validator.ts # Compatibility export for the shared response contract
├── api/chat/security.ts # Input sanitization + injection detection
├── api/chat/rate-limit.ts # In-memory per-IP limiter with cleanup
├── api/image-search/route.ts # Thin HTTP wrapper over image-search service
├── api/image-proxy/route.ts # Safe image proxy for remote image tiles
├── api/realtime/session/route.ts # OpenAI Realtime session bootstrap
├── api/speech/route.ts # Bounded exact-text TTS adapter
├── globals.css # Design tokens + keyframe animations
└── page.tsx # Entry point
components/
├── console/local-console.tsx # Client entry wrapper
├── console/conversation-shell.tsx # Voice-first shell and card stage
├── voice/voice-transcript-strip.tsx # Live user/assistant captions
└── ui/ # 10 visual card components + renderer
├── ui-renderer.tsx # Routes JSON → component via registry map
├── animations.tsx # AnimateIn wrapper
├── card-layout.tsx # Shared card headers, count badges, disclosure controls
├── copy-button.tsx # Clipboard actions for formulas/results/steps
├── safety-callout.tsx # Consistent safety note presentation
├── spec-card.tsx
├── comparison-card.tsx
├── explanation-card.tsx
├── image-block.tsx # Dual-mode: SVG diagrams + web photos
├── recommendation-card.tsx
├── troubleshooting-card.tsx
├── calculation-card.tsx
├── pinout-card.tsx # SVG IC pin layout
├── chart-card.tsx # Horizontal bar chart
├── wiring-card.tsx # Step-by-step wiring guide
└── text-response.tsx # Word-by-word spoken-text fallback
hooks/
├── useConversationState.ts # Structured response fetch + history context
├── usePrefersReducedMotion.ts # Motion preference hook for accessible animation
└── useVoiceInteraction.ts # Transcription transport, turn ownership, exact speech playback
lib/
├── ai/component-registry.ts # Single source of truth for component names/aliases/types
├── ai/openai-config.ts # Shared OpenAI model + realtime config
├── ai/openai-server.ts # Server-only API key resolution and client factory
├── ai/response-contract.ts # Shared server/browser Zod decoder
├── ai/response-schema.ts # TypeScript response contracts
├── ai/voice-presentation.ts # Bounded deterministic card-to-speech projection
├── ai/rate-limit.ts # Shared rate-limit constants/messages
├── ai/system-prompt.ts # Intent detection + response formatting
└── ai/transcript-utils.ts # Light cleanup for speech transcripts
The current app experience is optimized around a voice-first workshop workflow:
components/ui/card-layout.tsxSee docs/ui-ux-polish.md for the interaction patterns and design constraints behind the current card system.
/api/realtime/session. Only server-side routes can read OPENAI_API_KEY; the browser receives
the scoped Realtime secret, never the standard project key./api/chat.UIRenderer projects the validated payload into a card while
/api/speech synthesizes the exact bounded summary derived from that same payload.item_id values and abort controllers prevent stale transcripts,
requests, or audio from committing after barge-in or replacement.show me one still resolve correctly.See docs/engine-architecture.md for the interaction-engine invariants, failure boundaries, and verification strategy.
Use this order to avoid drift:
lib/ai/component-registry.ts (name, alias, type, detection signature)lib/ai/response-schema.ts data contractlib/ai/response-contract.ts component data schemacomponents/ui/ui-renderer.tsx renderer mappinglib/ai/system-prompt.ts component guidanceUse the scaffolding script to generate a new UI component file and a guided integration checklist:
npm run scaffold:component -- --name "Signal Meter" --kind chart
--name supports spaces, kebab-case, snake_case, or PascalCase.--kind must be one of: card, chart, image.components/ui/<name>-card.tsx and prints the exact follow-up edits required across registry/schema/validator/renderer/prompt.| Variable | Required | Description |
|---|---|---|
OPENAI_API_KEY | Yes | Server-only OpenAI project API key |
OPENAI_SAFETY_ID_SECRET | No | Stable server-only HMAC key for Realtime safety IDs |
BRAVE_API_KEY | No | Brave Search API key; blank uses Wikimedia only |
DAILY_RATE_LIMIT | No | Daily chat requests per IP (default: 20) |
REALTIME_SESSION_MINUTE_LIMIT | No | Realtime client-secret requests per IP/minute (12) |
REALTIME_SESSION_DAILY_LIMIT | No | Realtime client-secret requests per IP/day (120) |
IMAGE_SEARCH_MINUTE_LIMIT | No | Image-search requests per IP/minute (30) |
IMAGE_SEARCH_DAILY_LIMIT | No | Image-search requests per IP/day (300) |
IMAGE_PROXY_MINUTE_LIMIT | No | Remote image proxy requests per IP/minute (120) |
IMAGE_PROXY_DAILY_LIMIT | No | Remote image proxy requests per IP/day (default: 1,000) |
Rate limits are in-memory, per process, and intended as demo controls. They are not durable across multiple serverless instances. See deployment and key rotation before making the app publicly reachable.
See ROADMAP.md for upcoming work beyond the shipped realtime voice flow, including richer multi-card responses and circuit simulation.
MIT