ai-startup-skills
AI 제품을 만드는 스타트업을 위한 7단계 에이전트 스킬: 검증 → 비즈플랜 → 정책 → 로드쇼 → 고객 확보 → 가격 책정 → 등록
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A lightweight progressive web app (PWA) that connects to a Gauge.S device over Wi-Fi, merges all CSV log files by name, and downloads them in one tap — no app install needed.
It also diagnoses those logs on the device: likely faults, ranked, with the evidence for each one. See Engine diagnosis.
🌐 Live app: https://oshanrube.github.io/gauge.s-log-downloader/
📱 Android app (deleting works): Download the APK · all releases
"Delete after download" only works in the Android app. The browser blocks it: a cross-origin
DELETEis preceded by anOPTIONSpreflight that the device firmware doesn't answer, so the delete never reaches the device. The app sends its requests through the OS HTTP stack instead, so there's no preflight — and it pins its sockets to the Gauge.S Wi-Fi, so the device stays reachable while Android reports "no internet". Build details: NATIVE.md.Everything below applies to the web app and is unchanged.
Follow these steps in order each time you want to download logs.
You only need internet for this step. Do it once before heading to the field.
https://oshanrube.github.io/gauge.s-log-downloader/
https://oshanrube.github.io/gauge.s-log-downloader/
✅ After this step the app is cached on your phone. You can open it any time — even without internet.
Gauge.S or similar — check your device label).Device on a different IP? The Device field at the top is a dropdown as well as a text box. Type a new address once and it is remembered; after that, tap the ▾ button and pick it from the list — handy when the same Gauge.S answers on
192.168.4.1on its own Wi-Fi but on another address once it is joined to a workshop router. The eight most recently used addresses are kept, most recent first, and the × next to an entry forgets it.The field is locked when you open the app from the device itself (
http://<ip>/index.html) — there is nothing to choose in that case.
| Platform | Location |
|---|---|
| iPhone | Files app → Downloads (or Safari's Downloads pop-up) |
| Android | Files app → Downloads |
The merged files will be named like:
Gauge.S_26-09-23_14-32.csv — numbered session logs combined, stamped with
the date and hour-minute of the downloadGauge.S_26-02-28_14-32.csv — one day's dated session logs combined, stamped
with the hour-minute of the downloadDownload Individual Files skips merging and saves each log exactly as it
came off the device, under its own name (e.g. Gauge.S-1.csv).
The hour-minute keeps a second download on the same day from replacing the
first. If numbered and dated logs land on the same date and time, the second
file gets a -2 suffix instead of being merged into the first.
| Problem | Fix |
|---|---|
| Page doesn't load after switching Wi-Fi | Make sure you opened the app before switching Wi-Fi, or use the Home Screen shortcut |
| "Failed to fetch file list" error | Check that you are connected to the Gauge.S Wi-Fi and the device is powered on |
| Phone drops the Gauge.S Wi-Fi automatically | On Android, toggle off "Auto-switch to better network" in Wi-Fi settings |
| Downloaded file is empty | One or more source files on the device may be empty — check the Activity Log for details |
| "Delete after download" always fails | Expected in the browser — the DELETE is stopped by a CORS preflight the firmware doesn't answer. Install the Android app. |
The app reads a merged log and reports likely faults, with the evidence for each one. This is the Car Doctor pipeline, ported from Kotlin so it runs in the web app and the Android app alike — that project is retired and this is now the only copy.
📖 How it decides something is wrong — a plain-English walkthrough with diagrams, for anyone who wants to know what the report is actually telling them. The rest of this section is the technical summary.
Analysis runs entirely on the device. A drive log is never uploaded; the diagnosis needs no internet at all, which matters because the field where you collect logs is usually the field with no signal.
Pick a merged log on the Analyse tab and tap Analyse. The report lists findings worst-first, each with the numbers it reasoned from and the checks worth doing — plus what the log covered, and what could not be checked.
CSV ─▶ 1 Ingest ─▶ 2 Condition ─▶ 3 Segment ─▶ 4 Aggregate ─▶ 5 Detect ─▶ 6 Rank
(stream) (validity) (states) (fixed size) (declarative) (root cause)
"engine speed (RPM)", "RPM" and
"Engine Speed" onto one canonical channel, so a new logger format never
touches a detector. Gauge.S and RomRaider logs both work.The file is read twice. Knock cannot be judged from ignition advance alone — advance is supposed to fall as load rises, which is the shape of every spark map ever calibrated. The first pass learns this engine's own ignition map (and where its throttle actually rests, which is not always zero); the second judges timing against it. Buffering the samples instead is precisely the thing that must not scale with drive length.
A quiet report means nothing matched the rules that could be run — not that the engine is healthy. The "not checked" list is part of the output for that reason.
npm test
The pipeline has no compiler to catch it going wrong: a broken detector still builds, installs and runs, and simply reports the wrong thing. The suite carries the assertions that stop that shipping — including the regressions that each guard was added for, such as a throttle sensor reading 0.0% through three quarters of a drive, and a normal spark map being mistaken for knock. CI runs it before building the APK.
Detectors degrade honestly when a channel is missing, and upgrade when a better one is present. Given only ignition advance, the knock rule has to reconstruct a spark map and still only concludes "timing looks low for these conditions". Given a log carrying the ECU's own knock correction, it simply reads how many degrees were pulled — and the inferred rule stands down, so one fault is never reported twice at two different confidences.
Worth logging if your software offers them: knock correction, cam advance (AVCS/VANOS/VVT), both bank fuel trims, radiator temp, battery/system voltage, oil temp, fuel pressure. Also used when present: the accelerator pedal (on an MS43 the throttle plate stays shut through light driving, so only the pedal shows the driver asking for power), the exhaust cam, the AC compressor state (idle is judged with and without its load), the electric fan, and the check engine and EML lamps.
An engine the analyser knows gets its own limits: a vehicle record naming the M54 engine or the MS43 ECU allows for the map thermostat running the coolant at up to about 110 degC by design.
analyze(text, options) takes two more inputs, for an app that keeps them
(Bimmer Cockpit does):
ecu — a snapshot of what the ECU has stored, read near the drive: the
fault memory (with how often each fault occurred, whether it is present now,
and what the ECU stored with it), the learned fuel, idle-air and octane
adaptations, and the per-cylinder misfire counters (see
normalizeEcuSnapshot). Stored or counted misfires name their cylinder; a
stored code that explains a finding raises its confidence; the learned idle
air joins a rough-idle finding; and the adaptations show a fault the ECU has
already learned around, which the short-term trims in the log no longer can.history — the record of earlier drives, as returned in each report.
The drive is compared with this car's own recent normal (idle trim, idle
speed and roughness, low- and high-load trim, bank split, cruise coolant,
charging voltage, cam range), which moves well before a fixed limit trips.GitHub Pages (internet) Gauge.S Device (local Wi-Fi)
│ │
│ 1. Visit URL + cache app │
│◄──────────────────────────────────┤ (first visit, needs internet)
│ │
│ 2. Open cached app │
│ (no internet needed) │
│ │
│ 3. Fetch file list ────────────►│ GET /list?dir=/logs
│ 4. Fetch each file ────────────►│ GET /logs/{filename}
│ 5. Merge & download to phone │
index.html file with no external dependencies.sw.js) caches the app shell on first load.192.168.4.1 bypass the cache and go directly to the device.