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.
Technical reference for writing open-sheet workbooks as React files that export live .xlsx models, built around a rule against hand-written cell addresses.
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install lianghsun/open-sheet sheet-authoring --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "sheet-authoring" agent skill from https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoring into .claude/skills/sheet-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sheet-authoring", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoringType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install lianghsun/open-sheet sheet-authoring --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lianghsun/open-sheet.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/core/skills/sheet-authoring .agents/skills/sheet-authoring && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sheet-authoring" agent skill from https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoring into .agents/skills/sheet-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sheet-authoring", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install lianghsun/open-sheet sheet-authoring --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lianghsun/open-sheet.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/core/skills/sheet-authoring .cursor/skills/sheet-authoring && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sheet-authoring" agent skill from https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoring into .cursor/skills/sheet-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sheet-authoring", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/lianghsun/open-sheet.git --path packages/core/skills/sheet-authoring--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install lianghsun/open-sheet sheet-authoring --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lianghsun/open-sheet.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/core/skills/sheet-authoring .gemini/skills/sheet-authoring && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sheet-authoring" agent skill from https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoring into .gemini/skills/sheet-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sheet-authoring", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install lianghsun/open-sheet sheet-authoringInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/lianghsun/open-sheet.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/core/skills/sheet-authoring .github/skills/sheet-authoring && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sheet-authoring" agent skill from https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoring into .github/skills/sheet-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sheet-authoring", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lianghsun/open-sheet --skill sheet-authoring -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install lianghsun/open-sheet sheet-authoring --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lianghsun/open-sheet.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/core/skills/sheet-authoring .opencode/skills/sheet-authoring && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sheet-authoring" agent skill from https://github.com/lianghsun/open-sheet/tree/main/packages/core/skills/sheet-authoring into .opencode/skills/sheet-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sheet-authoring", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
sheet-authoringTechnical 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. 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.
Read from SKILL.md and the folder at commit 6ab72dd. It shows what the files ask for, not the result of running them.
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.
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.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from lianghsun/open-sheet at commit 6ab72dd, republished under its MIT licence (© lianghsun). 879 words, ~2,061 tokens.
.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.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.
// 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.
JSX describes the report. Rows are plain arrays.
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.
| Component | What 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:
name, data, columns, optional title, showHeader,
totalkind="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.
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.
<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.
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:
| Shape | Example |
|---|---|
Ordering decided in data | a sorted array: right this month, silently stale next month |
| Periods of different length | two days of data beside thirty → a growth rate of +790% |
| Sources with different coverage | 30 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?
When two figures come from different sources, divide each by its own coverage first. The spans cancel, and what is left is comparable:
// 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.
col that computes uses formula, not a pre-computed value in datadata 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.isLast0.0829 reads as noise#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
SKILL.md and 6 other files (references) in packages/core/skills/sheet-authoring of lianghsun/open-sheet.
Open the folder on GitHubat commit 6ab72dd
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| open-sheet Workbook Authoring this skilllianghsun/open-sheet | 127 | — | ~2.1k | Automated safety check: Pass | MIT | |
| PipesHub Excel Spreadsheet Builderpipeshub-ai/pipeshub-ai | 3.8k | — | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| Fork And GoSimplePDF/simplepdf-embed | 407 | — | ~7.9k | Automated safety check: Notes | MIT | |
| Analytics Dashboardcharlie947/social-media-skills | 3.8k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Add Excelmicrosoft/power-platform-skills | 979 | — | ~796 | Automated safety check: Notes | MIT | |
| Web Artifacts Builderanthropics/skills | 180k | 41 repos | ~769 | Automated safety check: Pass | Apache-2.0 |
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.
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.
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.
microsoft/power-platform-skills
Adds Excel Online (Business) connector to a Power Apps code app.
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
langgenius/dify
Use when implementing or refactoring React/TypeScript components and the task requires decisions about component ownership, feature boundaries, state, data…
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.
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.
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?"…
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.
Works with
Categories
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.