▌ 2026-06-06-memory-archive.md
▒ PATH:
▒ SIZE: 59.8 KB
▒ MODIFIED: 2026-06-06 00:12
MemPalace Archive/sessions/2026-06-06-memory-archive.md▒ SIZE: 59.8 KB
▒ MODIFIED: 2026-06-06 00:12
# MEMORY (Henry's Personal Notes) Archive
Exported: 2026-06-06
Entries: 109
---
## Entry 1: Hermes crash: ~/.local/state mkdir fails. Fix: XDG_STATE_HOME per instance to it...
Hermes crash: ~/.local/state mkdir fails. Fix: XDG_STATE_HOME per instance to its own .state dir. Launch: HERMES_HOME=~/.hermes-[inst] XDG_STATE_HOME=~/.hermes-[inst]/.state ~/.hermes/hermes-agent/venv/bin/hermes gateway run --accept-hooks &
---
## Entry 2: Honcho: workspace="default", peer="nick-williams". Python 3.9 compatible via dir...
Honcho: workspace="default", peer="nick-williams". Python 3.9 compatible via direct requests. Base: https://api.honcho.dev/v3. Auth: Bearer header. Add messages: POST .../workspaces/{workspace}/sessions/{id}/messages with {"messages": [{"peer_id": "...", "content": "...", "sender_id": "...", "sender_type": "user"}]}. Chat: POST .../peers/{peer_id}/chat with {"query": "...", "top_k": 5}. honcho-ai v2.1.1 requires Python 3.10+ (uses `type | None` union syntax) so use requests directly on 3.9.
---
## Entry 3: Vision: base64 encode image from ~/.hermes/image_cache/, call OpenRouter API (qw...
Vision: base64 encode image from ~/.hermes/image_cache/, call OpenRouter API (qwen/qwen2.5-vl-72b-instruct) directly via execute_code. Do NOT use vision_analyze or guess. Nick wants Qwen VL, not nemotron.
---
## Entry 4: AI CV: /private/tmp/nick-ai-cv/ — Flask :5001, HTML :5000. MiniMax endpoint: /v1...
AI CV: /private/tmp/nick-ai-cv/ — Flask :5001, HTML :5000. MiniMax endpoint: /v1/text/chatcompletion_v2 (NOT /anthropic/). Model: MiniMax-M2.7 (NOT MiniMax-Text-01 — paid plan only). Response: choices[0].message.content. Deploy: Railway, not Vercel.
---
## Entry 5: HERMES_KANBAN: dashboard @ :9119. 60s interval. hermes kanban gc = permanent del...
HERMES_KANBAN: dashboard @ :9119. 60s interval. hermes kanban gc = permanent delete.
---
## Entry 6: Betting AI: HKJC Wed/Sun predictions. Cron: df9a737d19b5 (Wed 11am), e8569b29434...
Betting AI: HKJC Wed/Sun predictions. Cron: df9a737d19b5 (Wed 11am), e8569b29434d (Sun 11am). Data: /Volumes/My Shared Files/UTM/hkjc-betting/
---
## Entry 7: Coincustrard video: HyperFrames (/Users/Shared/hf-demo/, run: cd /Users/Shared/h...
Coincustrard video: HyperFrames (/Users/Shared/hf-demo/, run: cd /Users/Shared/hf-demo && npx hyperframes). Scene-by-scene from images. 1080x1920 portrait. ⚠️ Daniel (ElevenLabs) now female — use Brian/George/Bill for male.
---
## Entry 8: Job search LinkedIn: charliemolty@gmail.com / Noodle@478788. Remote-only APAC ro...
Job search LinkedIn: charliemolty@gmail.com / Noodle@478788. Remote-only APAC roles. Does NOT speak Chinese/Mandarin — filter out Mandarin-speaking workplaces. Cover letters: keep rough/human-sounding, shorter paragraphs, don't over-polish.
---
## Entry 9: Nick's AI CV live URL: https://nicks-cv.up.railway.app/ (Railway deployed, MiniM...
Nick's AI CV live URL: https://nicks-cv.up.railway.app/ (Railway deployed, MiniMax-M2.7 model, base64 headshot embedded)
---
## Entry 10: Beepbo SEO: 1 pillar article/week targeting HK/SME AI keywords. Focus: local SEO...
Beepbo SEO: 1 pillar article/week targeting HK/SME AI keywords. Focus: local SEO + backlinks over volume posting.
---
## Entry 11: Memory: Honcho (primary, API) + Obsidian vault + shared_memory.md (cross-instanc...
Memory: Honcho (primary, API) + Obsidian vault + shared_memory.md (cross-instance). MemPalace retired May 29. Obsidian vault: ~/Documents/Obsidian Vault/ (backed by MemPalace archive). Skill: obsidian + note-taking/obsidian.
---
## Entry 12: OCR Web UI: http://127.0.0.1:9120/ — script at /Users/nick/.hermes/scripts/herme...
OCR Web UI: http://127.0.0.1:9120/ — script at /Users/nick/.hermes/scripts/hermes_image_chat.py, Qwen VL (qwen/qwen2.5-vl-72b-instruct) via OpenRouter. Start: python3 /Users/nick/.hermes/scripts/hermes_image_chat.py
---
## Entry 13: Comparative Data (@comparativedata1) YouTube channel — content source for HyperF...
Comparative Data (@comparativedata1) YouTube channel — content source for HyperFrames videos. Nick screenshots/vision-analyzes charts from this channel to extract data, then creates short-form content (1-2 min data viz videos). Caption template: 🔥 hook + country rankings + data source + hashtags + @comparativedata1 credit.
---
## Entry 14: Comparative Data video: 11 topics, topic_idx = (day_of_year - 2) % 11. New topic...
Comparative Data video: 11 topics, topic_idx = (day_of_year - 2) % 11. New topics added: CO2 per capita (EN.ATM.CO2E.PC), GINI Index (SI.POV.GINI), Health Expenditure per Capita (SH.XPD.CHEE.PC.CD). Day 140→CO2, 141→GINI, 142→Health. Script: /tmp/daily_comparative_video.py (PIL frame gen + ffmpeg). Output: /Users/Shared/hf-demo/gdp-animation/video_daily.mp4
---
## Entry 15: Comparative Data YouTube videos (channel @comparativedata1): Topic formula = (da...
Comparative Data YouTube videos (channel @comparativedata1): Topic formula = (day_of_year - 1) % 11. Day 140→GINI, 141→Health, 142→CO2. Script: ~/.hermes/scripts/daily_comparative_video.py — uses persistent indicator cache at ~/.hermes/scripts/indicator_cache/ (survives /tmp wipes). Output: /Users/Shared/hf-demo/gdp-animation/video_daily.mp4
---
## Entry 16: EPL/soccer betting: Polymarket Gamma API (gamma-api.polymarket.com) for events/s...
EPL/soccer betting: Polymarket Gamma API (gamma-api.polymarket.com) for events/search. CLOB (clob.polymarket.com) has historical football only — all resolved/settled markets from 2022-23 seasons, no live odds. Independent picks from data, not external tipsters. Bets on Sunday games.
---
## Entry 17: Nick's EPL betting approach: uses Poisson model on historical data (E0_*.csv sea...
Nick's EPL betting approach: uses Poisson model on historical data (E0_*.csv seasons from 95/96 to 23/24) to find value vs Polymarket odds. Key insight: model consistently finds Polymarket underprices draws by 8-12 percentage points. Nick interested in draw scorelines (0-0, 1-1) specifically. GitHub: ncik8/betting-ai. Has ~25 seasons of EPL data covering all 10 current teams.
---
## Entry 18: Population chart video specs: 1940-2023, top 20 countries by population, same st...
Population chart video specs: 1940-2023, top 20 countries by population, same style as daily_comparative_video.py (flags, ranks, gradient bars, dark BG). Data: Our World in Data CSV (https://ourworldindata.org/grapher/population.csv?downloadFormat=csv). Country filter: 180 sovereign countries in COUNTRY_CODES. 0.6s per year, 3s title, 7.6s end card = 1m 1s total. Music: /tmp/interstellar_85s.mp3. Output: /Volumes/My Shared Files/UTM/population_chart.mp4. End card: @mrbizmind not @comparativedata1. Common bug: data keys are integers (year int), NOT strings — must use gdp_data[c].get(y, 0) NOT gdp_data[c].get(str(y), 0).
---
## Entry 19: Free image APIs for news video: Pexels + NewsAPI need API keys (free signup). Wi...
Free image APIs for news video: Pexels + NewsAPI need API keys (free signup). Wikimedia Commons works for generic tech/server images (no key, `action=query&generator=search` on `commons.wikimedia.org/w/api.php`). Most stock sites blocked by Cloudflare. Dell AI Factory/Nvidia story — no free portrait image found without key signup.
---
## Entry 20: When generating HTML slides via Open Design simple-deck: the CSS :root tokens `-...
When generating HTML slides via Open Design simple-deck: the CSS :root tokens `--bg`, `--surface`, `--fg` map to LIGHT slides (bg=surface, fg=fg) and DARK slides (bg=fg, fg=bg). "light" class = dark bg, "dark" class = medium bg — counterintuitive naming. Always verify color contrast with Playwright screenshot before showing user. Test: 4 distinct slides at positions 0, 1, 2, 3 should show 2 different bg colors and readable text (not white-on-white).
---
## Entry 21: Nick hates when output is hard to read or visually wrong on first delivery — tre...
Nick hates when output is hard to read or visually wrong on first delivery — treats it as a failure, not a quick fix. When generating HTML slide decks via Open Design: ALWAYS test color contrast with Playwright screenshot before showing user. Nick will reject white-on-white text or one visible slide immediately.
For shared links Nick expects permanent URLs — Cloudflare tunnels (reset on restart, ~24h expiry) frustrate him. When he says "yes" to hosting, deploy to Railway instead of using temp tunnels. Railway free tier works for static HTML hosting.
---
## Entry 22: AI Beginner Course deck: /tmp/ai-beginner-course/index.html — 29 slides, Tech Ut...
AI Beginner Course deck: /tmp/ai-beginner-course/index.html — 29 slides, Tech Utility dark theme, horizontal-swipe HTML deck. Structure: Intro → Chat AI (How + Cloud + Local) → Image AI (How + Cloud + Local) → Video AI (How + Cloud + Local) → Coding AI (How + Cloud + Local) → Prompts 5 Rules → Local vs Cloud comparison → Takeaways → Next Steps. Tokens: --bg:#0B0E14 --surface:#151920 --fg:#E8EAED --muted:#8B9199 --accent:#3B82F6. Open Design simple-deck skill generates these. Cloudflare tunnel for sharing: cloudflared tunnel --url http://127.0.0.1:9125.
---
## Entry 23: PDF export for slide decks: format='A4', landscape=True. Use Playwright page.pdf...
PDF export for slide decks: format='A4', landscape=True. Use Playwright page.pdf(). Nick accepts landscape A4 for presentations.
---
## Entry 24: MiniMax audio credits: Nick has 10,000 credits + Brian's voice cloned on MiniMax...
MiniMax audio credits: Nick has 10,000 credits + Brian's voice cloned on MiniMax web (minimax.io/audio). He handles audio manually via web UI when at home — doesn't want API approach. Workflow: Henry generates script/scenes, Nick does voiceover on MiniMax web, Henry adds to video. ElevenLabs API key is broken (truncated to sk_68e in .env) — Nick will regenerate when needed.
---
## Entry 25: Video production pipeline (for news/comparative data videos):
Video production pipeline (for news/comparative data videos):
1. Henry generates image from script (MiniMax /v1/image_generation, model=image-01)
2. Henry gives video prompt for Hedra (text-to-video motion prompts: camera movement, lighting, etc.)
3. Nick feeds image to Hedra web UI + video prompt → generates video clip
4. Nick stitches clips in After Effects
5. Nick handles audio separately (MiniMax.io/audio web interface, Brian voice, 10k credits)
Hedra = video generation from image + text prompt. No API key needed — web UI only.
MiniMax image gen: works now, included in plan. MiniMax TTS/voice: blocked until 4AM HK.
---
## Entry 26: OpenCode code review: Nick values this — subagent + OpenRouter free model caught...
OpenCode code review: Nick values this — subagent + OpenRouter free model caught 3 CRITICAL + 6 HIGH in GeBeCert. Skill: opencode-review-agent. Trigger: "double check code" or similar → load skill and offer to run review.
---
## Entry 27: Nick wants a SEPARATE cron job for memory sync — not bundled with other jobs. Sp...
Nick wants a SEPARATE cron job for memory sync — not bundled with other jobs. Specific requirement: it must cover "from yesterday 3pm till when it's updated" (the window since the last daily video run). Cron ID: 01c42aac85c2, 9am HKT daily.
---
## Entry 28: New brand name (May 25): ResMyCV — not TailorMyCV anymore. Domain: rezmycv.com. ...
New brand name (May 25): ResMyCV — not TailorMyCV anymore. Domain: rezmycv.com. Project directory still ~/tailormycv/ locally, GitHub repo still ncik8/TailorMyCV (repo rename pending).
ResMyCV live URL: https://nicks-cv.up.railway.app/ (Railway deployed, was nicks-cv before rebrand)
---
## Entry 29: RezMyCV core bug: tailor_cv() rephrases existing content but doesn't push ATS ke...
RezMyCV core bug: tailor_cv() rephrases existing content but doesn't push ATS keywords or add bullets for gaps. Job wants retail/distribution/property/forecasting keywords — CV has none so ATS scores low. Fix: pre-tailoring step that injects ATS-friendly bullets for each missing keyword, even if stretched from real experience.
---
## Entry 30: Rezmycv (May 25): All core features shipped. Auth + Stripe + Blog live at rezmyc...
Rezmycv (May 25): All core features shipped. Auth + Stripe + Blog live at rezmycv.com. GitHub: ncik8/TailorMyCV (rename pending). Railway variables all set via CLI.
Blog workflow (May 25): Henry researches Reddit/X every 2 days, writes blog posts, writes blog posts, inserts into Supabase, sends Nick URLs of relevant threads. Nick comments with genuine advice. No astroturfing — Nick refused fake review comments explicitly.
X auth needed before cron: xurl CLI installed, no apps registered. Nick needs to run: xurl auth apps add rezmycv --client-id X --client-secret Y; xurl auth oauth2 --app rezmycv; xurl auth default rezmycv
Reddit JSON API works without auth: curl -s "https://www.reddit.com/r/SUB/hot.json?limit=8" -H "User-Agent: Mozilla/5.0" | python3 -c "..." — confirmed working. Use this for blog research, not Google/Bing (they block scrapers).
---
## Entry 31: - Beepbo landing page: /private/tmp/beepbo-landing/blog.html (NOT index.html — v...
- Beepbo landing page: /private/tmp/beepbo-landing/blog.html (NOT index.html — vercel.json rewrites all routes to blog.html)
- blog/ folder contains individual post HTML files
- Daily comparative video: topic formula = (day_of_year - 1) % 11 (NOT -2)
- Daily comparative video end card: @mrbizmind (correct), YouTube hashtags mention @comparativedata1
- Daily comparative video script: ~/.hermes/scripts/daily_comparative_video.py — ALL paths persistent (/tmp wiped on restart)
- Daily comparative music: /Users/Shared/hf-demo/interstellar_85s.mp3 (Interstellar clip — was in /tmp, re-downloaded placeholder, original may be lost)
- Hermes occasionally restarts — /tmp contents wiped. Always use ~/.hermes/scripts/ for scripts, /Users/Shared/ for data outputs
- Rezmycv blog workflow: Henry researches Reddit (JSON API, no auth needed), writes blog posts every 2 days, inserts into Supabase. Nick comments on relevant Reddit threads with links. NO fake reviews — Nick refused astroturfing explicitly.
- X auth for blog workflow: xurl installed but not auth'd yet. Reddit JSON API works without auth for research.
- Shared memory /Volumes/My Shared Files/UTM/hermes/shared_memory.md gets overwritten by project sessions — verify/update after each session
---
## Entry 32: RezMyCV completed (May 27): upload/parse/persistence all working. Supabase anon ...
RezMyCV completed (May 27): upload/parse/persistence all working. Supabase anon key = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... (JWT). Flask session cookies use itsdangerous pickle serialization (NOT JWT) — can't decode with base64. supabase-py client uses Python 3.10+ type union syntax (dict | None) — requires python3.11, not python3.9. Supabase RLS INSERT policy syntax: CREATE POLICY "name" ON table FOR INSERT TO anon WITH CHECK (true); (not USING for INSERT).
---
## Entry 33: RezMyCV bug (May 27): Work experience + education not saved after edit — form su...
RezMyCV bug (May 27): Work experience + education not saved after edit — form submit JS created indexed fields (exp_title_0, exp_title_1) but backend used getlist('exp_title') which returned empty. Fix: read form keys matching prefix patterns instead of getlist. Pushed as commit 2b43624.
---
## Entry 34: RezMyCV / TailorMyCV (May 29): Full flow working on Railway at rezmycv.com. Job ...
RezMyCV / TailorMyCV (May 29): Full flow working on Railway at rezmycv.com. Job descriptions save to Supabase `job_descriptions` table (not session). CV loaded from Supabase via `load_cv()` — not in session cookie. ATS keywords extracted and stored. Gap analysis shows loading animation on confirm. "Find Another Job" calls `POST /job/clear` to delete from Supabase. Dashboard passes `cv_data` as template arg. `SESSION_COOKIE_SIZE = None` set. GitHub: ncik8/TailorMyCV.
---
## Entry 35: Nick: short, direct. Says "you push" = git push immediately. Runs SQL in Supabas...
Nick: short, direct. Says "you push" = git push immediately. Runs SQL in Supabase SQL Editor himself (not via agent). Prefers voice replies but types when working on code/projects. No flowery language, no over-asking.
---
## Entry 36: RezMyCV ats_keywords bug (May 30): built only from requirements['skills'], tools...
RezMyCV ats_keywords bug (May 30): built only from requirements['skills'], tools/certs/other ignored. Salesforce in CV skills but flagged MISSING. Fixed: use requirements.skills directly as ats_keywords. Committed 065065a.
---
## Entry 37: Supabase URL CORRECTION: tfkzirfxixlylizlmxeur.supabase.co (verified from ~/.her...
Supabase URL CORRECTION: tfkzirfxixlylizlmxeur.supabase.co (verified from ~/.hermes/tailormycv/.env May 25). Previous entry ymxkrgkgpplzcjsupfco was a hallucination.
---
## Entry 38: RezMyCV Stripe setup: one-time payments (not subscriptions). Railway env vars po...
RezMyCV Stripe setup: one-time payments (not subscriptions). Railway env vars point to one-time price IDs. Code has mode="subscription" but actual Stripe products are one-time. Nick wants to leave it as-is for now.
---
## Entry 39: RezMyCV (June 1): Multi-item gap answer bug fixed. Gap answers saved to user_cvs...
RezMyCV (June 1): Multi-item gap answer bug fixed. Gap answers saved to user_cvs.gap_answers (permanent). Tailor reads job_descriptions.gap_answers (per-job).
---
## Entry 40: RezMyCV (June 1 2026): Two-step CV flow working — Tailor then Match ATS Keywords...
RezMyCV (June 1 2026): Two-step CV flow working — Tailor then Match ATS Keywords. All field types eligible. Gap answers accumulate in Supabase user_cvs (permanent).
---
## Entry 41: ResMyCV ATS optimisation: `services/optimise.py` (new) + `POST /cv/optimise` end...
ResMyCV ATS optimisation: `services/optimise.py` (new) + `POST /cv/optimise` endpoint. Two-step flow: Tailor CV → Match ATS Keywords. Button in cv_editor.html — purple, id=btnOptimise.
---
## Entry 42: When something works on Rezmycv, save to Obsidian + backup to shared drive immed...
When something works on Rezmycv, save to Obsidian + backup to shared drive immediately — don't wait to be asked, do both at once.
---
## Entry 43: Nick has YouTube channel with 12k followers, X with 1k, and runs online news cha...
Nick has YouTube channel with 12k followers, X with 1k, and runs online news channel "Coincustrard". Content distribution plan for RezMyCV: news wire + X + CoinCUstrard + Reddit + YouTube Short + YouTube long form video.
---
## Entry 44: Charity project (Nick's wife): small charity, 5 txns/month, needs multi-user aut...
Charity project (Nick's wife): small charity, 5 txns/month, needs multi-user auth with audit trail. Voice input primary. Railway deploy. Categories TBD.
---
## Entry 45: Nick is considering face-on YouTube content for AI Beginner Journey (educational...
Nick is considering face-on YouTube content for AI Beginner Journey (educational AI content for beginners). Key context: He has stage presence — spoke to 2,500 people live 25 years ago; He's funnier with live feedback (reactive/improv comedy style), not a natural scripted speaker; Relates to Julian Goldie SEO's style of catchphrases ("this is absurd", "this is crazy"); Needs a signature phrase/reaction for his AI content; Barrier: video is different from live — no audience feedback, just camera; Prefers short, direct responses. Voice replies preferred. No Chinese/Mandarin.
---
## Entry 46: 5 Hermes instances (bizmind, clawpack, coinc, gebecert, mingyun) — all restartab...
5 Hermes instances (bizmind, clawpack, coinc, gebecert, mingyun) — all restartable with: HERMES_HOME=~/.hermes-[inst] XDG_STATE_HOME=~/.hermes-[inst]/.state ~/.hermes/hermes-agent/venv/bin/hermes gateway run --replace > ~/.hermes-[inst]/gateway.log 2>&1 &
---
## Entry 47: RezMyCV SaaS product (subscription billing). Stripe prices: STRIPE_PRICE_PRO and...
RezMyCV SaaS product (subscription billing). Stripe prices: STRIPE_PRICE_PRO and STRIPE_PRICE_PRO_PLUS env vars. Current code: mode="subscription" (correct for recurring). Stripe MCC: txcd_10701401 (Website Information Services – Personal Use). Upgrade issue: Pro→Pro+ creates duplicate subscription instead of upgrading existing. Fix: Enable Stripe Customer Portal (Settings → Customer Portal → enable upgrade/downgrade) + add "Manage Subscription" button to dashboard.
---
## Entry 48: RezMyCV article distribution (June 2026): CoinCUstrard version first (Day 1), ne...
RezMyCV article distribution (June 2026): CoinCUstrard version first (Day 1), news outlet version different angle (Day 2+). Both: H1/H2 headers, SEO metadata block, engagement question at end. Word doc format (.docx) saved to /Volumes/My Shared Files/UTM/. Scripts file: Reddit_YouTube_Scripts.md also in UTM. Content calendar: RezMyCV_Content_Calendar.md in UTM.
---
## Entry 49: Reddit workflow for RezMyCV: Nick posts genuine story (300 EasyApply → 0 intervi...
Reddit workflow for RezMyCV: Nick posts genuine story (300 EasyApply → 0 interviews, 100 with RezMyCV → 7 interviews). Henry handles ALL comments/replies once Nick sends the link. Nick discloses "I built this" — no astroturfing.
---
## Entry 50: RezMyCV content workflow: Article in .docx (H1/H2/H3 + SEO block + engagement qu...
RezMyCV content workflow: Article in .docx (H1/H2/H3 + SEO block + engagement question), YouTube scripts, Reddit post — all written by Henry, saved to /Volumes/My Shared Files/UTM/, Nick executes on platforms. Henry cannot access CoinCUstrard CMS — content provided as files only.
---
## Entry 51: Rezmycv (May 25): All core features shipped. Auth + Stripe + Blog live at rezmyc...
Rezmycv (May 25): All core features shipped. Auth + Stripe + Blog live at rezmycv.com. GitHub: ncik8/TailorMyCV (rename pending). Railway variables all set via CLI.
Blog workflow (May 25): Henry researches Reddit/X every 2 days, writes blog posts, inserts into Supabase, sends Nick URLs of relevant threads. Nick comments with genuine advice. No astroturfing — Nick refused fake review comments explicitly.
X auth needed before cron: xurl CLI installed, no apps registered. Nick needs to run: xurl auth apps add rezmycv --client-id X --client-secret Y; xurl auth oauth2 --app rezmycv; xurl auth default rezmycv
Reddit JSON API works without auth: curl -s "https://www.reddit.com/r/SUB/hot.json?limit=8" -H "User-Agent: Mozilla/5.0" | python3 -c "..." — confirmed working. Use this for blog research, not Google/Bing (they block scrapers).
---
## Entry 52: TailorMyCV platform rebuild (May 25): Full flow rebuilt by subagents. Current st...
TailorMyCV platform rebuild (May 25): Full flow rebuilt by subagents. Current state:
- /cv/upload → /cv/edit-profile (editable form) → /job/paste → /gap/analyze → /gap/answer → /cv/preview → /cv/download PDF
- services/tailor.py rebuilt with ATS expert prompt + PDF generation
- services/gap_analyzer.py has generate_gap_questions() + gap Q&A flow
- templates/edit_profile.html (editable fields form) + gap_analyze.html + gap_answer.html
- Server running on :5000, cloudflare tunnel active
- Live tunnel: https://shirts-cuisine-panels-rogers.trycloudflare.com
- Profile stored in session['profile'], CV data in session['cv_data']
- DOCX text box reading order fix (reverse XML order = top-to-bottom reading)
- Key concept: living profile engine — user builds comprehensive profile once, AI grows it smarter with every job application via gap Q&A
- Still todo: Railway deploy, user accounts, cover letter generation
---
## Entry 53: Rezmycv (May 25 late): Auth + Stripe + Blog all deployed to Railway. ~/tailormyc...
Rezmycv (May 25 late): Auth + Stripe + Blog all deployed to Railway. ~/tailormycv/ is the repo. All 8 Railway env vars set. Live at rezmycv.com. Blog table + SQL provided to Nick for Supabase SQL Editor run.
---
## Entry 54: Rezmycv blog workflow (May 25): I research Reddit/X, write blog posts every 2 da...
Rezmycv blog workflow (May 25): I research Reddit/X, write blog posts every 2 days, insert into Supabase. Nick comments on relevant Reddit threads with links. I refused fake review comments — Nick accepted this. X auth still pending (xurl installed but not auth'd). Reddit JSON API works without auth for research.
---
## Entry 55: - Beepbo landing page: /private/tmp/beepbo-landing/blog.html (NOT index.html — v...
- Beepbo landing page: /private/tmp/beepbo-landing/blog.html (NOT index.html — vercel.json rewrites all routes to blog.html)
- blog/ folder contains individual post HTML files
- Daily comparative video: topic formula = (day_of_year - 1) % 11 (NOT -2)
- Daily comparative video end card: @mrbizmind (correct), YouTube hashtags mention @comparativedata1
- Daily comparative video script: ~/.hermes/scripts/daily_comparative_video.py — ALL paths persistent (/tmp wiped on restart)
- Daily comparative music: /Users/Shared/hf-demo/interstellar_85s.mp3 (Interstellar clip — was in /tmp, re-downloaded placeholder, original may be lost)
- Hermes occasionally restarts — /tmp contents wiped. Always use ~/.hermes/scripts/ for scripts, /Users/Shared/ for data outputs
- Rezmycv blog workflow: Henry researches Reddit (JSON API, no auth needed), writes blog posts every 2 days, inserts into Supabase blog_posts table. Nick comments on Reddit threads with links. NO fake reviews — Nick refused astroturfing explicitly.
- X auth for blog workflow: xurl installed but not auth'd yet. Reddit JSON API works without auth for research.
- Shared memory /Volumes/My Shared Files/UTM/hermes/shared_memory.md gets overwritten by project sessions — verify/update after each session
---
## Entry 56: RezMyCV (May 29): Full flow working on Railway at rezmycv.com. GitHub: ncik8/Tai...
RezMyCV (May 29): Full flow working on Railway at rezmycv.com. GitHub: ncik8/TailorMyCV. Architecture: session stores only `user_id` + tiny IDs; ALL data fetched from Supabase per request. CV via `load_cv()`, jobs via `load_job_description()`. Gap analysis generates on-the-fly at `/gap/analyze` if `session['gaps']` is empty. `analyze_gaps()` runs CV + requirements to produce gap analysis dict. RLS disabled on `job_descriptions` table (Supabase `ALTER TABLE DISABLE ROW LEVEL SECURITY`). Templates: gap_analyze.html (loading spinner + Find Another Job), job_paste.html (confirm with loading animation). Find Another Job → `POST /job/clear` → deletes from Supabase.
---
## Entry 57: RezMyCV (May 29 pm): Full flow at rezmycv.com. Session stores only user_id; CV +...
RezMyCV (May 29 pm): Full flow at rezmycv.com. Session stores only user_id; CV + jobs from Supabase. Gap analysis + Fill in the Gaps Q&A wired. SESSION_COOKIE_SIZE = None. RLS disabled on job_descriptions. GitHub: ncik8/TailorMyCV.
---
## Entry 58: Obsidian vault at ~/Documents/Obsidian Vault/ — set OBSIDIAN_VAULT_PATH in env c...
Obsidian vault at ~/Documents/Obsidian Vault/ — set OBSIDIAN_VAULT_PATH in env config. I use obsidian skill to read/write notes there. Starter notes created: Henry AI Assistant, Welcome, Projects.
---
## Entry 59: Email setup deferred — Resend for rezmycv.com + beepbo.com. Will resolve email r...
Email setup deferred — Resend for rezmycv.com + beepbo.com. Will resolve email routing once all systems confirmed working. Nick to create Resend API key when ready.
---
## Entry 60: Flask tojson BOM bug: _json.dumps() in Python already JSON-encodes; adding |tojs...
Flask tojson BOM bug: _json.dumps() in Python already JSON-encodes; adding |tojson in Jinja2 template double-encodes AND injects BOM. Fix: use |safe instead of |tojson for pre-encoded JSON vars, then strip BOM client-side with .replace(/\ufeff/gi, '') in JS. NEVER use |tojson on a var already passed as _json.dumps() output from Flask. Sign: "Unexpected non-whitespace character after JSON at position 4" = double-encoding.
---
## Entry 61: DeepSeek API (deepseek-v4-pro): bare model name, no org prefix. Timeouts common ...
DeepSeek API (deepseek-v4-pro): bare model name, no org prefix. Timeouts common — use --max-time 30, fall back to manual debugging if it hangs.
---
## Entry 62: Nick prefers step-by-step, chat-first approach — no delegation chains, wants to ...
Nick prefers step-by-step, chat-first approach — no delegation chains, wants to understand and decide each step. Frustrated that ats_keywords still broken after multiple fixes. Willing to check Supabase SQL Editor himself to verify data. Priority: get core functionality working (ats_keywords extraction, profile updates, ATS score) BEFORE design/UI work.
---
## Entry 63: RezMyCV ats_keywords bug (May 30): requirements.skills was returning correct 6 s...
RezMyCV ats_keywords bug (May 30): requirements.skills was returning correct 6 skills from AI, but extraction loop (flattening skills/certifications/tools/other) was returning [] — cause unknown (supabase-py Python 3.10+ type union syntax suspicion). Fix: use requirements.skills directly as ats_keywords — committed as 065065a "Use requirements.skills directly for ats_keywords instead of broken extraction loop". CV preview design + "Add to CV" profile update + PDF download still pending.
---
## Entry 64: Supabase URL CORRECTION: tfkzirfxixlylizlmxeur.supabase.co (verified from ~/.her...
Supabase URL CORRECTION: tfkzirfxixlylizlmxeur.supabase.co (verified from ~/.hermes/tailormycv/.env May 25). Previous entry ymxkrgkgpplzcjsupfco was a hallucination — discard it entirely.
---
## Entry 65: RezMyCV multi-item gap answer bug (June 1): AI classifying multi-item answers as...
RezMyCV multi-item gap answer bug (June 1): AI classifying multi-item answers as "skill" caused silent CV modification loss. Fixed in commit a676222: GAP_INTERPRET_PROMPT → multi-item = "other"/"Add to Additional Info"; GAP_UPDATE_PROFILE_PROMPT → new applied_to="additional_info" case; merge_cv_sections() → handles it. Railway auto-deploys.
---
## Entry 66: RezMyCV (June 2): ats_keywords bug — built only from requirements['skills'], too...
RezMyCV (June 2): ats_keywords bug — built only from requirements['skills'], tools/certs/other ignored. Salesforce in CV skills but flagged MISSING. Gap answers saved to user_cvs.gap_answers (permanent) but tailor_cv only reads job_descriptions.gap_answers (per-job). Job switch nukes gap answers. Fix in progress: (1) all requirement categories for ats_keywords, (2) read gap_answers from user_cvs for tailoring, (3) upsert not delete on new job.
---
## Entry 67: ResMyCV ATS optimisation: `services/optimise.py` (new) + `POST /cv/optimise` end...
ResMyCV ATS optimisation: `services/optimise.py` (new) + `POST /cv/optimise` endpoint. Two-step flow: Tailor CV → Match ATS Keywords (rewrite bullets for keyword match). Button in cv_editor.html — purple, id=btnOptimise. Priority keywords: retail/properties/distribution → pipeline/forecasting → presales/marketing → implementation/delivery → stakeholder/enterprise → CRM/sales reporting. Cover letter humanised: mix short + long sentences. Session cookie limit: don't store large CV data in session — load from Supabase per request.
---
## Entry 68: When something works on Rezmycv, save to Obsidian + backup to shared drive immed...
When something works on Rezmycv, save to Obsidian + backup to shared drive immediately — don't wait to be asked, do both at once.
Rezmycv (June 1 2026): Two-step CV flow working — Tailor then Match ATS Keywords. All field types eligible. Gap answers accumulate in Supabase user_cvs (permanent). Re-adding same job = more gap questions (expected, Nick confirmed correct). Summary triple protection working (prompt rule + JSON schema + code safeguard). Bug fixed: `_prepare_cv_context` not copying top-level summary into personal when personal already existed from AI output. Debug print statements added to optimise.py and /cv/optimise route.
Rezmycv ats_keywords: built from requirements['skills'] + all other categories (tools, certifications, other, etc.) — not just skills field.
TailorMyCV repo: ~/tailormycv, backed up to /Volumes/My Shared Files/UTM/tailormycv-YYYYMMDD/ on significant changes.
---
## Entry 69: Nick has YouTube channel with 12k followers, X with 1k, and runs online news cha...
Nick has YouTube channel with 12k followers, X with 1k, and runs online news channel "Coincustrard". Content distribution plan for RezMyCV: news wire + X + CoinCUstrard + Reddit + YouTube Short + YouTube long form video. Article angle: "10 job sites that require effort because LinkedIn easyApply is broken" — targeting frustrated job seekers who clicked through the grind. Strong message: "Do the work, not the easy button." Long form script drafted (8 min). Nick wants scripts done first before producing content.
---
## Entry 70: Nick has an online news channel called "CoinCUstrard" (not just a website). YouT...
Nick has an online news channel called "CoinCUstrard" (not just a website). YouTube: 12k followers. X: 1k followers. Promotion plan for RezMyCV: article → YouTube Short + Long Form → CoinCUstrard → news wire → Reddit → X posts (3-4 over 2 weeks). Reddit strategy: Nick posts genuine story ("300 EasyApply → 0 interviews, 100 with RezMyCV → 7 interviews"), I handle all comments/replies once he sends me the link. Article on CoinCUstrard: "The 10 Best Websites to Help You Get a Job in 2026 (And Why RezMyCV is #1)" — RezMyCV positioned as the solution to the generic CV problem, not just another job board.
---
## Entry 71: RezMyCV article content strategy: Two versions — CoinCUstrard (personal/story-dr...
RezMyCV article content strategy: Two versions — CoinCUstrard (personal/story-driven) and news outlets (journalistic/informational). Both position RezMyCV as #1, same core message (EasyApply broken, effort works), same CTA. Engagement question at end of each article. Saved to /Volumes/My Shared Files/UTM/ in .docx with H1/H2/H3 headers + SEO metadata block at top.
---
## Entry 72: RezMyCV Stripe MCC: txcd_10701401 (Website Information Services – Personal Use)....
RezMyCV Stripe MCC: txcd_10701401 (Website Information Services – Personal Use). Set in Stripe Dashboard → Payments → Statement descriptor, not in code.
---
## Entry 73: RezMyCV launch plan (June 2026): Day1=LinkedIn article+X post, Day2=CoinCUstrard...
RezMyCV launch plan (June 2026): Day1=LinkedIn article+X post, Day2=CoinCUstrard+Reddit, Day3=X#2+YouTube Short, Day4-5=YouTube long-form+engagement, Day6-7=news wire+X#3, Week2=fresh X posts. Content: genuine story angle, article link+short hook on LinkedIn (no overselling), I handle all Reddit comments. YouTube video launches 6pm NYC today.
---
## Entry 74: Brian voice clone: canonical source is /Volumes/My Shared Files/UTM/Brian.mp3 (9...
Brian voice clone: canonical source is /Volumes/My Shared Files/UTM/Brian.mp3 (953KB, 61s, 128kbps mono, 44.1kHz). Use this file for any MiniMax voice_clone upload. Nick's $20 plan returns 2061 "your current token plan not support model, voice_clone" — voice cloning needs plan upgrade or pay-per-use. Web interface (minimax.io/audio) is the working path for now.
---
## Entry 75: MiniMax API endpoints (api.minimax.io):
MiniMax API endpoints (api.minimax.io):
- Text chat: /v1/text/chatcompletion_v2 — models MiniMax-M2.7, MiniMax-M3 both work
- Image gen: /v1/image_generation — model image-01, returns signed OSS URL (expires ~24h)
- TTS: /v1/t2a_v2 — model speech-01-turbo, voice_id required, audio returned as HEX (not base64) — decode with bytes.fromhex()
- File upload: /v1/files/upload — multipart, purpose=voice_clone
- Voice clone: /v1/voice_clone — POST {file_id, voice_id, need_noise_reduction, need_volume_normalization}. Token plan error 2061 = cloning not in current plan
- Hermes base URL in config: https://api.minimax.io/anthropic (NOT /v1/)
MiniMax TTS English male voices: English_magnetic_voiced_man, English_Trustworth_Man, English_Deep-VoicedGentleman, English_Aussie_Bloke, English_Gentle-voiced_man, English_ManWithDeepVoice, English_MaturePartner, English_FriendlyPerson, English_Debator, English_Steadymentor, English_Comedian, English_BossyLeader, English_PassionateWarrior, English_WiseScholar, English_PatientMan, English_Jovialman, English_ReservedYoungMan.
---
## Entry 76: Hermes config changes 2026-06-04:
Hermes config changes 2026-06-04:
- model.default: MiniMax-M2.7 → MiniMax-M3 (direct API)
- providers.ollama-launch.default_model: minimax-m3:cloud → mistral:latest (reverted, Max stays on mistral)
- tts.provider: edge → minimax
- tts.minimax: model=speech-01-turbo, voice_id=English_Trustworth_Man (Henry's voice)
- All require gateway restart to take effect.
---
## Entry 77: MiniMax-M3 confirmed operational for: text chat, image generation. Voice cloning...
MiniMax-M3 confirmed operational for: text chat, image generation. Voice cloning requires plan upgrade. TTS works with speech-01-turbo model.
---
## Entry 78: Henry's voice = MiniMax English_Trustworth_Man (TTS). Brian's cloned voice lives...
Henry's voice = MiniMax English_Trustworth_Man (TTS). Brian's cloned voice lives on minimax.io/audio web interface (not accessible via API due to plan). Nick does Brian's voiceover manually on web.
---
## Entry 79: RezMyCV YouTube Short script (45s, no "do the work" CTA): "I clicked LinkedIn Ea...
RezMyCV YouTube Short script (45s, no "do the work" CTA): "I clicked LinkedIn EasyApply 300 times. Zero interviews. 300 million people use EasyApply. Same CV. Same process. ATS systems filter all of us out before a human ever reads our names. I stopped using the same generic CV. Started tailoring every application. 100 applications later — 7 interviews. RezMyCV. 10 tailored CVs free. Link in bio."
---
## Entry 80: RezMyCV launch status (June 4 2026):
RezMyCV launch status (June 4 2026):
- Day 1 (Jun 2): Article on CoinCUstrard — done
- Day 2 (Jun 3): YouTube Long Form video uploaded — done
- Day 3 (Jun 4): YouTube Short — still need to record/film
- Scripts: /Volumes/My Shared Files/UTM/Reddit_YouTube_Scripts.md
- Calendar: /Volumes/My Shared Files/UTM/RezMyCV_Content_Calendar.md
---
## Entry 81: MiniMax API endpoints (verified Jun 5 2026 from platform.minimax.io docs):
MiniMax API endpoints (verified Jun 5 2026 from platform.minimax.io docs):
- /v1 (https://api.minimax.io/v1) — OpenAI-compatible — M3 has 1,000,000 token context
- /anthropic (https://api.minimax.io/anthropic) — Anthropic-compatible — M3 capped to ~512K
- M2.x models (M2, M2.1, M2.5, M2.7): 204,800 tokens on BOTH endpoints
- M2.7-highspeed / M2.5-highspeed / M2.1-highspeed: same 204,800, ~100 tps output
Hermes config: model.base_url in ~/.hermes/config.yaml. Patched 2026-06-05 from /anthropic to /v1 to get 1M context for M3. Gateway restart required + new chat session (context window is locked at session startup, doesn't expand mid-session).
Skill: minimax-endpoints (general) — full reference + probe script at scripts/probe_context_window.py
---
## Entry 82: Hermes config (June 4 2026): model.default = MiniMax-M3 (was M2.7). TTS provider...
Hermes config (June 4 2026): model.default = MiniMax-M3 (was M2.7). TTS provider = minimax, voice = English_Trustworth_Man (Nick's chosen "personal" voice, M3 era). 512K context window. M3 supports image+video input via /anthropic endpoint and /v1/chatcompletion_v2; M2.x do not. Direct API key (MiniMax env var) — base URL https://api.minimax.io/anthropic.
MiniMax API surface (working as of June 4 2026): chat (M2.7, M3), image gen (image-01, model in body, returns aliyuncs URL), TTS (speech-01-turbo, audio field is HEX not base64 — first 4 bytes = "ID3" MP3 header). Voice clone endpoint exists (/v1/voice_clone) but requires upgraded plan — got 2061 "your current token plan not support model, voice_clone". Brian's clone lives on MiniMax web UI; can't be accessed via API.
---
## Entry 83: Henry's voice = MiniMax TTS English_Trustworth_Man (speech-01-turbo model). Set ...
Henry's voice = MiniMax TTS English_Trustworth_Man (speech-01-turbo model). Set in ~/.hermes/config.yaml tts.provider=minimax + tts.minimax.voice_id. User picked this from 3 samples on June 4, 2026 — "will add as your personal voice."
---
## Entry 84: MiniMax TTS API quirk: `data.audio` field is **hex-encoded**, NOT base64. Decode...
MiniMax TTS API quirk: `data.audio` field is **hex-encoded**, NOT base64. Decode with `bytes.fromhex(audio)` not `base64.b64decode(audio)`. First chars `49443304` = `ID3` in ASCII = valid MP3 header. Working model name is `speech-01-turbo` (others like `speech-01`, `speech-02`, `MiniMax-Speech-02` return error 2013 "method t2a-v2 not have model").
---
## Entry 85: MiniMax voice cloning requires paid token plan upgrade. Upload audio file to `/v...
MiniMax voice cloning requires paid token plan upgrade. Upload audio file to `/v1/files/upload` (purpose=voice_clone) → get file_id → POST `/v1/voice_clone` with file_id + custom voice_id. User's current plan returns status_code 2061 "your current token plan not support model, voice_clone". Brian's cloned voice exists on minimax.io/audio web interface but not exposed via API on current plan.
---
## Entry 86: Hermes config (June 4 2026): model.default = MiniMax-M3 (was M2.7), tts.provider...
Hermes config (June 4 2026): model.default = MiniMax-M3 (was M2.7), tts.provider = minimax, tts.voice = English_Trustworth_Man. Ollama-launch.default_model = mistral:latest (reverted from minimax-m3). Nick only uses MiniMax API direct, not Ollama-routed.
---
## Entry 87: RezMyCV blog_posts table (Supabase tfkzirfxixlylizlmxeur): fields = title, slug,...
RezMyCV blog_posts table (Supabase tfkzirfxixlylizlmxeur): fields = title, slug, excerpt, content (HTML), author, cover_image, published, published_at, tags (array), meta_title, meta_description. Read in app.py at /blog (list) and /blog/<slug> (single).
---
## Entry 88: RezMyCV blog_posts: template uses `{{ post.content | safe }}` but content is mar...
RezMyCV blog_posts: template uses `{{ post.content | safe }}` but content is markdown — renders as raw text (##, **, etc visible). Fix path: (1) convert markdown to HTML before storing, OR (2) install `markdown` lib + convert in Flask route. Existing columns: title, slug, excerpt, content, author, cover_image, published, published_at. NO tags/meta_title/meta_description columns exist — don't add to INSERT. Live post: slug `linkedin-easyapply-doesnt-work-2026`, HTML version stored.
---
## Entry 89: MiniMax TTS API quirks (speech model):
MiniMax TTS API quirks (speech model):
- model MUST be `speech-01-turbo` (not `speech-01` or `speech-02` — those return 2013 error)
- Audio field `data.audio` is HEX encoded (not base64) — decode via `bytes.fromhex()`, first 4 bytes are `ID3` (MP3 header)
- Max ~10.5s per call at sample_rate 32000
- Output file path pattern: /Users/Shared/hf-demo/voice-{name}.mp3 works
---
## Entry 90: MiniMax voice_clone (POST /v1/voice_clone) requires PAID plan. Free/token-plan r...
MiniMax voice_clone (POST /v1/voice_clone) requires PAID plan. Free/token-plan returns `status_code: 2061 — your current token plan not support model, voice_clone`. Brian's voice on minimax.io/audio web (can't access via API). 61s sample at /Volumes/My Shared Files/UTM/Brian.mp3 uploaded successfully (file_id 405647936299258) but clone blocked. Upload + clone via API would work if plan upgraded.
---
## Entry 91: Nick wants SEO + AEO optimized blog content (global not HK-specific). Blog post ...
Nick wants SEO + AEO optimized blog content (global not HK-specific). Blog post structure that works: TL;DR quick answer in first 60 words (for AI search engines), FAQ section with 5-7 Q&As (schema-ready), data tables with stats, sources/citations at bottom, JSON-LD FAQ schema. Primary keyword in title + H1 + first paragraph. Long-tail variations in H2s. 8-min read time, 1500+ words.
---
## Entry 92: Model switch done June 4 2026: Hermes `model.default: MiniMax-M3` (was M2.7). Ol...
Model switch done June 4 2026: Hermes `model.default: MiniMax-M3` (was M2.7). Ollama default reverted to `mistral:latest` (NOT `minimax-m3:cloud` per Nick's "forget Max" instruction — Max stays on local Ollama mistral, only Henry uses M3 via direct API). Config saved but requires gateway restart to apply. M3 specs: 512K context, supports image + video input (URL/base64), thinking blocks (default on, can disable), tool use. M2.x models don't support image/video input.
---
## Entry 93: MiniMax API quirks (verified Jun 4-5 2026): TTS model is `speech-01-turbo` (NOT ...
MiniMax API quirks (verified Jun 4-5 2026): TTS model is `speech-01-turbo` (NOT speech-02). Audio response is HEX not base64 — first chars `49443304` = ID3 MP3 header. Decode with `bytes.fromhex()`. Voice clone requires paid plan (error 2061 otherwise). Cloned voices auto-delete after 7 days. Doc shortcut: `curl https://platform.minimax.io/docs/llms.txt` for text index. Image URLs are signed HTTP OSS URLs (need security approval to fetch).
RezMyCV blog rendering bug: `templates/blog/post.html` uses `{{ post.content | safe }}` which dumps raw markdown as text. Fix: add `markdown` lib + convert in route, OR convert md→html before SQL insert. Skill `rezmycv-promotion` updated with the pitfall + a `scripts/md_to_blog_html.py` fallback converter. Until fixed, every new blog post needs a manual `UPDATE blog_posts SET content = '<html>'` after insert.
---
## Entry 94: Project organization pain (June 2026): Nick has 5 Hermes instances running (bizm...
Project organization pain (June 2026): Nick has 5 Hermes instances running (bizmind, clawpack, coinc, gebecert, mingyun) plus main "Henry" + growing project list (RezMyCV, Beepbo, Coincustrard, charity, Bean Boy Comic). Reports Henry gets confused with context bleeding between projects. Wants: dedicated instance per project, self-hosted Slack-like interface (Matrix/Element preferred), Henry as main orchestrator who sees all conversations, sub-agents per project that know their own history. Cron jobs should auto-post summaries to project room. Discussed options June 4 2026, picked "don't build yet, talk more about my day first" — discovery phase ongoing.
---
## Entry 95: Per-instance style/guardrails needed (June 2026): Nick reported two incidents th...
Per-instance style/guardrails needed (June 2026): Nick reported two incidents that revealed gaps. (1) Blog post cron job once deleted entire rezmycv.com website content, had to restore from backup. (2) Coincustrard data video format drifted between renders — words moved from middle to bottom. Plan: each instance gets 3 files at ~/.hermes-X/. style.md (format specs e.g. "1080x1920, red BG, words middle, 0.6s/year, 3s title, 7.6s end card"), guardrails.md (e.g. "never DELETE/UPDATE without SELECT first, never modify prod without backup"), history.md (auto-written cron summaries). Agent reads all 3 on session start. Approved approach, not yet implemented.
---
## Entry 96: Bean Boy Comic (June 2026). Instance live at `~/.hermes-beanboy/`. Persona "Bean...
Bean Boy Comic (June 2026). Instance live at `~/.hermes-beanboy/`. Persona "Bean" (comic-first, MiniMax subject_reference for character consistency). Dashboard name "Bean" via DISPLAY_NAME_OVERRIDES. Telegram disabled (dashboard-only worker). Assets at `/Volumes/My Shared Files/UTM/beanboy-assets/` (characters/, panels/, scripts/, style/). SOUL.md has comic-style prompt guidance. Still needs from Nick: character design brief (what Bean looks like, palette, tone, reference comics), OR "go" to start with placeholder.
---
## Entry 97: Nick Command Base: local Flask dashboard at /Users/nick/.hermes-dashboard/ on po...
Nick Command Base: local Flask dashboard at /Users/nick/.hermes-dashboard/ on port 9130. Retro CRT theme (green glow, scanlines, traffic-light title bar, monospace), left sidebar (Home/Agents/Crons/Obsidian/Coincustrard/New Agent/External), status bar at bottom. Has agent tiles, weekly cron view, Obsidian vault viewer, chat proxy to all 5 Hermes instances, "new agent" form, and Coincustrard local SQLite DB (Notion replacement). Exposed via Cloudflare quick tunnel when Nick is away from Mac. Live URL pattern: cloudflared tunnel --url http://localhost:9130 --no-autoupdate → extract https://*.trycloudflare.com from /tmp/cf-dashboard.log after 6s. Restart script: /Users/nick/.hermes-dashboard/tunnel.sh. Banner text: "NICK COMMAND BASE" (not ANMAP/HENRY — Unicode block art for words is unreadable in most fonts).
---
## Entry 98: Nick: local + tunnel (Cloudflare quick or Tailscale) over Railway for personal d...
Nick: local + tunnel (Cloudflare quick or Tailscale) over Railway for personal dashboards. Railway is wrong for this — it can't see Mac filesystem files like ~/.hermes-*/cron/jobs.json. Use Railway only for production SaaS that doesn't read local files. When Nick says "I need internet access", default to cloudflared quick tunnel (no signup, free, instant URL).
---
## Entry 99: Hermes CLI chat: correct non-interactive syntax is `hermes -z "message" --yolo` ...
Hermes CLI chat: correct non-interactive syntax is `hermes -z "message" --yolo` (top-level -z flag), NOT `hermes chat "message" --yolo`. The `chat` subcommand rejects positional args with "unrecognized arguments" and dumps full CLI help. Set HERMES_HOME + XDG_STATE_HOME env vars for the target instance. 180s timeout. --yolo auto-approves tool calls (subprocess has no TTY).
---
## Entry 100: Notion public scraping is blocked: page HTML is fully client-rendered (no conten...
Notion public scraping is blocked: page HTML is fully client-rendered (no content in source), public loadPageChunk API requires auth and rejects with ValidationError 400. Can't auto-import from Notion. Workarounds: (1) manual export to CSV, (2) Notion integration token at notion.so/my-integrations + share DB, (3) manual entry.
---
## Entry 101: Nick Command Base: Coincustrard local DB at /coincustrard is the Notion replacem...
Nick Command Base: Coincustrard local DB at /coincustrard is the Notion replacement for https://www.notion.so/3029e699c38d80ecbebaf814162574e6. SQLite at ~/.hermes-dashboard/data/coincustrard.db. Schema: id, title, slug (unique), category (AI/Crypto/Tech/Other), status (draft/ready/scheduled/published), source, content, notes, tweet, reddit_post, tags, created_at, updated_at, published_at. Full CRUD + bulk import (JSON or `title | category | status | source` per line). Coincustrard spelling: 12 letters with "str" (C-O-I-N-C-U-S-T-R-A-R-D). The cron job in jobs.json is misspelled as "Coincustard" (missing 'r').
---
## Entry 102: Flask restart: killing the bash wrapper does NOT kill the Python child holding t...
Flask restart: killing the bash wrapper does NOT kill the Python child holding the port. Use `lsof -ti:9130 | xargs kill -9` to kill the actual Python process. Browser cache gotcha: even with TEMPLATES_AUTO_RELOAD, browser shows stale HTML — tell user to hard refresh (Cmd+Shift+R Mac Chrome, Cmd+Option+R Mac Safari, clear site data iPhone).
---
## Entry 103: **Patch + duplicate function definition bug (June 5, 2026):** When using `patch`...
**Patch + duplicate function definition bug (June 5, 2026):** When using `patch` tool to add a function that might already exist in the file, the file can end up with TWO definitions of the same function. Python's "last definition wins" rule means the OLDER code silently overrides the newer code. The running server returns stale behavior even after a successful patch. Detection: `grep -n "def func_name" /path/to/file.py` shows 2 lines. Fix: read both, keep the newer one. Prevention: when using `patch` on a function that may exist, use `execute_code` to dedupe the file first, or `read_file` the whole function block and `write_file` to overwrite rather than `patch`. Common culprits: when the same function gets a small refactor pass after already existing — the patch adds the new version but the old one stays below it.
**Hermes CLI one-shot prompt flag (verified empirically June 5, 2026):** Use `hermes -z "prompt" --yolo`, NOT `hermes chat "prompt" --yolo`. The `chat` subcommand does NOT accept a positional prompt arg — passing one dumps the full CLI usage as the "response" with `error: unrecognized arguments`. The correct form has `-z PROMPT` as a top-level flag. Same `--yolo` for tool auto-approve (subprocess has no TTY to ask). 180s timeout is generous. Set `HERMES_HOME` and `XDG_STATE_HOME` in the env so it picks up the right config. Critical for any dashboard/API code that calls Hermes CLI as a subprocess.
**SQLite field-metadata + dynamic SQL pattern (June 5, 2026):** For any CRUD page where the schema is user-defined or evolves, drive both the form rendering AND the SQL from a single `FIELDS` list + `FIELD_META` dict. Example: `FIELDS = ['date', 'title', ...]` + `META = {'date': {'type': 'date', 'short': True}, ...}`. INSERT: `f'INSERT INTO t ({",".join(FIELDS)}) VALUES ({",".join("?" * len(FIELDS))})'`. UPDATE: `f'UPDATE t SET {",".join(f"{f}=?" for f in FIELDS)}'`. Adding/removing a field = 2 lines. Avoids the "left a `slug` reference in the route when removing the field" bug class entirely.
---
## Entry 104: Hermes dashboard persistent chat: ~/.hermes-dashboard/data/chat_history.db (tabl...
Hermes dashboard persistent chat: ~/.hermes-dashboard/data/chat_history.db (table `messages`: id, instance, role, content, media_path, media_type, media_name, created_at). 5s auto-refresh on /agents/<name> so Henry's Telegram replies show in dashboard too. Uploads dir: ~/.hermes-dashboard/data/uploads/. Next step (not built): Henry writes his own responses to chat_history.db with instance='henry' so the 5s auto-refresh shows them.
JSON error fix for hermes CLI: hermes output can contain control chars (BOM/ANSI/NUL) that break jsonify or r.json(). Server: `output = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', output)`. Also use `request.get_json(force=True, silent=True)`. Client: try/catch around JSON.parse and show raw text on error. Defense in depth.
hermes CLI one-shot prompt: `hermes -z "message" --yolo` (NOT `hermes chat "message"` — chat subcommand doesn't accept positional arg, errors with "unrecognized arguments").
Nick's spelling: "Coincustard" (11 letters, no 'r' in middle) for the brand, but Notion column header IS literally "URL Coincustard" (no 'r'). Field "Focus Keyword" (singular) AND "Focus Keywords" (plural) are two separate columns in his Notion DB.
Remote access for dashboard: Cloudflare quick tunnel is the answer, NOT Railway (Railway can't see local files like ~/.hermes-*/cron/jobs.json). Tailscale for VPN-only. Nick confirmed: "we dont need to have it on railway we just need internet access".
---
## Entry 105: Nick Command Base — local multi-agent dashboard (BUILT June 2026):
Nick Command Base — local multi-agent dashboard (BUILT June 2026):
- Flask app at ~/.hermes-dashboard/ running on localhost:9130
- Public URL via cloudflared tunnel (no account): https://rain-since-performs-provincial.trycloudflare.com
- Henry is the main orchestrator (★ MAIN badge, cyan border) — lives at ~/.hermes (no suffix)
- Other agents: bizmind, clawpack, coinc, gebecert, mingyun, games — at ~/.hermes-<name>/
- Features: agent tiles, chat with each, cron schedule, Obsidian viewer, Coincustard DB (17 fields), new-agent form, file/image/video upload, persistent chat history, live draft sync (Henry sees what you type as you type)
- Coincustard DB at ~/.hermes-dashboard/data/coincustrard.db — 17 fields matching Notion schema (date, category, title, meta_description, meta_tags, story, source_url, image_alt_text, image_title, image_caption, x_post, linkedin_post, status, url_coincustrard, avatar_used, focus_keyword, focus_keywords)
- Chat history at ~/.hermes-dashboard/data/chat_history.db
- Uploads at ~/.hermes-dashboard/data/uploads/
- Live drafts at ~/.hermes-dashboard/data/drafts/<instance>.json (Henry can read these as user types)
- Nick chose local + cloudflared over Railway (data sovereignty — dashboard reads local files, can't host on Railway)
- Tailscale mentioned as alternative for off-LAN access; cloudflared was his pick for now
Games agent (NEW June 2026):
- Workspace: ~/.hermes-games/
- Project: missile-command.html (1276 lines, retro CRT-styled Missile Command clone, green glow, scanlines, vignette)
- Agent reviewed the game: solid core loop, missing sound/pause/high-score/touch/screen-shake
- Style guide: vanilla JS, no frameworks, 60fps, single-file HTML, mouse+keyboard
- Saved review at ~/.hermes-games/reviews/ + /Volumes/My Shared Files/UTM/missile-command-review.md
RezMyCV blog cron — runs at **11pm HKT** (NOT 9am). Cron ID: a0b2435ef44a. The 9am duplicate (5a5dd49882f1) was the wrong one — removed. The 11pm one is correct and is the only RezMyCV blog cron now.
---
## Entry 106: Dashboard (NICK COMMAND BASE) at http://localhost:9130 / cloudflared tunnel: htt...
Dashboard (NICK COMMAND BASE) at http://localhost:9130 / cloudflared tunnel: https://rain-since-performs-provincial.trycloudflare.com. Routes: /, /agents, /agents/<name>, /chat/<name> (compact popout chat for multi-window), /multi-chat (grid of all agents), /crons, /obsidian, /coincustrard, /new-agent. New chat routes added June 5 2026.
Chat text is selectable (user-select: text on .chat-msg, .chat-box, .chat-meta). Copy/paste works in chat. Selection highlight is green/cyan.
Multi-agent chat options:
1. **/chat/<name>** — single agent in standalone compact window. Open multiple browser windows/tabs to chat with multiple agents simultaneously.
2. **/multi-chat** — grid view with all agents in panels, each independently chatable, refreshes every 7s. Each panel has its own input + history. Best for many-agents-at-once.
3. /agents/<name> — full agent detail page (with start/stop, cron jobs, recent activity, chat).
Coincustard 5pm daily cron job created June 5 2026:
- ID: 683a4bc7821c
- Schedule: 0 17 * * * (5pm HKT daily)
- Script: /Users/nick/.hermes/scripts/coincustard_daily.py (no-agent mode, script stdout delivered)
- Calls Coincustard Hermes profile to generate AI crypto+tech article, parses JSON, INSERTs into dashboard DB at ~/.hermes-dashboard/data/coincustrard.db
- Backup .md saved to /Volumes/My Shared Files/UTM/coincustard-DATE-slug.md
- Hermes call: HERMES_HOME=~/.hermes-coinc, model=MiniMax-M3, provider=minimax. Note: `hermes -z` does NOT take -Q flag (only `hermes chat -q` does).
- Test run succeeded: article #4 inserted (JPMorgan/BofA/Citi tokenized deposits).
hermes -z = non-interactive (NOT chat subcommand). Use `hermes chat -q` for chat-subcommand one-shot. Don't mix flags between modes.
---
## Entry 107: Hermes instances (6 total, not 5): Main, bizmind, clawpack, coinc, gebecert, min...
Hermes instances (6 total, not 5): Main, bizmind, clawpack, coinc, gebecert, mingyun + games (~/.hermes-games/, added later for Pokemon/gaming sub-agents). 5-instance restart recipe (bizmind clawpack coinc gebecert mingyun) does NOT include games — must add explicitly. Games also currently shares Main's Telegram bot token — silent polling conflict flap, not a fatal startup error. Fix: give games its own @BotFather token. Diagnostic for "Telegram bot not working" with no startup error: `for dir in ~/.hermes ~/.hermes-*; do grep -A1 "^telegram:" "$dir/config.yaml" | grep "token:"; done` and look for duplicates.
---
## Entry 108: Hermes Orchestrator (dashboard) at /Users/nick/.hermes-dashboard/app.py, port :9...
Hermes Orchestrator (dashboard) at /Users/nick/.hermes-dashboard/app.py, port :9130. Python 3.9 Flask app, supervises all Hermes instances via KNOWN_INSTANCES list ['henry', 'bizmind', 'clawpack', 'coinc', 'gebecert', 'mingyun', 'games']. Respawns gateways via POST /api/instance/<name>/start → subprocess.Popen(['/bin/bash', start.sh], start_new_session=True). When killing an instance gateway, the parent bash (start.sh) survives; check ~/.hermes-dashboard/server.log for `POST /api/instance/<name>/start` lines to find what triggered respawn. To make a kill stick permanently: give the instance its own unique Telegram token (real fix), or kill the orchestrator itself (nuclear). Stop endpoint is advisory only — does not prevent respawn. Games instance currently shares Main's Telegram token `8771432492:***` — known conflict, fix pending.
---
## Entry 109: Nick's ElevenLabs voice_id: ezzquwW0U4sVYqmNGAEY (cloned, "Nick (you)" in FALLBA...
Nick's ElevenLabs voice_id: ezzquwW0U4sVYqmNGAEY (cloned, "Nick (you)" in FALLBACK_VOICES top of dashboard /voices dropdown). Use for TTS-as-Nick. Distinct from Brian (different person, MiniMax English_Trustworth_Man TTS, web-only). ElevenLabs API key works for TTS, lacks voices_read scope — shows fallback list (8 premade + Nick). Regenerate key with voices_read to enable live voice listing.
---