Native Shell
Native Shell은 모든 플랫폼의 앱 안에서 만들어지는 AI UI입니다
Apple Pages·Numbers·Keynote 문서를 순수 TypeScript로 읽고 검사·편집, 의존성 없이 바이트 정확도 유지
Read, inspect and edit Apple Pages, Numbers and Keynote documents in pure TypeScript — zero dependencies, byte-fidelity round trips, measured not guessed.
개발 도구TypeScript · JavaScriptGitHub @den-frie-vilje온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Read and write Apple Pages, Numbers and Keynote documents in pure TypeScript. Zero runtime dependencies, byte-identical round trips, no Mac required.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Open, edit, and save Apple Pages, Numbers, and Keynote documents—anywhere JavaScript runs. Pure TypeScript, zero runtime dependencies, no Mac required. You work with paragraphs, cells, and slides; the bytes take care of themselves.
Docs: https://den-frie-vilje.github.io/cupertino-files/
npm install cupertino-files
import { readFileSync, writeFileSync } from "node:fs";
import { PagesDocument, NumbersDocument } from "cupertino-files";
const doc = PagesDocument.load(new Uint8Array(readFileSync("report.pages")));
doc.replaceText("2024", "2025");
doc.appendParagraph("Conclusion", "Heading 1");
writeFileSync("report-2025.pages", doc.save());
const sheet = NumbersDocument.load(new Uint8Array(readFileSync("budget.numbers")));
const table = sheet.tables()[0]!;
table.setCell(1, 1, 143_800);
table.setFormula(1, 2, "=B2*1.25", { value: 179_750 });
writeFileSync("budget.numbers", sheet.save());
Everything you don't touch is preserved byte-for-byte (how). Works in Node 22 or later and modern browsers, ESM-only. Bytes in, bytes out.
The format is undocumented; this library is an ongoing
reverse-engineering of it, measured from real documents.
docs/COVERAGE.md is the always-current answer to
"does it do X?". The short version:
=SUM(A1:A5), =Other::B2); 363 functionsNumbersDocument.blank() and friends: a fresh A4 document or 16:9 deck, no template file neededdoc.audit() names the faults a person otherwise finds by opening the document, and save() refuses an archive missing a required fieldDeeper detail, per capability and with the evidence: the capability matrix · what each open question waits on · the format itself.
npx -y cupertino-files dump info file.pages inspects; export file.key prints Markdown (--format csv a table); import notes.md deck.key builds a document; call runs any editing tool from the shellnpx -y cupertino-files mcp: an MCP server whose tools create, edit, format, and export documents, plus a Claude Code skill in the packageMore in For AI agents and the API reference.
npm install && npm test # unit + fixture suite; never launches an app
npm run test:e2e # macOS only: drives the real apps
Contributions are warmly welcome—CONTRIBUTING.md shows the way, and docs/BLOCKERS.md lists questions where a few minutes with a Mac genuinely helps. Test fixtures are real Apple-written documents from open-source test suites and public repositories (attribution).
Built on the shoulders of iWorkFileFormat, keynote-parser, numbers-parser and WorkKit.
An independent project, not affiliated with or endorsed by Apple Inc. Apple, iWork, Pages, Numbers, and Keynote are trademarks of Apple Inc., used only to name the formats this library interoperates with. It contains no Apple code and declines encrypted documents by design; details in docs/LEGAL.md.
MIT © Ole Kristensen