Octoweb มีบ้านของตัวเองแล้ว — และมันยังรันบนโมเดลของคุณ ไม่ใช่ของเรา

สามสัปดาห์ก่อนเราแนะนำ Octoweb — เบราว์เซอร์ WebKit แบบ keyboard-first ที่เราแอบใช้ชีวิตอยู่ในนั้นมาตั้งแต่เดือนมีนาคม เสียงตอบรับดีกว่าที่คิดไว้ และมันมาพร้อมคำถามข้อเดียวที่ติดมาด้วยเสมอ ถามกันมาเป็นสิบน้ำเสียง:

แปลว่ามันใช้ได้กับคลาวด์ของพวกคุณเท่านั้นใช่ไหม

จะคิดแบบนั้นก็ไม่แปลก sidebar รันบน Octomind ซึ่งเป็นชื่อเดียวกับคลาวด์แบบเสียเงินของเรา แล้วโพสต์นั้นก็เขียนว่า "ติดตั้ง Octomind แล้วลงชื่อเข้าใช้" คนอ่านที่มีเหตุผลย่อมสรุปว่าเบราว์เซอร์คือกรวยดูดลูกค้า — ว่าการย้ายเบราว์เซอร์แปลว่าต้องมาเช่าโมเดลจากเรา

มันไม่ใช่ และไม่เคยเป็นแบบนั้นเลย การที่คำตอบนี้ไม่ชัดในตัวเองคือความล้มเหลวด้านเอกสารที่เรารับผิดเอง เริ่มตั้งแต่ URL: หน้าผลิตภัณฑ์อยู่ที่ octomind.run/product/octoweb ซึ่งบอกว่า นี่คือฟีเจอร์ของสิ่งที่คุณต้องจ่ายเงิน ตั้งแต่ก่อนคุณจะได้อ่านสักคำ

เราก็เลยแก้ URL ก่อน แล้วค่อยแก้คำอธิบาย

ตอนนี้ Octoweb อยู่ที่ octoweb.xyz แล้ว ฟรี ภายใต้ Apache-2.0 macOS 13 ขึ้นไป ไม่ต้องมีบัญชี และตัวเบราว์เซอร์ไม่เคยเรียกผู้ให้บริการโมเดลเลยสักครั้งในชีวิตของมัน — เพราะมันไม่มีโค้ดสำหรับทำแบบนั้นอยู่ด้วยซ้ำ


บ้านหลังใหม่

octoweb.xyz
octoweb short
  • TABปุ่มลัดคีย์บอร์ด — ครบทุกปุ่มoctoweb.xyz/shortcuts⌘1
  • TABMCP server — 29 เครื่องมือที่เอเจนต์ของคุณเรียกได้octoweb.xyz/mcp⌘2
  • ประวัติเบราว์เซอร์เก็บอะไรไว้ และส่งอะไรออกไปoctoweb.xyz/privacy⌘3
↵ เปิด⌘↵ ไปที่ URL⌘⇧↵ ถาม AI

นั่นคือ command palette — ⌘⇧P — ที่ fuzzy-match ข้ามแท็บที่เปิดอยู่และประวัติ และเป็นวิธีเดินทางไปทุกที่ใน Octoweb มันยังเป็นตัวอย่างที่สะท้อนเว็บไซต์ใหม่ได้ดีด้วย เพราะเว็บนั้นเป็นเอกสารอ้างอิงเสียส่วนใหญ่ มากกว่าจะเป็นหน้าการตลาด:

  • /shortcuts — ครบทั้ง 48 ปุ่มลัด แบ่งเป็นหกกลุ่ม รวมถึงตัวที่มีอยู่เฉพาะใน palette และในกล่อง prompt ของ AI
  • /mcp — เครื่องมือ MCP ครบทั้ง 29 ตัว จัดกลุ่มตามหน้าที่ พร้อมคอนฟิกให้ก๊อปวางสำหรับ Claude Code, Claude Desktop และ Cursor
  • /privacy — ไฟล์แต่ละไฟล์ไปตกอยู่ตรงไหนบนดิสก์ของคุณ อะไรที่ bind กับ loopback และหมายเหตุแบบตรง ๆ ว่า เว็บไซต์ รัน Google Analytics ส่วน ตัวเบราว์เซอร์ ไม่มี telemetry เลยสักตัว
  • /blog — โพสต์สั้น ๆ ที่ว่าด้วยตัวผลิตภัณฑ์ โพสต์แบบที่คุณกำลังอ่านนี้ยังอยู่บน muvon.io ส่วนที่นั่นจะเป็นบ้านของ release notes

มันคือเว็บ SvelteKit แบบ static บน Cloudflare, prerender ไว้ทั้งหมด, ไม่มีการ fetch ฝั่งไคลเอนต์ — สแตกเดียวกับหน้าที่คุณกำลังอ่านอยู่ ใช้เวลาทำเย็นเดียว เราน่าจะทำมันตั้งแต่เดือนมีนาคมแล้ว


คำตอบจริง ๆ: มันรันบนโมเดลของใคร

นี่คือส่วนที่สมควรได้ย่อหน้าตรง ๆ ตั้งแต่สามสัปดาห์ก่อน

sidebar ของ Octoweb ไม่ใช่ไคลเอนต์แชต พอคุณกด ⌘⇧A เบราว์เซอร์จะ spawn โปรเซสลูกขึ้นมาหนึ่งตัว — octomind acp octoweb:assistant ที่ถูก sandbox ไว้ — แล้วคุยกับมันผ่าน Agent Client Protocol การเรียกโมเดลทุกครั้งในระบบนี้เกิดขึ้นที่โปรเซสตัวนั้น ลองไล่หา HTTP call ที่ยิงไปหาผู้ให้บริการโมเดลในโค้ด Rust 36,000 บรรทัดของเบราว์เซอร์ดู แล้วคุณจะกลับมามือเปล่า เพราะมันไม่มี เบราว์เซอร์รู้วิธีเรนเดอร์บทสนทนา แต่มันไม่รู้จักว่า OpenAI คืออะไร

เรื่องนี้สำคัญ เพราะมันย้ายคำถาม "จะใช้โมเดลไหน" ทั้งก้อนไปไว้อีกโปรเซสหนึ่งทางซ้าย คือไปอยู่ในคอนฟิกของ Octomind — ซึ่งในนั้นมันเป็นแค่สตริงเดียว:

[model]
name = "octohub:auto"          # Octomind Cloud, one key, we route it
# name = "anthropic:claude-opus-5"
# name = "openrouter:qwen/qwen3-coder"
# name = "local:qwen3-coder-30b"   # your box, your GPU, your electricity

โมเดลต้องเขียนเป็น provider:model เสมอ — ใส่มาแค่ชื่อเปล่า ๆ จะถูกปฏิเสธ ไม่ใช่เดาให้ หลัง prefix พวกนั้นคือ octolib — เลเยอร์ผู้ให้บริการที่เครื่องมือทุกตัวของ Muvon ใช้ร่วมกัน — ซึ่งตอนนี้รองรับอยู่ 28 เจ้า: openrouter, openai, anthropic, google-vertex, google-studio, groq, cerebras, deepseek, fireworks, together, xai, moonshot, minimax, nvidia, amazon, cloudflare, zai, alibaba และที่เหลือ

และมีอยู่สอง prefix ที่เป็นหัวใจของโพสต์นี้จริง ๆ:

  • local: ชี้ไปที่เซิร์ฟเวอร์ตัวไหนก็ได้ที่เข้ากันได้กับ OpenAI โดยค่าเริ่มต้นคือ http://localhost:11434/v1/chat/completions นั่นคือ Ollama แบบไม่ต้องตั้งอะไรเลย ตั้ง LOCAL_API_URL เมื่อไหร่ มันก็กลายเป็น LM Studio ที่พอร์ต 1234, LocalAI ที่ 8080 หรือเครื่อง vLLM ใต้โต๊ะคุณ ไม่มีอะไรออกจากเครื่องเลย
  • cli: ขับ CLI ของเอเจนต์ที่คุณติดตั้งไว้อยู่แล้ว — codex, claude, cursor, gemini — ราวกับว่ามันเป็น endpoint ของโมเดล ถ้าคุณจ่ายค่าตัวใดตัวหนึ่งอยู่แล้ว sidebar ก็ใช้ตัวนั้นได้ โดยที่คุณไม่ต้องรับบิลใบที่สอง

และ key ไม่เคยลงไปอยู่ในไฟล์คอนฟิก octomind config --api-key ปฏิเสธที่จะเก็บมันให้ — credential ถูกอ่านจาก environment ก่อน แล้วค่อยเป็น .env ระดับผู้ใช้ แล้วค่อย .env ในโปรเจกต์ key ของ Anthropic ก็เลยไปอยู่ที่เดียวกับ key อื่น ๆ ของคุณ

แล้ว Octomind Cloud อยู่ตรงไหน: มันคือเส้นทางที่ ง่าย ไม่ใช่เส้นทางบังคับ octomind login คือการลงชื่อเข้าใช้แบบ device code เหมือน gh auth login มันเขียน credential ลงไปตัวเดียว — OCTOHUB_API_KEY — จากนั้นโมเดลค่าเริ่มต้น octohub:auto จะกระจายการเรียกแต่ละครั้งตามวัตถุประสงค์ (main, supervisor, compression) ไปยังโมเดลที่เหมาะสมฝั่งเรา key เดียวแทนที่จะเป็นหกตัว เพดานค่าใช้จ่ายเดียวที่คุณคอยจับตาดูได้ และมี free tier ให้เริ่มต้น เราคิดว่ามันเป็นดีลที่ดี นั่นแหละคือเหตุผลที่มันเป็นค่าเริ่มต้น และถ้าคุณไม่อยากใช้มัน การเลิกใช้ก็อยู่ห่างออกไปแค่เก้าตัวอักษรในไฟล์ TOML — ส่วนแถบบัญชีใน sidebar ก็เป็นแค่ข้อความแจ้งที่ปิดทิ้งได้ ไม่ใช่ประตูที่ล็อกอยู่

github.com/muvon/octoweb/pull/214

แท็กบนส่วนหัวของ sidebar แก้ไขได้ หน้าต่างเดียวกันจึงคุยกับ octoweb:assistant อยู่นาทีนี้ แล้วนาทีถัดไปคุยกับเอเจนต์ developer:rust ของคุณเองได้ — และตั้งแต่ 0.14.0 ช่องนั้นก็เติมคำอัตโนมัติจากแท็กที่ Octomind ในเครื่องคุณรู้จักจริง ๆ แทนที่จะให้คุณพิมพ์มันแบบเดาสุ่ม


สามสัปดาห์ สี่รีลีส

นับจากโพสต์แนะนำตัวไป Octoweb ปล่อยมาตั้งแต่ 0.11.0 ถึง 0.14.0 — รวม 62 คอมมิต และมีสองอย่างในนั้นที่เปลี่ยนความรู้สึกตอนใช้งานไปเลย

เวิร์กสเปซ (⌘⇧O) โปรไฟล์ที่แยกขาดจากกัน และเราหมายถึงแยกขาดจริง ๆ: แต่ละเวิร์กสเปซมีแท็บของตัวเอง ประวัติของตัวเอง เซสชัน AI ของตัวเอง ลำดับ MRU ของตัวเอง ช่อง fast-access ของตัวเอง และ WKWebsiteDataStore ของตัวเอง — คุกกี้, localStorage และแคชจึงไม่มีวันข้ามฝั่งกัน ล็อกอินสองบัญชีบนเว็บเดียวกันพร้อมกันได้ โดยไม่ต้องเล่นละครหน้าต่างไม่ระบุตัวตน นี่คือฟีเจอร์ที่เราไม่รู้ตัวว่าต้องการ จนถึงวันที่เราเลิกต้องเปิดเบราว์เซอร์ตัวที่สองไว้สำหรับโปรเจกต์ลูกค้า

⌘⇧O — เวิร์กสเปซ
  • ⌘1personal14 แท็บ
  • ⌘2client-acme6 แท็บ▶ meet.google.com
  • ⌘3agent-scratch2 แท็บMCP
แยกคุกกี้ ประวัติ เซสชัน และช่องลัด⌘⇧O เพื่อสลับ

ตอนนี้ MCP แยกเส้นทางตามเวิร์กสเปซแล้ว เซิร์ฟเวอร์ตัวเดียวที่ localhost:3434/mcp จะอ่านโทเคน X-Octoweb-Workspace แล้วทำงานอยู่ในโปรไฟล์นั้นเท่านั้น แปลว่าเอเจนต์ขับเวิร์กสเปซพื้นหลังได้ — ล็อกอินด้วยบัญชีทดลอง บนคุกกี้ของมันเอง — ขณะที่คุณทำงานในเวิร์กสเปซของคุณต่อไป และมันไม่มีทางหลงเข้ามาในเซสชันของคุณโดยบังเอิญ manifest ของ capability ยังไปไกลกว่านั้น คือปฏิเสธที่จะเปิดเผยเซิร์ฟเวอร์เลยเมื่อไม่มีโทเคนติดมา แทนที่จะถือเอาว่าหมายถึงเวิร์กสเปซที่อยู่บนจอตอนนั้น

ที่เหลือแบบสั้น ๆ และทั้งหมดอยู่ในมือคุณ ไม่ใช่ในมือเรา:

  • อินพุตเนทีฟที่หน้าเว็บเชื่อถือ การคลิกและการกดคีย์ผ่าน MCP ตอนนี้เป็น NSEvent ของ AppKit จริง ๆ ที่ส่งเข้า WKWebView ของแท็บนั้น — หน้าเว็บจึงเห็น isTrusted=true, user gesture ของแท้, :hover ที่ทำงาน และ default action แบบเนทีฟ มันใช้ได้กับแท็บพื้นหลังที่ซ่อนอยู่โดยไม่แย่งโฟกัสของคุณ อีเวนต์ DOM แบบสังเคราะห์ไม่มีวันทำได้ครบทั้งสี่ข้อ
  • ทุกการกระทำตอบกลับว่าอะไรเปลี่ยนไป การเรียกเครื่องมือทุกครั้งจะคืนสรุปผลกระทบหนึ่งบรรทัด — การนำทาง, URL ของ SPA ที่เปลี่ยน, ข้อความใหม่บนจอ, ไดอะล็อก, กิจกรรมเครือข่าย, โฟกัสที่ขยับ — หรือไม่ก็พูดออกมาตรง ๆ ว่า "ไม่มีการเปลี่ยนแปลงที่สังเกตได้" เอเจนต์จึงเลิกเสียเทิร์นไปกับการอ่านหน้าซ้ำเพื่อดูว่าคลิกของมันโดนหรือเปล่า ส่วน query parameter ที่อ่อนไหวก็ถูกล้างออกจากกิจกรรมเครือข่ายที่รายงานกลับมาระหว่างทาง
  • ตอนนี้ดาวน์โหลดได้แล้ว แพตช์ตอนรันไทม์ทำให้ WebKit เคารพ Content-Disposition: attachment ทั้งใน main frame และ subframe — ซึ่งเป็นแบบที่ Google Drive ใช้ — แล้วชื่อไฟล์ที่ได้ก็โผล่ในสรุปผลกระทบ แม้ตัวหน้าเว็บจะไม่บอกอะไรเลยก็ตาม
  • browser_dismiss_overlay เก็บแบนเนอร์คุกกี้และแบนเนอร์ขอความยินยอมให้ และมันเลือก Reject ก่อนเสมอ — มันจะไม่กดยอมรับแทนคุณ
  • A2UI v1.0 เอเจนต์เรนเดอร์ UI ที่โต้ตอบได้จริง ๆ ใน sidebar ได้ — การ์ด ฟอร์ม ตัวเลือก สไลเดอร์ โมดัล — พร้อม data binding และการตรวจสอบค่า และรอคุณกดอะไรสักอย่างได้นานถึงครึ่งชั่วโมง การกระทำที่มีผลตามมาควรวิ่งผ่านทางนี้: ถามก่อน แล้วค่อยลงมือ
  • แท็บที่มีสื่อกำลังเล่น ตัวสลับเวิร์กสเปซบอกว่าแท็บไหนกำลังเล่นเสียงหรือวิดีโอ หรือจับไมค์อยู่ — การประชุมที่คุณลืมเปิดค้างไว้ในอีกโปรไฟล์จึงเป็นสิ่งที่หาเจอ ไม่ใช่สิ่งที่ตามหลอกหลอน

สองเรื่องที่เราเขียนผิดไปเมื่อเดือนสิงหาคม

กฎประจำบ้าน: ถ้าโพสต์ที่แล้วเขียนผิด โพสต์ถัดไปต้องบอก

ปุ่มลัดแบบ global ไม่ได้วิ่งผ่าน CGEventTap เราเขียนไว้อย่างนั้น แต่โค้ดย้ายออกจากมันตั้งแต่เดือนพฤษภาคมแล้ว CGEventTap ต้องขอสิทธิ์ Accessibility ของ macOS และการที่ของหน้าตาเหมือนเบราว์เซอร์ไปขอสิทธิ์ระดับ keylogger คือดีลที่ไม่คุ้มเลยสำหรับฟีเจอร์ที่ไม่มีใครขอ Octoweb ใช้ local NSEvent monitor ของ AppKit แทน — ไม่ต้องขอสิทธิ์อะไรเลย และขอบเขตก็ตรงไปตรงมา: มันเห็นคีย์เฉพาะตอนที่ Octoweb อยู่หน้าสุด คำว่า "ทั้งระบบ" เป็นคำที่ผิดสำหรับดีไซน์ที่ถูก

ไม่มี passkeys อยู่ในนั้น โพสต์เดือนสิงหาคมใส่ WebAuthn ไว้ในรายการพื้นฐานที่ปล่อยแล้ว คอมมิตที่เพิ่มมันเข้ามาถูก revert ไปตั้งแต่เดือนพฤษภาคม และเราไม่ทันจับได้ก่อนกดเผยแพร่ มันไม่มีใน 0.14.0

แก้อีกสองจุดเล็ก ๆ ตอนที่ยังอยู่ตรงนี้: MCP server มี 29 เครื่องมือ ไม่ใช่ 26 — browser_fill_form, browser_dismiss_overlay, browser_get_playing_tabs และ render_ui มาเพิ่มทีหลัง ส่วน "ราว 25,000 บรรทัด" ตอนนี้คือ 35,972


โหลดไปใช้

brew install --cask muvon/tap/octoweb

macOS 13 ขึ้นไป ทั้ง Apple Silicon และ Intel ไม่ต้องมีบัญชี หรือจะ build เองก็ได้ ใช้แค่ Rust toolchain กับเวลาราวหนึ่งนาที:

git clone https://github.com/muvon/octoweb
cd octoweb
./build.sh --dev
open dist/Octoweb.app

ถ้าไม่ตั้งค่า AI เลยแม้แต่นิดเดียว Octoweb ก็ยังเป็นเบราว์เซอร์: palette, ช่องลัด, เวิร์กสเปซ, find-in-page, การบล็อกคอนเทนต์, การจำศีลแท็บ ส่วน sidebar อยากให้คุณติดตั้ง Octomind ไว้ข้าง ๆ จากนั้นเรื่องโมเดลก็เป็นการตัดสินใจบรรทัดเดียว — octomind login ถ้าจะใช้คลาวด์ของเรา หรือ export key แล้วใส่สตริง provider:model ถ้าจะใช้อย่างอื่น เราเองใช้ทั้งสองแบบ บนเครื่องคนละเครื่อง แล้วแต่ว่างานคืออะไรและเน็ตเป็นอย่างไร

ทุกอย่างอยู่ภายใต้ Apache-2.0: ตัวเบราว์เซอร์, รันไทม์, เลเยอร์ผู้ให้บริการ ถ้าคุณรันมันกับโมเดลในเครื่องแล้วอะไรบางอย่างช้าหรือโง่กว่าที่ควรจะเป็น เปิด issue มาได้เลย — เส้นทางนั้นถูกทดสอบน้อยกว่าเส้นทางคลาวด์ และวิธีแก้อย่างเดียวคือคุณต้องบอกเรา

— Don

Octoweb เป็นโอเพนซอร์สภายใต้ Apache-2.0 พัฒนาโดย Muvon Un Limited ตอนนี้มันอยู่ที่ octoweb.xyz รันบน Octomind และทำงานกับโมเดลตัวไหนก็ได้ที่คุณชี้ให้มัน GitHub — ยินดีรับ issues และ pull requests