<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yukihiro Kimura</title>
    <description>The latest articles on DEV Community by Yukihiro Kimura (@yukihirokimura).</description>
    <link>https://dev.to/yukihirokimura</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3649123%2Fe74d77e8-ee80-48f4-b3f6-4f075118d70e.png</url>
      <title>DEV Community: Yukihiro Kimura</title>
      <link>https://dev.to/yukihirokimura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yukihirokimura"/>
    <language>en</language>
    <item>
      <title>Claude Does Not Have One Memory System: A Map of Chat, Claude Code, and the API</title>
      <dc:creator>Yukihiro Kimura</dc:creator>
      <pubDate>Mon, 03 Aug 2026 23:35:00 +0000</pubDate>
      <link>https://dev.to/yukihirokimura/claude-does-not-have-one-memory-system-a-map-of-chat-claude-code-and-the-api-1g8j</link>
      <guid>https://dev.to/yukihirokimura/claude-does-not-have-one-memory-system-a-map-of-chat-claude-code-and-the-api-1g8j</guid>
      <description>&lt;p&gt;Ask Claude, “Do you remember what we discussed before?” and the answer can feel inconsistent.&lt;/p&gt;

&lt;p&gt;Sometimes it knows. Sometimes it does not.&lt;/p&gt;

&lt;p&gt;Claude Code may carry a build command into tomorrow's session, then appear to forget it when you open another repository. Clone the same repository on another machine, and some of that context disappears again.&lt;/p&gt;

&lt;p&gt;The problem is not simply that Claude has “good” or “bad” memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude does not have one unified memory system.&lt;/strong&gt; Chat, projects, Claude Code, and applications built with the Claude API use different mechanisms. They store different things, in different places, and stop at different boundaries.&lt;/p&gt;

&lt;p&gt;This article maps those mechanisms by asking four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who writes or retrieves the information?&lt;/li&gt;
&lt;li&gt;Where does it live?&lt;/li&gt;
&lt;li&gt;Where can it be used?&lt;/li&gt;
&lt;li&gt;How do you remove it?&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This article reflects the product documentation available on August 4, 2026. Claude's memory experience is currently being migrated, so your plan and settings screen may differ. Check the linked official documentation and the settings shown in your own account.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also made a &lt;a href="https://speakerdeck.com/yukihirokimuraj/claudeno-ji-yi-hadokoniaru-tiyatutoclaude-codeapinojing-jie-wozheng-li-suru" rel="noopener noreferrer"&gt;15-slide Japanese overview on Speaker Deck&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My six-container model
&lt;/h2&gt;

&lt;p&gt;“Six containers” is my way of organizing the product. It is not Anthropic's official taxonomy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Who manages it?&lt;/th&gt;
&lt;th&gt;Effective boundary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Chat&lt;/td&gt;
&lt;td&gt;Memory generated from non-project chats&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Chats outside projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Chat&lt;/td&gt;
&lt;td&gt;Project memory&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;One specific project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Chat&lt;/td&gt;
&lt;td&gt;Past chat search&lt;/td&gt;
&lt;td&gt;Claude searches when needed&lt;/td&gt;
&lt;td&gt;Non-project chats, or one specific project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;CLAUDE.local.md&lt;/code&gt;, and &lt;code&gt;.claude/rules/*.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;td&gt;Depends on file location and launch directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Auto memory&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;One repository on one machine by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An app using the Claude API&lt;/td&gt;
&lt;td&gt;Memory tool&lt;/td&gt;
&lt;td&gt;Claude requests operations; your app executes them&lt;/td&gt;
&lt;td&gt;Whatever your application defines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At a high level, the map looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Chat                  Claude Code                 Your application

chat memory                  CLAUDE.md                   Claude API
project memory               .claude/rules/                 ↓
past chat search             auto memory                memory tool request
                                                             ↓
                                                        storage you control
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are no arrows between the three columns because memory is not automatically shared across them.&lt;/p&gt;

&lt;p&gt;What Claude learned in a normal chat does not automatically become Claude Code's auto memory. A &lt;code&gt;CLAUDE.md&lt;/code&gt; file does not automatically appear in Claude Chat. The API memory tool is not an endpoint for reading the memory attached to your Claude Chat account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Chat has both memory and search
&lt;/h2&gt;

&lt;p&gt;The first distinction is easy to miss: &lt;strong&gt;memory&lt;/strong&gt; and &lt;strong&gt;past chat search&lt;/strong&gt; are separate features.&lt;/p&gt;

&lt;p&gt;Memory keeps extracted information that may remain useful across conversations: your role, active work, communication preferences, tools, and technical preferences.&lt;/p&gt;

&lt;p&gt;Past chat search does not pre-store a summary of everything. Claude searches the original conversation history when it needs a detail. When this happens, the search appears as a tool call in the conversation.&lt;/p&gt;

&lt;p&gt;The practical difference is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory:&lt;/strong&gt; prepared context that can already influence a new conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Past chat search:&lt;/strong&gt; retrieval from an earlier conversation when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic documents both behaviors in &lt;a href="https://support.claude.com/en/articles/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context" rel="noopener noreferrer"&gt;Use Claude's chat search and memory to build on previous context&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The memory rollout creates two experiences
&lt;/h3&gt;

&lt;p&gt;As of this writing, Claude is moving users to an improved memory experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you see &lt;strong&gt;Settings &amp;gt; Memory&lt;/strong&gt;, you have the improved experience. Memory is stored as individual entries grouped into categories, and Claude reads, writes, and updates them in real time. Anthropic says this experience is available to Free, Pro, and Max users and is becoming the default for new users.&lt;/li&gt;
&lt;li&gt;If you see memory under &lt;strong&gt;Settings &amp;gt; Capabilities&lt;/strong&gt;, you have the legacy experience. It creates a synthesized memory summary and updates it roughly every 24 hours. Team and Enterprise users are remaining on this experience during the current rollout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Past chat search has a different plan boundary: Anthropic currently lists it for Pro, Max, Team, and Enterprise plans.&lt;/p&gt;

&lt;p&gt;This means “memory” and “search” should not be treated as two names for the same feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search stops at project boundaries
&lt;/h3&gt;

&lt;p&gt;Claude can search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;all chats outside projects, when you are outside a project;&lt;/li&gt;
&lt;li&gt;conversations inside the current project, when you are working in that project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not perform one account-wide search across both sides of that boundary.&lt;/p&gt;

&lt;p&gt;These searches therefore fail by design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;searching from a non-project chat for something discussed in Project A;&lt;/li&gt;
&lt;li&gt;searching from Project A for something discussed outside projects;&lt;/li&gt;
&lt;li&gt;searching from Project A for something discussed in Project B.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each project also has its own memory space and project summary. Project A does not inherit the memory accumulated outside projects, and Project B does not inherit Project A's memory.&lt;/p&gt;

&lt;p&gt;That separation can feel like forgetting. It is also what prevents one client's context from leaking into another client's project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deleting a chat and deleting memory are not always the same action
&lt;/h3&gt;

&lt;p&gt;In the improved memory experience, deleting or expiring the original conversation does not remove memory entries generated from it. You delete those entries from &lt;strong&gt;Settings &amp;gt; Memory&lt;/strong&gt;, or reset memory entirely.&lt;/p&gt;

&lt;p&gt;In the legacy experience, deleting a conversation removes it from the synthesized memory. Anthropic says the synthesis is updated within 24 hours.&lt;/p&gt;

&lt;p&gt;If you only want to prevent search, you can turn off &lt;strong&gt;Search and reference chats&lt;/strong&gt; in the relevant settings screen without deleting every conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incognito Chat is temporary, not a secret vault
&lt;/h2&gt;

&lt;p&gt;An Incognito Chat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does not use Claude's existing chat memory;&lt;/li&gt;
&lt;li&gt;is not saved to chat history;&lt;/li&gt;
&lt;li&gt;does not create future memory entries;&lt;/li&gt;
&lt;li&gt;is not used by past chat search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, profile information such as custom styles and personal preferences can still be available inside the chat.&lt;/p&gt;

&lt;p&gt;The conversation data is also not erased the moment you close the window. Anthropic says incognito chats are retained for 30 days by default. Enterprise organizations can configure a longer retention period, and Team and Enterprise exports include incognito chats.&lt;/p&gt;

&lt;p&gt;So the right use case is &lt;strong&gt;a conversation you do not want carried into future chats&lt;/strong&gt;, not “a place where sensitive information can never be retained.”&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://support.claude.com/en/articles/12260368-use-incognito-chats" rel="noopener noreferrer"&gt;Use incognito chats&lt;/a&gt; for the current retention and availability details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code has memory written by you and memory written by Claude
&lt;/h2&gt;

&lt;p&gt;Every Claude Code session begins with a fresh context window. Two mechanisms carry knowledge across sessions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; files containing instructions you wrote&lt;/li&gt;
&lt;li&gt;Auto memory containing notes Claude wrote&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anthropic describes both in &lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;How Claude remembers your project&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;CLAUDE.md&lt;/code&gt;: instructions you control
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;CLAUDE.md&lt;/code&gt; for things you do not want to explain again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build and test commands;&lt;/li&gt;
&lt;li&gt;coding conventions;&lt;/li&gt;
&lt;li&gt;project architecture;&lt;/li&gt;
&lt;li&gt;review requirements;&lt;/li&gt;
&lt;li&gt;actions Claude should avoid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common locations have different scopes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your preferences across all projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;./CLAUDE.md&lt;/code&gt; or &lt;code&gt;./.claude/CLAUDE.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Team-shared project instructions, usually committed to Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./CLAUDE.local.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Personal instructions for this project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;CLAUDE.local.md&lt;/code&gt; is intended for personal project-specific instructions, but Git does not magically keep it private. Add it to &lt;code&gt;.gitignore&lt;/code&gt; if you do not want it committed.&lt;/p&gt;

&lt;p&gt;These files are context, not hard enforcement. Claude Code concatenates the instructions it discovers. It does not treat a nearer file as a guaranteed override of every earlier instruction. Contradictory rules can therefore produce inconsistent behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;.claude/rules/&lt;/code&gt;: split instructions and scope them by path
&lt;/h3&gt;

&lt;p&gt;For a larger project, you can split instructions into arbitrary Markdown files under &lt;code&gt;.claude/rules/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.claude/
├── CLAUDE.md
└── rules/
    ├── testing.md
    ├── api-design.md
    └── frontend/
        └── accessibility.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A rule without &lt;code&gt;paths&lt;/code&gt; front matter applies to the whole project. Add &lt;code&gt;paths&lt;/code&gt; to load it only when Claude works with matching files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/api/**/*.ts"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# API development rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Validate input at every endpoint.
&lt;span class="p"&gt;-&lt;/span&gt; Use the shared error response format.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My rule of thumb is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;put short, project-wide instructions in &lt;code&gt;CLAUDE.md&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;use &lt;code&gt;.claude/rules/&lt;/code&gt; for separate topics or path-specific instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Auto memory: notes Claude Code writes for itself
&lt;/h3&gt;

&lt;p&gt;Auto memory stores things Claude judges useful for future sessions: build commands, debugging findings, architecture notes, code style preferences, and workflow habits.&lt;/p&gt;

&lt;p&gt;By default, each repository gets a local directory like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/memory/
├── MEMORY.md
├── debugging.md
├── api-conventions.md
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;lt;project&amp;gt;&lt;/code&gt; is derived from the Git repository. It is not a name you are expected to choose manually.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; is the entry point. Claude Code loads its first 200 lines or 25 KB, whichever comes first, at the beginning of a conversation. More detailed files such as &lt;code&gt;debugging.md&lt;/code&gt; are read on demand.&lt;/p&gt;

&lt;p&gt;The important boundary is the machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subdirectories and worktrees in the same repository share one auto-memory directory;&lt;/li&gt;
&lt;li&gt;another machine does not receive it automatically;&lt;/li&gt;
&lt;li&gt;it lives outside the repository by default, so changing &lt;code&gt;.gitignore&lt;/code&gt; does not make it team-shared.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run &lt;code&gt;/memory&lt;/code&gt; to inspect or edit the files and toggle auto memory. Everything is plain Markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Claude Code memory belongs in Git?
&lt;/h3&gt;

&lt;p&gt;I use this promotion rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;team-wide rules and required procedures → commit them in &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;.claude/rules/&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;provisional findings from one machine → leave them in auto memory;&lt;/li&gt;
&lt;li&gt;a finding that repeatedly matters → review it and promote it into a shared file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Auto memory is useful as a notebook. It should not become the only copy of knowledge your team depends on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API memory tool means your application owns the memory
&lt;/h2&gt;

&lt;p&gt;The Claude API memory tool is another mechanism with a similar name and a very different storage model.&lt;/p&gt;

&lt;p&gt;Claude can request file operations such as create, read, update, and delete under a logical &lt;code&gt;/memories&lt;/code&gt; path. Your application executes those operations and returns the result.&lt;/p&gt;

&lt;p&gt;The tool operates client-side. Your application decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether memory is stored in files, a database, or cloud storage;&lt;/li&gt;
&lt;li&gt;how one user's memory is separated from another's;&lt;/li&gt;
&lt;li&gt;which sessions reconnect to the same memory;&lt;/li&gt;
&lt;li&gt;how long the data is retained;&lt;/li&gt;
&lt;li&gt;how users view and delete it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic does not provide an account-level memory store for your application through this tool. The documentation is explicit: Claude requests the operation, while your infrastructure performs it against storage you control.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool" rel="noopener noreferrer"&gt;Memory tool documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five boundaries worth remembering
&lt;/h2&gt;

&lt;p&gt;The product names will change. These boundaries are more durable.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Claude Chat / Claude Code
&lt;/h3&gt;

&lt;p&gt;Chat memory and Claude Code's instruction files and auto memory are separate systems. Context does not cross automatically in either direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Outside a project / inside a project
&lt;/h3&gt;

&lt;p&gt;Project memory and past chat search remain inside one project. Creating a project is also creating a memory boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. This machine / another machine
&lt;/h3&gt;

&lt;p&gt;Claude Code auto memory is machine-local by default. Cloning the repository elsewhere does not bring it along.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Claude Chat / Cowork
&lt;/h3&gt;

&lt;p&gt;What Claude remembers about you in Chat does not currently carry into Cowork. Cowork can maintain separate memory inside Cowork projects, scoped to each project. See &lt;a href="https://support.claude.com/en/articles/13345190-get-started-with-claude-cowork" rel="noopener noreferrer"&gt;Get started with Claude Cowork&lt;/a&gt; and &lt;a href="https://support.claude.com/en/articles/14116274-organize-your-tasks-with-projects-in-claude-cowork" rel="noopener noreferrer"&gt;Organize your tasks with projects in Claude Cowork&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Claude / another application
&lt;/h3&gt;

&lt;p&gt;Memory does not automatically move to another AI service or custom application. Claude's memory import is experimental and requires an explicit import flow. API-based applications must implement their own storage and identity boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose the storage location from the thing you want remembered
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What should persist?&lt;/th&gt;
&lt;th&gt;Put it here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your role, communication style, and general working preferences&lt;/td&gt;
&lt;td&gt;Memory generated from non-project Claude Chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assumptions and decisions for one client or project&lt;/td&gt;
&lt;td&gt;A separate Claude project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding rules the whole team must follow&lt;/td&gt;
&lt;td&gt;Repository &lt;code&gt;CLAUDE.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules for one directory or file type&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.claude/rules/*.md&lt;/code&gt; with &lt;code&gt;paths&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A local finding Claude Code may reuse&lt;/td&gt;
&lt;td&gt;Auto memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A finding needed on another machine or by the team&lt;/td&gt;
&lt;td&gt;Promote it from auto memory into a committed file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A temporary conversation that should not affect future memory or search&lt;/td&gt;
&lt;td&gt;Incognito Chat, while respecting its retention policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent information for users of your own application&lt;/td&gt;
&lt;td&gt;The API memory tool plus storage and deletion behavior you implement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Duplicating the same fact everywhere does not necessarily make the system safer. It creates multiple copies that can become stale or contradictory.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Claude appears to have forgotten
&lt;/h2&gt;

&lt;p&gt;Before repeating the information, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which product surface created it?&lt;/li&gt;
&lt;li&gt;Was it stored as memory, or was it only present in the original conversation?&lt;/li&gt;
&lt;li&gt;Which project, repository, application, or machine owns it?&lt;/li&gt;
&lt;li&gt;Is the current session still inside that boundary?&lt;/li&gt;
&lt;li&gt;Does deleting the source conversation also delete this type of memory?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Does Claude remember?” is usually too broad a question.&lt;/p&gt;

&lt;p&gt;The more useful question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which memory system am I using, and where does its boundary stop?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published in Japanese on Zenn: &lt;a href="https://zenn.dev/yukihirokimuraj/articles/claude-memory-map" rel="noopener noreferrer"&gt;Claudeの「記憶」はどこにある？ チャット・Claude Code・APIの境界を整理する&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This English edition was translated and edited with AI assistance from a Japanese article that I carefully reviewed and revised. I remain responsible for the published content.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>I automated my weight logging into Notion, and gave myself a new daily chore</title>
      <dc:creator>Yukihiro Kimura</dc:creator>
      <pubDate>Fri, 31 Jul 2026 21:28:27 +0000</pubDate>
      <link>https://dev.to/yukihirokimura/i-automated-my-weight-logging-into-notion-and-gave-myself-a-new-daily-chore-2coa</link>
      <guid>https://dev.to/yukihirokimura/i-automated-my-weight-logging-into-notion-and-gave-myself-a-new-daily-chore-2coa</guid>
      <description>&lt;h2&gt;
  
  
  What I wanted
&lt;/h2&gt;

&lt;p&gt;I'm building a system where all my daily records live in Notion, so I can point an AI at it and get feedback. Goals, tasks, daily logs, finances — those are all manual entry, and that's fine. But one day it hit me that &lt;strong&gt;weight&lt;/strong&gt; would be nice to sync automatically.&lt;/p&gt;

&lt;p&gt;The requirements were simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every morning, my weight and body fat percentage get appended to a Notion database as one row&lt;/li&gt;
&lt;li&gt;No manual typing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. My scale is a Withings Body Smart.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design I picked first
&lt;/h2&gt;

&lt;p&gt;This one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scale → vendor app → Apple Health → iOS Shortcut → Notion API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I chose Apple Health as the hub for these reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't depend on the scale model.&lt;/strong&gt; As long as the data lands in Health, the same implementation works for any vendor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No server required.&lt;/strong&gt; A time-based Shortcuts automation handles it end to end — no always-on machine, no cron.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free.&lt;/strong&gt; No extra subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensible later.&lt;/strong&gt; Anything that's already in Health — steps, sleep, heart rate — could be added the same way (if I ever wanted to).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generic, zero cost, extensible. The design looked sound to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;Here's what the Shortcut looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Find Health Samples          [Weight] latest, limit 1
2. Get Details of Health Sample [Value]      → variable Kg
3. Get Details of Health Sample [Start Date] → variable SampleDate
4. Format Date                  yyyy-MM-dd   → variable Ymd
5. If Ymd == today
6.   Text                       ← build the JSON
7.   Get Contents of URL        ← POST to the Notion API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5 matters. Without it, on a day you don't step on the scale, &lt;strong&gt;yesterday's weight gets appended under today's date&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's the JSON built in step 6:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"database_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@@YMD@@"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Measured"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@@YMD@@"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Weight kg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@@KG@@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Body fat %"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@@FAT@@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(My real database uses Japanese property names. What matters is that they match your database exactly.)&lt;/p&gt;

&lt;p&gt;I write this as a plain string in a Text action and hand it to the POST action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the Notion side
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use an access token, not OAuth
&lt;/h3&gt;

&lt;p&gt;Notion offers two auth methods for a connection: an internal access token, and OAuth. &lt;strong&gt;OAuth is meant for apps that get installed into other people's workspaces, or listed on the Marketplace&lt;/strong&gt; — so for this I went with the access token.&lt;/p&gt;

&lt;h3&gt;
  
  
  I attached the connection at the parent page
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Notion permissions are inherited by child pages.&lt;/strong&gt; If you connect an integration at a parent page, everything underneath it becomes reachable.&lt;/p&gt;

&lt;p&gt;In my case I may want to auto-sync things other than weight later, so I granted access at the parent page that holds my personal data.&lt;/p&gt;

&lt;p&gt;Note: if you're doing this at work, you'd want to scope it down to the minimum necessary permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  I hit a 400 twice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  First: it says there's no &lt;code&gt;parent&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Provide a `parent.page_id` or `parent.database_id` parameter to create a page,
              or use a public integration with `insert_content` capability.
              Internal integrations aren't owned by a single user, so creating
              workspace-level private pages is not supported."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My JSON &lt;em&gt;has&lt;/em&gt; a &lt;code&gt;parent&lt;/code&gt;. And I still got this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cause was that I never wired the JSON into the request body.&lt;/strong&gt; When I set up the POST action in Shortcuts, I hadn't configured it to actually take the JSON — so I was POSTing an empty body. Yeah.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second: &lt;code&gt;invalid_json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error parsing JSON body."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Weight was appending fine, so I went to add body fat percentage. When I added the property, I forgot the trailing comma on the previous line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"Weight kg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;67.878&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;comma&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Body fat %"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;16.058&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Shortcuts has no syntax highlighting and no linter&lt;/strong&gt;, so I walked right past it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The only debugging tool you get
&lt;/h3&gt;

&lt;p&gt;Drop a &lt;strong&gt;Quick Look&lt;/strong&gt; action immediately after the Text action. It shows you the expanded JSON exactly as it will be sent, so you can confirm the variables actually resolved to values.&lt;/p&gt;

&lt;p&gt;In Shortcuts development this is effectively your only debugging tool. When you're stuck, look at the payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rounding the numbers
&lt;/h2&gt;

&lt;p&gt;The weight coming out of Health was something like &lt;code&gt;67.87800598144531&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I first tried to round it inside Shortcuts, but &lt;strong&gt;somehow I could not get it to work&lt;/strong&gt;, so I rounded on the Notion side instead.&lt;/p&gt;

&lt;p&gt;Add one formula column to the weight database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Weight kg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then hide the raw column in the view and show only the rounded one. Much easier to read.&lt;/p&gt;

&lt;p&gt;As a side effect this turned out to be the better design anyway: the raw value stays in the database, and rounding is a display concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  It works. And then I noticed something
&lt;/h2&gt;

&lt;p&gt;It ran. Rows appeared in Notion.&lt;/p&gt;

&lt;p&gt;But there was one problem left.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple Health doesn't get the data unless I open the Withings app.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stepping on the scale every morning isn't enough. If I want a row every day, I have to open the Withings app every day. Background App Refresh is on, and even then there's no guarantee it syncs daily.&lt;/p&gt;

&lt;p&gt;So the actual workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Step on the scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open the Withings app&lt;/strong&gt; ← New!&lt;/li&gt;
&lt;li&gt;The Shortcut runs (I changed the trigger to "when the Withings app is closed"...)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The appending is automated now, but a daily manual step survived. What I actually wanted was for stepping on the scale to be the whole interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I got wrong
&lt;/h2&gt;

&lt;p&gt;Apple Health is a bucket that &lt;strong&gt;gets written to when a connected app launches&lt;/strong&gt; — it isn't necessarily something that goes and fetches data on its own. I thought I was picking a hub. What I actually put in the middle of the path was a bucket waiting for the Withings app to open.&lt;/p&gt;

&lt;p&gt;Meanwhile, Withings has a public API. The scale is on Wi-Fi and presumably pushes measurements straight to the cloud, so a path like this might work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scale --Wi-Fi--&amp;gt; Withings cloud --webhook--&amp;gt; my own endpoint --&amp;gt; Notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A row appears in Notion the moment I step on the scale. There's no app to open.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I picked Health because I wanted the design to be generic — but &lt;strong&gt;the scale I actually own is one of the models that can skip that generic layer and be called directly&lt;/strong&gt;. By choosing "a design that works with any scale," I missed the better path that only my scale had.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When you design an automation path, check up front whether each hop can push data forward on its own.&lt;/strong&gt; If even one hop is pull-based — it only moves data when something comes asking — that's where a human eventually ends up doing the work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published in Japanese on Zenn: &lt;a href="https://zenn.dev/yukihirokimuraj/articles/afe22b0e3ffd97" rel="noopener noreferrer"&gt;体重を自動でNotionに記録したかったが、毎朝アプリを開く仕事が残った&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This English edition was translated and edited with AI assistance from a Japanese article that I carefully reviewed and revised. I remain responsible for the published content.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ios</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
