') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); docs(quickstart): transcribe both boot samples from @objectstack/cli 17.1.0, delete the expired Path B warning by os-warren · Pull Request #143 · objectstack-ai/objectos · GitHub
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 44 additions & 19 deletions content/docs/quickstart.mdx
Original file line numberDiff line numberDiff line change
Expand Up@@ -51,7 +51,6 @@ You'll see:
➜ MCP: http://localhost:3000/api/v1/mcp
connect an AI client (Claude Code, Cursor, …) · skill: http://localhost:3000/api/v1/mcp/skill

Config: objectstack.config.ts
Mode: production
Driver: SqlDriver(better-sqlite3) → ~/.objectstack/data/objectstack.db
Tenancy: single
Expand All@@ -62,10 +61,11 @@ You'll see:

That's it. You're running ObjectOS.

That block is transcribed from `@objectstack/cli` 17.0.0 booting an empty
That block is transcribed from `@objectstack/cli` 17.1.0 booting an empty
kernel. Home paths show as `~/…` — the CLI prints yours expanded. Your own boot
also prints startup advisories (local storage driver, dev crypto key) and the
full list of loaded plugin names, both of which depend on your environment.
also prints startup advisories (local storage driver, dev crypto key, boot
diagnostics) and the full list of loaded plugin names, both of which depend on
your environment.

### What's running

Expand DownExpand Up@@ -150,32 +150,57 @@ cd my-app
pnpm dev
```

> **Warning:** On `@objectstack/cli` 17.0.0 — the currently published
> `latest` — this sequence does not reach a dev server. The project
> `init` scaffolds declares no `sharingModel`, which the CLI's own
> `security-owd-unset` author-time rule rejects, so `pnpm dev` exits 1
> during compile instead of starting. The fix is merged and awaiting a
> release —
> [objectstack#9666](https://github.com/objectstack-ai/objectstack/issues/9666).

You'll see:

```text
✓ Project initialized!
◆ Development Mode
────────────────────────────────────────
📂 Config: my-app/objectstack.config.ts
→ Compiling objectstack.config.ts → dist/objectstack.json...

◆ Compile
✓ Build complete (462ms)
────────────────────────────────────────
✓ Build complete (117ms)

Data: 1 Objects 3 Fields

◆ Development Mode
Artifact: my-app/dist/objectstack.json (1.9 KB)

→ Starting dev server (local mode)...
🎯 Environment ID: env_local
📦 Artifact: dist/objectstack.json
🗄️ Database: file:my-app/.objectstack/data/objectstack.db
👁 watching objectstack.config.ts, src — rebuild + restart on change

✓ Server is ready

➜ API: http://localhost:3002/
➜ Console: http://localhost:3002/_console/
➜ API: http://localhost:3000/
➜ Console: http://localhost:3000/_console/
➜ MCP: http://localhost:3000/api/v1/mcp
connect an AI client (Claude Code, Cursor, …) · skill: http://localhost:3000/api/v1/mcp/skill

🔑 Dev admin: admin@objectos.ai / admin123
seeded on empty DB · dev only — do not use in production

Config: objectstack.config.ts
Mode: development
Driver: SqlDriver(better-sqlite3) → my-app/.objectstack/data/objectstack.db
Tenancy: single
Plugins: 30 loaded

Press Ctrl+C to stop
```

Note the dev server uses port **3002** to avoid colliding with a
running `os start` on 3000.
That block is transcribed from `pnpm dev` on a scaffold created by
`@objectstack/cli` 17.1.0. Project paths show as `my-app/…` — the CLI prints
yours expanded. Your own run also prints pnpm's script header above the block,
per-step compile progress, startup advisories (configuration load, dev
secret-field crypto), the full list of loaded plugin names, and an MCP
connection trailer below the banner.

Note the dev server asks for port **3000**, the same port `os start` uses. If
that port is taken it binds the next free one and says so:
`↪ server bound to port 3001 (requested 3000)`.

### Add your own object

Expand Down
Loading