Why ChatGPT forgets your design system
There's no file for it
Coding agents solved the availability half of this problem with files loaded on every request. That's why Cursor forgetting your coding style is usually fixable by writing a better rules file, and why the same complaint about Lovable losing your design system has a knowledge-file answer.
ChatGPT has no equivalent path. Custom instructions are a small, global block — useful for two or three standing rules, wrong for a component inventory, and applied to everything you do regardless of which product you're working on. A Project keeps attached files scoped to that Project, which helps until you ask a quick question in a normal chat. And memory is a page or two. Nothing in the product is shaped like a design system.
Memory stores prose about you, not structured facts about your system
This is the part that makes it worse than plain absence. Since the memory rebuild in June 2026, what ChatGPT keeps is a synthesized summary — an account of what the system concluded, kept current over time — rather than your exact words. Third-party estimates of its capacity float around a thousand-odd words or a couple hundred entries; OpenAI doesn't publish a number, so treat those as order-of-magnitude only.
Synthesis is the right trade for a small memory holding preferences, and precisely the wrong one for a design system. A token table compresses badly. "Spacing scale is 4, 8, 12, 20, 32; there is no 16" becomes "prefers consistent spacing." The exception you care about is exactly the detail synthesis drops, and what's left is a vibe rather than a constraint.
Your tokens are documentation, not constraints
Design system practitioners writing about AI-assisted work in 2026 converge on one diagnosis, and it isn't really about the model: in most organizations, tokens and component contracts exist as documentation that humans are expected to honor, not as constraints that something checks. Nothing in a chat window can reject an output for using a color that isn't in the palette.
Which means the model is being asked to do the job by memory and goodwill. Even a perfect recall of your palette wouldn't be enforcement — it would be a well-informed suggestion, made by something whose training data contains a million other design systems that all look plausible.
Drift happens inside a single session, not just between them
The failure people report most is the confusing one: consistency breaks between two consecutive prompts in the same conversation. The component it generated at the top of the thread and the variant it generates now don't match, and nobody told it to change anything.
That's the general long-context problem showing up in a specific place. Information in the middle of a long input gets used less reliably than what's at the beginning or end — the mechanism behind ChatGPT forgetting what you said earlier in the same conversation. Your pasted token list is at the top; by message forty it's in the weakest position in the input, and the model fills the gap with something reasonable.
Fabricated token names are the hardest kind of error to catch
A hallucinated API throws. A hallucinated token name is a string. var(--color-brand-600) fails silently, or falls back, or renders something close enough that review misses it. Names invented from your naming convention are more dangerous than random ones, because they look like yours.
This is why teams describe design system drift as accumulating rather than breaking: nothing errors, the diffs look fine individually, and six weeks later the product has four button styles.
What people try
Pasting the tokens and component list every time. Works, and decays. It works best in the first three messages of a thread, and you're paying for the paste on every task. It also encourages the longest threads, which is where positional drift lives.
Putting the top rules in custom instructions. Right move for a handful of load-bearing constraints — the spacing scale, the two-font rule, "never invent a token." The block is small and global, so you're choosing which five facts matter most across all your work, and this is real but partial. It's also distinct from instructions that are set but don't take effect, which is a different failure.
A Project with the design system docs attached. The best built-in option: correctly scoped, holds a real document instead of a paraphrase. The limits are that it's ChatGPT-only, that uploaded files drop out of context in long sessions, and that it does nothing for the quick question you ask outside the Project.
Screenshots from Figma. Good for layout intent, useless for names. A picture of a button doesn't tell it your prop signature, and it definitely doesn't tell it which of the four visually similar buttons is deprecated.
A custom GPT with the system stuffed in. A step up, and the maintenance is the catch: your design system changes weekly, and the GPT's files don't unless someone updates them. A stale system confidently applied is worse than no system.
Wiring the AI to the real component library. This is the direction that actually closes the loop, and it deserves credit rather than a footnote: when generation is constrained to components that exist — through a synced library, a code-connect style mapping, or a design-system MCP server — off-brand output stops being a matter of recall. If your team can invest here, do it. It's more durable than anything a chat window will offer.
The pattern across the list: everything that works is either enforcement or retrieval. Everything that fails is memory-by-repetition.
The Fix: Give ChatGPT the System, and Give Your Pipeline the Enforcement
Split the problem honestly, because half of it isn't a memory problem at all.
The mechanical half belongs to your build. Compile tokens into the artifact your code consumes, so a value that isn't in the system can't resolve. Add lint rules that reject raw hex, off-scale spacing, and unknown token names, and run them in CI. Keep the component library the only source of components. A lint rule cannot forget, cannot be persuaded by a plausible name, and doesn't care how long your conversation was. Anything you can express this way, express this way — not in a memory.
The half that can't be enforced needs to be retrievable. No linter knows why the compact table variant exists, that the old modal was deprecated after an accessibility audit, that a pattern was rejected twice for a reason, or which of two legal-looking components is the current one. That knowledge is prose, it changes, and it's what you're currently re-explaining. It should live in a store your assistants read on every request instead of in a paste buffer.
MemoryLake is a memory layer for that second half — your design system docs, token definitions, deprecations, and the decisions behind them in one store, readable from ChatGPT through the API and from MCP-capable tools like Claude and Codex directly. To be clear about the boundary: it doesn't enforce anything and it isn't a design system. Your pipeline enforces; this is what makes the system available and current.
Step 1: Create an API key
Generate a key and make your first request in about 30 seconds. Keep it in your environment or a secret manager rather than pasting it into a chat window.

Step 2: Upload your first memories
Drop in the documents, images, and files you currently paste: the token definitions as they're actually defined, the component API reference, the deprecation list with dates, the accessibility decisions, the rejected patterns and why. Upload the source files rather than a tidied summary — the summary is where "there is no 16px step" becomes "prefers consistent spacing."

Step 3: Connect your AI & agents
Give Claude, Codex, OpenClaw, and other AI agents access to memory via MCP or the API. ChatGPT has no MCP client, so retrieve the relevant part of the system through the API and inject it into the prompt, a custom GPT's instructions, or the workflow that calls the model. Tools that speak MCP read the same store directly — which matters, because the agent writing the component needs the same system as the assistant designing it.

What this changes in practice
The first difference is that invented token names get rare, and the ones that slip through get caught. Retrieval supplies the real names at generation time; the linter rejects anything else at commit time. Neither alone is sufficient, and together they close the loop.
The second is that the thread stops needing to be long. When the system arrives with the request, you're not front-loading three thousand tokens of palette and hoping they survive to message forty. Short threads are where models are reliable, and not having to re-explain your context is what makes short threads affordable.
The third is that deprecation finally works. Right now a component you retired last quarter still exists in the model's world — it looks like your naming, it appeared in your codebase, and nothing marks it dead. A record with a date and a status is the only thing that distinguishes current from historical, and it's the same reason an architectural decision needs its reason attached to stay binding.
And it stops being ChatGPT-specific. The design system constrains the coding agent as much as the chat window, and an assistant that arrives without your project's context is the same problem in every tool. One store, every reader.
Best practices for AI and design systems
Enforce what's mechanical, retrieve what's contextual
Values, names, scales, and component boundaries go into tokens and lint rules. Rationale, deprecations, exceptions, and rejected patterns go into a retrievable record. Getting this split wrong in either direction is the root of most frustration: teams try to lint intent, or try to remember values.
Ship a machine-readable version of the system
If your tokens only exist in a Figma file and a slide deck, every consumer — human or model — is guessing. A JSON or CSS artifact generated from the source of truth is what makes both enforcement and retrieval possible, and it's the highest-leverage thing on this list.
Mark deprecations with dates and keep the old entry
Deleting a retired component from your docs destroys your ability to explain the code that still uses it. Mark it deprecated, dated, with the replacement named. Undated design systems that disagree with the codebase are worse than one that honestly says "as of July."
Keep the always-loaded set to hard constraints
Whatever you inject on every request should be the rules that make an output wrong, not merely unidiomatic: the spacing scale, the palette, "never invent a token name." The full component reference belongs in retrieval. A wall of design system history in front of every question crowds out the question.
Ask for the names back before you ask for code
For anything substantial, have the model state which tokens and components it plans to use, check that list, then let it generate. It's a thirty-second review of five names instead of a careful read of ninety lines of CSS, and it catches the plausible-name failure specifically.
Don't let the AI define the system
The tempting shortcut is asking the model to propose the tokens and then treating its output as canon. That's how you end up with a system nobody decided on. The model is a consumer of your design system, not an author of it.
Conclusion
ChatGPT forgets your design system because there's nowhere in the product for a design system to live. No rules file, small global custom instructions, Project-scoped files, and a memory that stores a synthesized page about your preferences rather than a token table. On top of that, tokens in most organizations are documentation rather than constraints — so even perfect recall would only be a well-informed suggestion.
The fix is two-sided and neither side is optional. Compile your tokens, lint the violations, and constrain generation to components that exist, because a lint rule cannot forget. Then put the part no linter can express — the reasons, the deprecations, the exceptions, the patterns you already rejected — in one store your assistants read on every request. Then the palette stops being something you paste, and starts being something the system knows.