Agent skill

open-sheet Workbook Authoring

by lianghsun in lianghsun/open-sheet

Technical reference for writing open-sheet workbooks as React files that export live .xlsx models, built around a rule against hand-written cell addresses.

MITAuto-check passedDocuments & Office

Install open-sheet Workbook Authoring

skills CLI
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install lianghsun/open-sheet sheet-authoring --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/lianghsun/open-sheet.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/core/skills/sheet-authoring .claude/skills/sheet-authoring && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
sheet-authoring
GitHub stars
127
Token cost
~2.1k tokens
SKILL.md length
879 words
Files
7 (incl. references)
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

Technical reference for writing open-sheet workbooks as React files that export live .xlsx models, built around a rule against hand-written cell addresses.

  • Writing or editing a workbook file under the sheets folder
  • SKILL.md covers The one rule, The file contract, Structure in JSX, data in… and The component surface, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Defining assumptions as named values so formulas stay readable

What it does

The core rule is never to write a cell address such as B5 or SUM(B2:B13). The framework assigns every coordinate after it lays out the blocks, and references resolve against that layout, so a hand-written address silently goes wrong as soon as a row is added. The single exception is raw(), a deliberate escape hatch.

A workbook is an index.tsx file inside a sheets folder whose default export is a Workbook containing Sheet children, and its meta and design must be plain object literals so the dev UI can parse and rewrite them. Structure lives in JSX and data in TypeScript arrays passed to a table. The components include Stack and Row for layout, Table in grid or key-value form, where each key becomes an Excel defined name, plus KpiBand, Cell, Note and Spacer. References cover charts, formats, formulas, placement, printing and recipients.

When your agent uses it

  • Writing or editing a workbook file under the sheets folder
  • Defining assumptions as named values so formulas stay readable
  • Laying out tables, KPI bands and notes without cell addresses
  • Setting number formats and formulas in an open-sheet model

Example prompts

  • “Add a KPI band and a quarterly revenue table to the budget workbook in sheets/budget/index.tsx.”
  • “Rewrite this formula so it uses a reference instead of a hand-written cell address.”
  • “Put the growth rate in a key-value table so formulas can refer to it by name.”

Requirements

  • The open-sheet framework (@open-sheet/core) with a TypeScript and React setup

What it can do on your machine

Read from SKILL.md and the folder at commit 6ab72dd. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

open-sheet Workbook Authoring loads about 2.1k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 92 tokens; SKILL.md has 879 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~92
When it runs · the whole SKILL.md, loaded when a task matches
~2.1k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~11k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from lianghsun/open-sheet at commit 6ab72dd, republished under its MIT licence (© lianghsun). 879 words, ~2,061 tokens.

Download SKILL.mdSave it as .claude/skills/sheet-authoring/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
name
sheet-authoring
description
Technical reference for writing open-sheet workbooks — the file contract, the component surface, references and formulas, number formats, and the rules that keep a workbook a live model. Use this whenever writing or editing a file under `sheets/<id>/index.tsx`. The workflow for drafting a new workbook from scratch lives in the `create-sheet` skill.

Authoring an open-sheet workbook

The one rule

Never write a cell address.

Not B5. Not SUM(B2:B13). Not $A$1. The framework assigns every coordinate after it has laid the blocks out, and references resolve against that layout. Writing an address by hand means writing a number that is correct only until someone adds a row — and then it is silently wrong, which in a financial model is worse than broken.

If you catch yourself counting rows to work out where something landed, stop. The thing you want is a reference.

The single exception is raw('...'), the deliberate escape hatch — see references/formulas.md.

The file contract

tsx
// sheets/<id>/index.tsx
import { Sheet, Table, Workbook, col, sub, type SheetMeta } from '@open-sheet/core'

export const meta: SheetMeta = {
  title: 'FY26 Budget',        // shown in the viewer and used as the export name
  description: 'One line.',    // optional
  theme: 'corporate-neutral',  // optional; links back to themes/<id>.md
  createdAt: '2026-08-18T00:00:00.000Z',
}

export const design: DesignSystem = { … }   // optional; see the Design panel note

export default (
  <Workbook>
    <Sheet name="…">…</Sheet>
  </Workbook>
)

The default export must be a <Workbook> containing <Sheet> children. meta and design are plain object literals — the dev UI parses and rewrites them, and a spread or an imported value makes the workbook untweakable.

Structure in JSX, data in TypeScript

JSX describes the report. Rows are plain arrays.

tsx
const quarters = [
  { quarter: 'Q1', revenue: 12_400_000, cogs: 5_100_000 },
  { quarter: 'Q2', revenue: 13_900_000, cogs: 5_600_000 },
]

<Table
  name="pl"
  data={quarters}
  columns={[
    col('quarter', { header: 'Quarter', width: 12 }),
    col('revenue', { header: 'Revenue', format: 'currency' }),
    col('grossProfit', {
      header: 'Gross profit',
      format: 'currency',
      formula: (r) => sub(r.cell('revenue'), r.cell('cogs')),
    }),
  ]}
  total={{ revenue: 'sum', grossProfit: 'sum' }}
/>

Do not write a thousand rows of JSX. If the data is generated, generate the array and hand it to data.

The component surface

ComponentWhat it is
<Workbook>The root. Children must be <Sheet>.
<Sheet name freeze origin>One tab. freeze="B2" freezes the rows above and columns left of that cell.
<Stack gap>Stacks blocks downward. gap is in rows (default 1).
<Row gap>Places blocks side by side. gap is in columns.
<Table>A named data block. See below.
<KpiBand items>A label row above a value row — a headline strip.
<Cell value formula format style span>One cell.
<Note cols>A line of prose spanning cols columns.
<Spacer rows cols>Deliberate empty space.

<Table> has two shapes:

  • grid (default) — name, data, columns, optional title, showHeader, total
  • key-value — kind="keyValue" with data={[{ key, label, value, format }]}. Every key becomes an Excel defined name, so formulas referencing it read =B5*growth in the exported file. This is how assumptions should be written.

name is workbook-global, because ref() looks blocks up by name. A duplicate throws at compile time.

total applies to grid tables only — a key-value block is a list of named scalars, not a column to aggregate. To total a key-value block, reference the entries you want and add them.

Separate assumptions from calculations

Put every number a reader might want to change on its own sheet, in a kind="keyValue" table, and reference it. That is what makes the export a model rather than a picture of one.

tsx
<Sheet name="Assumptions">
  <Table name="assumptions" kind="keyValue" data={[
    { key: 'growth',  label: 'QoQ growth', value: 0.08, format: 'percent' },
    { key: 'taxRate', label: 'Tax rate',   value: 0.2,  format: 'percent' },
  ]} />
</Sheet>

A number hard-coded inside a formula is a number the recipient cannot change.

Further reference

Show full SKILL.md (415 more words)Show less

What the framework cannot check for you

The framework guarantees referential integrity: addresses are right, formulas point where you meant, nothing breaks when a row is inserted. It cannot guarantee that the things being compared are comparable.

Every failure of this kind looks identical to a correct result. There is no error, no #NOT_EVALUATED, no trace in any cell — just a number that is arithmetically right and analytically wrong. Three shapes seen in real workbooks:

ShapeExample
Ordering decided in dataa sorted array: right this month, silently stale next month
Periods of different lengthtwo days of data beside thirty → a growth rate of +790%
Sources with different coverage30 days of cost ÷ 20 days of requests → wrong by 50%

So whenever two numbers go into one expression — a division, a difference, a ranking — ask once: do they cover the same ground?

Normalise before you combine

When two figures come from different sources, divide each by its own coverage first. The spans cancel, and what is left is comparable:

tsx
// Wrong: two totals carrying different numbers of days
col('costPerRequest', { formula: (r) => div(r.cell('cost'), r.cell('requests')) })

// Right: each normalised first
col('dailyCost',      { formula: (r) => div(r.cell('cost'), r.cell('costDays')) })
col('dailyRequests',  { formula: (r) => div(r.cell('requests'), r.cell('requestDays')) })
col('costPerRequest', { formula: (r) => div(r.cell('dailyCost'), r.cell('dailyRequests')) })

Two extra columns, and both earn their place as diagnostics: a daily cost of 810, 1,225, 1,068 across three months shows which one is off. Collapsed into a single costPerRequest, it does not.

Make the coverage gap itself a column when the sources may disagree — a visible number with a threshold flag beats a footnote nobody reads.

Self-review before finishing

  • No A1 address anywhere in the file
  • Every number a reader might change lives in an assumptions block, not inside a formula
  • Every col that computes uses formula, not a pre-computed value in data
  • Nothing that depends on the values is decided in the data array — no sorting, filtering, grouping, or top-N. Those must be formulas. Easier to miss than a pre-computed value, because a sorted array leaves no trace in any cell: the workbook is right this month and quietly wrong next month, while still looking like a sorted table.
  • r.prev() / r.next() are guarded with r.isFirst / r.isLast
  • Formats are set on the columns that need them — a bare 0.0829 reads as noise
  • Nothing was invented: every figure came from the user or a named source
  • Everything compared covers the same ground — see "What the framework cannot check for you". Provenance is not comparability, and this class of error leaves no trace in any cell. Prefer not generating a comparison over generating one with a caveat: a caveat gets skipped, a column that does not exist cannot be misread.
  • The viewer shows no unexpected #NOT_EVALUATED

© lianghsun, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (references) in packages/core/skills/sheet-authoring of lianghsun/open-sheet.

  • SKILL.md
  • references/charts.md
  • references/formats.md
  • references/formulas.md
  • references/placement.md
  • references/printing.md
  • references/recipients.md

Open the folder on GitHubat commit 6ab72dd

Compare with similar skills

open-sheet Workbook Authoring next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

open-sheet Workbook Authoring compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
open-sheet Workbook Authoring this skilllianghsun/open-sheet127—~2.1kAutomated safety check: PassMIT
PipesHub Excel Spreadsheet Builderpipeshub-ai/pipeshub-ai3.8k—~1.8kAutomated safety check: PassApache-2.0
Fork And GoSimplePDF/simplepdf-embed407—~7.9kAutomated safety check: NotesMIT
Analytics Dashboardcharlie947/social-media-skills3.8k—~1.8kAutomated safety check: PassMIT
Add Excelmicrosoft/power-platform-skills979—~796Automated safety check: NotesMIT
Web Artifacts Builderanthropics/skills180k41 repos~769Automated safety check: PassApache-2.0

Similar skills

  • PipesHub Excel Spreadsheet Builder

    pipeshub-ai/pipeshub-ai

    Creates and edits .xlsx workbooks with real Excel formulas rather than hardcoded computed values, defaulting to exceljs in TypeScript with a static formula-safety check.

    3.8k GitHub stars~1.8k tokensUpdated yesterday
    Documents & OfficeAuto-check passed
  • Fork And Go

    SimplePDF/simplepdf-embed

    Guided walkthrough for forking and deploying your own SimplePDF Copilot: hosting choice, Pro-account confirmation, AI-provider wiring, demo customization, deploy, and the SimplePDF whitelist step.

    407 GitHub stars~7.9k tokensUpdated 9 days ago
    Frontend & DesignAuto-check: notes
  • Analytics Dashboard

    charlie947/social-media-skills

    Turn a LinkedIn Analytics export into an interactive dark-themed React dashboard plus a written strategic analysis with 5 data-backed content recommendations.

    3.8k GitHub stars~1.8k tokensUpdated 24 days ago
    Documents & OfficeAuto-check passed
  • Add Excel

    microsoft/power-platform-skills

    Official

    Adds Excel Online (Business) connector to a Power Apps code app.

    979 GitHub stars~796 tokensUpdated today
    Documents & OfficeAuto-check: notes
  • Web Artifacts Builder

    anthropics/skills

    Official

    Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.

    180k GitHub starsUsed in 41 repos~769 tokens
    Frontend & DesignAuto-check passed
  • Use when implementing or refactoring React/TypeScript components and the task requires decisions about component ownership, feature boundaries, state, data…

    158k GitHub stars~626 tokensUpdated today
    Frontend & DesignAuto-check passed

More from lianghsun/open-sheet

  • Apply Sheet Viewer Comments

    lianghsun/open-sheet

    Finds every @sheet-comment marker left through the open-sheet viewer in a workbook's source, makes the edit each one asks for, and removes the marker.

    127 GitHub stars~377 tokensUpdated 1 mo ago
    Auto-check passed
  • Open-Sheet Theme Creator

    lianghsun/open-sheet

    Writes a reusable house style for open-sheet workbooks as a themes Markdown file, with an optional demo workbook, so every spreadsheet follows the same brand look.

    127 GitHub stars~452 tokensUpdated 1 mo ago
    Auto-check passed
  • Current Sheet

    lianghsun/open-sheet

    A skill your agent uses to find out which workbook, sheet, and cell the user is currently looking at in the open-sheet viewer, so an instruction like "make this bold" or "why is this wrong?"…

    127 GitHub stars~437 tokensUpdated 1 mo ago
    Auto-check passed
  • Open-Sheet Workbook Creator

    lianghsun/open-sheet

    Walks an agent through building a new spreadsheet workbook in an open-sheet project, from choosing a theme to settling the real numbers and workbook type.

    127 GitHub stars~1.4k tokensUpdated 1 mo ago
    Auto-check passed

Questions about open-sheet Workbook Authoring

What does open-sheet Workbook Authoring do?

Technical reference for writing open-sheet workbooks as React files that export live .xlsx models, built around a rule against hand-written cell addresses. The core rule is never to write a cell address such as B5 or SUM(B2:B13). The framework assigns every coordinate after it lays out the blocks, and references resolve against that layout, so a hand-written address silently goes wrong as soon as a row is added.

When should I use open-sheet Workbook Authoring?

open-sheet Workbook Authoring fits situations like: writing or editing a workbook file under the sheets folder; defining assumptions as named values so formulas stay readable; laying out tables, KPI bands and notes without cell addresses; setting number formats and formulas in an open-sheet model.

How do I install open-sheet Workbook Authoring in Claude Code?

Run `npx skills add lianghsun/open-sheet --skill sheet-authoring -a claude-code`. Or copy the skill folder (packages/core/skills/sheet-authoring in lianghsun/open-sheet) into .claude/skills/sheet-authoring in your project. Claude Code loads it when a task matches its description.

How do I install open-sheet Workbook Authoring in Codex?

Run `npx skills add lianghsun/open-sheet --skill sheet-authoring -a codex`. Or copy the skill folder (packages/core/skills/sheet-authoring in lianghsun/open-sheet) into .agents/skills/sheet-authoring in your project. Codex loads it when a task matches its description.

Can I use open-sheet Workbook Authoring in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add lianghsun/open-sheet --skill sheet-authoring -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sheet-authoring, .gemini/skills/sheet-authoring, .github/skills/sheet-authoring and .opencode/skills/sheet-authoring in your project.

What does open-sheet Workbook Authoring need to run?

SKILL.md names no scripts, command-line tools or credentials: open-sheet Workbook Authoring is instructions for the agent only. Our summary lists: The open-sheet framework (@open-sheet/core) with a TypeScript and React setup.

Does open-sheet Workbook Authoring access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is open-sheet Workbook Authoring safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does open-sheet Workbook Authoring use?

open-sheet Workbook Authoring is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does open-sheet Workbook Authoring use?

About 2.1k tokens (SKILL.md is roughly 8.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 9.4k tokens, read only when the agent opens those files.

What are the alternatives to open-sheet Workbook Authoring?

Skills that share tags, products or a category with open-sheet Workbook Authoring: PipesHub Excel Spreadsheet Builder (pipeshub-ai/pipeshub-ai, 3.8k stars), Fork And Go (SimplePDF/simplepdf-embed, 407 stars), Analytics Dashboard (charlie947/social-media-skills, 3.8k stars) and Add Excel (microsoft/power-platform-skills, 979 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains open-sheet Workbook Authoring?

lianghsun (a GitHub user) maintains it in lianghsun/open-sheet, which has 127 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on August 26, 2026.

Source: lianghsun/open-sheet on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.