惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V2EX - 技术
V2EX - 技术
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
Forbes - Security
Forbes - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
Know Your Adversary
Know Your Adversary
Schneier on Security
Schneier on Security
H
Heimdal Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
月光博客
月光博客
罗磊的独立博客
Webroot Blog
Webroot Blog
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog
爱范儿
爱范儿
Last Week in AI
Last Week in AI
博客园 - 聂微东
博客园 - 叶小钗
美团技术团队
A
Arctic Wolf
P
Palo Alto Networks Blog
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
Jina AI
Jina AI
C
Cyber Attacks, Cyber Crime and Cyber Security
The Last Watchdog
The Last Watchdog
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
B
Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Privacy & Cybersecurity Law Blog

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店 GitHub - EdoardoBambini/Agent-Armor-Iaga: AI agents are getting tool access — shell, file system, databases, APIs, secrets. But **nobody is governing what they actually do with it**. Frameworks like LangChain, CrewAI, AutoGen, and Claude Code give agents the power to execute. Agent Armor gives you the power to control, audit, and approve every single action before it happens. HN Vibes — Week 15, Apr 7–13 2026 GitHub - chojs23/ec: Easy terminal-native 3-way git mergetool vim-like workflow GitHub - SethPyle376/hiraeth: Local AWS emulator focused on fast integration testing, with SQS support, SQLite-backed state, and a debug-friendly web UI. GitHub - JakOb-dotcom/cloud-sandbox-security-analysis: Technical analysis and Proof of Concept (PoC) regarding environment variable exfiltration in containerized cloud sandboxes via side-channel data leaks. Springboards - Flint Alpha Show HN: A simpler coding agent harness GitHub - audiodude/sudomake-friends GitHub - 256thFission/mini-mythos: OSS clone of Anthropic’s Mythos harness to locate C/C++ memory vulnerabilities Show HN: OpenParallax: OS-level privilege separation for AI agent execution Hacker News Sorted - Chrome 应用商店 Show HN: How to Install Docker on Ubuntu 24.04 LTS: Complete 2026 Guide GitHub - himanshudongre/smriti GitHub - sverrirsig/claude-control: macOS desktop dashboard for monitoring and managing multiple Claude Code sessions GitHub - ory/dockertest: Write better integration tests! Dockertest helps you boot up ephermal docker images for your Go tests with minimal work. Chiral - Chrome 应用商店 Show HN: Two Claudes collaborating through shared memory on a $100 mini-PC GitHub - pmichaillat/latex-cv: Minimalist LaTeX template for academic CVs GitHub - oguzbilgic/posse: A web UI for Anthropic Managed Agents. GitHub - sshiraz/depsly: Dependency risk analysis tool for npm packages ABI Add safari/agent-harness — Safari browser automation via safari-mcp by achiya-automation · Pull Request #212 · HKUDS/CLI-Anything GitHub - Halfblood-Prince/trustcheck: Verify PyPI package attestations and improve Python supply-chain security GitHub - oguzbilgic/kern-ai: Agents that do the work and show it. GitHub - bruits/satteri: High-performance Markdown and MDX processing for the JavaScript ecosystem GitHub - tylergibbs1/feedstock: High-performance web crawler and scraper for TypeScript, powered by Bun and Playwright GitHub - Grimm67123/grimmbot: The self-improving sandboxed and open-source AI agent. With persistent memory and scheduling. GitHub - whitevanillaskies/whitebloom: Local whiteboard that blooms. GitHub - hwdsl2/docker-whisper: Docker image for a self-hosted Whisper speech-to-text server with speaker diarization and OpenAI-compatible transcription and translation APIs. Powered by faster-whisper. Supports all Whisper models, NVIDIA GPU (CUDA) acceleration, JSON/SRT/VTT output, SSE streaming, offline mode, and multi-arch (amd64, arm64). GitHub - yisding/reviewwiggum GitHub - MarwanAlsoltany/serrors: Structured errors for Go: sentinel hierarchies, typed data, custom formatting, and slog integration. GitHub - soatok/age-php GitHub - Luthiraa/markitme GitHub - stagas/rtdiff: realtime git diff gui and AI-assisted commits GitHub - tombedor/excalicharts GitHub - wh1le/excalidraw-edit: Open and edit .excalidraw files from the terminal. Offline, auto-saves to disk. MalExt Sentry - Malicious Extension Scanner - Chrome 应用商店 GitHub - syi0808/asciianimesvg: Generate animated ASCII art SVGs from text. CLI, Rust library, WASM, and web editor. GitHub - zaina-ml/ml_forge: A visual-based graph node editor for training computer vision models. GitHub - anakin87/llm-rl-environments-lil-course: 🌱 A little course on Reinforcement Learning Environments for evaluating and training Language Models GitHub - takaakit/superpowers-uml: Superpowers-UML modifies Superpowers to ensure a software development workflow in which AI agents design through UML modeling. AdriByte Studio - Sviluppo Web e Soluzioni Digitali GitHub - chouligi/angel-copilot: Your personalized Angel Investment Advisor Show HN: MoodSense AI (ML and FastAPI and Gradio, Deployed on Hugging Face) Moodsense Ai - a Hugging Face Space by aman179102 GitHub - agenteractai/lodmem: Level Of Detail Context Management for Agents GitHub - ostefani/subnetlens: A fast, concurrent network scanner with a TUI and plain-text CLI, built in Go. It discovers live hosts on your network, scans their open ports, resolves hostnames, and fingerprints operating systems—delivered. Cyber Pulse: Agentic Intel - Apps on Google Play Whisper API: Self-Hostable Speech to Text Transcription The Agent-Web Protocol Stack: A Research Thesis GitHub - msmarkgu/RelayFreeLLM: A restful API designed to route user prompts to various AI model providers. Show HN: Provepy – A Python decorator that proves your code using Lean and LLMs Show HN: Pardonned.com – A searchable database of US Pardons GitHub - patrickdappollonio/dux: Dux is a terminal UI that lets you run multiple AI coding agents side by side, each in its own git worktree, with full companion terminals, macros, commit generation, and a command palette that knows more tricks than you do. kMC Crystal Simulator Show HN: HyperFlow – A self-improving agent framework built on LangGraph GitHub - stef41/vibescore: 🎵 Grade your vibe-coded project. One command, instant letter grade across security, quality, dependencies, and testing. GitHub - stef41/lmscan: 🔍 Detect AI-generated text and fingerprint which LLM wrote it. Open-source GPTZero alternative. Zero dependencies, works offline. imgur.com GitHub - visionscaper/collabmem: Enabling long-term collaboration with Agentic AI - building up episodic and world model memory over time with in-context awareness 在 Steam 上购买 FriedrichAI: Offline AI 立省 10% GitHub - atripati/ark: AI Runtime Kernel — a context operating system for AI agents. Eliminates tool bloat, loads only what’s needed, and gives LLMs their reasoning space back. GitHub - nowork-studio/toprank: Open-source Claude Code skills for SEO, SEM, Google Ads GitHub - tacomanator/sash: Lightweight macOS menu bar app for reliably cycling through windows of the current application. Appents | Social Media Management for Product-First Teams GitHub - pnhoang/youtube-spam-blocker: Automatically detects and hides spam messages in YouTube Live chat. Set rate limits, keyword filters, and block repeat offenders. GitHub - decisionnode/DecisionNode: CLI + Local MCP - A shared structured memory store across Claude Code, Cursor, Windsurf, Antigravity, and every MCP client. Semantically queryable. GitHub - AvaCodeSolutions/django-email-learning: An open source Django app for creating email-based learning platforms with IMAP integration and React frontend components. The $100K Gap in Kubernetes Security Tooling Function Calling Harness: From 6.75% to 100%
GitHub - zohaibus/localsheets: A single-file, local-first, multi-sheet spreadsheet
zpusmani · 2026-06-02 · via Hacker News: Show HN

A single-file, local-first, multi-sheet spreadsheet.

No accounts. No cloud. No subscription. No analytics. No tracking. One HTML file.

MIT licensed. Your data stays in a plain JSON file on your disk.

Part of the LocalOffice suite, alongside DeckBuilder and Context Protocol.


The local AI reading the budget and flagging every over-budget row, applied as one undoable patch: LocalSheets local AI flagging over-budget rows in the budget template

Change one gain on the Joints sheet and the Computed sheet recomputes damping ratio, settling time, and class live. Here, J2 tunes from underdamped to critically damped: LocalSheets recomputing a 6-DOF PID calibration as a joint gain changes

Why LocalSheets feels different

Most spreadsheet tools want your data on their servers, your access behind their login, your money in their subscription, and your workflow locked into their format.

LocalSheets assumes the opposite: software disappears, but files persist.

  • No cloud. No accounts. No telemetry. The app is a single HTML file you open from disk.
  • No vendor format. Workbooks are plain JSON: git diff works on them, you can edit one in a text editor, and the schema is short enough to read in five minutes.
  • No dependencies. Zero npm packages, zero CDN calls, zero embedded fonts. The whole product is one ~260 KB file; mirror it, fork it, archive it, run it on an air-gapped laptop in 2046.
  • MIT. Use it, modify it, ship it inside your own product. No callbacks home.

Provable zero-leak

The repo contains a network-surface audit you can re-run. Every potential outbound channel in localsheets.html:

Surface Count Notes
fetch(...) 2 Both to http://localhost:11434 (Ollama), only fired when you click AI in the toolbar
XMLHttpRequest 0
WebSocket / EventSource 0
navigator.sendBeacon 0
Dynamic import(...) 0
<script src=> / <link rel=...> to external 0 The one <link> is a data: URI favicon
<img src=> / <iframe> 0
CSS url(http*) / @import 0

The AI panel is the only outbound call. Don't click it (or don't run Ollama) and the app is fully airgapped.

Verify it yourself (60 seconds)

Don't take this on faith. Run these two commands against the file you downloaded:

# 1. Network surface: should print exactly 2 lines, both fetches to localhost:11434
grep -nE 'fetch\(|XMLHttpRequest|WebSocket|sendBeacon' localsheets.html   # Linux / macOS / Git Bash
Select-String -Path .\localsheets.html -Pattern "fetch\(", "XMLHttpRequest", "WebSocket", "sendBeacon"  # Windows PowerShell

Expected output (line numbers will match the version you downloaded):

5494:      const res = await fetch(this.host + '/api/tags', { method: 'GET' });
5594:      const res = await fetch(this.host + '/api/generate', {

this.host is a hard-coded const 'http://localhost:11434' (see const AI = { near the top of the AI section). There is no let, no DOM input, no env var that can override it.

# 2. Integrity: confirm the file you have is the file the maintainer audited
sha256sum localsheets.html      # Linux / Git Bash on Windows
shasum -a 256 localsheets.html  # macOS

Compare with the SHA-256 published on the GitHub Releases page for the version you downloaded. If they match, the file you have is the file that was audited. If they don't, don't run it.

This is the design that lets the same workbook hold a household budget and a 6-DOF robot-arm PID calibration, because the engine is just files and formulas.


Features in v1.1

New in v1.1

  • Charts: Data ▾ → Chart selection… renders a bar / line / pie SVG of the selected range, with copy + download
  • =SPARKLINE(range, [type], [color]): inline SVG line or bar chart inside a single cell
  • Absolute references: $A$1, $A1, A$1 are tokenized and honored by the fill handle
  • Insert / delete row or column auto-rewrites formula text: including cross-sheet refs. Refs to a deleted row become #REF!; refs past it shift up. Same for columns.
  • Fill-handle propagates formulas: dragging =A1+B1 down one row produces =A2+B2 instead of copying the value
  • Local AI panel (toolbar AI): talks to a local Ollama instance, with two modes: freeform text reply or structured JSON-patch mutations
  • JSONL / NDJSON import: drop a .jsonl or .log file (one JSON object per line, common in robotics/telemetry/log streaming) into Import CSV / JSONL. The union of keys becomes the header row; one row per line. Auto-detects by content, so .txt files containing JSONL also work.
  • 10,000-row sheets (up from 1,000)
  • Browser e2e suite: 28 Playwright specs across 6 files run headlessly on Chromium and WebKit (see e2e/STATUS.md)

Workbook

  • Multi-sheet workbooks: up to 100 sheets per file, each up to 10,000 rows × 702 columns (A–ZZ)
  • Tab bar at the bottom: click to switch, double-click to rename, right-click to duplicate/delete/reorder
  • Save / load as .localsheet.json (schema v2.0); v1.0 files auto-migrate on open
  • File System Access API in Chrome/Edge: real in-place save; download fallback elsewhere

Formula & Equations

  • 99 functions across math, stats, text, lookup, dates, financial, info
  • Multi-sheet references: =Sheet2!A1, =SUM('My Data'!A1:B10)
  • Cycle detection (#CIRC!), proper error tokens (#DIV/0!, #VALUE!, #REF!, #NAME?, #PARSE!, #N/A, #NUM!)
  • Dependency graph with topological recalc: change a cell and all dependents update

Editing

  • Range selection: click+drag, Shift+click, Shift+arrows
  • Whole row / column / sheet selection: click a row number, column letter, or the top-left corner to select all of it
  • Jump to any cell: click the address box (top-left) or press Ctrl+G and type a cell like ZZ500 or Sheet2!AA10
  • Auto-extend: scroll near the right or bottom edge and the grid expands in chunks (26 cols / 50 rows) all the way to ZZ × row 10000
  • Formula reference picking: while editing a formula, click or drag any cell to insert its reference (A1 or A1:A10) at the cursor; picked range shows a dashed accent outline
  • Auto-pair parentheses: typing ( in a formula inserts () with the cursor between; ) skips over a matching close; Backspace deletes the pair
  • Multi-cell copy/paste as TSV (round-trips with Excel and Google Sheets)
  • Undo / Redo up to 100 actions (Ctrl+Z / Ctrl+Y or Ctrl+Shift+Z) including bulk ops (paste, clear, format, sort, replace-all)
  • Insert/delete/sort rows and columns via toolbar dropdown or right-click
  • Column and row resize by dragging the right edge of a column header or bottom edge of a row header
  • Freeze panes: top row / first column / both / freeze at selection / unfreeze
  • Sort columns A→Z or Z→A from the right-click menu or Data ▾ toolbar dropdown (sorts the populated range, preserves row groups)
  • Sort range with / without header: select cells, then Data → Sort range with header…; treats the first row as a label and keeps it in place while sorting the rest
  • Format painter: pick the format of the active cell, then click anywhere to paint it

Formatting

  • Bold / Italic / Underline / Strikethrough per cell (Ctrl+B / Ctrl+I / Ctrl+U + S button)
  • Wrap text: toggle word-wrap; row auto-grows to fit
  • Font size: 9 through 32 pt, rows auto-grow for larger text
  • Text alignment: Left, Center, Right
  • Number formats: General, Number (1,234.56), Currency ($1,234.56), Percent (42%), Integer (1,235), Date (2026-05-24), Date US (05/24/2026)
  • Fill color: 11-swatch palette plus a custom color picker; applies to empty cells too
  • Text color: same palette mechanic for foreground
  • Borders: All / Outside-only / Top / Bottom / Left / Right / None (medium-gray, visible in both themes)
  • Conditional formatting: per-sheet rules (> 0 → green, < 0 → red, etc.) applied at render time

Data

  • Data validation lists: right-click → Set list values… gives the cell a dropdown of allowed values; a small ▾ arrow on the cell opens the picker
  • Cell notes: right-click → Add / edit note; a red triangle in the corner marks notes; hover to read
  • Named ranges: toolbar Names… dialog (e.g. Revenue = Sheet1!B2:B13); names work inside formulas: =SUM(Revenue)
  • Tables / Lists (Excel-style "Format as Table"): Ctrl+L or Ctrl+T (or Data → Format selection as table, or right-click → Create list / table). If you have a range selected it uses that; if you're on a single cell inside data, it auto-detects the contiguous range like Excel does. The first row becomes a styled header (accent background, white text) with a ▾ filter chip on each column. Body rows get zebra stripes. To convert back to a plain range, use Remove table from the same menus.
  • Fill handle: select one or more cells, then drag the small accent square at the bottom-right corner down or right. If the source values are an arithmetic series (1, 2, 3 or 10, 20, 30), it continues the pattern; otherwise it repeats the source values in cycle.
  • Merge cells: select a range and pick Merge cells (right-click or Data ▾). Cells visually combine into one block; only the top-left value is kept. Unmerge on the merged cell restores it.

UX

  • Find / Replace / Find All (Ctrl+F): current sheet or all sheets, optional case-sensitive; Enter advances; Find All highlights every match in yellow and shows a clickable results list at the bottom of the panel (click a result to jump to that cell; the current one is highlighted in orange)
  • Column filter: right-click → Filter column… shows a checklist of unique values; uncheck to hide rows. No header row required. Multiple columns can be filtered at once; filtered columns get a ▾ chip on the header.
  • Theme toggle: Light / Dark / Auto, remembered across sessions
  • Range summary in the status bar: count, sum, average for the active selection
  • Right-click context menu: copy, paste, insert/delete row+col without leaving the grid
  • Help overlay (?): full keyboard reference and function list
  • Unsaved changes dot in the toolbar, browser warning on close

Usage

  1. Download localsheets.html
  2. Open it in Chrome, Edge, Brave, or Safari (see Browser support below; Firefox is not officially supported in v1.1)
  3. Start typing. That's it

No install. No npm. No build step. No telemetry.


Keyboard shortcuts

Key Action
Click Select cell
Click+drag / Shift+click Select range
Click row number / column letter / top-left corner Select whole row / column / sheet
Click/drag in grid while editing =… Insert cell or range reference into the formula
Type Start editing (overwrites)
F2 / Enter Edit current cell (keeps value)
Escape Cancel edit / close panel
Enter / Tab Commit + move down / right
Shift+Tab / Shift+Enter Commit + move left / up
Arrow keys Navigate
Shift+Arrows Extend selection
Page Up / Page Down Page through rows
Home / End Start / end of row
Delete / Backspace Clear cell(s)
Ctrl+S / Ctrl+Shift+S Save / Save As
Ctrl+N / Ctrl+O New / Open
Ctrl+Z Undo
Ctrl+Y / Ctrl+Shift+Z Redo
Ctrl+Home / Ctrl+End Jump to A1 / last cell with data
Ctrl+G Focus the address box (then type any cell like ZZ500 and Enter)
Ctrl+L / Ctrl+T Create list / table from selection (or auto-detect contiguous range)
Alt+Enter (in cell editor) Insert newline + auto-enable wrap text
Ctrl+= / Ctrl+- / Ctrl+0 Zoom in / out / reset
Enter (in Find box) Find next match
Enter (in Replace box) Replace current and find next
Ctrl+C / Ctrl+V Copy / Paste (cell or range, as TSV)
Ctrl+B / Ctrl+I / Ctrl+U Bold / Italic / Underline
Ctrl+F Find / Replace
Ctrl+PgDn / Ctrl+PgUp Next / previous sheet
Right-click Context menu
Double-click title Rename workbook
Double-click tab Rename sheet
? Help overlay

Formula reference

Start a formula with =. Function names are case-insensitive. Cross-sheet refs use SheetName!A1 or 'Sheet Name'!A1.

Math / Stats: SUM, AVERAGE, COUNT, COUNTA, COUNTBLANK, MIN, MAX, MEDIAN, STDEV, VAR, PRODUCT, ROUND, ROUNDUP, ROUNDDOWN, FLOOR, CEILING, INT, MOD, ABS, SQRT, POWER, EXP, LN, LOG, LOG10, PI, RAND, RANDBETWEEN, SIGN

Logical: IF, IFS, SWITCH, IFERROR, IFNA, AND, OR, NOT, XOR

Text: CONCAT, CONCATENATE, TEXTJOIN, LEN, UPPER, LOWER, PROPER, TRIM, LEFT, RIGHT, MID, FIND, SEARCH, SUBSTITUTE, REPLACE, REPT, VALUE, TEXT, EXACT

Lookup: VLOOKUP, HLOOKUP, INDEX, MATCH, XLOOKUP, ROW, COLUMN, ROWS, COLUMNS

Conditional aggregates: SUMIF, COUNTIF, AVERAGEIF, SUMIFS, COUNTIFS, AVERAGEIFS

Dates: TODAY, NOW, DATE, YEAR, MONTH, DAY, WEEKDAY, EOMONTH, EDATE, DATEDIF, DAYS, NETWORKDAYS

Financial: PMT, FV, PV, NPV, IRR

Info: ISNUMBER, ISTEXT, ISBLANK, ISERROR, ISERR, ISNA, ISLOGICAL, N

Inline charts: SPARKLINE: =SPARKLINE(A1:A10) returns an inline SVG line chart in the cell. Optional 2nd arg "bar" for a bar variant; optional 3rd arg is a hex color like "#ef4444".

Cell references: plain A1 (relative), $A$1 (both absolute), $A1 / A$1 (mixed). The fill handle preserves absolute parts when dragging.


File format

Files are saved as .localsheet.json: plain JSON, fully portable, git-diffable. Multi-sheet schema (v2.0):

{
  "version": "2.0",
  "tool": "localsheets",
  "meta": { "title": "My Budget" },
  "sheets": {
    "sAbc12345": {
      "name": "Sheet1",
      "cells": {
        "A1": { "raw": "Salary", "value": "Salary", "type": "text", "format": { "bold": true } },
        "B1": { "raw": "5000",   "value": 5000,     "type": "number", "format": { "numfmt": "currency" } },
        "B2": { "raw": "=B1*12", "formula": "=B1*12" }
      },
      "colWidths": {}
    }
  },
  "sheetOrder": ["sAbc12345"],
  "activeSheet": "sAbc12345"
}
  • Sparse: only populated cells are stored
  • Formulas re-evaluate on load: saved files never trust the cached value for formula cells
  • v1.0 files (single-sheet cells map) auto-migrate to v2.0 on open

Templates

Seven ready-to-use templates ship in templates/. Open any via the toolbar Open button. See templates/README.md for the full breakdown.

Personal finance

File What it shows
monthly-budget.localsheet.json Income vs. expense tracker with totals and net savings.
rsu-tracker.localsheet.json Two sheets: an Inputs sheet (stock price, tax rate) feeds a Vesting schedule via cross-sheet formulas. Change the stock price on one sheet, every vest event recomputes.
startup-burn.localsheet.json Monthly burn rollup, runway in months/years, projected out-of-cash date, and a "cut 20%" sensitivity row.
rental-cashflow.localsheet.json Property-by-property net monthly / annual cash flow + cap rate, with portfolio totals.
kids-allowance.localsheet.json Earned / spent log with a running balance formula.
mortgage-calculator.localsheet.json Loan amount, monthly P+I via PMT(), total interest, and a 28%-rule affordability calc.

Edge / Robotics

File What it shows
robot-arm-pid-calibration.localsheet.json 6-DOF robotic arm PID calibration. Per-joint Kp/Ki/Kd/inertia on the Joints sheet; Computed sheet derives natural frequency, damping ratio, 2% settling time, and damping class. Same multi-sheet pattern as the RSU tracker, applied to motion control.

All templates use the v2.0 multi-sheet schema with live formulas that recompute when you edit the inputs.


Local AI (optional)

Click AI in the toolbar to open a panel that talks to a local Ollama instance. No data ever leaves your machine. The panel auto-detects the model list and offers two modes:

  • Text reply: freeform response, optionally including the selection as TSV context. Insert into the active cell or paste as TSV below the selection.
  • JSON patch: the model returns a structured object like {"A1": "=SUM(B1:B10)", "B12": 42}. The panel validates every cell key, shows a preview, applies as a single undoable bulk action.

Use cases that work well: "categorize these expenses into Needs/Wants/Savings", "explain this formula", "draft a budget for a $90k salary", "what's the next likely value in this series?".

Hardware

Tested on a 7-year-old laptop with no usable GPU. Slow but correct. On modern hardware where a 7B model fits in VRAM, it's snappier. We chose to verify the floor, not the ceiling. If it works here, it works on whatever you have.

Setup

This is a one-time setup. Because LocalSheets runs from file://, Ollama has to be told to accept browser connections. The full per-OS guide is in OLLAMA_SETUP.md, but the short version:

OS Command (one terminal session)
macOS launchctl setenv OLLAMA_ORIGINS "*" then relaunch Ollama from the menu bar
Linux OLLAMA_ORIGINS="*" ollama serve (or persistent: sudo systemctl edit ollama.service)
Windows Quit Ollama from system tray → set OLLAMA_ORIGINS=* in user env vars → relaunch

If the AI panel says "Cannot reach Ollama", see OLLAMA_SETUP.md, which covers troubleshooting and recommended models. There's also a standalone verifier, node e2e/verify-ai-live.js, that runs the same HTTP calls the browser makes (reachability, CORS for Origin: null, text-mode, JSON-patch-mode) and exits 0 on success.


Repository layout

localsheets/
├── .gitignore
├── localsheets.html          ← the app (single-file, ~260 KB, what you ship)
├── README.md
├── LICENSE                   ← MIT
├── CHANGELOG.md
├── templates/                ← 7 ready-to-use sample workbooks (see templates/README.md)
│   ├── README.md
│   ├── monthly-budget.localsheet.json
│   ├── rsu-tracker.localsheet.json
│   ├── startup-burn.localsheet.json
│   ├── rental-cashflow.localsheet.json
│   ├── kids-allowance.localsheet.json
│   ├── mortgage-calculator.localsheet.json
│   └── robot-arm-pid-calibration.localsheet.json
├── src/                      ← un-bundled engine + tests (for review / CI)
│   ├── engine.js             (~1,800 lines: tokenizer + parser + evaluator + 99 fns + SPARKLINE + absolute refs + formula-shift helpers)
│   ├── app-layer.js          (~790 lines: DepGraph + Store including structural ops)
│   ├── test-engine.js        (143 tests)
│   └── test-store.js         (56 tests)
└── e2e/                      ← browser end-to-end tests (dev tooling, NOT shipped)
    ├── README.md
    ├── package.json          (one devDep: @playwright/test)
    ├── playwright.config.js  (Chromium + Firefox + WebKit)
    ├── verify-ai-live.js     (standalone Node script: exercises the real Ollama round-trip end-to-end)
    └── tests/                (render, editing, structural, formulas, persistence, panels)
  • Engine has no DOM dependencies: pure compute, fully unit-tested (143/143 pass)
  • Store has no DOM dependencies: wraps the engine with state, undo, serialization, and structural ops (56/56 pass)
  • UI wires the HTML shell to the Store
  • Zero runtime dependencies in the shipped artifact: no React, no jQuery, no charting lib, no npm. The e2e/ test harness uses Playwright but is isolated dev tooling; it never ships to users.
  • Run engine + store tests with node src/test-engine.js && node src/test-store.js
  • Run browser e2e tests with cd e2e && npm install && npx playwright test

Limits (by design)

Limit Value
Sheets per workbook 100
Rows per sheet 10,000
Columns per sheet 702 (A through ZZ)
Undo history 100 actions
File size target < 300 KB (currently ~260 KB)

What LocalSheets will NOT do

Real-time collaboration. Cloud sync. Pivot tables. Macros / VBA. Image embedding. Sheet protection. Excel format parity (.xlsx import is planned). Multi-user editing. Mobile UI (desktop only by design).

Browser support

Browser Status Notes
Chrome / Edge / Brave (Chromium) Primary target Full feature set. File System Access API enables in-place save (Ctrl+S writes back to the same file, no download dance). E2E test suite green on Chromium.
Safari (WebKit) ✓ Supported All formulas, editing, charts, AI panel work. Save falls back to a download (Safari doesn't expose FSAPI). E2E test suite green on WebKit.
Firefox Not officially supported in v1.1 Engine math + UI should work, but Firefox lacks FSAPI (so every save is a download), and we don't yet run cross-engine regression tests against it. Use Chrome/Edge for the intended UX.

The "no Firefox" call is pragmatic, not philosophical. Chrome + Edge cover the audiences that care about a local-first spreadsheet, and the in-place-save UX is a core part of the product that Firefox can't deliver. If there's user demand we'll add it back; PRs welcome.

Known limitations

Honest list of things that are missing or partial, not just unsupported. The first user to hit one shouldn't be surprised.

  • Drag-and-drop column or row reordering is not supported. Use Insert + cut/paste, or sort.
  • While editing a formula, you can't click a tab on another sheet to pick a reference from there. Type Sheet2!A1 manually, or finish the formula on the current sheet first.
  • Sort doesn't update formula references inside the sorted range: if your sort range contains cells that reference each other, those refs will point at the original positions after sort. Put formulas outside the sort range.
  • Sort / Fill ignore filter state: they operate on the full populated range, not just visible rows.
  • Named ranges use string substitution, so a name that looks like a cell ref (e.g. Q1) will collide. The Names dialog warns about this.
  • Conditional formatting is single-rule-per-cell: the first matching rule wins, no rule priority UI yet.
  • Fill handle pattern detection covers arithmetic series (1, 2, 3 → 4, 5, 6) and repeats only, no month/weekday/date increment yet.
  • Tables: the filter chip on a table header opens the existing column filter, which applies to the whole sheet, not just the table's row range.
  • Cell merging is supported, but selection navigation into a merged block lands on the owner cell; arrow keys from inside the merge feel slightly different from Excel.
  • Freeze at selection uses the focus cell, so freezing while at A1 is a no-op; select a different cell first.
  • Chrome may prompt for clipboard permission on every paste: that's a Chrome security policy, not something this app can override. Edge tends to remember.
  • Function names must be exact: =conc(...) returns #NAME?. The right name is CONCAT. No fuzzy match.
  • No print view or PDF export. Use the browser's built-in print.
  • File System Access API (in-place save) only works in Chromium-based browsers. Safari falls back to a download on every save. (Firefox: see Browser support above; not officially supported in v1.1.)
  • Mobile shows a warning splash; touch isn't supported by design.

Roadmap

Version Status Focus
v0.1 shipped Single-sheet grid, save/load, CSV, formatting
v1.0 shipped Multi-sheet, formula engine (80 fns), undo, find/replace, range select, TSV paste, column resize
v1.1 shipped =SPARKLINE(), basic charts (bar/line/pie SVG), Ollama AI panel (text + JSON-patch modes), absolute references ($A$1), insert/delete row+col rewrites formula text (incl. cross-sheet refs), fill-handle propagates formulas, 10k row cap, right-click bug fix, 199 unit + 28 e2e tests (Chromium + WebKit)
v1.2 planned XLSX import (SheetJS CE, Apache 2.0, lazy-loaded), Firefox cross-engine support, domain template packs (RF link budget, PID, thermal, BMS)
v2.0 future Pivot tables, array formulas / SPILL, real-time collab via Yjs (opt-in)

License

MIT. Yours forever.