Why I Don’t Leave Project State to ChatGPT Memory: Building a Personal LLM Wiki with GitHub and Obsidian

After running a project in ChatGPT for long enough, I eventually find myself asking the same question:

“Where did we leave off last time?”

For one or two conversations, that is not a serious problem. But once a project lasts for days or weeks, the situation changes. Architecture gets debated, assumptions get revised, old sessions become heavy, implementation options are compared, and earlier decisions are sometimes overturned.

ChatGPT has Memory. It also has Projects, and Project Instructions can hold useful operating rules.

But the longer my projects became, the more I realized that what I needed was not more memory.

I needed a clear representation of the current project state: which design is now authoritative, why it was chosen, which questions remain unresolved, and where the next session should resume.

So I reframed the problem.

Instead of asking ChatGPT to remember the conversation, what if I preserve the knowledge that survives the conversation as a project asset?

In this post, I will build the smallest version of the personal LLM Wiki that I actually use with ChatGPT, GitHub, and Obsidian.

The goal is not to build a massive knowledge-management platform.

The goal is to create a small loop: brainstorm freely in ChatGPT, promote only settled knowledge into Markdown, let GitHub version that state, review it in Obsidian, and let the next ChatGPT session read the same state again.

Chat History and Project Knowledge Are Different Things

At first, I thought simply continuing the conversation inside one ChatGPT Project would be enough.

But real projects tend to evolve like this:

Session 1
→ Compare several ideas.

Session 2
→ Select one architecture.

Session 3
→ Review implementation details and revise the design.

Session 4
→ Discover a new constraint.

Session 5
→ “What is the current baseline architecture again?”

The problem is not that the earlier conversations are missing.

It is almost the opposite: there are too many earlier conversations.

Initial assumptions, abandoned designs, unverified ideas, and final decisions all coexist in the same history.

That led me to separate two concepts:

Chat History
= how we arrived here

Project Knowledge
= what we currently know and treat as the baseline

Memory is useful as well, but it serves a different purpose from a project’s Source of Truth.

Instead of merely hoping that ChatGPT roughly remembers an earlier discussion, I wanted the project to answer questions such as:

What is the current goal?

What is the current architecture?

What has been decided?

What is still a hypothesis?

What problems remain open?

What should happen next?

I decided to keep those answers in an explicit external document state rather than leaving them only inside ChatGPT’s internal context.

The Idea I Took from Karpathy’s LLM Wiki

While thinking through this approach, I found Andrej Karpathy’s idea of an LLM Wiki interesting.

A common document-based AI pattern looks roughly like this:

Documents
    ↓
Retrieve
    ↓
LLM
    ↓
Answer

Every time a question arrives, the system retrieves related information, reconstructs the context, and generates an answer again.

The interesting part of the LLM Wiki idea is different.

Instead of forcing the LLM to rediscover the same knowledge from raw material every time, the system interprets knowledge once and accumulates the result in a persistent Wiki that can keep evolving.

I did not try to reproduce the idea literally. I applied it to a problem I already had: continuity across long-running ChatGPT projects.

I adopted one principle:

Do not save the conversation. Save the knowledge that survives the conversation.

That does not mean moving every chat message into a Wiki.

During brainstorming, I promote only the information that the project will need to depend on going forward.

That distinction matters.

My Minimal Structure: ChatGPT + GitHub + Obsidian

The structure I wanted was intentionally simple.

ChatGPT
   ↓
Brainstorming
   ↓
Knowledge Promotion
   ↓
Markdown
   ↓
GitHub
   ↓
Obsidian
   ↓
Next ChatGPT Session

Each tool has a deliberately separate role.

ChatGPT thinks.
Markdown represents knowledge.
GitHub becomes the versioned Source of Truth.
Obsidian becomes the human-readable review workspace.

A personal LLM Wiki loop that promotes selected knowledge from multiple ChatGPT sessions into GitHub and Obsidian project state for reuse in future sessions.
A personal LLM Wiki loop: preserve the knowledge that survives the conversation in GitHub and Obsidian, then reuse that state in the next ChatGPT session.

I am not using GitHub here simply as a backup destination.

I use it as a persistent Project State Layer shared between ChatGPT and me.

Because the state is managed with Git, I can see when a document changed, inspect the diff, roll back a bad change, and continue evolving the same files whether the change came from ChatGPT or from me.

Step 1. Turn an Obsidian Vault into a Git Repository

Start with a Vault that Obsidian can open.

If you already have one, you can use it as-is.

I roughly separate projects from general knowledge with a structure like this:

my-llm-wiki/
├─ 00-Inbox/
├─ 10-Projects/
├─ 20-Knowledge/
├─ 40-Templates/
└─ README.md

On Windows, a new Vault can start like this:

mkdir D:Obsidianmy-llm-wiki
cd D:Obsidianmy-llm-wiki

mkdir 00-Inbox
mkdir 10-Projects
mkdir 20-Knowledge
mkdir 40-Templates

git init

Open the folder in Obsidian using Open folder as vault.

Then create a GitHub repository and connect it:

git branch -M main
git remote add origin https://github.com/<YOUR_ACCOUNT>/<YOUR_REPOSITORY>.git

git add .
git commit -m "chore: initialize personal llm wiki"
git push -u origin main

There is no special AI technique in this step.

The important part is that ChatGPT and Obsidian will eventually operate on the same Markdown repository.

Step 2. Create the Minimum State Documents for Each Project

Now create one project under `10-Projects`.

There is no need to start with an elaborate Knowledge Taxonomy.

For a minimal setup, I think something like this is enough:

10-Projects/
└─ my-project/
   ├─ PROJECT.md
   ├─ architecture/
   ├─ decisions/
   └─ handoffs/
       └─ LATEST.md

These files serve different purposes.

`PROJECT.md` contains the relatively stable definition of the project.

For example:

# Project

## Purpose

The problem this project is trying to solve and its final objective.

## Current Scope

What is currently in scope and what is intentionally excluded.

## Core Principles

The main design principles agreed so far.

## Current Phase

The current phase of the project.

## Key Artifacts

The Architecture, Decision, and Handoff documents that define the current baseline.

`LATEST.md`, on the other hand, is the Working Context that lets the project resume.

# Rolling Handoff

## Current Goal

The objective currently being worked on.

## Current Direction

The design direction currently treated as the baseline.

## Decisions Made

The major decisions confirmed so far.

## Open Questions

Questions that remain unresolved.

## Known Risks

Known risks and constraints.

## Relevant Files

Documents that the next session should read.

## Next Actions

The work that should happen next.

The key is not to turn `LATEST.md` into a session diary.

If every session simply appends more text, the file eventually becomes another giant Chat History.

I use it as a Rolling Handoff that represents the current state.

Session 1
        ↓
LATEST.md v1

Session 2
        ↓
LATEST.md v2

Session 3
        ↓
LATEST.md v3

The past remains in Git History.

`LATEST.md` keeps only the information required to restart the work now.

Step 3. Connect ChatGPT to GitHub

Next, connect GitHub so ChatGPT can read and update the repository.

After connecting the GitHub integration, grant access to the repository you intend to use.

Rather than enabling access to every repository from the beginning, I prefer starting with something whose purpose is clear, such as a personal Wiki repository.

Once the connection is ready, I do not immediately ask ChatGPT to modify files. I first verify that it can read them.

For example:

Check my GitHub my-llm-wiki repository and read:

10-Projects/my-project/PROJECT.md
10-Projects/my-project/handoffs/LATEST.md

Summarize the current project state.

Do not modify any files yet.

The last sentence is important:

“Do not modify any files yet.”

Just because AI has repository access does not mean every conversation should automatically become a write operation.

I keep an intentional boundary between discussion and Knowledge Update.

Step 4. Think Freely During Brainstorming

Now I discuss the project with ChatGPT as usual.

Suppose I am exploring a new Enterprise AI Architecture.

I do not update the Wiki from the first turn.

Instead, I make the brainstorming boundary explicit:

We are in brainstorming mode.

Do not modify PROJECT.md or the architecture documents yet.

Compare possible structures freely, including alternatives and hypotheses
that have not been confirmed.

Inside the conversation, the direction can change as often as necessary.

Idea A
 ↓
Problem discovered
 ↓
Idea B
 ↓
Counterargument
 ↓
Idea C
 ↓
New hypothesis

Most of this is not final knowledge.

If I store all of it, the Wiki becomes polluted very quickly.

The boundary I try to maintain looks like this:

Conversation
├─ Exploration
├─ Hypothesis
├─ Rejected Idea
├─ Open Question
└─ Durable Knowledge
           ↓
        Promote

In other words, ChatGPT should think freely, while the Wiki should change conservatively.

Step 5. Promote Only Settled Knowledge

After several rounds of discussion, suppose the direction has become reasonably clear.

That is when I first ask for a repository update.

For example:

Update the project documents using only what has been confirmed so far.

Use these rules:

- Do not record hypotheses as confirmed facts.
- If something conflicts with an existing decision, do not overwrite it arbitrarily.
- Apply confirmed Architecture changes to the relevant documents.
- Keep unresolved issues under Open Questions.
- Keep PROJECT.md focused on stable project baselines.
- Update handoffs/LATEST.md so the project can resume from the current state.

After the update, summarize which files changed.

This transition is the main reason I use the structure.

Dozens of conversation turns
           ↓
       Synthesis
           ↓
      Promotion
           ↓
A few explicit Markdown artifacts
Ideas, hypotheses, questions, and decisions passing through Knowledge Promotion before becoming durable project documents and reusable knowledge.
Do not save every conversation. Promote only the ideas, decisions, and questions that future project work should continue to depend on.

I think of this process as Knowledge Promotion.

The important question is not whether AI can summarize a conversation well.

The important question is whether the system can distinguish knowledge that future work should depend on from ideas that are still being debated.

GitHub Is Not Only for Storing Files

If I only needed Markdown, I could use Google Drive or a local folder.

But project knowledge has a time dimension.

An Architecture document might evolve like this:

v1
Agent performs every task

        ↓

v2
Separate Agent + Tool responsibilities

        ↓

v3
Separate Deterministic Tools + Agent Reasoning

If I only look at the current document, I may miss why the design reached v3.

Git preserves that evolution.

Current State
+
Diff
+
Commit History
+
Rollback

That is why GitHub becomes more than Cloud Storage. It becomes the Source of Truth for Versioned Project Knowledge.

Knowledge written by AI gains the same kind of change history as code and other project documents.

At that point, the personal Wiki starts to behave differently from a simple notes application.

Step 6. Use Obsidian as the Human Inspection Layer

When ChatGPT updates the repository, pull those changes into the Windows Vault.

cd D:Obsidianmy-llm-wiki
git pull --ff-only

If you use the Obsidian Git plugin, you can also use its Pull or Commit-and-sync functions.

Then read the changed documents directly in Obsidian.

GitHub version history and an Obsidian review workspace sharing the same Markdown project knowledge as a persistent project state layer.
GitHub preserves versioned Project State, while Obsidian provides a human-readable workspace for inspecting and correcting the same Markdown knowledge.

I do not need Obsidian to play a special AI role in this architecture.

I think of it primarily as the Human Inspection Layer.

I can read the project state that ChatGPT generated or modified, correct it when necessary, and avoid locking the knowledge into one specific LLM or SaaS because the source is plain Markdown.

LLM
→ Write / Maintain

Human
→ Read / Validate / Correct

This simple role separation matters more than it may seem.

If AI-generated knowledge exists only inside an invisible Memory layer, incorrect information can accumulate without being obvious.

A Markdown document is directly inspectable by a person.

Step 7. Restart the Project in a New ChatGPT Session

Now comes the most important test.

Instead of continuing the existing ChatGPT conversation, start a new session.

Do not explain the previous 20 turns again.

Ask ChatGPT to read the project state instead:

In my GitHub my-llm-wiki repository, read:

10-Projects/my-project/PROJECT.md
10-Projects/my-project/handoffs/LATEST.md

Summarize the current goal, confirmed design, unresolved questions,
and next actions, then continue from that state.

ChatGPT reconstructs the project’s current baseline from the external documents.

Previous Sessions
       ↓
   Compiled State
       ↓
PROJECT.md
LATEST.md
       ↓
 New Session
Multiple ChatGPT sessions reconnecting to the same project through PROJECT.md and LATEST.md stored in GitHub.
The session can change while the project state persists. PROJECT.md and LATEST.md provide the next ChatGPT session with a reliable restart point.

At this point, the session itself no longer owns the project state.

ChatGPT sessions can change at any time.

The project state remains in GitHub.

That difference has been significant in long-running work.

What Should Go into Project Instructions?

Before adopting this structure, I was tempted to keep adding more content to Project Instructions to preserve continuity across long projects.

Current Architecture, previous decisions, warnings, file locations, and active work status all start accumulating there.

Eventually, the Instructions can become something like this:

Project Instructions
=
Rules
+ Memory
+ Architecture
+ Current State
+ History

I prefer separating those concerns.

Project Instructions
= How to work

Project Wiki
= What we know

Instructions should contain relatively stable operating principles.

For example:

At the start of a new session, read PROJECT.md and LATEST.md first.

Do not infer previous decisions from conversation history alone.

Distinguish confirmed decisions from hypotheses.

Update Project Artifacts only when the user explicitly requests it.

Architecture and current progress are different. They keep changing, so I keep them in the Wiki.

This prevents Project Instructions from becoming an oversized prompt that tries to carry the entire project around with it.

What You Do Not Save Matters More Than Saving Everything

The phrase “LLM Wiki” can easily suggest a system that automatically saves every ChatGPT conversation.

But after using this approach, I found the opposite question more important:

What should not be saved?

Brainstorming needs wrong assumptions.

It needs extreme ideas, counterarguments, and discarded approaches before the design improves.

If all of those traces are stored as if they were current Knowledge, the Wiki becomes more confusing, not less.

My workflow is closer to this:

Think freely
     ↓
Challenge
     ↓
Decide
     ↓
Promote selectively
     ↓
Maintain current knowledge

This is not about building a Conversation Archive.

It is closer to compiling Project Knowledge.

A Personal LLM Wiki Is Also a Small Experiment in Enterprise Knowledge Architecture

So far, this may look like a personal productivity setup.

For an individual project, that alone is already useful.

But after building it, I noticed that the underlying problem resembles the questions I deal with in Enterprise AI.

At a personal scale:

Conversation
     ↓
Human Judgment
     ↓
Knowledge Promotion
     ↓
Markdown
     ↓
Reuse

At enterprise scale, the volume is larger, but the underlying questions are similar.

Documents / CRM / Meetings / External Data
                  ↓
              Interpretation
                  ↓
         Reconciliation / Validation
                  ↓
          Knowledge Promotion
                  ↓
        Enterprise Knowledge
                  ↓
             Agent Reuse

In a personal Wiki, I decide which information gets promoted.

In an enterprise environment, that same step introduces much harder questions.

Who is allowed to see the information? Which Source should be trusted more? What happens when new information conflicts with existing knowledge? When should stale knowledge expire? How far should AI be allowed to update it automatically?

In other words, once Governance starts expanding around a Personal LLM Wiki, the problem naturally becomes an Enterprise Knowledge Architecture problem.

This post does not go that far.

The purpose here is to validate the core principle at the smallest possible scale first.

My Conclusion: Design State Before Memory

The longer we use ChatGPT, the easier it is to assume that what we need is better Memory.

From a project perspective, I think the question should come earlier than that.

Before deciding what the AI should remember, decide what state the project itself should preserve explicitly.

The minimal loop I use today is simple:

Think in ChatGPT.

        ↓

Promote only confirmed knowledge into Markdown.

        ↓

Let GitHub preserve the state with version history.

        ↓

Review it in Obsidian.

        ↓

Let the next ChatGPT session read it again.

I did not need a special Vector DB, Graph DB, or separate Agent Platform to start.

Markdown and Git were enough to establish the habit of separating conversation from project knowledge.

I now see this simple structure as a useful starting point for designing a larger LLM Wiki later.

The goal is not to preserve conversations forever.
The goal is to preserve knowledge that can support the next decision.

In the next post, I plan to go one step further and connect the Project State written by ChatGPT in GitHub to actual automation.

If a Git Commit becomes more than a record—if n8n and a server can receive it and execute a workflow—GitHub can evolve from a Knowledge repository into a Control Plane between AI and the actual Runtime.