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

推荐订阅源

S
Securelist
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
博客园 - 聂微东
博客园 - 【当耐特】
小众软件
小众软件
V
V2EX
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
N
News and Events Feed by Topic
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 司徒正美
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
AI
AI
O
OpenAI News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Jina AI
Jina AI
博客园_首页
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
IT之家
IT之家
V
Vulnerabilities – Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
G
GRAHAM CLULEY
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hacker News: Ask HN
Hacker News: Ask HN
P
Palo Alto Networks Blog
S
SegmentFault 最新的问题
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
V
Visual Studio 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 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
I built a journaling app where the AI refuses to talk on Sundays. Day 8/9 of 30.
Vineet Negi · 2026-04-27 · via DEV Community
<p>Day 8 and 9 of building <a href="https://app-b3tuv7opfegx.appmedo.com/" rel="noopener noreferrer">Evengood</a> — a 60-second journaling app — for the <a href="https://medo.devpost.com/" rel="noopener noreferrer">Build with MeDo</a> $50K hackathon.</p> <p>This one took two days because I went the wrong way first.</p> <h2> The trap I almost fell into </h2> <p>By Day 7 I had what looked like a finished product. Voice capture, a calm Tomorrow line, a Kling watercolor keepsake, a 7-day streak ribbon, a Pattern detection that surfaces a one-line rhythm of your week, and a Quiet Mode that shuts the AI up entirely on grief days. v28. Working. Pretty. People could use it.</p> <p>So Day 8 the obvious move was: ship a small polish feature. Maybe surface yesterday's Tomorrow line in tiny grey above the mic. Maybe a "save the week" export. Maybe a streak ribbon that pulses on the dot for today. Safe. Iterative. The kind of thing every journaling app already has.</p> <p>I asked Claude to scan every competitor — Stoic, Day One, Reflectly, Daylio, Finch, Apple Journal, How We Feel, Mood Meter, Rosebud, Mindsera, Replika. Then to brainstorm a Day 8 feature that didn't exist in any of them.</p> <p>The first answer was a "Yesterday's Tomorrow" line. Surfacing yesterday's prompt above the mic. Soft. Tasteful. On-brand.</p> <p>I killed it.</p> <p>I didn't want to ship a feature that any other journaling app could build in an afternoon. Restraint is supposed to be the thesis of this product. If the thesis is real, there should be features the category structurally cannot copy. Not because they're hard — because they're contrary to how every other product makes money.</p> <p>So Day 8 became research and Day 9 became the build.</p> <h2> The thing nobody is building </h2> <p>Here is the structural observation. Every AI journaling app on the market is built around the assumption that the AI's job is to <strong>say more</strong>. Go deeper. Probe. Reframe. Suggest. Coach. Mentor. Advise.</p> <p>Rosebud's UVP is literally "go deeper." Mindsera's is mental models. Stoic's is mentor advice. Replika's whole pitch is the AI talking back. Their entire business model — and their reflex to ship more from the model — is <em>more output</em>.</p> <p>The 2025 Brown University study of LLM "therapy chatbots" catalogued fifteen distinct ethical violations across the major models. The biggest one they named was "deceptive empathy" — phrases like "I hear you" and "that sounds so hard" that mimic care without holding any. The category's failure mode is structural. The AI talks too much, in a register it doesn't actually have authority for.</p> <p>Quiet Mode (v28) was my first move against that. When the user types "my dad died last week" or "I had a panic attack," Evengood doesn't reframe. The model is silenced. The screen says: <em>"some days don't need reframing. be gentle with yourself tonight."</em> No popup. No emoji. No analytics event. It just gets quieter.</p> <p>That worked. It felt right. But it was content-triggered — only on heavy days. Calm days still got the full 2-minute reflection. Which meant Quiet Mode was a single point, not a thesis.</p> <p>For Day 9, I wanted the second point on the same axis.</p> <h2> Witness Mode </h2> <p>What I shipped is called Witness Mode. It runs once a week. By default Sunday evening, but you pick the day in settings.</p> <p>When you open the app on a Witness Night and reflect for 60 seconds — typed or voice — the response screen does not load a 2-minute reframe. It does not load a Tomorrow line. It does not load a theme word. It does not play TTS speech.</p> <p>Instead, the AI returns one sentence. Under fifteen words. About the <em>form</em> of what you just said — a recurring word, a surprising word, an absence — never the meaning. Then the screen sits with you in silence for four seconds. Then the closing line reads <code>come back tomorrow.</code> and that is the whole evening.</p> <p>Examples of what the model is allowed to return:</p> <ul> <li><em>i noticed you said the word "tired" four times</em></li> <li><em>tonight you didn't talk about work</em></li> <li><em>what stood out was the gap between what you wanted and what you did</em></li> <li><em>you returned to the word "ok" — three different times, three different ways</em></li> </ul> <p>That's it. No advice. No empathy phrases. No compliments. No follow-up questions. No interpretation of meaning.</p> <p>The role is borrowed almost verbatim from a forty-year-old practice in narrative therapy called <strong>outsider witnessing</strong>, formalized by Michael White and David Epston in <em>Maps of Narrative Practice</em> (2007). The witness's job is structurally bounded: never advise, never applaud, never interpret meaning, never offer follow-up. The witness names <em>what resonated</em> in the form of what the person said — and then sits with them.</p> <p>The category does not have a verb for this. The verbs are: track, write, coach, chat, record, reflect-back. None of them are <em>witness</em>. Now one is.</p> <h2> Why no competitor will copy this </h2> <p>This is not hard to build. The whole feature is one new lib file, a few new localStorage keys, one replaced LLM system prompt, one new regex guard module, two new settings rows, and a restructured response screen. About 2,800 lines of TypeScript change in total. MeDo did the build in seven minutes.</p> <p>The reason no one else has it is not technical. It is structural.</p> <p>A subscription journaling app with monthly retention metrics needs the AI to talk <em>more</em>, not less, on the days when nothing is wrong. Calm days are when streak-driven products quietly maximize session length. A weekly evening where the AI deliberately does <em>less</em> than on a normal night reads as a regression on every dashboard the category lives on.</p> <p>It is also philosophically backwards for them. Their pitch is the AI as coach, mentor, friend. A bounded outsider-witness role is not a brand position they can hold without rewriting their UVP.</p> <p>So the moat isn't the code. It's the position the code asserts.</p> <h2> The calm-tech lineage </h2> <p>While I was building this I went back and re-read Mark Weiser, John Seely Brown, and Amber Case's <a href="https://calmtech.com" rel="noopener noreferrer">calm-technology principles</a>. Weiser and Brown wrote that "technology should communicate but doesn't need to speak" and "the right amount of technology is the minimum needed to solve the problem." Case formalized eight of these principles in 2015 and now runs a Calm Tech Certified program.</p> <p>Evengood was always intuitively calm-tech. I just hadn't said it out loud. Witness Mode is the moment I'm naming the lineage. The thesis is: in 2026, an AI product that gets quieter as the user gets more vulnerable is not just a feature choice — it is a different product category from the one all my competitors are competing in.</p> <p>Streak research is moving the same way. Katy Milkman's recent work argues that streak design trains people to care more about not failing than about succeeding — surveillance dressed as resilience. Evengood has a 7-day streak ribbon, but it does not show a number. It does not lecture. It just fills a dot. Witness Mode entries fill the dot the same as any other entry, with no special badge, no count, no "you witnessed three times this month" notification. That last one would be gamification, which is forbidden by the spec.</p> <h2> What I deliberately did not build </h2> <p>This list is half the work.</p> <ul> <li>No "tonight is witness night" push notification. The reframe must be in the response, not in the prompt — pre-framing the capture screen would corrupt what the user says toward the system's expectation.</li> <li>No streak counter as a number. Anywhere.</li> <li>No "Witness Night" badge or progress ring.</li> <li>No mood-trend chart, no leaderboard, no level system, no XP.</li> <li>No popup, no toast, no red error state. Failure is silent fallback, every time. If the LLM returns something that violates any of the spec's word rules, a default line — <em>tonight, i'm just sitting with you</em> — is substituted on the client and the user never knows anything went wrong.</li> <li>No login, no account, no password, no SSO. None of the previous 28 versions had auth. This one didn't add it either.</li> <li>No Witness Mode firing on a heavy day. Quiet Mode supersedes always — a heavy-day signal must always route to Quiet, even if it happens to be Sunday. Witness is a calm-day ritual; Quiet is a heavy-day refusal. They never overlap.</li> </ul> <h2> The regex guards </h2> <p>Defense in depth. After the LLM returns its single sentence, the client runs five guards before rendering or storing:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight typescript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">FORBIDDEN_WORDS</span> <span class="o">=</span> <span class="sr">/</span><span class="se">\b(</span><span class="sr">should|must|need|ought|try|maybe|perhaps</span><span class="se">)\b</span><span class="sr">/i</span><span class="p">;</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">EMPATHY_PHRASES</span> <span class="o">=</span> <span class="p">[</span> <span class="dl">"</span><span class="s2">i hear you</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">that sounds</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">i'm sorry</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">be kind to yourself</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">you could</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">you should</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">i feel</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">you feel</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">must be</span><span class="dl">"</span><span class="p">,</span> <span class="p">];</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">ALLOWED_OPENERS</span> <span class="o">=</span> <span class="p">[</span> <span class="dl">"</span><span class="s2">i noticed</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">tonight</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">what stood out was</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">you said the word</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">tonight you didn't</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">you returned to</span><span class="dl">"</span><span class="p">,</span> <span class="p">];</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">DEFAULT_LINE</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">tonight, i'm just sitting with you</span><span class="dl">"</span><span class="p">;</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">MAX_WORDS</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> </code></pre> </div> <p>If the line exceeds 15 words, contains a forbidden word, contains an empathy phrase, doesn't start with an allowed opener, or contains CJK characters (English-only enforcement), it is silently swapped for <code>DEFAULT_LINE</code>. Sentry breadcrumb. No console error. No user-visible failure.</p> <p>This is the part the LLM industry mostly does not do. The system prompt tells the model what the role is. The client guard refuses to render anything that violates the role even if the model drifts. Trust the model less than the spec.</p> <h2> What ships next </h2> <p>Day 10 onward, on the same spectrum:</p> <ul> <li>A v40-ish feature called <strong>anonymous definitional ceremonies</strong> — opt-in, three users on the same day each pick the same theme word, and on Sunday evening each one sees one anonymous line from another about how that word sat with them. No content shared. No chat. No identity. Just three witnesses, one word, one Sunday. This is the long arc Witness Mode is the seed of.</li> <li>A feature called <strong>The Wake</strong> — programmable forgetting. Reflections expire after a window the user sets unless they explicitly mark them "kept." Default: let the day go. The opposite of every product whose business model depends on the user's data accumulating forever.</li> <li>A feature called <strong>Letter to Tomorrow</strong> — once a month, instead of a Tomorrow line, you write one to your future self. Sealed. Returned on a date you pick. No notification. No reminder. It just appears.</li> </ul> <p>All three obey the same axis. Restraint as feature, not absence.</p> <h2> Try it </h2> <p><a href="https://app-b3tuv7opfegx.appmedo.com/" rel="noopener noreferrer">https://app-b3tuv7opfegx.appmedo.com/</a></p> <p>Open settings. There's a new section called <em>evening</em>. Toggle on <code>witness night</code>. Pick a day. Come back that evening.</p> <p>If the model returns one sentence about a word you used, and the screen sits still for four seconds, and nothing else happens, the feature worked.</p> <p>That is the entire feature.</p> <p>— Day 9 of 30. v29. #BuiltWithMeDo</p>