Skip to content

Add /dev terminal-style landing page#2830

Open
jalafgani wants to merge 2 commits intomainfrom
feat/terminal-homepage
Open

Add /dev terminal-style landing page#2830
jalafgani wants to merge 2 commits intomainfrom
feat/terminal-homepage

Conversation

@jalafgani
Copy link
Copy Markdown
Contributor

@jalafgani jalafgani commented Mar 25, 2026

Summary

  • Adds a new /dev route serving an interactive terminal UI that introduces Appwrite's backend services
  • Boot sequence animates appwrite init loading all 7 services (auth, databases, storage, functions, messaging, realtime, hosting)
  • Menu-driven navigation: explore products inline, read product-specific docs (new tab), or sign up (new tab)
  • Product details show dev-focused explanations with actual SDK call examples
  • Text input supports easter eggs (vim, sudo rm -rf /, git push --force, whoami, etc.) and natural language commands
  • Fully self-contained vanilla JS/HTML — no SvelteKit component lifecycle, served as raw HTML via +server.ts

Test plan

  • Visit /dev and watch the boot animation complete
  • Click "Explore products" or press 1 — verify product list appears
  • Click a product or press its number — verify detail with explanation and SDK example appears
  • Click "read the docs" on a product — verify it opens the correct product docs in a new tab
  • Click "Start building" or "Sign up free" — verify Appwrite Cloud opens in a new tab
  • Type commands in the input: vim, whoami, sudo rm -rf /, help
  • Type a product name (e.g. auth) and press Enter — verify it shows that product's detail
  • Press Escape to navigate back through the hierarchy
  • Test on mobile viewport

Made with Cursor

Summary by CodeRabbit

  • New Features
    • Introduced Appwrite Terminal - a new interactive terminal interface available at /terminal. The terminal supports service and documentation browsing with intelligent content formatting, delivering responses in both HTML and markdown formats depending on client preferences, with server-side caching enabled.

Interactive terminal UI at /dev that introduces Appwrite's backend
services through a boot sequence animation and navigable menu.
Products are explained inline with SDK examples, easter eggs reward
curious developers, and only docs/signup link externally.

Made-with: Cursor
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 25, 2026

Greptile Summary

This PR adds a standalone interactive terminal-style landing page at /dev, served as a raw HTML response via a SvelteKit +server.ts handler. The page boots with an animated appwrite init sequence, then presents a menu for exploring products, reading docs, and signing up. It is fully self-contained (vanilla JS/HTML, no SvelteKit lifecycle) which is a reasonable choice for this kind of page.

Key issues found:

  • [P1 – Logic] When a user types a menu shortcut (2, 3, or 4) into the terminal input and presses Enter, handleInput removes the prompt row and processCmd calls doMain() then returns early. doMain for the 'docs' and 'signup' actions only calls window.open(...) without restoring the prompt via addPrompt(). The terminal is left in 'menu' state with no input field, requiring non-obvious keyboard recovery (press 1 then back-navigate). Keyboard shortcut users (pressing numbers without the input focused) are not affected.
  • [P2 – Style] The Appwrite version is hardcoded as v1.6.0 in two places (lines 281 and 340) and will go stale as new versions ship.
  • [P2 – Style] The back-navigation key is a no-op when the terminal input has focus (the global keydown listener skips INPUT targets), so the test plan step "Press Escape to navigate back" only works when focus is outside the input.
  • [Minor] The DIM variable (line 50) is declared but never referenced.

Confidence Score: 4/5

  • Safe to merge with one small targeted fix to the prompt-restoration path in doMain.
  • The page is a standalone marketing/demo feature with no impact on core product flows. The P1 prompt-disappearing bug is real but narrowly scoped (only triggered by typing menu numbers via the input, not by clicking or keyboard shortcuts) and is a one-line fix per branch in doMain. The remaining issues are cosmetic or minor UX gaps.
  • src/routes/dev/+server.ts — specifically the doMain function and its callers in processCmd.

Important Files Changed

Filename Overview
src/routes/dev/+server.ts Adds a self-contained terminal-style landing page at /dev. Contains one logic bug: typing menu shortcut numbers (2, 3, 4) via the text input removes the prompt without restoring it. Also has hardcoded version string (v1.6.0) and Escape key is non-functional while the input is focused.

Reviews (1): Last reviewed commit: "Add /dev terminal-style landing page" | Re-trigger Greptile

Comment on lines +165 to +169
function processCmd(v){
var low=v.toLowerCase();
if(state==='menu'){
for(var i=0;i<MAIN_MENU.length;i++){if(low===MAIN_MENU[i].k){doMain(MAIN_MENU[i]);return}}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Prompt disappears after typing menu number keys via input

When a user types 2, 3, or 4 directly into the terminal input and presses Enter, the prompt is removed (line 160 in handleInput) and is never restored.

The execution path is:

  1. handleInput removes the prompt row (inputEl.parentElement.remove())
  2. processCmd matches the number in MAIN_MENU at line 168 and calls doMain() then returns immediately
  3. doMain for 'docs' and 'signup' only calls window.open(...) — it does not call addPrompt()
  4. processCmd exits early, so the addPrompt() calls further down (lines 174, 178, 183, 192) are never reached

The user is left in 'menu' state with the menu items still visible but no input field. They can only recover via keyboard shortcuts (1 → products, then Escape → goHome() which calls drawMainMenu()addPrompt()), which is not obvious.

Note: this bug does not affect keyboard shortcuts (pressing 2/3/4 without input focused goes through the global keydown listener at line 298 which calls doMain directly without touching the prompt).

The fix is to call addPrompt() inside doMain for the 'docs' and 'signup' branches:

Suggested change
function processCmd(v){
var low=v.toLowerCase();
if(state==='menu'){
for(var i=0;i<MAIN_MENU.length;i++){if(low===MAIN_MENU[i].k){doMain(MAIN_MENU[i]);return}}
}
function doMain(m){
if(m.a==='products'){showProductList();return}
if(m.a==='docs'){window.open('/docs','_blank');addPrompt();return}
if(m.a==='signup'){window.open('https://cloud.appwrite.io','_blank');addPrompt();return}
}

logo.src='/images/logos/logo.svg';logo.alt='Appwrite';
logo.style.cssText='width:1.8em;height:1.8em;';
var txt=document.createElement('div');
txt.innerHTML='<div style="color:'+PK+';font-size:1.05em;font-weight:bold;letter-spacing:.05em;">APPWRITE</div><div style="color:#666;font-size:.72rem;">v1.6.0 \\u00b7 open-source backend \\u00b7 appwrite.io</div>';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Hardcoded Appwrite version will go stale

v1.6.0 is hardcoded here and again at line 340. This will become inaccurate as Appwrite releases new versions, making the terminal landing page feel dated. Consider either deriving the version dynamically (e.g. from a shared constant or package manifest) or omitting the specific patch version in favour of a major/minor string that changes less frequently.

Comment on lines +153 to +163
function handleInput(e){
if(e.key==='Enter'){
e.preventDefault();
var v=inputEl.value.trim();
inputEl.value='';
if(!v)return;
ln(PROMPT+v,WH);
if(inputEl.parentElement)inputEl.parentElement.remove();
processCmd(v);
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Back-navigation key ignored when input is focused

The global keydown listener at line 295 exits early whenever the focused element is an INPUT, so pressing the back-navigation key while typing has no effect. The PR's test plan specifically calls out "Press Escape to navigate back through the hierarchy", but this only works when focus is outside the input.

Adding an extra key-check branch inside handleInput — before the Enter handler — would handle back-navigation consistently regardless of focus state.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 25, 2026

Walkthrough

This change introduces a new terminal feature to the application. The first modification adds a new SPECIAL_PAGES entry pointing to /terminal in the llms-config, which makes the terminal discoverable through generated documentation. The second modification creates a new SvelteKit server route handler that implements content negotiation—returning markdown content when clients request non-HTML MIME types, and HTML otherwise. The HTML payload is a self-contained interactive terminal page with CSS and JavaScript bundled inline.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title 'Add /dev terminal-style landing page' is partially related but mentions '/dev' when the actual route is '/terminal', creating a discrepancy with the changeset. Update the title to 'Add /terminal terminal-style landing page' or 'Add terminal-style landing page' to accurately reflect the actual route being added in the PR.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/terminal-homepage

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/routes/dev/+server.ts (3)

40-44: Consider adding basic accessibility attributes.

The terminal UI lacks ARIA attributes (role, aria-label, aria-live) which would help screen reader users. Given this is a novelty developer page, this is low priority but worth noting for inclusivity.

♻️ Optional accessibility improvements
-<div id="out"></div>
+<div id="out" role="log" aria-label="Terminal output" aria-live="polite"></div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/dev/`+server.ts around lines 40 - 44, Add basic ARIA attributes to
the terminal DOM elements to improve accessibility: add role and aria-label to
the main container with id "root" or "win" (e.g., role="application" or "region"
and a descriptive aria-label), mark the output area with id "out" as a live
region (aria-live="polite" or "assertive") so screen readers announce updates,
and ensure the title bar with id "bar" has an appropriate role or aria-label (or
aria-hidden if decorative). Also consider adding tabindex="0" to the interactive
container (id "win" or "out") to allow keyboard focus and navigation.

78-83: Menu items 3 and 4 have duplicate actions.

Both "Start building" and "Sign up free" map to the same 'signup' action, which opens cloud.appwrite.io. If intentional for different user intents, consider differentiating the labels or combining into a single entry.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/dev/`+server.ts around lines 78 - 83, MAIN_MENU contains two
entries (items with k:'3' and k:'4') that both set a:'signup' causing duplicate
actions; update the array to either remove one of them, combine them into a
single entry, or change one entry's action to the intended unique route/action
(e.g., 'start' or 'signupPromo') and adjust any consumers that rely on MAIN_MENU
to handle the new action name; locate the MAIN_MENU definition and edit the
objects for keys '3' and '4' to ensure each menu item has a distinct action or
is consolidated into one.

281-281: Extract hardcoded version string to a constant.

The version "v1.6.0" is duplicated at lines 281 and 340. Extract to a constant to simplify future updates.

♻️ Proposed fix to extract version constant
 var PK='#fd366e',GR='#777',WH='#d4d4d4',DIM='#555';
 var state='boot',menuBox=null,inputEl=null;
 var PROMPT='visitor@appwrite-cloud ~ % ';
+var VERSION='v1.6.0';

Then update line 281:

-txt.innerHTML='<div style="color:'+PK+';font-size:1.05em;font-weight:bold;letter-spacing:.05em;">APPWRITE</div><div style="color:`#666`;font-size:.72rem;">v1.6.0 \\u00b7 open-source backend \\u00b7 appwrite.io</div>';
+txt.innerHTML='<div style="color:'+PK+';font-size:1.05em;font-weight:bold;letter-spacing:.05em;">APPWRITE</div><div style="color:`#666`;font-size:.72rem;">'+VERSION+' \\u00b7 open-source backend \\u00b7 appwrite.io</div>';

And line 340:

-ln('appwrite v1.6.0 \\u2014 open-source backend. all batteries included.',WH);
+ln('appwrite '+VERSION+' \\u2014 open-source backend. all batteries included.',WH);

Also applies to: 340-340

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/dev/`+server.ts at line 281, The hardcoded version string "v1.6.0"
is duplicated; extract it to a single constant (e.g., APPWRITE_VERSION) and
replace both inline occurrences so updates are centralized: add a top-level
const APPWRITE_VERSION = 'v1.6.0' near the other module constants and change the
two places that build the HTML (the txt.innerHTML assignment and the other
occurrence referenced in the review) to interpolate/concatenate APPWRITE_VERSION
instead of the literal.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/routes/dev/`+server.ts:
- Around line 224-264: showProductDetail can be re-entered during its async
animation causing duplicate DOM output; add a re-entry guard (e.g., a
module-scoped boolean like isAnimating or use the existing state var) at the top
of showProductDetail that early-returns if an animation is in progress, set the
flag before any awaits/animations and clear it at the end (and on any early exit
paths), and ensure back/cancel handlers also clear the flag so consecutive calls
are serialized/prevented; reference the function showProductDetail, the state
variable, and DOM cleanup points (menuBox, inputEl, o.appendChild) when
implementing the guard.

---

Nitpick comments:
In `@src/routes/dev/`+server.ts:
- Around line 40-44: Add basic ARIA attributes to the terminal DOM elements to
improve accessibility: add role and aria-label to the main container with id
"root" or "win" (e.g., role="application" or "region" and a descriptive
aria-label), mark the output area with id "out" as a live region
(aria-live="polite" or "assertive") so screen readers announce updates, and
ensure the title bar with id "bar" has an appropriate role or aria-label (or
aria-hidden if decorative). Also consider adding tabindex="0" to the interactive
container (id "win" or "out") to allow keyboard focus and navigation.
- Around line 78-83: MAIN_MENU contains two entries (items with k:'3' and k:'4')
that both set a:'signup' causing duplicate actions; update the array to either
remove one of them, combine them into a single entry, or change one entry's
action to the intended unique route/action (e.g., 'start' or 'signupPromo') and
adjust any consumers that rely on MAIN_MENU to handle the new action name;
locate the MAIN_MENU definition and edit the objects for keys '3' and '4' to
ensure each menu item has a distinct action or is consolidated into one.
- Line 281: The hardcoded version string "v1.6.0" is duplicated; extract it to a
single constant (e.g., APPWRITE_VERSION) and replace both inline occurrences so
updates are centralized: add a top-level const APPWRITE_VERSION = 'v1.6.0' near
the other module constants and change the two places that build the HTML (the
txt.innerHTML assignment and the other occurrence referenced in the review) to
interpolate/concatenate APPWRITE_VERSION instead of the literal.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 88346a5e-6e68-4860-8ff1-5dfd4c5e077f

📥 Commits

Reviewing files that changed from the base of the PR and between 94418f2 and e30b877.

📒 Files selected for processing (1)
  • src/routes/dev/+server.ts

Comment on lines +224 to +264
async function showProductDetail(idx){
state='detail';
if(menuBox)menuBox.remove();
if(inputEl&&inputEl.parentElement)inputEl.parentElement.remove();
var s=SVC[idx];

ln('',WH);
var cmdText=PROMPT+'appwrite explain '+s.n;
var cmdDiv=el('div','color:'+WH+';white-space:pre-wrap;min-height:1em','');
o.appendChild(cmdDiv);
for(var i=1;i<=cmdText.length;i++){
cmdDiv.textContent=cmdText.slice(0,i);
scr();
await w(18)
}
await w(300);

ln('',WH);
ln(s.n.toUpperCase(),PK);
ln('',WH);
ln(s.why,WH);
ln('',WH);
ln(' '+s.tl,'#888');
ln('',WH);

var btns=document.createElement('div');
var docsBtn=document.createElement('a');
docsBtn.className='cta';docsBtn.textContent='read the docs';
docsBtn.href=s.doc;docsBtn.target='_blank';
var signBtn=document.createElement('a');
signBtn.className='cta cta-primary';signBtn.textContent='start building';
signBtn.href='https://cloud.appwrite.io';signBtn.target='_blank';
btns.appendChild(signBtn);btns.appendChild(docsBtn);
o.appendChild(btns);

ln('',WH);
var back=el('div','color:#555;font-size:.72rem;cursor:pointer;margin-top:.25em','\\u2190 esc back to products \\u00b7 \\u2190\\u2190 esc esc back to menu');
back.onclick=function(){showProductList()};
o.appendChild(back);
scr()
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Potential race condition during async animation.

If showProductDetail() is invoked rapidly (e.g., user clicks multiple products quickly), concurrent executions could render duplicate content since there's no guard preventing re-entry while the animation is in progress.

Consider adding a flag to skip or abort if already animating:

🛡️ Proposed fix to guard against concurrent executions
 var state='boot',menuBox=null,inputEl=null;
+var animating=false;
 var PROMPT='visitor@appwrite-cloud ~ % ';
 async function showProductDetail(idx){
+if(animating)return;
+animating=true;
 state='detail';
 if(menuBox)menuBox.remove();
 if(inputEl&&inputEl.parentElement)inputEl.parentElement.remove();
 var s=SVC[idx];
 // ... rest of function ...
 o.appendChild(back);
+animating=false;
 scr()
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/dev/`+server.ts around lines 224 - 264, showProductDetail can be
re-entered during its async animation causing duplicate DOM output; add a
re-entry guard (e.g., a module-scoped boolean like isAnimating or use the
existing state var) at the top of showProductDetail that early-returns if an
animation is in progress, set the flag before any awaits/animations and clear it
at the end (and on any early exit paths), and ensure back/cancel handlers also
clear the flag so consecutive calls are serialized/prevented; reference the
function showProductDetail, the state variable, and DOM cleanup points (menuBox,
inputEl, o.appendChild) when implementing the guard.

Rename route from /dev to /terminal. Add content negotiation so LLMs
requesting text/markdown get a warm, structured overview of Appwrite
with product details and SDK examples. Add noscript fallback, OG/Twitter
meta tags, JSON-LD schemas, and register the page in llms-config.ts.

Made-with: Cursor
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
src/routes/terminal/+server.ts (1)

15-17: Consider adding cache-control header for consistency.

The markdown response includes cache-control: public, max-age=3600 but the HTML response has no caching headers. For consistency and to reduce server load, consider adding the same cache policy.

♻️ Proposed fix
     return new Response(HTML, {
-        headers: { 'content-type': 'text/html; charset=utf-8' }
+        headers: {
+            'content-type': 'text/html; charset=utf-8',
+            'cache-control': 'public, max-age=3600'
+        }
     });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/terminal/`+server.ts around lines 15 - 17, The HTML response
created with new Response(HTML, { headers: { 'content-type': 'text/html;
charset=utf-8' } }) lacks caching headers; add the same cache policy used for
the markdown response by including a 'cache-control': 'public, max-age=3600'
header alongside 'content-type' so the HTML response (the Response constructed
with HTML) is cached consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/routes/llms-config.ts`:
- Around line 16-21: The new page object for '/terminal' in llms-config.ts is
missing the required fullContent property used by the llms-full.txt handler (it
accesses SPECIAL_PAGES and page.fullContent); add a fullContent string to the
'/terminal' entry that contains the full markdown/text block expected by the
exporter (matching structure used by other SPECIAL_PAGES entries) so
page.fullContent is defined when llms-full.txt iterates SPECIAL_PAGES.
- Around line 15-16: There is a syntax error in the array literal of LLM
configuration objects: the two adjacent object literals are missing a separating
comma. Fix it by inserting a comma after the closing brace of the first object
(i.e., between "}" and the following "{") in the LLMs configuration array so the
objects are valid array elements; you can also add a trailing comma for
consistency.

---

Nitpick comments:
In `@src/routes/terminal/`+server.ts:
- Around line 15-17: The HTML response created with new Response(HTML, {
headers: { 'content-type': 'text/html; charset=utf-8' } }) lacks caching
headers; add the same cache policy used for the markdown response by including a
'cache-control': 'public, max-age=3600' header alongside 'content-type' so the
HTML response (the Response constructed with HTML) is cached consistently.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4b67b49c-3397-452b-b00d-f62aa41c2c68

📥 Commits

Reviewing files that changed from the base of the PR and between e30b877 and 3cbb14e.

📒 Files selected for processing (2)
  • src/routes/llms-config.ts
  • src/routes/terminal/+server.ts

Comment on lines 15 to +16
}
// Add more special pages here as needed
{
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Syntax error: missing comma between array elements.

The static analysis correctly identifies a missing comma after the first object (line 15) and before the second object (line 16). This will cause a parse error.

🐛 Proposed fix
             'Browse integrations by category including AI, Deployments, Messaging, Auth, Payments, Logging, MCP, Databases, Search, Sites, and Storage.'
-    }
+    },
     {
📝 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.

Suggested change
}
// Add more special pages here as needed
{
},
{
🧰 Tools
🪛 Biome (2.4.7)

[error] 16-16: expected , but instead found {

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/llms-config.ts` around lines 15 - 16, There is a syntax error in
the array literal of LLM configuration objects: the two adjacent object literals
are missing a separating comma. Fix it by inserting a comma after the closing
brace of the first object (i.e., between "}" and the following "{") in the LLMs
configuration array so the objects are valid array elements; you can also add a
trailing comma for consistency.

Comment on lines +16 to +21
{
href: '/terminal',
title: 'Appwrite Terminal',
description:
'Interactive terminal-style overview of Appwrite — an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting. Includes product explanations, SDK examples, and developer easter eggs.'
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Missing fullContent field required by llms-full.txt handler.

The context snippet from src/routes/llms-full.txt/+server.ts shows that it iterates over SPECIAL_PAGES and accesses page.fullContent to build markdown blocks. The new /terminal entry lacks this field, which will result in undefined being interpolated into the output.

🛠️ Proposed fix — add fullContent field
     {
         href: '/terminal',
         title: 'Appwrite Terminal',
         description:
-            'Interactive terminal-style overview of Appwrite — an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting. Includes product explanations, SDK examples, and developer easter eggs.'
+            'Interactive terminal-style overview of Appwrite — an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting. Includes product explanations, SDK examples, and developer easter eggs.',
+        fullContent: `Interactive terminal-style overview of Appwrite — an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting.
+
+Products: Auth (authentication with OAuth, magic links, MFA), Databases (document database with REST/GraphQL), Storage (file storage with transforms), Functions (serverless in multiple runtimes), Messaging (push, email, SMS), Realtime (WebSocket subscriptions), and Hosting (static/SSR deployment).
+
+Includes SDK code examples and links to documentation for each product.`
     }
📝 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.

Suggested change
{
href: '/terminal',
title: 'Appwrite Terminal',
description:
'Interactive terminal-style overview of Appwrite — an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting. Includes product explanations, SDK examples, and developer easter eggs.'
}
{
href: '/terminal',
title: 'Appwrite Terminal',
description:
'Interactive terminal-style overview of Appwrite — an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting. Includes product explanations, SDK examples, and developer easter eggs.',
fullContent: `Interactive terminal-style overview of Appwrite an open-source backend with auth, databases, storage, functions, realtime, messaging, and hosting.
Products: Auth (authentication with OAuth, magic links, MFA), Databases (document database with REST/GraphQL), Storage (file storage with transforms), Functions (serverless in multiple runtimes), Messaging (push, email, SMS), Realtime (WebSocket subscriptions), and Hosting (static/SSR deployment).
Includes SDK code examples and links to documentation for each product.`
}
🧰 Tools
🪛 Biome (2.4.7)

[error] 16-16: expected , but instead found {

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/routes/llms-config.ts` around lines 16 - 21, The new page object for
'/terminal' in llms-config.ts is missing the required fullContent property used
by the llms-full.txt handler (it accesses SPECIAL_PAGES and page.fullContent);
add a fullContent string to the '/terminal' entry that contains the full
markdown/text block expected by the exporter (matching structure used by other
SPECIAL_PAGES entries) so page.fullContent is defined when llms-full.txt
iterates SPECIAL_PAGES.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant