Free for macOS · Apple Silicon & Intel

Review before you commit.

Zense is a native macOS code editor with AI chat, a real terminal and first-class Git review — local-first, private by default, bring your own key.

Auto-detects Apple Silicon — Intel version also available · macOS 12+ · updates itself

$ curl -fsSL https://zense.zurge.co/install.sh | bash
zense— zense main
EDITOR
zense
src
components
ReviewPanel.tsx
DiffList.tsx
store
lib
package.json
design.md
ReviewPanel.tsx ✕ DiffList.tsx
src › components › ReviewPanel.tsx
1import { useMemo } from "react"
2import { useGitStore } from "../store/git"
3
4// Nothing ships without a human pass
5export function ReviewPanel({ files }: { files: ChangedFile[] }) {
6 const staged = useMemo(() => files.filter(f => f.staged), [files])
7 if (!staged.length) return <Empty text="No staged changes" />
8 return <DiffList files={staged} onStage={toggleStage} />
9}
CHAT AI REVIEW FOCUS ✕
Summarize the staged changes
Two edits in ReviewPanel.tsx — staged files are filtered before rendering, and the list now disables staging for binary files.
✓ 2 files · review diff
Ask about your code…
main ⨯ 1⚠ 2 Ln 6, Col 20Spaces: 2TSX
LOCAL-FIRSTBRING YOUR OWN KEYNO ACCOUNTTAURI NATIVEFREE
01 · One workspace

Everything between idea
and commit. One window.

No window hopping, no lost context. Code, AI, shell and Git review live side by side — pick a panel to see it.

zense— zense main
EDITOR
zense
src
ReviewPanel.tsx
DiffList.tsx
store
package.json
ReviewPanel.tsx ✕ git.ts
src › components › ReviewPanel.tsx
1import { useMemo } from "react"
2
3// Nothing ships without a human pass
4export function ReviewPanel({ files }: { files: ChangedFile[] }) {
5 const staged = useMemo(() => files.filter(f => f.staged), [files])
6 return <DiffList files={staged} />
7}
main ⨯ 1⚠ 2 Ln 6, Col 20Spaces: 2TSX
zense— zense main
middleware.ts ✕
src › auth › middleware.ts
41export async function verify(req: Request) {
42 const user = await verifyToken(req)
43 req.ctx.user = user
44}
CHAT AI REVIEW FOCUS ✕
Where is the auth flow handled?
The request passes through verifyToken() in middleware.ts, then session.ts hydrates the user. Login handler: login.tsx:42
Add rate limiting to that middleware
Drafted a sliding-window limiter around verifyToken(). Nothing applied yet — review the diff first.
+18 −2 · middleware.ts
Ask about your code…
main BYO key · stored locallyLn 1, Col 1Spaces: 2TSX
zense— zense main
pi ✕ Terminal 2 ✕ +
user@zense-Laptop zense % bun test
✓ src/review.spec.ts (12)
✓ src/diff.spec.ts (8)
✓ src/stage.spec.ts (22)
  42 pass · 0 fail · 118ms
user@zense-Laptop zense % git commit -m "harden review pipeline"
✓ 3 files changed, 24 insertions, 6 deletions
user@zense-Laptop zense %
CHAT AI REVIEW FOCUS ✕
Ask about your code
Ask about your code…
main ⨯ 1⚠ 2 ▣Ln 1, Col 1Spaces: 2HTML
zense— zense main
REVIEW
main
Commit message…
✓ Commit
AI Review
STAGED · 1
src/ReviewPanel.tsx +24−6M
CHANGES · 0
ReviewPanel.tsx DIFF ✕
src › ReviewPanel.tsx
HEAD ← Working Tree +24−6 1/1 Side-by-side Reset File ✦ AI Summary
33 export function ReviewPanel({ files }) {
4 − const staged = files
 4+ const staged = files.filter(f => f.staged)
 5+ if (!staged.length) return <Empty />
 6+ // every hunk is reviewable — never silent
57  return <DiffList files={staged} />
68 }
CHAT AI REVIEW FOCUS ✕
✦ Review ทั้งหมด
Summarize all changes + review points
Staged change filters files before rendering. Two things to check: f.staged flag source, and the early return drops unstaged context.
(no critical findings)
Ask a follow-up…
main ⨯ 1⚠ 2 Ln 1, Col 1Spaces: 2TSX
nothing leaves the machine until you commit it yourself
02 · Workflow

From prompt to commit,
in one motion.

add rate limiting
STEP 01

Prompt

Describe the change in chat, next to the code it touches.

STEP 02

Generate

Zense drafts the edit with full workspace context — your key, your machine.

− getUser()+ await getUser()+ if (!user) throw …
STEP 03

Review

Every change lands as a diff. Line by line, stage what you trust.

$ bun test
✓ 42 passed · 118ms
STEP 04

Test

Run the suite in the built-in terminal without leaving the window.

✓ Commit
STEP 05

Commit

Commit with confidence — you saw exactly what went in.

03 · The review habit
AI can write the code.
You review the work.

Every AI edit in Zense arrives as a reviewable diff — never a silent overwrite. You see what changed, you stage what makes sense, and you are the one who commits.

That's not a feature. It's the whole point. Zense is built around one habit: review before you commit.

auth/middleware.ts +18−2 ✦ AI Summary
1010 export async function verify(req: Request) {
11 − const user = await verifyToken(req)
 11+ const user = await limiter.wrap(verifyToken)(req)
 12+ if (!user) throw new Unauthorized()
 13+ req.ctx.user = user
1214 }
main STAGED ✓1 file · +18 −2
Reviewed by you
04 · Why Zense

Built like a tool,
not a toy.

01
01

Native & fast

Tauri · Rust

No Electron. Small download, instant startup, low memory — it feels like part of macOS, because it's built like it.

● cold start ~0.4s · <200MB idle
02
02

AI inside the workspace

Bring your own key

Chat, AI Review and Focus sessions sit right next to your editor. OpenAI, Anthropic, Gemini — or local models with Ollama.

✦ chat · ai review · focus
03
03

A real terminal

PTY · zsh / bash

Actual shell tabs inside the workspace. Build, run, test and commit without switching windows — the session stays alive.

$ multiple tabs · shell profiles
04
04

Git review, first-class

Diff · Stage · Commit

Status, diffs, staging, history and AI commit summaries in one panel. The habit the whole app is built around.

✓ review before you commit
05 · Privacy

Your code. Your machine.
Your key.

01

Your code

Files never leave your disk. Indexing, context and diffs are computed locally.

02

Your machine

No account, no cloud editor, no telemetry. The app updates itself — that's the only network it needs.

03

Your key

AI calls go straight from your Mac to the provider with your own API key. Or no key at all — run Ollama or LM Studio fully offline.

No account required No cloud editor No telemetry BYO API key — stored locally Local models: Ollama · LM Studio Free, no strings
Under the hood

Small binary. Serious internals.

Framework
Tauri + Rustnot Electron
Editor
MonacoVS Code engine
Git
git2 / libgit2native bindings
Parsing
Tree-sittersymbols & context
Platform
macOS 12+Apple Silicon · Intel
06 · Changelog

What's new.

Shipped with every release — auto-generated from the app's release notes.

v0.19.3 ล่าสุด

  • 📊 Markdown แสดงตารางได้แล้ว — ตารางแบบ pipe (| ชื่อ | อายุ |) render เป็นตารางจริงทั้งในคำตอบแช็ทและหน้า Preview ของไฟล์ .md มีเส้นขอบ แถวหัวตารางเด่นชัด และจัดแนวคอลัมน์ได้ตามที่เขียนไว้ (:-- ชิดซ้าย, :-: กึ่งกลาง, --: ชิดขวา) — ไม่ใช่ข้อความดิบเต็มไปด้วยขีด ๆ อีกต่อไป
  • ✏️ เปลี่ยนชื่อ tab Terminal ได้แล้ว — ดับเบิลคลิกที่ชื่อ tab เพื่อตั้งชื่อเอง (เช่น "dev server", "tests") กด Enter ยืนยัน หรือ Esc ยกเลิก — และชื่อที่ตั้งเองจะไม่ถูกเปลี่ยนทับด้วยชื่อจากคำสั่งที่พิมพ์รันอีกต่อไป
  • 🖱️ ลากสลับตำแหน่ง tab Terminal ได้ — ลาก tab ไปซ้าย/ขวาเพื่อจัดลำดับใหม่ตามใจ มีเส้นบอกตำแหน่งที่จะวาง โดย shell แต่ละตัวยังรันต่อพร้อม output เดิมครบทุกบรรทัด ไม่มีการ restart

v0.19.2

  • 🖥️ เปิดแอพแล้วเจอหน้า Terminal ทันที — เมนูเริ่มต้นเป็นเมนูแรกของแถบซ้ายเสมอ
  • 🗂️ แยก tab ของแต่ละหน้าออกจากกันเด็ดขาด ไม่ปนกันอีกต่อไป — Editor เห็นเฉพาะไฟล์ที่เปิดอยู่, Review เห็นเฉพาะ diff ของงานที่กำลังแก้, History เห็นเฉพาะ commit/compare ของตัวเอง — แต่ละหน้าจำ tab ที่เปิดค้างไว้ สลับไปกลับมาเจอหน้าจอเดิมเป๊ะ และคำสั่งปิด/สลับ tab (⌘W, Close Others, Close All, ⌘1–9) กระทบเฉพาะ tab ในหน้าที่กำลังมองอยู่ ไม่ไปยุ่งกับ tab ของหน้าอื่น
  • 📂 กดเปิดไฟล์จากที่ไหนก็เด้งไปหน้า Editor ทันที — เปิดไฟล์จากค้นหา, Quick Open (⌘P), finding ของ AI review หรือไฟล์ conflict ในหน้า Review จะพาไปหน้า Editor พร้อมไฟล์นั้นเลย หน้า Review ไม่แสดง file tab ปนอยู่อีก

v0.19.1

  • 📝 หน้าต่าง release notes ตอนมีอัปเดตใหญ่ขึ้นและอ่านง่ายขึ้นมาก — ขยายจากกล่องแคบ ๆ เป็นหน้าต่างกว้างขึ้น เลื่อนดูเนื้อหาได้เกือบเต็มจอ และ render เป็น Markdown จริง ๆ (หัวข้อ ตัวหนา bullet ลิงก์) ไม่ใช่ข้อความดิบอีกต่อไป — อ่านอะไรใหม่ในแต่ละเวอร์ชันได้สบาย ๆ ก่อนกดอัปเดต
  • 🖥️ แก้บั๊ก: สลับไปหน้า Review แล้วกลับมาที่ Terminal แล้ว shell ถูก restart ทิ้ง — เมื่อก่อนทุกครั้งที่เปลี่ยน activity ไป Review แอพจะฆ่า shell ทั้งหมด งานที่รันค้างไว้หาย ตอนนี้ terminal อยู่ต่อได้ข้ามการสลับหน้า กลับมาเจอ shell เดิมพร้อม output เดิม
  • 🌿 ชื่อ branch ในแถบสถานะอัปเดตสดแล้ว — เมื่อก่อนถ้าสั่ง git checkout จาก terminal ในแอพ (หรือจากข้างนอก) ชื่อ branch มุมล่างจะค้างเป็นค่าเก่าจนกว่าจะทำ git action ผ่านแอพ ตอนนี้แอพจับตา .git ไว้ด้วย เปลี่ยน branch ปุ๊บชื่อเปลี่ยนตามทันที
  • 🔍 กด Escape ในหน้าค้นหาเพื่อกลับไปหน้ารายชื่อไฟล์ได้แล้ว — ไม่ว่า cursor จะอยู่ในช่องค้นหา ช่อง replace หรือตัวกรองใด ๆ กด Esc ปุ๊บ sidebar กลับเป็น file tree (และไม่ไปชนกับ Esc ของกล่องยืนยัน replace-all)
  • 🗂️ หน้า Review มี empty state เป็นของตัวเอง — ตอนยังไม่ได้เลือกไฟล์ หน้า diff จะบอกให้เลือกไฟล์ที่เปลี่ยนแปลงเพื่อดู diff (พร้อมไอคอนเฉพาะ) แทนข้อความเปิดไฟล์ของ editor ที่ไม่เข้าบริบท และแก้บั๊กข้อความ placeholder ที่เคยแสดงเบี้ยวไม่ตรงกลางจอ
  • 🧹 แถบ tab ของ Terminal โล่งขึ้น — เอาปุ่มกลุ่มขวาบน (Restart shell และ Back to editor) ออก หน้าจอสะอาดขึ้น ปุ่มปิด tab รายตัวและปุ่ม + เปิด terminal ใหม่อยู่ครบเหมือนเดิม

v0.19.0

  • 🤖 Auto Review รุ่นใหม่ กดดู finding ถึงตำแหน่งในโค้ดได้เลย — รายการ finding จาก AI review ตอนนี้คลิกได้ พาไปยังไฟล์/บรรทัดที่เกี่ยวข้องทันที พร้อมปุ่มสั่ง review ซ้ำจาก panel ได้โดยตรง
  • 🖼️ หน้า Review กลายเป็นหน้าเต็มจอ — เอา Chat dock และเมนู Summarize / Explain ที่แทรกอยู่ออก หน้า Review ใช้พื้นที่เต็มหน้าต่าง ดู diff ได้กว้างขึ้น
  • 🌐 เว็บไซต์ zense.zurge.co ได้ดีไซน์หน้าแรกใหม่ทั้งหมด

v0.18.0

  • 🌐 คลิกขวาที่ไฟล์ .html แล้วกด "Open in Browser" ได้แล้ว — เปิดไฟล์ด้วย browser หลักของเครื่องโดยตรง (Chrome/Safari/…) ตอนทดลองเขียนหน้าเว็บ ส่วน "Open Preview" ที่ดูผลลัพธ์ในแอพยังอยู่เหมือนเดิม และคลิกซ้ายปกติยังเปิดโค้ดใน editor
  • 🌿 ชื่อ branch ด้านบนของหน้า Review กดได้แล้ว — เมื่อก่อนเป็นแค่ป้ายชื่อเฉย ๆ ตอนนี้กดแล้วเปิดเมนู branch เต็มรูปแบบ (fetch / pull / สลับ / สร้าง branch ใหม่) เหมือนแถบสถานะด้านล่าง ไม่ต้องเลื่อนลงไปหาอีก
  • 🧩 stage/unstage ทีละส่วน (hunk) จากหน้า diff ได้เลย — เวลาแก้ไฟล์เดียวหลายจุดแต่อยาก commit แค่บางส่วน กดปุ่ม +/- บนแต่ละก้อนใน Diff view ได้ทันที ไม่ต้องเปิด command line
  • 🗺️ เว็บไซต์ zense.zurge.co มีหน้าแรกใหม่พร้อม roadmap ของโปรเจกต์ อัปเดตเองทุกครั้งที่ออกเวอร์ชันใหม่

v0.17.0

  • ↔️ ลากปรับความกว้างแผง Chat / AI Review / Focus ด้านขวาได้แล้ว — มีขอบจับบาง ๆ ที่ขอบซ้ายของแผง ลากปรับได้แบบสด ๆ และแอพจำความกว้างไว้ให้หลังปิด–เปิดใหม่
  • 🪟 แก้บั๊ก: กดปิดหน้าต่างหรือใช้คำสั่งเมนู (เช่น ⌘S) แล้วดันไปกระทบทุกหน้าต่างโปรเจกต์ที่เปิดอยู่ — ตอนนี้คำสั่งส่งถึงเฉพาะหน้าต่างที่สั่งจริง ๆ
  • 🗂️ แก้บั๊ก: ลากไฟล์/โฟลเดอร์ไปวางในโฟลเดอร์อื่นบน explorer ไม่มีอะไรเกิดขึ้น (macOS) — ตอนนี้ลากย้ายได้ตามปกติ
  • 📑 แก้บั๊ก: ชื่อ tab editor ตกเป็นหลายบรรทัดเวลาเปิดหลาย tab — ตอนนี้ชื่อ tab อยู่บรรทัดเดียว ยาวเกินก็ย่อด้วย … พร้อม tooltip ตอน hover
  • 🧹 แก้บั๊กภายใน: ตัวจับ event ตอนลาก (resize แผง และลากย้ายไฟล์) เคยค้างหลงเหลืออยู่ถ้ามีการปิด component กลางทาง จน cursor/selection ของหน้าจออาจติดสถานะลากอยู่ — ตอนนี้ถูกเก็บกวาดครบ

v0.16.0

  • ⬆️ แก้บั๊ก: ปุ่ม Push ใช้งานได้กับ branch ใหม่ที่ยังไม่เคย push ขึ้น remote — เมื่อก่อนถูกล็อคพร้อมข้อความ "ไม่มีอะไรให้ push" ทั้งที่ยังไม่เคยส่ง branch นี้ขึ้นไปเลย ตอนนี้แอพแยกแยะออกว่า "ไม่มีอะไรใหม่" กับ "ยังไม่เคย push"
  • 🔀 แก้บั๊ก: repo แบบ fork ที่มีหลาย remote Push ถูกล็อคผิด ๆ — แอพเคยนับ ref ของ remote อื่น (เช่น upstream ของต้นฉบับ) ว่าเป็น upstream ของ branch เรา ตอนนี้พิจารณาเฉพาะ origin (หรือ remote ตัวเดียวใน repo ที่มี remote เดียว) เท่านั้น

v0.15.0

  • 📂 เปิดดูไฟล์ในโฟลเดอร์จุดที่ถูก ignore ได้แล้ว — โฟลเดอร์เก็บ state เช่น .zense, .idea ที่อยู่ใน .gitignore เมื่อก่อนโผล่ใน tree เป็นตัวจางแต่เปิดดูข้างในไม่ได้ ตอนนี้กดขยายดูไฟล์ข้างในได้ปกติ (จำกัดจำนวนไฟล์ต่อโฟลเดอร์เพื่อไม่ให้แอพช้า) ส่วน node_modules/target ยังซ่อนเนื้อในเหมือนเดิม
  • 💬 แก้บั๊ก: bubble ฝั่งเราใน AI Review แสดงชื่อเมนูซ้อนกันซ้ำ ๆ — เช่นเคยขึ้น "หาบั๊กใน 'หาบั๊ก · path'" ตอนนี้แสดงตรงกับปุ่ม/เมนูที่กดจริง ๆ (Summarize, Find bugs, Explain with AI, ...) แค่ชื่อเดียว

v0.14.0

  • ✨ Push ได้จากหน้า Review เลย — เพิ่มปุ่ม ↑ ข้างชื่อ branch ไม่ต้องลงไปกดที่แถบล่างสุดอีก ระหว่างส่งเห็นสถานะกำลังทำงาน และเมื่อเสร็จแสดงผลลัพธ์ให้ทันที
  • 🛡️ ปุ่ม Push ฉลาดขึ้น — หมุดล็อคเองอัตโนมัติตอนที่ยังไม่ควรกด เช่น กำลังแก้ conflict อยู่กลางทาง หรือกำลังเปิดดู commit เก่าเฉย ๆ พร้อมอธิบายเหตุผลให้เหมือนปุ่มอื่นในแอพ
  • ⌨️ แก้บั๊ก: กด ⌘C (หรือ Ctrl+C) แล้ว copy ข้อความในแชท / หน้าต่าง AI Review ไม่ได้ — ก่อนหน้านี้แอพไปเอาไฟล์ที่เลือกอยู่ใน tree แทน ต้องมาคลิกขวากันเอาเอง ตอนนี้ลากเลือกข้อความแล้วกด copy ได้ตามปกติ ทั้งคำตอบของ AI และข้อความที่ตัวเองพิมพ์
  • 🗣️ ข้อความเตือนเวลาเกิดข้อผิดพลาดอ่านเข้าใจง่ายขึ้นทั้งแอพ — แก้จุดที่เคยขึ้นหน้าจอด้วยข้อความอ่านไม่รู้เรื่อง

v0.13.0

  • ✨ เพิ่มการตั้งค่า Preferred language ใน Settings > LLM — เลือกให้ AI ตอบเป็นไทยหรืออังกฤษได้
  • AI จะตอบเป็นภาษาที่เลือกเสมอ กระชับและใช้คำง่าย ๆ (prompt ภายในทั้งหมดปรับเป็นภาษาอังกฤษ)
Get Zense

Ready when you are.

Free for macOS. No account. Updates itself.

$ curl -fsSL https://zense.zurge.co/install.sh | bash