I built an SEO system with Obsidian, Jev and Claude (it works!)

(no SEO tool)

Timothée

0 min left
FR

I'm going to give you solid arguments to sell you on setting up a system and to stop chatting in Claude or ChatGPT.

But first, there is a problem.

People often teach you what to do: do this, do that.

Much more rarely why you should do it, which data to rely on, and in which cases it's worth it.

For example, everybody tells you that you need to be cited by AI. That's a bad angle. The stake is to do everything you can to find keywords that LLMs won't eat in the next 5 years.

Another example: people sell you traffic curves to show you how good the SEO strategy was. In 2026, that's hard to accept. You now have to find business keywords and stop chasing traffic as if it were an interesting KPI.

Same thing for keyword volume: most of the keywords that bring in clients don't exist in classic SEO tools. Literally undetectable. Well, you have to find them. That's your mission as a consultant!

There is no hack or secret to tackle this GEO or AI SEO. Your data will make the difference. We're entering a data game, and nothing else.

Except that today you can't benefit from it, because you don't have a system. And you don't have permanent memory.

Oh, and it's not just about learning to write skills, it's about having a complete system that can act as an assistant. Like a junior consultant.

For example, you can ask it this:

GEO scoring, per paragraph
ScoreBar/100PbDiagnosis
Surprise285Repeats the consensus, no proprietary data
Grounding4170.7 proof / 100 words, threshold at 2
Content Effort343Generic synthesis, no test run
RRF Alignment624Pricing and integrations not covered
RAG Structurer524Answer 78 words after the H2 "How to choose"
Freshness Guard152Last date cited: 2023
Action Engine383Explains without letting you act

What you see in the image is a mission I gave to my scoring agent.

It reads my text and scores each paragraph against my GEO criteria.

That lowers the risk of writing for nothing.

But you can also ask it to model your Google Search Console data, like we did with Seocity.app.

The only limit of the system is your ability to project yourself into the project and to come up with proposals.

Anyway, the arguments.

ARGUMENT 1: The system is meant to replace all your SEO tools

Claude Code · your notesSearch ConsoleKeyword PlannerYouTubeLighthouseAnalyticsTrends

ARGUMENT 2: To win the SEO game, you will have to dominate the proprietary data game.

Client callSupport ticketPrevious SEO strategyThinkingVideoObsidian · your notes

THE SETUP

You should never move to Obsidian without implementing the LLM wiki model:

ma-base/

Click a folder or a file.

The principle comes from Andrej Karpathy.

The idea:

the LLM writes and maintains its own wiki.

In each new conversation, it can start again from what it has already learned and written.

My Obsidian space is split into two parts.

raw/

That's where I keep all the raw sources:

Claude never modifies this folder.

wiki/

That's the part organized by Claude, which connects the different sources from the different /raw folders

THE SYSTEM IN 4 ADVANTAGES

1. You have permanent memory:

Claude forgets the context → you need a local system with Obsidian

2. The system is an exponential model:

Tomorrow companies will buy your SEO system, and will stop paying a day rate

3. Fight technical isolation:

New models every day, you no longer know what to try. Here, you keep the same base and you iterate with structural updates, without ever starting again from 0

4. Huge efficiency gain:

No memory and no Obsidian → massive productivity loss, because you have no standardized process for your audits, keyword research, etc.

CLAUDE x OBSIDIAN: keywords

How the system thinks about keywords:

The mission

Sort keywords by business interest and decide what to push, create, consolidate or discard

Output

Full skill

seo-mots-cles-business58 lines
name: seo-mots-cles-business

description: Sorts a site's keywords by business intent, with or without Search Console. Three gates, five decisions, no invented volume. Triggers: "business keywords", "which keywords to target", "what should my site fight for".

# Business keywords

## What you give Claude

- The offer and the conversion point (quote, appointment, purchase).
- The target, the market, the language.
- The URLs of the offer pages.
- The Search Console export, Queries + Pages, 3 to 6 months, if you have it.
- Client verbatims, if you have any.

## Instruction

> Run seo-mots-cles-business on [URL]. Offer: [...], target: [...], conversion: [...], market: [...].

## Steps

1. List the non-brand queries. Group the variants of one need into one intent. Flag each merge.

2. Without Search Console, collect Google Suggest, web search and verbatims. Two queries that share the same top 10 go on one page.

3. Discard what an AI answers without a click: definition, "how to", single fact. Keep purchase, price, comparison, reviews, local.

4. Run each intent through the three gates:
- Matches the offer? Yes / No.
- Business intent? Strong / Medium / Weak, read from the modifiers, never from the volume.
- Demonstrated opportunity? Already captured / New / Not demonstrated.

5. Decide: PUSH, CREATE, CONSOLIDATE, DISCARD or TO VALIDATE.

## Observed demand

Write Weak / Medium / Strong, with the signals named next to it.

Strong: 5 Suggest variants or more, 7 mentions in calls or more.

Only 20 Search Console impressions or more confirm the demand.

## Output

- Diagnosis in one sentence.
- 3 to 5 figures, with source and period.
- Four tables: captured intents, opportunities with no page, underperforming pages, discarded queries with their reason.
- 3 actions maximum, each justified by its gate.
- What the data does not allow you to conclude.

## Rules

- No invented volume, position or CPC.
- No score out of 10.
- A high-volume query outside the offer ends up DISCARDED, reason written.
- Search Console does not show the whole market.
- No page created by reflex. First look for an existing URL or existing content.

Save the output in `YYYY-MM-DD-<site>-mots-cles-business.md`.

Your instruction

Run seo-mots-cles-business on . Offer: , target: , conversion: , market: .

CLAUDE x OBSIDIAN: SEO audit and pre-audit

The mission

Analyze indexing, speed, content, cannibalization, internal linking, structured data and business keywords.

Output

Pre-audit before a call

The pre-audit is separate from the full audit.

The mission

Prepare an SEO pre-audit before a call, from the URL alone and from public data.

Output

Full pre-audit skill

seo-pre-audit54 lines
name: seo-pre-audit

description: Prepares an SEO pre-audit before a call, from the URL alone and from public data. Triggers: "prepare the pre-call", "run a pre-audit", "pre-call on [site]".

# Pre-audit before a call

## What you give Claude

- The site URL.
- The offer, the target and the goal, if you know them. Otherwise Claude infers them and marks them "to confirm on the call".

## Instruction

> Run a pre-audit on https://mysite.com. It sells [offer] to [target], the goal is [goal].

## Hard rule

No invented volume, position or traffic.

An unverified figure carries `[TO SOURCE]` or "to collect on the call".

## 1. Public collection

- Identity: age, size, offers, who decides.
- Model: who pays, sales cycle, conversion point.
- SEO: sitemap, useful pages, geo or decision pages, lastmod, redesign.
- AI: queries absorbed by AI, or decision queries.
- Proprietary data: client cases, method, internal figures.
- To ask on the call: Search Console access, weight of each offer in revenue.

## 2. The 7 questions

1. Defensible niche: where to attack first.
2. Pain that costs money.
3. Page templates: 4 to 6.
4. Path to the lead.
5. Timing: why now.
6. Objections.
7. Call outcome: 90-day roadmap and proposal.

Settle 2 or 3 of these questions. The others become questions for the call.

## 3. Output

- Summary: 3 to 5 sentences.
- Diagnosis.
- Angle.
- Dated SEO state.
- Prioritized page templates.
- 90-day roadmap.
- Call notes.
- To verify.

No "visibility": talk about positions, AI citations, leads.

Your instruction

Run a pre-audit on . It sells to , the goal is .

The technical agents

1.1 internal linking agent:

The mission

The system suggests the right internal links so you don't have to look for them by hand.

Output

Full skill

maillage-systeme73 lines
name: maillage-systeme

description: Audits and builds a site's internal linking without Search Console. Triggers: "audit the internal linking", "orphan pages", "linking plan".

# Internal linking

## What you give Claude

- The sitemap URL, or the list of articles.
- Your 3 to 5 pillar keywords.
- Your offer pages: audit, contact, quote, tool.

## Instruction

> Audit the internal linking of mysite.com. My offer pages: [URL].

## Step 0: crawl

python3 ~/.claude/skills/maillage-systeme/scripts/crawl_graph.py https://mysite.com/sitemap.xml -o ./maillage-data

Only `index.json` enters the conversation.

A link present on 80% of pages or more is a template link. It doesn't count.

## Steps

1. Classify each page: Know or Do.

2. Group into pillars of 3 pages minimum, with one hub each.

3. Count body links by distinct source pages. Spot orphans and dead ends.

4. For each link to create: passage and 3 anchors (exact, partial, semantic).

5. Rank them:
- orphan offer page;
- Know to Do link;
- hub to satellite;
- orphan outside the offer;
- link between pillars.

## Criteria for an anchor

- It says what the target promises.
- The sentence still reads well without the link.
- It is not already used toward the same target.
- The 5 words around it are about the target's topic.

One failed criterion: the anchor is rejected.

## Output

- Pillars and hubs.
- Table: page, inbound, outbound, status.
- Link plan: source, target, passage, anchors, justification.
- Diagnosis in one sentence, 3 P1 actions maximum.
- What the data does not allow you to conclude.

## Before adding the links

- Read each passage out loud without the link.
- Insert in batches of 10 to 20.
- Rerun the crawl after each batch.
- End criterion: zero orphan offer pages.

## Rules

- No numeric score.
- An orphan legal page is not a problem.
- Links in the text, never in a "See also".
- Never a link to the homepage from the content.

Save the output in `YYYY-MM-DD-<site>-maillage.md`.

Your instruction

Audit the internal linking of . My offer pages: .

1.2 structured data agent:

The mission

Check that the information in the JSON-LD matches what the page displays.

Output

Full skill

seo-donnees-structurees63 lines
name: seo-donnees-structurees

description: Sets up or audits a site's JSON-LD structured data, derived from the content of each page. Triggers: "structured data", "JSON-LD", "schema.org", "rich results", "markup".

# JSON-LD structured data

## What you give Claude

- Access to the site's code.
- The URLs of the pages to check.
- The real identity: name, logo, founder, social profiles.

## Instruction

> Set up JSON-LD structured data on this project.

> Check that the markup of [URL] matches what the page displays.

## Three rules

1. One source. All the JSON-LD comes from one module (`lib/schema.ts`).

2. One entity, referenced by `@id`. Organization, WebSite and Person are emitted once.

3. Derived from the content. A field typed by hand goes out of sync at the first edit.

## What each signal triggers

| Signal in the page | Schema |
|---|---|
| Article | `Article` |
| Any page | `BreadcrumbList` |
| Real FAQ block | `FAQPage` |
| YouTube video | `VideoObject` |
| Numbered steps | `HowTo` |
| Displayed price | `Product` / `Offer` |

Never ask "which schema do you want". Read the page, emit what it proves.

## Procedure

1. Identify the framework and its version.
2. Find where the data lives.
3. Create `lib/schema.ts`.
4. Emit the site graph in the root layout.
5. Emit one JSON-LD array per page.
6. Delete the old redeclared blocks.
7. Validate with the Google and schema.org tools.

## Audit: three checks

- The JSON is valid.
- Each marked-up value exists as is on the page.
- The markup serves a real Google feature.

## Forbidden

- `FAQPage` or `HowTo` "just in case".
- `aggregateRating`, reviews or prices that can't be verified.
- Author and publisher redeclared on each page.
- Hard-coded `wordCount` or dates.

Ask for your approval before each write to the code.

Your instruction

Set up JSON-LD structured data on this project.

Check that the markup of matches what the page displays.

1.3 Indexing agent

The mission

Check whether pages are indexed, redirected, unknown or not testable.

Output

Skill:

indexing-agent65 lines
You are an SEO auditor specialized in indexing. Your role: check that Google can discover, crawl and index the pages we want to make visible.

What you are given

Domain: [site.com]

List of URLs: public sitemap.xml or urls.txt (one per line)

Priority pages: the 5-30 offer pages (business-critical)

Hub pages: / , /blog , footer, categories (for internal linking)

The 9 checks to run (read-only)

TECHNICAL (causes):

HTTP: final codes + redirects (301/302/200)?

robots.txt: does it block Googlebot or * on these URLs?

noindex: present in a meta tag or in an HTTP header?

Sitemap: present, consistent, lastmod < 6 months?

Consistency: sitemap URLs = given list? Orphans?

Internal linking: how many inbound links per URL (crawl + hubs)?

Content: length per URL (< 300 words = short, dig further)

GOOGLE (observation): 8. site: {URL} on Google (space requests 3-5s apart, detect rate limiting, mark "not testable" if blocked), or Search Console API if you have access 9. Soft 404: test 3 nonexistent URLs, record their title and canonical

Mandatory report

Markdown format with:

Summary: X/N pages with no confirmed defect

Key figures: table of the 9 checks

What blocks: max 3 problems, each = Observation + Proof + Impact + Action + Priority/Effort/Confidence

What works: what is working (avoid negative bias)

Google inspection: table of the URLs inspected one by one

Limits: what we could not test and why

Pre-decision (mandatory): diagnosis (1 sentence) → figures (3-5) → State (Critical/To improve/Healthy) → Problems + Actions P1-P3 → What we cannot conclude

Guardrails

Read-only: no Search Console submit, no forcing

Never: HTTP 200 = indexed, outside sitemap = problem, 1 link = not discovered

Always: "not testable" ≠ "not indexed"

Prioritize offer pages and real anomalies (accidental noindex, 404)

No extrapolation: N URLs tested ≠ whole cluster

Trigger

"Indexing audit of [domain], sitemap: [URL]"

Your instruction

Indexing audit of , sitemap:

I'm adding a layer with a new model: JEV

Trying not to get too technical about Jev (but it's important to talk about it), it's a model used to verify, classify and score, not to write.

It receives a closed question, picks among several possible answers and gives its confidence level.

In my system, I use it mostly with three scripts: verifier.py to check whether each sentence is backed by the sources, liens.py to check the relevance of internal links, and matiere.py to detect proof or real data.

Its main interest is speed: about 0.8 second per call. Jev sorts the information, but doesn't make the final decisions.

In short, an assistant that answers fast, that can settle a question with a yes or a no, that can score an analysis, and that uses far, far fewer tokens.

The mission

JEV is there to sort and verify, not to write content for example.

verifier: looks at each sentence and checks where it comes from: a source, a deduction, nowhere, or filler.

  • 71 Backed
  • 58 Deduced
  • 58 Absent from the corpus
  • 6 Outside the sources

19 of which filler · Score 16/100

verifier.py on a 193-sentence draft, 2026-09-21

liens: spots the internal links that are useful and discards vague or misleading anchors.

matiere: looks for the solid proof available: figures, facts, client quotes or opinions.

calibrer: compares JEV's choices with mine. No automation until we reach 80% agreement on at least 30 cases.

The rule stays simple:

JEV sorts, but the final decision is always mine.

What we give it

Output

Where is your system at?

9 questions · Yes / No

Contents

  1. ARGUMENT 1: The system is meant to replace all your SEO tools
  2. ARGUMENT 2: To win the SEO game, you will have to dominate the proprietary data game.
  3. THE SETUP
  4. THE SYSTEM IN 4 ADVANTAGES
  5. CLAUDE x OBSIDIAN: keywords
  6. CLAUDE x OBSIDIAN: SEO audit and pre-audit
  7. The technical agents
  8. I'm adding a layer with a new model: JEV