Agent Landing

You are an AI agent working in levander's Obsidian vault.

This note is your map. Read it first, then follow the links to what you need.

Vault Purpose

This is a personal knowledge base covering several active software projects and a full dev-environment reference. The owner (levander / Andras) is a developer who works with AI agents daily — everything here is written to be agent-friendly.

Vault Structure

levandor_obsidian/
├── Agent Landing.md          ← you are here
├── projects/
│   ├── ai-project-brain/     ← Rust workspace on grafeo (embeddable graph DB) — scaffold stage
│   ├── alpiq-bess/           ← Rust/Python BESS platform (Alpiq)
│   ├── buttonbox/            ← Two-button ESP32 gizmo in a gutted pushbutton station
│   ├── facekom/              ← Enterprise KYC/eKYC platform (TechTeamer)
│   │   └── investigations/   ← ticket-level deep dives
│   ├── homelab/              ← Physical/on-prem infra: OpenWrt router, LAN, WiFi, tailnet
│   ├── inventory/            ← Vault-level electronics parts inventory (what is physically owned)
│   ├── levandor-crm/         ← Personal CRM (React + Supabase)
│   ├── levandor-infra/       ← GCP VM provisioning, Terraform + Ansible, deployed
│   └── txarchive/            ← txArchive 2025 rewrite (Supabase backend + Vite/React SPA)
│
│   Every projects/<project>/ folder also contains:
│     LOG.md                  ← reverse-chronological session log
│     TOPICS.md                ← theme index of recurring work areas
│
└── .agents/                  ← AgentOps artifacts (not vault content)

Projects — Where to Look

ProjectEntry PointAgent ContextKey Tags
Alpiq BESS (Mando)Alpiq BESSBESS Agent Context#alpiq, #bess
FaceKomFaceKomFaceKom Agent Context#facekom
Levandor CRMlevandor-crmCRM Agent Context#levandor, #crm
Homelab (physical infra)homelabPhysical/on-prem infra — distinct from levandor-infra, which is cloud-only. Site gateway telep-router (Asus RT-AX89X, OpenWrt 24.10.0) reachable at /usr/bin/ssh root@telep-router over Tailscale. Site is double-NATed with no public IP — use Tailscale, not port-forwards.#project/homelab
Levandor Infra (GCP Terraform)levandor-infraSpec 1 deployed (ops-vm live); Spec 2a in design: see gcp-app-deploy-design. How-to: agent-guide-provision-new-vm, agent-guide-configure-app-deploy#project/levandor-infra
txArchive 2025txArchive 2025 Rewrite— (see overview note)#project/txarchive
dionysus (news engine)dionysusDesign phase — see dionysus-architecture-decisions. Platform-first news-aggregation microservice in the trading empire (GDELT-spine, Postgres+Qdrant, NATS JetStream, Tailscale-native)#project/dionysus
babylon (agent coord MCP)babylonDEPLOYED + cutover Phase 1 IN PROGRESS (2026-06-09, pin 4fe5cdb). Fleet migration from AGENT_HANDOFF.md is staged in 4 phases — see babylon-migration; per-agent wiring is in babylon-operator-crib-sheet. Host layout / Ansible role / Litestream / CLI: babylon-deploy-notes. Build + audit: babylon + babylon + babylon-design-decisions. Token-saving Rust MCP server (rmcp 1.7 Streamable HTTP, Tailscale, SQLite).#project/babylon
position_manager (pmv2)position_managerpmv2 fleet’s order-execution gate. Fail-closed: resolves autotrade mode from the message-body order.source (NOT the NATS subject) against pmv2_autotrade_sources; unknown source → Mode::Off, silently skipped. Pinned pmv2-contracts 4c7a54f (SCHEMA_VERSION=2). See the 3-way source invariant + source-rename gotcha.#project/position_manager, #pmv2
esbuild-fivemesbuild-fivemFiveM (FXServer) resource template — TypeScript bundled via esbuild, split server/client/common builds (two independent runtimes). On Node 22 as of node16-to-node22-migration.#project/esbuild-fivem
WiFi Transmitter Hunterwifi-hunterRPi 5 + iPhone tool for physically hunting a WiFi transmitter. Single-radio: wlan0 hosts a hotspot AND scans the full band simultaneously (no USB dongle — see pi5-scan-while-ap-mode). Python 3 stdlib HTTPS server on port 8443; iPhone Safari reads GPS + compass and draws a plane-fit RSSI-gradient arrow. Pi at ssh raspi (eth0 192.168.1.200).#project/wifi-hunter
Tatabánya Mesh (Meshtastic)tatabanya-meshPersonal hobby: friends-only isolated Meshtastic LoRa mesh over Tatabánya on EU_868 (license-free). Isolation = custom PRIMARY channel + random 256-bit PSK, MQTT off. Security caveat: AES-CTR gives confidentiality but no authenticity (PSK-holder can impersonate any node); run firmware ≥ 2.7.15 (CVE-2025-53627). Range comes from height-over-terrain — Turul/Kőhegy ridge (~320m) solar repeater is the biggest jump. See tatabanya-mesh.#project/tatabanya-mesh
voice-agent (AI receptionist SaaS)voice-agentNew 2026-07-21, repo ~/coding/voice_agent (greenfield). Multi-tenant AI receptionist as a Rust-native cascaded voice pipeline on Twilio Media Streams. Vendor landscape researched → three decisions: cascaded not speech-to-speech (voice-agent-speech-to-speech-disqualification-2026-07-21 — alphanumeric read-back corruption, name-triggered language drift, no verbatim guarantee), own Rust runtime not Pipecat/LiveKit (voice-agent-latency-budget-2026-07-21~480ms of a measured 1,048ms loop is unaccounted orchestration overhead), Twilio despite being priciest (voice-agent-telephony-carriers-2026-07-21 — suspension risk ≫ a 0.0326/min. Gotcha: TTS concurrency caps, not price, are the binding constraint (ElevenLabs 15 concurrent even at $990/mo).#project/voice-agent
cluzter (wiring diagram editor)cluzterNew 2026-07-30, repo ~/coding/cluzter (wowjeeez/cluzter, spec only — no code yet). Browser editor for vehicle wiring diagrams that are both buildable (cut list + BOM) and printable (large-format colorized factory-style sheet, colour or mono). Subject vehicle: 1995 Geo Tracker 1.6 16v (G16B), Suzuki Vitara/Sidekick platform, JIS/Suzuki slash colour notation. GUI-first opaque .cluz zip; pure-TS engine/ with a CI-enforced no-React/no-DOM boundary; SVG renderer; 7 phases (P1–P3 = minimum useful tool). Decision trail incl. the two reversals: cluzter-design-decisions. Read cluzter-wiring-gotchas before touching colour codeBL silently rendering black is the canonical failure, and JIS B(black) vs Bl(blue) is the same trap. Successor to pipeline (imports its 5-field jot grammar).#project/cluzter
szig/felmeres (CAD Lite survey app)szig-felmeresFindability stub only. ~6.5k-line React 19 + react-konva floorplan/area survey app at ~/coding/szig/felmeres (wowjeeez/fodemsz-felmeres); metre world-space, Area/Subtractions layers, pure-TS engine/, Cloudflare PWA. All its design docs live in-repo under docs/plans/ (core: 2026-02-16-cad-lite-engine-design.md) and are NOT mirrored here. Explicitly rejected as a template for cluzter — do not port patterns between them.#project/szig-felmeres
carpi-2din (Pi 5 car head unit)carpi-2dinNew 2026-08-04. Personal hardware: 3D-printable ISO 7736 2DIN enclosure for a Raspberry Pi 5 + 7” 1024x600 HDMI panel, modelled in Fusion 360 over the fusionMCP server. Two-part FDM print (shell + bezel), 2.4 mm walls. Governing gotcha: a 7” panel is exactly 100 mm tall = the full 2DIN body height, so it cannot sit inside the shell — it is captured in a 5.5 mm bezel pocket in front of the flange. Screw band is hard-derived: M3 at (±85.5, ±35) is the only x that clears the panel pocket AND keeps the r3.5 boss inside 178 mm. Full numbers: 2din-enclosure-geometry-spec. Fusion API lessons (cm units, Design.castNone, TemporaryBRepManager+BaseFeature over sketch/extrude, Z-up, viewport.fit()): fusion360-mcp-scripting.#project/carpi-2din
offroad-armour (underbody armour CAD)offroad-armourNew 2026-08-04. Personal CAD: offroad underbody armour in Fusion 360 over fusionMCP. Two unrelated models, two separate Fusion docs. (1) 2005 Jeep Grand Cherokee WH five-segment skid plate set — 4 mm plate, 30 mm upturned flanges, stations Y 350–3800 on the centreline, segments 01–04 butted with a 150 mm gap before the tank plate; “JEEP” cut through segment 01 needing stencil tie bars for the P’s counter: wh-grand-cherokee-skid-plate-set. (2) 1995 Geo Tracker / Suzuki Sidekick front diff shield — 3/16 in steel faceted cradle, 895 cm³, ~7.0 kg: geo-tracker-front-diff-shield. WARNING: every dimension in this project is an ESTIMATE — nothing was measured off a vehicle. WH numbers come from published WK/WH platform figures; the Tracker shield is sized around a guessed 230 mm pumpkin sphere. Read geo-tracker-front-diff-dimensions-research before searching for Sidekick/Tracker front diff dimensions — that search has been run to exhaustion and no published data exists. Fusion API gotchas 5–9 in fusion360-mcp-scripting originated here.#project/offroad-armour
kickfix (1995 Geo Tracker repair)kickfixNew 2026-08-04. The vehicle side of the 1995 Geo Tracker — bodywork, factory specs, repair marking. Name comes from kick-fix.com, the dead Sidekick/Tracker community site archived in the homelab knowledgebase, and from the /kickfix-docs/ URL segment the factory sheets are served under. (1) geo-tracker-body-dimensions-sae-j1100 — verbatim GM SAE J1100 sheet (MY1994, issued 9-93, 2-door convertible + hardtop): wheelbase 2200, length 3620, width 1630, height 1654 4WD / 1633 2WD, 45.0° windshield, 15.5° tumble-home, curb masses, fiducial marks. Retrieval gotcha: WebFetch returns only the mkdocs nav shell — use curl + HTML strip. Approach/departure/breakover angles did NOT survive OCR — do not cite them. (2) geo-tracker-body-model-fusion — 33-named-body whole-body Fusion 360 model as a canvas for marking repairs; Y=0 at the front axle, +Y rearward, Z=0 at ground. Open questions: the sheet is MY1994 but the car is a 1995 (carry-over is an inference), and the claimed 85 kW does not match the G16B’s ~70–71 kW. Fusion gotchas 10–11 originated here. Same vehicle as cluzter, hardcut, offroad-armour.#project/kickfix
3D Printing (hardware + materials)3d-printingNew 2026-08-07. Bambu Lab H2S + AMS 2 Pro — 350 °C hotend, 65 °C active heated chamber, runs the whole Bambu lineup; PPS-CF/GF is printable only on H2 Series + X1E. Full filament matrix (AMS feeding, drying, hardened-nozzle requirements, temps, HDT/impact/tensile, EU pricing, bulk-sale scope): bambu-h2s-material-reference. Two gotchas: (1) AMS 2 Pro maxes at 65 °C and is “Not recommended” for drying ABS/ASA/PC/PA/PAHT-CF/PET-CF/TPU — only AMS HT (80–85 °C) covers them; (2) PET-CF, PPA-CF and PPS-CF are external-feed only (PPA-CF exits via the TPU backplate port even with an AMS HT). Nozzle material is fixed per size, not a purchasing choice — 0.4/0.6/0.8 and 0.4 High Flow are all hardened steel, only 0.2 mm is stainless; the stock 0.4 mm is therefore CF-capable out of the box (an earlier “verify the nozzle is hardened” warning here was a misreading of the wiki and has been corrected). 0.4 mm is Bambu-tested for PLA-CF/PETG-CF; use 0.6 mm for PA-CF/PET-CF/PPA-CF/PPS-CF; 0.4 High Flow is “Not recommended” for any filled grade. Working set: PC FR (ECU box), PAHT-CF (high-temp/structural), PETG-CF (general CF), PLA/ASA Aero (weight-critical RC). PET-CF rejected as default — 5/1/5 means stiffest but impact 1/5, and no AMS feed. Bulk sale covers commodity PLA/PETG/ABS only. Feeds the printed parts in carpi-2din.#project/3d-printing
KrakenPi CarBox (SDR car enclosure)krakenpi-carboxNew 2026-08-26, files at ~/Documents/sdr/KrakenPi_CarBox. 3D-printed in-car enclosure for a KrakenSDR + Raspberry Pi 5 direction-finding rig with a 12 V power bay, Fusion 360 over fusionMCP. Model verified, NOT printed. The mechanical half of 2026-08-12-krakensdr-doa-rig — same physical hardware, the electrical/software side lives under projects/homelab/. ⭐ The source of truth is a Python file, not the Fusion document: build_carbox.py wipes the active design and rebuilds it from a single CONFIG block every run, then self-checks and re-exports — so any manual edit in the Fusion UI is destroyed on the next run. The Fusion doc is now saved as rpi_kraken_car_case (Default Project cloud folder), but is still disposable. 🔀 NOW v2 — a THREE-part split, superseding the v1 one-piece box (kept as build_carbox_v1_onepiece.py, its exports in old_onepiece/): floor 312 x 145 x 3 (bosses to Z=7 — every mount boss, prints first in ~2.5 h so hardware can be bolted in and wired while the frame prints), frame 312 x 145 x 44, lid 312 x 145 x 2.4, joined by 10x M3 up through the floor into 10 x 8 x 7 bosses. Split because the printer has only a 0.4 mm hotend and v1 was a ~15 h single print. The frame is its own body (block → fillet → shell removing BOTH Z faces), not a sliced box — that decouples WALL from FLOOR. Material 384 → 291.6 cm3 (−23 %): WALL 3→2.5, LID_T 3→2.4, 6 mm lid grilles at 10 mm pitch, floor lightening grid; FLOOR stays 3.0 (structural, and the M3 heads recess into it). Assembled 312 x 145 x 49.4; Kraken at X 13–190.3 on 4 mm standoffs, cased Pi 5 at X 201–299.5 on 3 mm standoffs, Ø28 x 40.5 adaptor in twin ribs. Full spec: carbox-enclosure-geometry-spec. 🔴 The headline lesson: the CABLE CORRIDOR. Building the wiring mockup exposed that the socket ribs walled off the back cable channel and the mid-span lid posts sat in it — the Kraken’s PWR/DATA leads had no route to the adaptor or the Pi. Fixed by sinking the lid posts 2 mm INTO the wall (_PC = WALL + POST_D/2 - 2; also required because the split frame has no floor to stand them on), SOCKET_Y 115→108 / RIB_Y0 92→88, and a RIB_NOTCH at Y 125..136, Z 8..32 through both ribs. CABLE_Y = 131 is now a named constant. ⚠️ A spot check passed — only a full line scan would have caught it; the build now scans X 40..250 at three Y offsets and fails if any point is solid. 🔩 Blockers before printing/ordering: (1) ⛔ no PLA — a parked car hits 70–80 °C (ASA/PETG/PC; the AMS 2 Pro cannot dry ASA or PC); (2) order M3x16 button head — the Kraken is fixed by its own case-assembly screws, so a 3 mm floor puts the stock M3x12 out of reach; (3) the switch cutout leaves only a 0.3 mm web to each screw hole, now in a 2.5 mm wall; (4) thread the 12 V wire bare before crimping — the 3.4 x 6.7 mm entry passes conductor, not connectors. 📐 Read krakensdr-pi5-reference-dimensions before searching for Kraken or Pi 5 mechanical numbers — that search is done: Kraken 177.3 x 113.5 x 25.86 mm (+4.7 fan guard), 8x M3 pattern 162.6 x 88.8, 5-SMA bank offset −1.7 mm from the body centreline; official Pi 5 case 98.5 x 70.3 x 33 with no external mounting feature; Pi 5 board 58 x 49 M2.5 — but where the board sits inside the case is unpublished, hence ±2 mm slotted mounts. ⚠️ LED trap: the 24.4 mm figure is the LED’s overall length INCLUDING LEADS, not a panel dimension — v1 modelled a 24.4 x 6.5 rectangular window and was wrong; the real feature is a Ø6.6 bore + Ø14 x 4 collar. 🧪 Verification standard worth copying: 102 pointContainment assertions run inside the build script plus a 1 260-point corridor line scan, and the negative asserts are the valuable half (the wall between two SMA slots, the 0.3 mm web, post bodies, counterbore floors must still be SOLID) — renders see through an opening to the far wall and will lie about an enclosure, and a spot check is not a scan. Fusion API gotchas 12–26 originated here: fusion360-mcp-scripting.#project/krakenpi-carbox
Parts Inventory (cross-project reference)inventoryNew 2026-09-02. A reference area, not a project — and deliberately a note, not a system (an inventory/reorder system was asked for on 2026-08-13 and withdrawn nine minutes later; do not build workflows on it). The single record of what electronics stock is physically in the house, so it stops being re-derived from raw order XML — the contents of HESTORE order H26/7333913 (placed 2026-08-08, arrived 2026-08-11, 26 line items, 84 100 Ft ex-VAT, boards alone 47 600) had been independently reconstructed by at least four separate agent runs. ⭐ The rule that makes HESTORE navigable: the cikkszám IS the product URL number with dots insertedhestore.hu/prod_10022512.html100.225.12, split 3-3-2, dots optional in cart imports, so any URL yields a part number and any part number yields a page. Cart import is <hestore><item cid="…" quantity="…"> XML (UTF-8 or ISO-8859-2; tab/semicolon CSV also works; quantity-multiplier box on the Kosár page) — and a double hyphen is illegal inside an XML comment, so <!-- ---- --> breaks the file. ⚠️ The cart XML on disk is NOT the order as placed: 5× CJOY-XYSW added after export, lab PSU (37 900 Ft) + oscilloscope (111 000 Ft) removed before placing — which is why neither exists. 🔴 Standing hazards: IRLML6344 and BAT54S are both 3 mm black SOT-23 and indistinguishable once loose (one type out of its bag at a time); the logic analyzer must capture at 1 MHz, never 24 MHz (zero capture memory, silently drops samples); the single XL4015 is currently set to 6.0 V for lightaim and is a configured part, not free stock. 🕳️ Biggest gaps: zero ceramic capacitors (the kit is electrolytic-only — nothing anywhere is decoupled), one buck converter, no JST, no F-F jumpers, no bench PSU, no scope, no ESD kit. ⭐ The note’s governing epistemic rule: the absence of a record is not a record of absence. It ships with an Owned but Undocumented section — 3 soldering irons (models UNKNOWN) and a multimeter that appear in no order, no note and no transcript; four separate agent runs had wrongly concluded there was no iron at all. The note is explicitly not exhaustive and invites additions — treat “not in the inventory” as unknown, never as absent. ❓ UNRESOLVED: /Users/levander/Downloads/hestore_20260124.txt, a 17-line list with no order confirmation and zero references anywhere — it holds the 100 nF ceramics, 1000 µF bulk, TVS diodes and a sixteenth ESP32 that are otherwise about to be re-bought; physically check the drawers first. hardcut-bench-inventory is now the hardcut-scoped subset (9 of 26) and is superseded for global purposes. ⸻ Extended 2026-09-03, corrected 2026-09-07, and the note now has FOUR tiers that must not be conflated — OWNED / ON ORDER, UNRECONCILED / NOT PLACED / WISHLIST.inventory carries 53 line items and 248 units transcribed verbatim from ~/Downloads/hestore_20260902_merged.xml — and confirmed 2026-09-07, that cart was NEVER PLACED. It is neither owned nor on order: a prepared cart file awaiting import, so every line in it is plain wishlist and closes no gap. ⭐ The failure is the reusable part — a bare “ordered” mid-session must be pinned to a specific vendor before it is written down as a status. The status came from one message, “ordered document everything” (2026-09-02 22:26), typed an hour after the topic had moved from HESTORE to protechshop/QBRICK; the word inherited the wrong vendor and promoted a wishlist to a purchase. If it cannot be pinned, it stays WISHLISTinventory. ⚠️ Before that cart is imported, four things are still open — 8 lines (17 553 Ft) are commented out and will not be imported, the M5 bolts were never added, the 2026-01-24 list overlaps it, and two lines are unverifiedinventory. ⭐ New listing rule: the fastener suffix tells you the head type — DBKNY = ISO 7380 BUTTON HEAD (1.65 mm), HBKNY = DIN 912 socket cap (3.0 mm) — load-bearing because the krakenpi-carbox recesses are 1.8 mm deep. ❌ inventory records seven searches already run to exhaustion: no I2C fuel gauge of any kind, no Dupont 2.54 crimp assortment, no M8 13 mm-AF hex head, no M3 self-tapper for a 3.0 mm pilot, no 1.9 mm-screw panel switch, no bench function generator under 100 EUR, no no-PSRAM ESP32-S3 devboard — and no XC6220, with nothing in stock meeting both low-Iq and 500 mA+ (closest HT7833-A 100.478.84, ~4 µA Iq but 450 mA, marginal against 350–500 mA WiFi peaks, workable only with 100 µF+ bulk). 📦 A QBRICK System ONE storage system is on order from protechshop.hu — 2× Organizer L (16497) + 1× Organizer 2 XL + QS ONE Connect (16508). ⭐ This is the order that really was placed (~44 400 Ft) — do not conflate it with the un-placed HESTORE cart — and it is still unreconciled: no confirmation, no delivery record.Unknown whether the Knipex Super Knips (08311, 10 501 Ft) went in with it. ⚠️ The QS ONE Connect adapter is a WALL/FLOOR MOUNTING BRACKET, NOT a cross-line coupler — System ONE does not connect to the System PRO cases already owned, accepted deliberately. ⭐ The reusable reasoning: depth is reversible, shallowness is not — this overturned an earlier shallow+deep recommendation — and subdivision comes from nested inserts, not from buying shallower boxes. 🔴 QBRICK does not solve two things: the bins are open cups (a lidded SMD box must be nested for the indistinguishable SOT-23 parts) and 18650 cells need their own case (a short-circuit and fire path, not untidiness). Do not decant the kits; Gridfinity printing rejected as a second parallel system; order by EAN, not by photo (RED Ultra HD differs by material, impact-tested below 0 °C, not only colour) and beware “habszivacs betét” = foam insert = the version WITHOUT bins. 📍 Every owned-stock table now carries a Location column, initially _unassigned_ — do not invent locations. 🛒 New wishlist blockers: a JST-PH crimper (Engineer PA-09 / IWISS SN-28B — ⛔ not the Knipex 08650, which is an RJ crimper), magnification, a label maker, and the Knipex Electronic Super Knips 125 mm (protechshop 08311; skip the insulated 16042 — insulation is for live mains, not lead trimming).#project/inventory, #inventory
ESP32 (cross-project reference)esp32New 2026-08-13. A reference area, not a project — the reusable silicon/toolchain/wiring layer shared by lightaim, hardcut and the RuView CSI node, consolidated so an agent can hit it cold instead of needing to know which project paid for the lesson. Every entry carries the symptom. Headline traps, all of which look healthy while broken: S3 LEDC caps at 14-bit duty resolution (16 → LEDC never initialises, zero PWM, rest of the firmware fine); ADC2 is unusable whenever WiFi is active (ADC1 = GPIO1–10 on S3, GPIO32–39 on classic); uvx --from platformio needs --with pip; flash over the CH343 UART port (1a86:55d3) — the native USB/OTG port (303a:*) cannot flash a board that is already running firmware and this has now bitten two separate projects; S3 bootloader goes at 0x0, classic at 0x1000; core pinning does NOT isolate an ISR from WiFi and flash write/erase stalls task code for milliseconds (the real threat); feed joystick/pot +5V pads from 3V3; never power a servo off the board’s 5 V pin. Boards on hand: 10× ESP32-S3-WROOM-1-N16R8-M (PCB antenna) + 5× ESP32-DEVKIT-32UE-4M (classic, U.FL — the scarce antenna-capable stock); note WROOM-1 has no U.FL, only the “U” variants do, and the connector is worth 10–20 dB where the antenna itself is worth ~1. Battery / deep sleep / low power is a separate note — esp32-battery-deep-sleep (added 2026-09-02, the vault’s first low-power content; every ESP32 project so far is mains- or vehicle-powered and always-on): DevKit carrier boards sleep at 20–45 mA vs 7–10 µA for a bare WROOM-1 (~3000×; ~4 days vs ~30 years on an 18650), so the 5 DevKits are unusable on a battery; ESP8266 cannot wake from deep sleep on a GPIO at all; WS2812 draws ~1 mA showing black; power-bank/boost modules (MH-CD42, IP5306) shut their own output off below ~40–50 mA; LDO Iq can exceed the MCU (AP2112K 55 µA → use XC6220); an NC switch on the internal pull-up burns 73 µA; ext1 ANY_LOW entered with a pin already low = infinite wake loop. ⸻ Added 2026-09-03: ⭐ the 5-column breadboard geometry rule — a standard breadboard is 1.1 in (27.9 mm) outermost row to outermost row (five rows spanning 0.4 in, a 0.3 in channel, five more spanning 0.4 in), so free rows per side go 0.3 in → 4+4, 0.6 in → 2+3, 0.9 in → 1+1, 🔴 1.0 in (DevKitC / 32UE) → 1+0, 1.1 in → 0+0. At 1.0 in half the GPIOs are physically unreachable, and NO larger breadboard fixes it — width is fixed across every standard breadboard. The fixes are more boards (one per ESP32), two boards butted with the facing power rails removed, F-M jumpers to lift the board off entirely, or a 0.6 in pitch board. ✅ Correction: the BB-102 is a FULL SIZE 56 × 165 mm, 630 + 200 tie-point board, not a 170-point mini — earlier sessions assumed otherwise and the wrong fix (a bigger breadboard) was nearly ordered. New downstream project: buttonbox.#project/esp32
hardcut (ignition-cut rev limiter)hardcutDesigned 2026-07-29, planned 2026-08-08, code root ~/vitara/hardcut (empty — parked, nothing built). ESP32-S3 two-step launch limiter + main rev limiter for the 1995 Geo Tracker 1.6 16v MPFI (G16B), 3L30 auto, catless, by shunting the ECM’s spark command IGt (pin A4, Orange) to ground. Parallel open-drain taps — no harness cut, and an unpowered box is electrically a stock car. Core insight: this OBD1 ECM cuts fuel when spark is lost, so a naive hard cut gives a stumble and no bang; the fix is a hard cap of 5 consecutive cuts so the ECM’s miss counter keeps resetting — which is also what keeps fuel flowing for the bangs. Bang intensity comes from consecutive cuts, not ratio — a 100% cut is the quietest setting. HAZARD: the falling edge is the spark, so asserting mid-dwell fires a plug at a random advance angle; a 74HC74 flip-flop clocked on IGt’s falling edge makes that physically unreachable. Design 2026-07-29-hardcut-design, 14-task plan 2026-08-08-hardcut-plan. Three physical gates before any build: ECM cavity count (22+26) + VIN, the 220 Ω source-impedance test (R_out < 60 Ω kills the shunt approach), and a stall test to replace the placeholder launch RPM. Same vehicle as cluzter, kickfix, lightaim, offroad-armour.#project/hardcut
hardcut (ignition-cut rev limiter)hardcutNew 2026-07-29, code root ~/vitara/hardcut (empty — Task 1 unstarted, no git init). Bolt-on ESP32-S3 two-step launch limiter + configurable rev limiter for the 1995 Geo Tracker 1.6 16v MPFI (G16B), 3L30 automatic, catless. Suppresses individual ignition events by shunting IGt (ECM A4, Orange) to ground, capped at 5 consecutive cuts so the ECM’s miss counter keeps resetting and never cuts fuel — the surviving fuel is what makes the bangs. Nothing in the harness is cut; unpowered or hung = stock car. Status: PARKEDdesign and 14-task plan complete, parts reported in hand, but the car isn’t running and the bench isn’t built. 🔴 Three physical measurement gates come before anything on the car and are surfaced at the top of hardcut: count the ECM coupler cavities (22-pin A + 26-pin B) + VIN 8th digit, because every pin number is Vitara-manual-sourced; then the 220 Ω source-impedance test on IGtif R_out < 60 Ω the whole parallel-shunt approach is abandoned; then a stall test to replace the placeholder 2,500 rpm launch limit (the quoted 2,300–2,600 is the 4-speed’s, not the 3L30’s). ⭐ The plan replaces the design’s software mid-dwell check with a 74HC74 D flip-flop clocked on IGt’s falling edge, making the one engine-destroying bug (asserting mid-dwell fires the plug at a random advance angle) physically unreachable. Tasks 1–5 + 11 are pure C++ in lib/core/ with 28 native unit tests — no hardware needed to start. Same vehicle as cluzter, kickfix, lightaim.#project/hardcut
lightaim (joystick-aimed vehicle light)lightaimNew 2026-08-12, code ~/vitara/lightaim. Bench-working end to end. ESP32-S3-WROOM-1 + CJOY-XYSW joystick (X axis only, GPIO1/ADC1) + MG996R servo (GPIO5), PlatformIO/Arduino, single src/main.cpp. Core decision: velocity control, not position control — deflection sets the rotation rate and the angle is integrated, so releasing the stick leaves the light aimed; position control was rejected for snapping back to centre. Bring-up trail + reusable ESP32-S3 gotchas: 2026-08-12-lightaim-bench-bringupuvx --from platformio needs --with pip (PlatformIO shells out to pip), S3 bootloader flashes at 0x0 not 0x1000, only the CH343 UART port (1a86:55d3) flashes a running S3, and LEDC caps at 14-bit duty resolution (SERVO_RES_BITS=16 → no PWM at all while everything looks healthy). HAZARDS: the joystick’s +5V pad must go to 3V3 (divider — 5 V reaches a 3.3 V ADC pin and kills it); set ANGLE_MIN/MAX_DEG to real mechanical limits before bolting to the horn (a stalled MG996R strips gears in seconds); never power the servo off the board’s 5 V pin (~2.5 A stall). Wiring is WireViz (wiring/{bench,vehicle}.yml, chosen over Fusion Electronics — no MCP, PCB-oriented, custom symbols needed). Not vehicle-ready: only one buck was ordered — the 5 V logic rail, 2 A fuse, SMBJ33A TVS and reverse protection are unbought. Open: parked vs moving (wind load at speed wants a worm drive or DS5160). Same vehicle as cluzter, kickfix, 2026-07-29-hardcut-design. ⸻ Two corrections added 2026-09-03, both of which change what you would otherwise conclude.“Full speed” is a CODE CONSTANT, not a power limit: MAX_RATE_DEG_S = 60.0f in src/main.cpp caps slew at 60 °/s while an MG996R at 6 V does ~430 °/s, so the rig runs at ~1/7 of mechanical capability; the XL4015 at 6.0 V has never browned out and no current has ever been measured. A UBEC + 2200 µF purchase was cancelled on this. ⛔ But it is a PREREQUISITE, not a follow-up, that ANGLE_MIN/MAX_DEG come off their untouched 0/180 defaults FIRST — a stalled MG996R strips gears in seconds and faster slew makes hitting a stop more likely. ⚠️ There is NO sender/receiver split — confirmed by exhaustive search: one ESP32-S3, all wired, joystick cabin-mounted on a 4-wire run (W9) back to the same board. A battery-powered joystick “sender” is a brand-new proposal introduced 2026-09-02 with no transport chosen — treat it as a proposal, never as existing architecture.#project/lightaim
slv1 (Solana meme-coin trading)slv1New 2026-07-03, repo ~/coding/slv1. Strategy #1 (Jito-shreds copy trading) analyzed over 2 research rounds → conditional GO, sharpened: desk research exhausted, next step is a 2–4 wk measurement-rig MVP on managed feeds; build feed-agnostic (Jito ToS revocable), no colo before the Rotor SIMD lands (initial Alpenglow keeps Turbine, shred edge survives). Key fact: mirror trades land slot N+1 at earliest — edge is wallet selection, not latency. See slv1-copy-trading-feasibility-2026-07-03. Strategy #2 (market-intel sniper) queued.#project/slv1
Aposemati (phone-as-camera)aposemati🟢 PHASE 2 IS COMPLETE as of 2026-08-25 — live preview works.Start at aposemati-phase2-live-preview: 33 commits, 418 tests, both apps building at c29f84d. JPEG frames from the phone through a 12-rung quality ladder, fragmented into QUIC datagrams, reassembled against a 200 ms deadline on the Mac, decoded and displayed — a lost fragment costs exactly one frame, never the stream, measured on two real QUIC ends (77 lost fragments destroyed 49 frames, 1.57 against 1.46 predicted). ⏸️ The JPEG-vs-H.264 verdict is deliberately blank pending hardwaredocs/superpowers/phase2-results.md is a measurement gate, and one reading decides two verdict rows at once: the delivered AVCaptureVideoDataOutput dimension gives either 4032×2268 → 240 fragments / 69.0 Mbps (passes) or 1920×1080 → 408 fragments / 117.4 Mbps (fails a derived 50%-of-throughput bar), because fitting(withinLongEdge:) returns the source unchanged when it already fits. 🔴 Hardware checklist item 1 is not preview — it is Phase 1’s stills: AVCaptureVideoDataOutput now joins the session unconditionally, so 48 MP + ZSL must be re-verified with it attached. 📡 Phase 2’s transport findings (aposemati-network-framework-gotchas): QUIC datagrams ARE reachable from Swift, but read usableDatagramFrameSize off the datagram flow (the parent returns 0), an oversize datagram is accepted with NO error and silently dropped, the two ends disagree (9156 vs 9164) so clamp on the local read, DATAGRAM frames are not flow-controlled, and NWConnectionGroup+NWMultiplexGroup did not work (POSIX 50 on every extracted connection; group .ready with its path down) — recorded as “hard, possibly not viable”, never “impossible”. ⚠️ The shipped preview rides a third connection on its own listener/port, not Connection A — better than the spec describes, but the durable spec has not caught up. 🔒 ⭐ aposemati-peer-restart-inference-boundaryseven rebuilds of one restart detector; four inference mechanisms each satisfied their requirement and each was exploitable, because an honest restart and a spoofed one are indistinguishable at admission. Shipped rule: peer data can never move the watermark backwards; reset() is the only backward move and the session layer calls it. 🧪 Phase 2’s process lessons are in aposemati-build-process-lessons and are the most transferable part: five separate measurements answered a different question than the one asked (never subtract percentiles; write the parameter the rig chose for you into the caption), two tasks each correct in scope jointly left a hole neither owned, a test double that collapses two roles hid a watchdog that could never fire on hardware, Apps/ is not a Package.swift target so the Mac app was silently broken for five commits, and bounding a review explicitly beat an open one. ⸻ Phase 0/1 context below. 🟢 WORKING SOFTWARE as of 2026-08-19 — that build session is closed. Repo ~/coding/aposemati, vault folder projects/phone-camera-clone/ (folder name predates the rename). Free/open-source Apple-only phone-as-camera: iPhone shoots, Mac is viewfinder / shutter / gallery. ⭐ Start at aposemati-phase0-phase1-build — the first live two-device run captured 8064x6048 = 48.8 MP from an iPhone 16 Pro to a Mac over awdl0 — direct, ~17x the pixels Continuity Camera can deliver (measured ceiling 1920x1440 on the same phone). 68 commits, 219 tests, zero warnings, clean tree, branch phase0-phase1-link-and-shutter — unmerged and unpushed; both apps installed and running on real hardware. ✅ The review loop is CLOSED — every finding from every round is fixed or recorded, including the Critical (aef872b: the transport now reads nothing from a peer until the application asks for its frames — an unconfirmed stranger could otherwise take a listening iPhone from 18 MB to 196 MB RSS, four reaching 321 MB; verified in a separate victim process with a control: 34.7 MB peak against four flooding strangers vs 486 MB with the fix reverted) and the field handshake timeout (ed436a0: readiness bound 10 s → 30 s, instrumented). 🔜 The one remaining step, and it is not started: the final whole-branch review over all 68 commits at once, triaging the 27 deferred minors in the ledger — every review so far was scoped to a single task’s diff, so cross-task inconsistencies are structurally invisible to them. Run it in a fresh session with HANDOVER.md + .superpowers/sdd/2026-08-18-phase0-phase1-link-and-shutter/progress.md as input. ❓ Still unresolved: an intermittent POSIX 57 transient during pairing, reproducible under a flood harness on first run, cause unknown, noted by two independent reviewers. 🚶 Untested on hardware: the 30 s handshake, deliberately refusing and reconnecting, and — the last untested product claimthe walk to the spot where Camo drops, with the apps (Phase 0 proved only that the probe holds awdl0 there at 156 Mbps, and that was two Macs moving zeros). 🔧 Read aposemati-build-install-run before building anything: the iOS product is Aposemati.app, not AposematiCamera.app (scheme name and product name differ), and the xcodebuild -destination id= is not the devicectl identifier — the same phone has two UUIDs (00008140-… to build, 03750A7F-… to install). Phase 1 = shutter-and-stills; no live preview is by design (Phase 2). 📡 Transport is proven, not arguedaposemati-phase0-field-measurements: 339 Mbps beside the router, 156 Mbps at the exact spot where Camo drops, both awdl0 — direct, rtt 37 ms unchanged at both, 0.011% retransmission. Range costs ~54% of bandwidth and zero latency. 🔴 Read aposemati-network-framework-gotchas before touching transport: NWBrowser.Result.interfaces is the only public source of an AWDL NWInterface (NWPathMonitor never reports awdl0) — pin with requiredInterface, and NEVER filter by interface type, because awdl0 reports type == .wifi so prohibitedInterfaceTypes([.wifi]) kills the peer-to-peer path. QUIC does not support TLS-PSK (-9858 in six variants; works over TCP), which moved the pairing model mid-build; and a QUIC listener reaches .ready with a broken security config, so .ready proves nothing. 🔐 aposemati-pairing-security-model is the most valuable finding of the build: short-authentication-string comparison alone is not MITM-resistant — a reviewer ground colliding certificates and relayed a real photo through a working machine-in-the-middle in 0.77 seconds, because the attacker chooses both certificates and nothing commits either side before seeing the peer’s. Fixed by a commit-reveal nonce exchange; TLS identity is in-memory per launch, never in the keychain. ⚠️ Two Swift traps that each appeared three times in one codebase: swift-uncancellable-continuation-trap (a bare withCheckedContinuation in a withTaskGroup is uncancellable; the QUIC idle timer had been accidentally rescuing the deadlock until a keepalive removed it) and swift-character-isnumber-digit-trap (Character.isNumber accepts Arabic-Indic/Devanagari/fullwidth digits — $0.isASCII && is load-bearing). 🔧 aposemati-apple-signing-gotchas: a fresh Apple Development cert needs the WWDR G3 intermediate — without it find-identity reports 0 valid identities while codesign fails errSecInternalComponent. 📏 48 MP starts at the iPhone 14 Pro — 12/13/14 non-Pro and every iPad are 12 MP; nothing may hardcode a resolution (aposemati-apple-api-measurements). 🧪 Process standard worth reusing anywhere: aposemati-build-process-lessonsverify by execution, not by reading; passing tests are never evidence; mutation testing required wherever a fix claims to close a hole; and ⭐ the rule that closed this build — trace a symptom to its single throw site and measure there, and treat a confident report as a claim to verify rather than as evidence (two fix rounds were spent on a bug a review had reported as fixed: once because the report was internally coherent and confidently argued while asserting the opposite of its own error table, once because a mutation harness produced a false negative). Earlier research context: aposemati-transport-findings (Wi-Fi Aware is @available(macOS, unavailable) — five proofs; “the EU killed AWDL” is FALSE), camo-studio-teardown (Camo cannot do 4K + background blur, nor 60 fps + Portrait), ⚠️ diy-continuity-camera-clone-research SUPERSEDED. ❌ Homelab receiver out — telep-mainframe’s AX210 has no antenna on its u.FL connector.#project/phone-camera-clone, #aposemati
buttonbox (two-button ESP32 gizmo)buttonboxNew 2026-09-02. Design phase — no code, no repo, nothing built. A repurposed industrial start/stop pushbutton station (~6 × 12 cm black enclosure, gutted) with an ESP32 inside; green and red buttons retained, any function assignable to either. Green NO, red NC — the industrial convention, chosen because NC fails loud: a broken wire on an NO button is silent and indistinguishable from idle, while NC reads as permanently pressed, and a stop that silently disables itself is the failure being designed out. 🔌 Mains/USB powered, always on — a full battery design was worked out and abandoned; the payoff is latency, ~500 ms → ~30 ms press-to-action because the board stays associated. Final wiring is therefore trivial: both buttons GPIO → contact → GND on internal pull-ups, zero external components, red inverted in one line (its 73 µA through the pull-up is design-breaking on a cell, irrelevant on mains). ⭐ The battery-era design is kept deliberately because it is correct and will be needed again: NC to 3.3 V + a 1 MΩ pull-DOWN, which cuts standby 73 → 3.3 µA and forces both pins to the same edge, because esp_sleep_enable_ext1_wakeup() takes ONE trigger level for the whole pin mask, not per-pin. ⚠️ Transport deliberately BREAKS tailnet-service-exposure-convention: WiFi to a new LAN-bound stdlib-Python listener, bearer-token authenticated (401 otherwise)an ESP32 cannot join the tailnet, so the token is the security model. ESP-NOW to a USB dongle on telep-mainframe would have sidestepped both the tailnet problem and the 98.9 % 2.4 GHz congestion; it was shown to the user and declined, not missed. ⭐ The load-bearing decision: the device has no opinion — it sends {"button", "held_ms", "seq"} on release and nothing else, and all gesture semantics (short/long/double, toggle) live server-side, so adding a long-press in two months is a Python dict edit, not a reflash of a device that has to be physically opened; seq gives free lost-press detection and held_ms catches a stuck switch (a 45 000 ms “press” is a fault, not a press). Enclosure is so full of contact blocks that a standard devkit only fits flipped on its back, hence XIAO ESP32C3 (0.6 in pitch, 21 × 17.5 mm) — ⛔ which was never ordered, so the project is blocked with nothing en route. ❓ UNRESOLVED: (1) is the enclosure plastic or metal — it decides XIAO C3 vs a 32UE + U.FL, and only 5 antenna-capable boards exist; (2) toggle-state ownershipproposed, not confirmed: query the real target and invert what is actually found, with a loudly-logged stored-boolean fallback, because a stored boolean desyncs the moment anything else changes the target. 🪤 Lesson: “contactor” was misread as a load-switching contactor, producing a full mains-safety design for a project with no mains and no load (it was the contact blocks behind the pushbuttons) — the topology is kept because ⛔ red must stay hardwired in series with the coil; a software stop is not a stop.#project/buttonbox
muetal (design system)muetalNew 2026-08-31, repo /Users/levander/muetal/design-system (pnpm monorepo, packages/ui = @muetal/ui, no git remote yet). Brand + component system for a metal fabrication shop; Astro + React 19 islands + Tailwind v4 @theme, hu-HU default. Design docs live in-repo under docs/superpowers/ and are NOT mirrored here. Three laws enforced in code; law 2 (mono owns every number) routes all numerals through one Data component, so U+00A0 is everywhere — read nbsp-testing-library-normalizer before debugging any formatting test, getByText silently cannot match a no-break space. ⚠️ Tailwind v4 scans every file under the build’s working directory, so any utility-shaped string — including test names — emits real CSS. One test description (keeps ring utilities, which carry visible focus states) put .ring and .visible in the shipped stylesheet; The grid pitch is 24px in the README generates .grid. Scoping the scan cuts the output 73→48 selectors. Read tailwind-v4-prose-generates-css before wondering why the CSS contains classes nothing uses, or why a docs-only edit changed the bundle; the fix is source(none) and it is not yet applied.#project/muetal
ai-project-brain (grafeo graph DB)ai-project-brainNew 2026-09-07, repo /Volumes/bandi/coding/ai-project-brain (edition 2024, resolver 3, members packages/app + packages/core/project, all deps inherited). ⛔ Scaffold only — main.rs is 10 lines, lib.rs is the cargo add() stub, project.rs is empty. There is no architecture yet; do not infer one. Backed by grafeo v0.5.42 on default features (embedded) — in-process engine, GQL only, no server-mode query languages. ⭐ The one thing to know: grafeo is SILENT in your logs. tracing is an opt-in grafeo feature (tracing = ["grafeo-engine/tracing"]), NOT part of embedded/default — it ships free with server, and that asymmetry is the trap. The graph layer emits zero spans, zero events, no error, no warning inside an otherwise working subscriber, so debugging misdirects onto EnvFilter/RUST_LOG/init order while the instrumentation was simply never compiled in; main.rs already has a live tracing_subscriber::fmt(), so only the sending end is missing (grafeo-feature-matrix). ⚠️ cargo remove is a workspace-aware GC, not a text editcargo remove -p <member> <dep> also prunes the root [workspace.dependencies] entry, breaking the add → copy up → remove → re-inherit path and failing a step later with workspace.dependencies` was not defined (cargo-workspace-dependency-inheritance).#project/ai-project-brain

Always load the Agent Context note for a project before doing any work in it. These contain architecture, conventions, and critical knowledge you need.

Per-Project Index Files

Every project folder under projects/<project>/ has two auto-maintained index files. Read them BEFORE trawling individual notes — they are the fast path for “what’s been going on in this project.”

FilePurposeMaintained by
LOG.mdReverse-chronological session log — newest dates at top, each bullet links to a noteobsidian-documenter writes / historian reads at bootstrap (top ~15 entries)
TOPICS.mdTheme index — ## <Topic> headings with wikilinks to related notesobsidian-documenter writes / historian reads at bootstrap (full file)

When you document new work in a project, the obsidian-documenter agent appends to LOG.md and updates the matching theme(s) in TOPICS.md automatically — you do not maintain these by hand.

Where to Write

You want to…Write it in…
Add project knowledge (architecture, conventions, decisions)projects/<project>/ — link from the project’s main note
Investigate a specific ticket or bugprojects/<project>/investigations/ (create the folder if missing)
Add agent context for a projectprojects/<project>/agent-context*.md — tag with #agent-context
Create a daily noteVault root, named YYYY-MM-DD.md
Create a debugging logprojects/<project>/debugging-log*.md

Diagrams — Mermaid Guidelines

This vault uses Mermaid diagrams rendered natively by Obsidian. Follow these rules when creating or editing diagrams, and progressively disclose detail so readers can drill in at their own pace.

Progressive Disclosure Pattern

Wrap diagrams in foldable callouts so they don’t dominate the page. Use collapsed (-) by default for supplementary diagrams, expanded (+) only for the primary diagram of a note.

> [!abstract]- System Architecture
> 
> ```mermaid
> graph TD
>     A --> B --> C
> ```

When a topic has multiple levels of detail, nest them:

  1. Top-level callout — high-level overview diagram (collapsed)
  2. Subsection callouts inside — detailed breakdowns per component (collapsed)
> [!abstract]- Architecture Overview
> 
> ```mermaid
> graph TD
>     Frontend --> API --> DB
> ```
>
> > [!example]- Frontend detail
> > ```mermaid
> > graph LR
> >     React --> Router --> Pages
> > ```
>
> > [!example]- API detail
> > ```mermaid
> > graph LR
> >     Express --> Auth --> Routes
> > ```

When to Use Diagrams

Use a diagram when…Diagram type
Showing system/service topologygraph TD or graph LR
Documenting a workflow or processflowchart TD
Mapping state transitionsstateDiagram-v2
Showing a timeline or sequencesequenceDiagram
Categorizing conceptsmindmap
Comparing phases or milestonesgantt

Diagram Style Rules

  • Dark-theme friendly — use muted fill colors (#2d2d2d, #264653, #3d2020) with light text (#fff). Avoid bright backgrounds.
  • Label nodes clearly — use <br/> for line breaks inside node labels, <b> for emphasis, <i> for annotations.
  • Keep it scannable — max ~8-10 nodes per diagram. If it’s bigger, split into multiple progressive-disclosure layers.
  • Link to notes — reference vault notes in labels using [[Note Name]] syntax where it helps navigation.
  • No orphan diagrams — every diagram must live inside a callout with a descriptive title. Never put a bare mermaid block at the top level of a note.
  • Callout type conventions:
    • [!abstract] — structural overviews (architecture, directory trees)
    • [!example] — component-level detail diagrams
    • [!info] — flowcharts and routing/decision diagrams
    • [!note] — sequence diagrams and timelines

Minimal Example

> [!abstract]- Data Flow
> 
> ```mermaid
> graph LR
>     Input["User Input"] --> Validate["Validation"]
>     Validate --> Store["Supabase"]
>     Store --> Cache["TanStack Query"]
>     Cache --> UI["React Component"]
>     style Input fill:#264653,stroke:#2a9d8f,color:#fff
>     style Store fill:#2d2d2d,stroke:#888,color:#fff
> ```

Writing Conventions

  • Frontmatter is required on every note — at minimum include tags.
  • Wikilinks ([[Note Name]]) for all internal references — never relative markdown links.
  • Tag with the project name (#alpiq, #facekom, #levandor) so notes are filterable.
  • Agent context notes get the #agent-context tag and an alias ending in “Agent Context”.
  • MOC notes (maps of content) get the #moc tag.
  • Notes that serve as indexes or entry points should use callouts to orient the reader.

Tags Reference

TagMeaning
#agent-contextDense reference designed for AI agent onboarding
#mocMap of Content — index note linking related notes
#alpiq, #bessAlpiq BESS / Mando project
#facekomFaceKom / vuer project
#levandor, #crmLevandor CRM project
#project/levandor-infraLevandor Infra (GCP Terraform + Ansible) project
#project/cluztercluzter — vehicle wiring diagram editor
#project/wiring-diagramThe jot → WireViz pipeline (cluzter’s predecessor)
#project/hardcuthardcut — ESP32-S3 ignition-cut rev/launch limiter (same vehicle as cluzter)
#project/lightaimlightaim — joystick-aimed vehicle light, ESP32-S3 + MG996R servo (same vehicle as cluzter, hardcut, kickfix)
#project/szig-felmeresszig/felmeres — CAD Lite floorplan survey app
#project/carpi-2dincarpi-2din — Raspberry Pi 5 2DIN car media unit enclosure (Fusion 360)
#project/offroad-armouroffroad-armour — Jeep WH skid plate set + Geo Tracker front diff shield (Fusion 360)
#project/kickfixkickfix — 1995 Geo Tracker repair/restoration: factory body dimensions + whole-body CAD repair canvas (same vehicle as cluzter, hardcut, offroad-armour)
#project/3d-printing3D printing — Bambu Lab H2S + AMS 2 Pro hardware and the filament compatibility matrix
#project/krakenpi-carboxKrakenPi CarBox — 3D-printed in-car enclosure for a KrakenSDR + Raspberry Pi 5 DF rig (Fusion 360); mechanical half of the homelab KrakenSDR rig
#project/inventory, #inventory, #hestoreParts inventory — the vault-level record of what electronics stock is physically owned: HESTORE cikkszámok, coverage gaps, the confirmed-absent list, and the cikkszám ↔ product-URL rule
#project/esp32ESP32 — cross-project silicon, toolchain, flashing, RTOS, wiring and battery/deep-sleep reference shared by lightaim, hardcut and the RuView CSI node
#project/phone-camera-clone, #aposematiAposemati — free/open-source Apple-only phone-as-camera (iPhone shoots, Mac is viewfinder). 🟢 Phase 0 + Phase 1 working on hardware since 2026-08-18; 🟢 Phase 2 live preview complete 2026-08-25, verdict pending a two-device run. Folder name predates the rename.
#project/muetalmuetal — brand and component system for the Muetal metal fabrication shop; NBSP-heavy number formatting
#project/buttonboxbuttonbox — two-button ESP32 gizmo in a gutted industrial start/stop pushbutton station; NO/NC convention, dumb-device + server-side gesture semantics, a deliberate tailnet-convention break
#project/ai-project-brain, #grafeoai-project-brain — Rust workspace (edition 2024) on the grafeo embeddable graph DB; the embedded/server/edge feature matrix, the opt-in-tracing silent-graph-layer gotcha, and cargo remove pruning [workspace.dependencies]
#quick-referenceCheat-sheet style note

What NOT to Do

  • Do not write into .obsidian/ or .agents/ — these are managed by Obsidian and AgentOps respectively.
  • Do not create README.md files — this vault uses Obsidian notes, not GitHub conventions.
  • Do not use standard markdown links ([text](path)) for internal vault links — use wikilinks.
  • Do not create notes without frontmatter tags.