docs: README overhaul + landing page refresh (GTM Phase 1+2) - #174
Conversation
📝 WalkthroughWalkthroughThis PR implements a GTM messaging refresh across planning, documentation, and landing page. It establishes offline-first positioning for v0.0.8, updates installation to use an ChangesGTM Messaging Refresh: Offline-First Positioning
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🔍 Cora AI Code Review✅ No issues found. Code looks good! Review powered by cora-cli · BYOK · MIT |
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/plans/2026-06-04-readme-landing-page-gtm.md`:
- Line 91: Update the two fenced code blocks that currently lack language tags
by adding explicit languages: change the block meant to contain Markdown to
```markdown and the plain/text block to ```text so they pass markdown lint and
get proper syntax highlighting; locate the two unnamed fenced blocks in the
README landing page document and replace their opening ``` with ```markdown and
```text respectively.
In `@README.md`:
- Line 19: Update the installer command occurrences that currently use "curl
-sSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh" to
include the -f flag (make them "curl -fsSL ... | sh") so curl fails fast on HTTP
errors; search for the exact string "curl -sSL
https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh" (present
at the README locations noted) and replace both instances with the "-fsSL"
variant.
- Around line 41-52: The Markdown table in README.md under the "Why Uteke?"
section is malformed because every row begins with double pipes ("||"), causing
GitHub to not render the table; fix it by replacing the leading "||" with a
single "|" for the header, separator and every data row so the first and last
columns are properly delimited (ensure the header separator row still contains
the required `---` cells separated by single pipes), and verify the table rows
(the lines currently starting with "|| | **Uteke**" through the final license
row) all use single leading and inter-cell pipes so the table renders correctly.
In `@website/src/routes/`+page.svelte:
- Around line 143-147: Update the displayed installer command and the clipboard
copy text to use the canonical curl flags "-fsSL" instead of "-sSL": change the
visible strings in the hero span elements (the hidden sm:inline and sm:hidden
spans showing the command) and the value passed to navigator.clipboard.writeText
in the onclick handler so both display and copied text use "curl -fsSL
https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh"; apply the
same replacement for the Quick Start snippet referenced around the other
occurrence (also update its navigator.clipboard.writeText if present).
- Around line 63-74: The comparisons array currently uses the competitor column
key "cognee" and values that don't match the README; update the Comparison[]
literal (the comparisons variable) to use the competitor key name "zep" instead
of "cognee" and replace that column's cell values to exactly match the README's
Phase 2 contract for Zep (e.g., the same entries for Install, API Keys, Offline,
Semantic Search, Privacy, Recall Speed, Tag Management, Memory Aging, Shell
Hooks, License). Ensure the object keys across all rows are uniform (uteke,
mem0, letta, zep) and that the updated values match the README text verbatim so
both surfaces stay in sync.
- Around line 104-108: The meta tags in +page.svelte reference /og-image.png but
the file website/static/og-image.png is missing; either add and commit the
actual image file into website/static (so the <meta property="og:image"
content="/og-image.png" /> and <meta name="twitter:image"
content="/og-image.png" /> resolve) or update those meta tags in +page.svelte to
point to an existing tracked asset (e.g., replace "/og-image.png" with the
path/name of a current image in website/static) so the OG/Twitter images load
correctly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 29fe7dae-a585-4dce-ba13-d356259d991a
📒 Files selected for processing (3)
README.mddocs/plans/2026-06-04-readme-landing-page-gtm.mdwebsite/src/routes/+page.svelte
| **That's it.** No API keys. No Docker. No Python. First run downloads the embedding model (~188MB) and you're good to go. | ||
|
|
||
| > 📖 More install options: [INSTALL.md](INSTALL.md) · [Pre-built binaries](https://github.com/ajianaz/uteke/releases) · [Docker](https://github.com/ajianaz/uteke/pkgs/container/uteke) | ||
| ``` |
There was a problem hiding this comment.
Add language identifiers to fenced code blocks.
Line 91 and Line 388 use fenced blocks without a language tag, which can fail markdown lint and reduce syntax highlighting quality.
Suggested fix
-```
+```markdown
...
-```
+```
-```
+```text
...
-```
+```Also applies to: 388-388
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 91-91: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/plans/2026-06-04-readme-landing-page-gtm.md` at line 91, Update the two
fenced code blocks that currently lack language tags by adding explicit
languages: change the block meant to contain Markdown to ```markdown and the
plain/text block to ```text so they pass markdown lint and get proper syntax
highlighting; locate the two unnamed fenced blocks in the README landing page
document and replace their opening ``` with ```markdown and ```text
respectively.
| cd uteke | ||
| cargo install --path crates/uteke-cli | ||
| # Install (macOS, Linux, Windows) | ||
| curl -sSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh |
There was a problem hiding this comment.
Use curl -fsSL for install snippets to match installer contract.
Line 19 and Line 92 use -sSL; the repo installer usage is -fsSL. Using -f fails fast on HTTP errors and avoids piping error pages into sh.
Suggested fix
-curl -sSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh
+curl -fsSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | shAlso applies to: 92-92
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` at line 19, Update the installer command occurrences that
currently use "curl -sSL
https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh" to include
the -f flag (make them "curl -fsSL ... | sh") so curl fails fast on HTTP errors;
search for the exact string "curl -sSL
https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh" (present
at the README locations noted) and replace both instances with the "-fsSL"
variant.
| || | **Uteke** | **Mem0** | **Letta** | **Zep** | | ||
| ||---|---|---|---|---| | ||
| || **Setup** | Single binary | pip + Docker + Qdrant | pip + Docker + Postgres | pip + Docker + Neo4j | | ||
| || **API keys needed** | ❌ None | ✅ OpenAI/LLM key | ✅ LLM key | ✅ LLM key | | ||
| || **Offline** | ✅ Fully | ❌ Cloud embedding | ❌ Needs LLM server | ❌ Needs LLM + vector DB | | ||
| || **Semantic search** | ✅ Local ONNX | ✅ Cloud embedding | ⚠️ Keyword + archival | ✅ GraphRAG | | ||
| || **Zero config** | ✅ Works instantly | ❌ Docker + env vars | ❌ Docker + env vars | ❌ Docker + env vars | | ||
| || **Embedding model** | Built-in (ONNX) | External (cloud) | External | External | | ||
| || **Recall speed** | ~30ms (library) | Network round-trip | Network round-trip | Network round-trip | | ||
| || **Privacy** | ✅ Data never leaves machine | ⚠️ Data sent to LLM | ⚠️ Data sent to LLM | ⚠️ Data sent to LLM | | ||
| || **Language** | Rust | Python | Python | Go + Python | | ||
| || **License** | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 | |
There was a problem hiding this comment.
Fix broken Markdown table syntax in “Why Uteke?”
The rows on Line 41–Line 52 start with ||, so the table won’t render correctly on GitHub. This breaks a key conversion section.
Suggested fix
-|| | **Uteke** | **Mem0** | **Letta** | **Zep** |
-||---|---|---|---|---|
-|| **Setup** | Single binary | pip + Docker + Qdrant | pip + Docker + Postgres | pip + Docker + Neo4j |
+| | **Uteke** | **Mem0** | **Letta** | **Zep** |
+|---|---|---|---|---|
+| **Setup** | Single binary | pip + Docker + Qdrant | pip + Docker + Postgres | pip + Docker + Neo4j |
...
-|| **License** | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 |
+| **License** | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 |📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| || | **Uteke** | **Mem0** | **Letta** | **Zep** | | |
| ||---|---|---|---|---| | |
| || **Setup** | Single binary | pip + Docker + Qdrant | pip + Docker + Postgres | pip + Docker + Neo4j | | |
| || **API keys needed** | ❌ None | ✅ OpenAI/LLM key | ✅ LLM key | ✅ LLM key | | |
| || **Offline** | ✅ Fully | ❌ Cloud embedding | ❌ Needs LLM server | ❌ Needs LLM + vector DB | | |
| || **Semantic search** | ✅ Local ONNX | ✅ Cloud embedding | ⚠️ Keyword + archival | ✅ GraphRAG | | |
| || **Zero config** | ✅ Works instantly | ❌ Docker + env vars | ❌ Docker + env vars | ❌ Docker + env vars | | |
| || **Embedding model** | Built-in (ONNX) | External (cloud) | External | External | | |
| || **Recall speed** | ~30ms (library) | Network round-trip | Network round-trip | Network round-trip | | |
| || **Privacy** | ✅ Data never leaves machine | ⚠️ Data sent to LLM | ⚠️ Data sent to LLM | ⚠️ Data sent to LLM | | |
| || **Language** | Rust | Python | Python | Go + Python | | |
| || **License** | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 | | |
| | | **Uteke** | **Mem0** | **Letta** | **Zep** | | |
| |---|---|---|---|---| | |
| | **Setup** | Single binary | pip + Docker + Qdrant | pip + Docker + Postgres | pip + Docker + Neo4j | | |
| | **API keys needed** | ❌ None | ✅ OpenAI/LLM key | ✅ LLM key | ✅ LLM key | | |
| | **Offline** | ✅ Fully | ❌ Cloud embedding | ❌ Needs LLM server | ❌ Needs LLM + vector DB | | |
| | **Semantic search** | ✅ Local ONNX | ✅ Cloud embedding | ⚠️ Keyword + archival | ✅ GraphRAG | | |
| | **Zero config** | ✅ Works instantly | ❌ Docker + env vars | ❌ Docker + env vars | ❌ Docker + env vars | | |
| | **Embedding model** | Built-in (ONNX) | External (cloud) | External | External | | |
| | **Recall speed** | ~30ms (library) | Network round-trip | Network round-trip | Network round-trip | | |
| | **Privacy** | ✅ Data never leaves machine | ⚠️ Data sent to LLM | ⚠️ Data sent to LLM | ⚠️ Data sent to LLM | | |
| | **Language** | Rust | Python | Python | Go + Python | | |
| | **License** | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 | |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` around lines 41 - 52, The Markdown table in README.md under the
"Why Uteke?" section is malformed because every row begins with double pipes
("||"), causing GitHub to not render the table; fix it by replacing the leading
"||" with a single "|" for the header, separator and every data row so the first
and last columns are properly delimited (ensure the header separator row still
contains the required `---` cells separated by single pipes), and verify the
table rows (the lines currently starting with "|| | **Uteke**" through the final
license row) all use single leading and inter-cell pipes so the table renders
correctly.
| const comparisons: Comparison[] = [ | ||
| { feature: 'Install', uteke: '1 binary', mem0: 'pip + Docker + Qdrant', letta: 'pip + Docker + Postgres', cognee: 'pip + Docker + Neo4j/pgvector' }, | ||
| { feature: 'Offline', uteke: '✅ Fully', mem0: '❌ Needs cloud embedding', letta: '❌ Needs server', cognee: '❌ Needs LLM + vector DB' }, | ||
| { feature: 'Install', uteke: '1 binary', mem0: 'pip + Docker + Qdrant', letta: 'pip + Docker + Postgres', cognee: 'pip + Docker + Neo4j' }, | ||
| { feature: 'API Keys', uteke: '✅ None needed', mem0: '❌ OpenAI/LLM key', letta: '❌ LLM key', cognee: '❌ LLM + vector DB' }, | ||
| { feature: 'Offline', uteke: '✅ Fully', mem0: '❌ Cloud embedding', letta: '❌ Needs server', cognee: '❌ Needs LLM + DB' }, | ||
| { feature: 'Semantic Search', uteke: '✅ Local ONNX', mem0: '✅ Cloud embedding', letta: '⚠️ Keyword + archival', cognee: '✅ GraphRAG' }, | ||
| { feature: 'Privacy', uteke: '✅ Data stays local', mem0: '⚠️ Sent to LLM', letta: '⚠️ Sent to LLM', cognee: '⚠️ Sent to LLM' }, | ||
| { feature: 'Recall Speed', uteke: '~30ms', mem0: 'Network RTT', letta: 'Network RTT', cognee: 'Network RTT' }, | ||
| { feature: 'Tag Management', uteke: '✅ list/rename/delete', mem0: '⚠️ Basic', letta: '❌', cognee: '⚠️ Basic' }, | ||
| { feature: 'Memory Aging', uteke: '✅ Auto-cleanup', mem0: '✅', letta: '✅ Core memory', cognee: '✅ TTL-based' }, | ||
| { feature: 'Shell Hooks', uteke: '✅ bash/zsh/fish', mem0: '❌', letta: '❌', cognee: '❌' }, | ||
| { feature: 'Config File', uteke: '✅ uteke.toml', mem0: '⚠️ .env', letta: '⚠️ .env', cognee: '⚠️ .env' }, | ||
| { feature: 'License', uteke: 'Apache-2.0', mem0: 'MIT', letta: 'Apache-2.0', cognee: 'Apache-2.0' } | ||
| { feature: 'License', uteke: 'Apache-2.0', mem0: 'Apache-2.0', letta: 'Apache-2.0', cognee: 'Apache-2.0' } | ||
| ]; |
There was a problem hiding this comment.
Landing comparison data is out of sync with README contract.
This table uses cognee while README compares against Zep, but Phase 2 explicitly says to sync with README. Please align competitor columns and row values across both surfaces.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@website/src/routes/`+page.svelte around lines 63 - 74, The comparisons array
currently uses the competitor column key "cognee" and values that don't match
the README; update the Comparison[] literal (the comparisons variable) to use
the competitor key name "zep" instead of "cognee" and replace that column's cell
values to exactly match the README's Phase 2 contract for Zep (e.g., the same
entries for Install, API Keys, Offline, Semantic Search, Privacy, Recall Speed,
Tag Management, Memory Aging, Shell Hooks, License). Ensure the object keys
across all rows are uniform (uteke, mem0, letta, zep) and that the updated
values match the README text verbatim so both surfaces stay in sync.
| <meta property="og:image" content="/og-image.png" /> | ||
| <meta name="twitter:card" content="summary_large_image" /> | ||
| <meta name="twitter:title" content="uteke — Give Your AI a Memory" /> | ||
| <meta name="twitter:description" content="Offline-first semantic memory. Single binary. Zero config. 30ms recall." /> | ||
| <meta name="twitter:image" content="/og-image.png" /> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Verify OG asset exists and is tracked
fd -a '^og-image\.png$' website/static
git ls-files | rg -n '^website/static/og-image\.png$'Repository: ajianaz/uteke
Length of output: 39
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Check presence on disk
echo "== find on disk =="
find website/static -maxdepth 2 -type f -name 'og-image.png' -print || true
# 2) Check git-tracked status
echo "== git tracked =="
git ls-files | rg -n '^website/static/og-image\.png$' || true
# 3) List any og-* images to see naming/casing
echo "== nearby og images =="
git ls-files 'website/static/og*' || trueRepository: ajianaz/uteke
Length of output: 117
Add/commit website/static/og-image.png (or update the meta tags)
website/src/routes/+page.svelte sets og:image and twitter:image to /og-image.png, but website/static/og-image.png is not present in the repo and is not tracked by git. Add the file under website/static and commit, or change the tags to point at an existing image.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@website/src/routes/`+page.svelte around lines 104 - 108, The meta tags in
+page.svelte reference /og-image.png but the file website/static/og-image.png is
missing; either add and commit the actual image file into website/static (so the
<meta property="og:image" content="/og-image.png" /> and <meta
name="twitter:image" content="/og-image.png" /> resolve) or update those meta
tags in +page.svelte to point to an existing tracked asset (e.g., replace
"/og-image.png" with the path/name of a current image in website/static) so the
OG/Twitter images load correctly.
| <span class="hidden sm:inline text-[var(--color-text)]">curl -sSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh</span> | ||
| <span class="sm:hidden text-[var(--color-text)]">curl -sSL .../install.sh | sh</span> | ||
| <button | ||
| class="text-[var(--color-text-dim)] hover:text-[var(--color-accent)] transition-colors ml-2" | ||
| onclick={() => navigator.clipboard.writeText('cargo install --git https://github.com/ajianaz/uteke')} | ||
| onclick={() => navigator.clipboard.writeText('curl -sSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh')} |
There was a problem hiding this comment.
Align install commands with installer docs (-fsSL).
Both hero and Quick Start snippets use curl -sSL; the canonical installer usage in repo docs is curl -fsSL. Update display and clipboard text together.
Suggested fix
-curl -sSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh
+curl -fsSL https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | shAlso applies to: 342-342
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@website/src/routes/`+page.svelte around lines 143 - 147, Update the displayed
installer command and the clipboard copy text to use the canonical curl flags
"-fsSL" instead of "-sSL": change the visible strings in the hero span elements
(the hidden sm:inline and sm:hidden spans showing the command) and the value
passed to navigator.clipboard.writeText in the onclick handler so both display
and copied text use "curl -fsSL
https://raw.githubusercontent.com/ajianaz/uteke/main/install.sh | sh"; apply the
same replacement for the Quick Start snippet referenced around the other
occurrence (also update its navigator.clipboard.writeText if present).
Go-to-Market: README + Landing Page Refresh
Phase 1: README Overhaul
curl | shas primary CTAPhase 2: Landing Page Refresh
Summary by CodeRabbit
Documentation
New Features
Updates