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

推荐订阅源

有赞技术团队
有赞技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
G
Google Developers Blog
爱范儿
爱范儿
博客园 - 司徒正美
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
J
Java Code Geeks
The Cloudflare Blog
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
宝玉的分享
宝玉的分享
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
B
Blog
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
T
Troy Hunt's Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Hacker News: Front Page
H
Help Net Security
S
Security @ Cisco Blogs
V
V2EX
Security Archives - TechRepublic
Security Archives - TechRepublic
Stack Overflow Blog
Stack Overflow Blog
O
OpenAI News
L
LINUX DO - 最新话题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
S
Secure Thoughts
Help Net Security
Help Net Security
F
Full Disclosure
博客园 - 叶小钗
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Jina AI
Jina AI
K
Kaspersky official blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
Scott Helme
Scott Helme

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 Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
"My README Kept Trying to Be the Whole Product Manual. So I Split It Into 3 Layers"
CodeKing · 2026-05-13 · via DEV Community

I kept fixing the same problem in three different places.

Someone would land on the GitHub repo for my local AI gateway and need a fast answer: what is this thing, what does it support, and how do I start it?

Instead, they got the same thing a lot of open-source projects accidentally grow into: a README that wanted to be a landing page, onboarding guide, operator manual, architecture index, and release checklist at the same time.

That works for a while. Then every edit makes it worse.

The failure mode was boring but expensive

The project is CliGate, a local AI gateway that sits between tools like Claude Code, Codex CLI, Gemini CLI, OpenClaw, dashboard chat, channel workflows, and upstream model providers.

As the product surface expanded, the docs expanded with it:

  • protocol translation details
  • account pools and API keys
  • app routing and model mapping
  • dashboard pages
  • runtime sessions
  • Telegram and Feishu channels
  • local manuals inside the product

The result was predictable:

  • the GitHub README kept getting longer
  • first-time users still needed a cleaner path
  • the in-product assistant needed stable source material
  • maintainers needed room for operational docs that should never be the first thing a new user reads

So the real problem was not "write more docs."

It was "stop making one document do five jobs."

I ended up with a three-layer docs model

The fix in this repo was to split the content by reader intent instead of by file history.

Now the project has three distinct layers:

  1. a repo-facing README.md
  2. a docs hub under docs/README.md
  3. a lightweight in-product manual served from /manual/

Each one answers a different question.

Layer 1: README is for orientation, not full ownership of every detail

The current README now does the things a repo landing page is actually good at:

  • explain what CliGate is
  • show the supported surfaces
  • give the shortest quick start
  • point to the right deeper documents

That keeps the first screen useful instead of turning it into a scroll tax.

The structure is intentionally compact:

## Quick Start

### 1. Start CliGate
### 2. Add at least one working credential
### 3. Point your tool to CliGate

Enter fullscreen mode Exit fullscreen mode

And it still gives concrete configuration examples, like Codex pointing at localhost:

chatgpt_base_url = "http://localhost:8081/backend-api/"
openai_base_url = "http://localhost:8081"

Enter fullscreen mode Exit fullscreen mode

That is enough for a reader who wants to know whether the project is relevant before they commit to the rest.

Layer 2: the docs hub is the router for human readers

Once the README stops pretending to be everything, you need a clean next step.

That is what docs/README.md became.

Instead of a random directory listing, it routes by audience:

## By Audience

### New users
### Integrators and operators
### Contributors

Enter fullscreen mode Exit fullscreen mode

This seems obvious, but it fixed a real repo problem for me.

When documentation grows organically, file names make sense to maintainers and almost nobody else. A docs hub changes the question from:

"Which markdown file sounds closest to my problem?"

to:

"What kind of reader am I, and where should I start?"

That is a much better first branch.

Layer 3: the product needed its own short manual

The part I did not want to keep faking was the in-product help path.

When users are already inside the dashboard, they usually do not want the full repository story. They want a short operational guide:

  • what does this product do
  • what is the default address
  • what do I configure first
  • where in the dashboard should I go next

So CliGate now serves a lightweight manual at /manual/, separate from the repo README and separate from the longer markdown manuals.

The HTML is deliberately focused on quick orientation:

<h2 id="page-title">Understand, configure, and verify CliGate quickly</h2>
<p id="page-subtle">This is the in-product quick manual. For full reference, use the complete product manuals.</p>

Enter fullscreen mode Exit fullscreen mode

And the route layer exposes the source documents explicitly instead of scraping whatever happens to be on disk:

const DOC_FILE_MAP = Object.freeze({
  'README.md': join(process.cwd(), 'docs', 'README.md'),
  'API.md': join(process.cwd(), 'docs', 'API.md'),
  'ARCHITECTURE.md': join(process.cwd(), 'docs', 'ARCHITECTURE.md'),
  'product-manual.en.md': join(process.cwd(), 'docs', 'product-manual.en.md'),
  'product-manual.zh-CN.md': join(process.cwd(), 'docs', 'product-manual.zh-CN.md')
});

Enter fullscreen mode Exit fullscreen mode

That mattered for two reasons:

  1. the UI got a stable set of documents
  2. the product assistant got a cleaner source of truth

The manual files are now doing real product work

This was the architectural shift that made the cleanup worth it.

The docs are not only for GitHub readers anymore. They are also part of the product behavior.

The product manual now carries the user-facing explanation of:

  • dashboard navigation
  • routing concepts
  • CLI configuration
  • channel workflows
  • troubleshooting paths

That means the manual has to be shaped for actual usage, not just for repository completeness.

One note in the docs hub says it pretty plainly:

- `product-manual.en.md` and `product-manual.zh-CN.md` are the primary user-facing manuals.
- The product assistant reads from those manual files directly.

Enter fullscreen mode Exit fullscreen mode

Once that became true, letting the README keep absorbing everything stopped making sense.

I also had to accept that maintainers and users need different entry points

This is the trap I keep seeing in open-source docs.

Maintainers are comfortable with:

  • roadmap files
  • architecture notes
  • release checklists
  • migration plans
  • incident writeups

New users are not.

If those documents sit beside the real onboarding path without any structure, the repo starts feeling harder than the product.

So the current split lets the project keep maintainers' documents in docs/ without making them the front door. The docs hub explicitly calls that out:

Planning, incident, and roadmap documents remain in this directory for maintainers, but they are not the best entry point for first-time users.

Enter fullscreen mode Exit fullscreen mode

That one sentence removed a lot of ambiguity.

What changed for the actual product

The cleanup was not cosmetic. It changed how the project presents itself in three different contexts:

  • GitHub readers now get a faster landing path
  • dashboard users now get a short manual without leaving the product
  • the product assistant now has clearer manual context to answer from

That last one is easy to underestimate.

If you build an assistant into the product, your documentation stops being passive. It becomes runtime input. Structure starts to matter much more than volume.

The pattern I would reuse

If your open-source project is growing past a single README, I think this split is a better default than endlessly reorganizing one giant file:

  1. README.md for orientation and quick start
  2. docs/README.md as a docs router by audience
  3. an in-product quick manual for operational tasks

Not every project needs all three.

But the moment your docs are serving both repository readers and product users, pretending those are the same audience usually creates a worse experience for both.

If you want to inspect the implementation, the project is here:

CliGate on GitHub

I'm curious how other people are handling this boundary. When did your README stop being a README and start trying to become the whole product manual?