惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
Microsoft Security Blog
Microsoft Security Blog
D
Docker
WordPress大学
WordPress大学
罗磊的独立博客
J
Java Code Geeks
博客园 - 【当耐特】
博客园 - 司徒正美
雷峰网
雷峰网
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
T
Tailwind CSS Blog
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
Recent Announcements
Recent Announcements
B
Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Adopt vs build: why we deleted our working logbook for Si...
Bryan Clark · 2026-06-24 · via DEV Community

Bryan Clark

Our boat agents log moments by voice: "log this moment" → an entry with
position, time, and conditions. The first version of
logbook-mcp backed that
with SQLite on the agent machine. It worked. It had tests. It shipped.

Then we audited it against the SignalK logbook ecosystem and deleted the
entire storage layer.

The audit

Our prime directive is use or improve existing tools before building our
own
. Applied honestly, that means auditing your own working code against
the ecosystem — not just once at design time, but again when you learn the
ecosystem better. Three candidates:

meri-imperiumi/signalk-logbook
— a semi-automatic electronic logbook that runs on the SignalK server.
Per-day YAML files, a REST API with an OpenAPI spec, a webapp in the SignalK
admin UI, and semi-automatic entries (hourly while underway, trip start/end).
The killer feature: POST /logs takes just the entry text, and the plugin
snapshots position, heading, speed, wind, and barometer from the live bus
server-side.

Saillogger — polished automatic trip capture, but your log lives in
their cloud. Wrong shape for a local-first agent that needs to read and
write programmatically.

postgsail — a
self-hosted Postgres + PostgREST + Grafana stack. Powerful trip analytics,
but a whole infrastructure tier to operate, aimed at dashboards rather than
agent-written narrative entries.

Keep ours — full control, no network dependency, no third-party risk.
But we'd be rebuilding, worse, what already exists: no UI, no auto-entries,
no enrichment — and the log would die with the laptop instead of living on
the boat.

The deciding argument

A ship's log belongs to the ship. Storing it in SQLite on the agent machine
was always slightly wrong; we just hadn't said it out loud. signalk-logbook
puts the entries on the vessel's own server as human-readable YAML — files
that remain trivially parseable decades from now even if every tool in this
post is abandoned.

That reframing also clarified what was actually ours: not entry storage,
but the agent-facing tool surface and (on the roadmap) USCG/Transport Canada
sea-time accounting — which nothing in the ecosystem does. So logbook-mcp
became ~200 lines of stateless glue: mark_moment and read_entries over
the plugin's REST API, with sea-service form export later derived from
the plugin's entries instead of kept in a parallel store. One source of
truth; the only code we maintain is the genuinely novel part.

What adoption actually cost: four undocumented quirks

Adopting someone else's plugin is not free. The OpenAPI spec got us 80% of
the way; live integration against the real server found the rest:

  1. POST /logs returns a bare 201 with no body. You don't get the created entry back — so confirming "what did I just write?" means re-fetching the day and taking the newest entry (with a previous-UTC-day fallback for midnight races).
  2. The "optional" ago field is mandatory in practice. The spec marks it optional; the code calls buffer.get(req.body.ago) whenever its 15-minute state buffer is non-empty, and buffer.get(undefined) throws. Send ago: 0 always.
  3. Author attribution reads a cookie, not the Authorization header. The plugin derives the entry author from parseJwt(req.cookies.JAUTHENTICATION). Our client sends the token both ways: header for the server's auth gate, cookie for the plugin.
  4. All /plugins/* REST routes are admin-gated. signalk-server's adminAuthenticationMiddleware guards every plugin route — device access tokens and read/write user tokens get 401 no matter what permissions you grant them. The agent's token must belong to an admin user. We verified this in the server source after two very confusing rounds of token provisioning.

None of these are complaints — they're the normal cost of integrating with
real software, and they're all documented now (in our
SPEC and
in this post, which is the writeup we wish we'd found). The total was still
a fraction of what maintaining our own store, schema migrations, UI, and
auto-entry pipeline would cost.

Where the line actually is

The audit's useful output wasn't "adopt" — it was a cleaner boundary:

  • Theirs: entry storage, enrichment, semi-automatic entries, the curation UI. Commodity for us; their core competence.
  • Ours: the agent tool surface (validated schemas, TTS-safe display strings, honest error states that never claim an unrecorded moment was logged), and the sea-time/licensing layer nothing else provides.

If you're holding working code you built before you knew the ecosystem,
the audit is still worth running. The sunk cost is real but small; ours
was one evening, and we traded a database for two hundred lines of glue
and a log that lives where it should — on the boat.