{"_id":"cupertino-files","_rev":"4-d6a900beea705566cf8bc951921e78b4","name":"cupertino-files","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"cupertino-files","version":"0.1.0","keywords":["iwork","pages","numbers","keynote","apple","iwa","snappy","protobuf","document","parser","key","creator-studio","cupertino"],"author":{"name":"Ole Kristensen","email":"ole@kristensen.name"},"license":"MIT","_id":"cupertino-files@0.1.0","maintainers":[{"name":"olekristensen","email":"ole@kristensen.name"}],"homepage":"https://den-frie-vilje.github.io/cupertino-files/","bugs":{"url":"https://github.com/den-frie-vilje/cupertino-files/issues"},"bin":{"cupertino-dump":"dist/cli.js","cupertino-files":"dist/main.js"},"dist":{"shasum":"eadc65637b40e76159e50b78f976711f1f46742d","tarball":"https://registry.npmjs.org/cupertino-files/-/cupertino-files-0.1.0.tgz","fileCount":261,"integrity":"sha512-GwGnoJFdvbnnlfC76vFJFdmg9Bb8lSF1LwOB7AuJd5zYNCaM9tqs066qd8mBzIj/YwCBg8hhmFlnEYz/h2imdQ==","signatures":[{"sig":"MEQCIFu2TZPuiQg+3Vtx46tGEcmtBSurov+AKBjv6uq2b8P6AiA/6KC9mqJuKM8wlgYZM5+FsV47EjOLbOoLkxTkVKFrdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3720322},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4c6196b7ee2b113b4f988a9c5c6507d1f064bd7e","scripts":{"lint":"eslint src test scripts","test":"node --test test/*.test.ts","build":"tsc -p tsconfig.build.json","probe":"node scripts/probe-unknowns.ts","blanks":"node scripts/make-blanks.ts","prebnc":"node scripts/analyse-prebnc.ts","stress":"node scripts/stress-readers.ts","harvest":"node scripts/harvest-functions.ts","prepare":"npm run build","api:docs":"typedoc --plugin typedoc-plugin-markdown --plugin typedoc-vitepress-theme --out docs/api","coverage":"node scripts/coverage-matrix.ts","docs:dev":"vitepress dev docs","test:all":"npm run test && npm run test:e2e","test:e2e":"node --test --test-concurrency=1 test/e2e/*.e2e.test.ts","tooldocs":"node scripts/generate-tool-docs.ts","typecheck":"tsc -p tsconfig.json --noEmit","docs:build":"npm run api:docs && vitepress build docs","pages:docs":"node scripts/make-pages-docs.ts","verify:doc":"node scripts/make-verification-doc.ts","bisect:docs":"node scripts/make-bisect-docs.ts","conformance":"node scripts/make-conformance.ts","proto:check":"node scripts/check-proto-drift.ts --check","proto:embed":"node scripts/embed-proto-schema.ts","shape:audit":"node scripts/audit-authored-shape.ts","shape:check":"node scripts/audit-authored-shape.ts --check","blanks:check":"node scripts/make-blanks.ts --check","docs:preview":"vitepress preview docs","keynote:docs":"node scripts/make-keynote-docs.ts","bundle:format":"node scripts/make-release-bundle.ts","harvest:check":"node scripts/harvest-functions.ts --check","privacy:check":"node scripts/scan-fixture-privacy.ts","coverage:check":"node scripts/coverage-matrix.ts --check","prepublishOnly":"npm run build && npm run lint && npm test","required:check":"node scripts/check-required-fields.ts","tooldocs:check":"node scripts/generate-tool-docs.ts --check","conformance:check":"node scripts/make-conformance.ts --check","proto:embed:check":"node scripts/embed-proto-schema.ts --check","survey:fieldinfos":"node scripts/survey-field-infos.ts","harvest:predicates":"node scripts/harvest-predicates.ts"},"_npmUser":{"name":"olekristensen","email":"ole@kristensen.name"},"repository":{"url":"git+https://github.com/den-frie-vilje/cupertino-files.git","type":"git"},"_npmVersion":"11.9.0","description":"Read, inspect, and edit Apple Pages, Numbers and Keynote documents (iWork / Creator Studio, modern IWA format) in pure TypeScript with zero runtime dependencies.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.0","typedoc":"^0.28.20","vitepress":"^1.6.4","@eslint/js":"^10.0.1","protobufjs":"^8.7.1","typescript":"^5.9.0","@types/node":"^22.10.0","typescript-eslint":"^8.65.0","typedoc-plugin-markdown":"^4.12.0","typedoc-vitepress-theme":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/cupertino-files_0.1.0_1785746098384_0.9539170630902587","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"cupertino-files","version":"0.2.0","keywords":["iwork","pages","numbers","keynote","apple","iwa","snappy","protobuf","document","parser","key","creator-studio","cupertino"],"author":{"name":"Ole Kristensen","email":"ole@kristensen.name"},"license":"MIT","_id":"cupertino-files@0.2.0","maintainers":[{"name":"olekristensen","email":"ole@kristensen.name"}],"homepage":"https://den-frie-vilje.github.io/cupertino-files/","bugs":{"url":"https://github.com/den-frie-vilje/cupertino-files/issues"},"bin":{"cupertino-dump":"dist/cli.js","cupertino-files":"dist/main.js"},"dist":{"shasum":"b9b2868292adac4fd7211ff03130fc26e84c2796","tarball":"https://registry.npmjs.org/cupertino-files/-/cupertino-files-0.2.0.tgz","fileCount":261,"integrity":"sha512-LjspdVxJC4PiyC4ZPGKx/yPsPOejAZB8gkhxmxKDEZkvFeamweeAkAycbzKJjzKndUriZWbGmC238zmiAcvmcw==","signatures":[{"sig":"MEQCIAe+MvLsk5Jek4XUbAeVcP2jofwevVteN3XD+ZFsLwVuAiBxCNw9GO49JcanbO299UHAy8+tnwbvy7EU91ScgnFo3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cupertino-files@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3758614},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5f05985c28ebbbc43c09d885731513a4dae9260a","scripts":{"lint":"eslint src test scripts","test":"node --test test/*.test.ts","build":"tsc -p tsconfig.build.json","probe":"node scripts/probe-unknowns.ts","seeds":"node scripts/make-seeds.ts","blanks":"node scripts/make-blanks.ts","prebnc":"node scripts/analyse-prebnc.ts","stress":"node scripts/stress-readers.ts","harvest":"node scripts/harvest-functions.ts","prepare":"npm run build","api:docs":"typedoc --plugin typedoc-plugin-markdown --plugin typedoc-vitepress-theme --out docs/api","coverage":"node scripts/coverage-matrix.ts","docs:dev":"vitepress dev docs","test:all":"npm run test && npm run test:e2e","test:e2e":"node --test --test-concurrency=1 test/e2e/*.e2e.test.ts","tooldocs":"node scripts/generate-tool-docs.ts","typecheck":"tsc -p tsconfig.json --noEmit","docs:build":"npm run api:docs && vitepress build docs","pages:docs":"node scripts/make-pages-docs.ts","verify:doc":"node scripts/make-verification-doc.ts","audit:check":"npm audit --omit=dev && npm audit --audit-level=high","bisect:docs":"node scripts/make-bisect-docs.ts","conformance":"node scripts/make-conformance.ts","proto:check":"node scripts/check-proto-drift.ts --check","proto:embed":"node scripts/embed-proto-schema.ts","shape:audit":"node scripts/audit-authored-shape.ts","shape:check":"node scripts/audit-authored-shape.ts --check","blanks:check":"node scripts/make-blanks.ts --check","docs:preview":"vitepress preview docs","keynote:docs":"node scripts/make-keynote-docs.ts","bundle:format":"node scripts/make-release-bundle.ts","harvest:check":"node scripts/harvest-functions.ts --check","privacy:check":"node scripts/scan-fixture-privacy.ts","coverage:check":"node scripts/coverage-matrix.ts --check","prepublishOnly":"npm run build && npm run lint && npm test","required:check":"node scripts/check-required-fields.ts","tooldocs:check":"node scripts/generate-tool-docs.ts --check","conformance:check":"node scripts/make-conformance.ts --check","proto:embed:check":"node scripts/embed-proto-schema.ts --check","survey:fieldinfos":"node scripts/survey-field-infos.ts","harvest:predicates":"node scripts/harvest-predicates.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ae9532b-733a-4854-9be9-e2b6a36091c4"}},"overrides":{"vite":"^7.0.0"},"repository":{"url":"git+https://github.com/den-frie-vilje/cupertino-files.git","type":"git"},"_npmVersion":"12.0.2","description":"Read, inspect, and edit Apple Pages, Numbers and Keynote documents (iWork / Creator Studio, modern IWA format) in pure TypeScript with zero runtime dependencies.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.0","typedoc":"^0.28.20","vitepress":"^1.6.4","@eslint/js":"^10.0.1","protobufjs":"^8.7.1","typescript":"^6.0.3","@types/node":"^26.1.2","typescript-eslint":"^8.65.0","typedoc-plugin-markdown":"^4.12.0","typedoc-vitepress-theme":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/cupertino-files_0.2.0_1785761436361_0.4525401188126992","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"cupertino-files","version":"0.3.0","keywords":["iwork","pages","numbers","keynote","apple","iwa","snappy","protobuf","document","parser","key","creator-studio","cupertino"],"author":{"name":"Ole Kristensen","email":"ole@kristensen.name"},"license":"MIT","_id":"cupertino-files@0.3.0","maintainers":[{"name":"olekristensen","email":"ole@kristensen.name"}],"homepage":"https://den-frie-vilje.github.io/cupertino-files/","bugs":{"url":"https://github.com/den-frie-vilje/cupertino-files/issues"},"bin":{"cupertino-dump":"dist/cli.js","cupertino-files":"dist/main.js"},"dist":{"shasum":"33f8cf90fdc2e4c41de08089b9329f249b253afd","tarball":"https://registry.npmjs.org/cupertino-files/-/cupertino-files-0.3.0.tgz","fileCount":265,"integrity":"sha512-jCnSGLzOhwLJGj4U2QLZWRWVZOFaaJqf7cEhplC2NFiF1VF3EWQMgsagnYvjgWYHY4IMHMXODhnmj50EFlnK0Q==","signatures":[{"sig":"MEUCIEDR/TZUcgyyI70gFDauSbVpn+hz7irDDyW9lyT5u4kxAiEApkhg043zrx4gX8NLx037oIhgSNr0fIxNQA1HAOPWRdw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cupertino-files@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3943848},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8b3f761b16510d2ed387503c9e09bebd7468b6d0","scripts":{"lint":"eslint src test scripts","test":"node --test test/*.test.ts","build":"tsc -p tsconfig.build.json","demos":"node scripts/make-demos.ts","probe":"node scripts/probe-unknowns.ts","seeds":"node scripts/make-seeds.ts","blanks":"node scripts/make-blanks.ts","prebnc":"node scripts/analyse-prebnc.ts","stress":"node scripts/stress-readers.ts","harvest":"node scripts/harvest-functions.ts","prepare":"npm run build","api:docs":"typedoc --plugin typedoc-plugin-markdown --plugin typedoc-vitepress-theme --out docs/api","coverage":"node scripts/coverage-matrix.ts","docs:dev":"vitepress dev docs","test:all":"npm run test && npm run test:e2e","test:e2e":"node --test --test-concurrency=1 test/e2e/*.e2e.test.ts","tooldocs":"node scripts/generate-tool-docs.ts","typecheck":"tsc -p tsconfig.json --noEmit","docs:build":"npm run api:docs && vitepress build docs","pages:docs":"node scripts/make-pages-docs.ts","verify:doc":"node scripts/make-verification-doc.ts","audit:check":"npm audit --omit=dev && npm audit --audit-level=high","bisect:docs":"node scripts/make-bisect-docs.ts","conformance":"node scripts/make-conformance.ts","proto:check":"node scripts/check-proto-drift.ts --check","proto:embed":"node scripts/embed-proto-schema.ts","shape:audit":"node scripts/audit-authored-shape.ts","shape:check":"node scripts/audit-authored-shape.ts --check","blanks:check":"node scripts/make-blanks.ts --check","docs:preview":"vitepress preview docs","keynote:docs":"node scripts/make-keynote-docs.ts","bundle:format":"node scripts/make-release-bundle.ts","harvest:check":"node scripts/harvest-functions.ts --check","privacy:check":"node scripts/scan-fixture-privacy.ts","coverage:check":"node scripts/coverage-matrix.ts --check","prepublishOnly":"npm run build && npm run lint && npm test","required:check":"node scripts/check-required-fields.ts","tooldocs:check":"node scripts/generate-tool-docs.ts --check","conformance:check":"node scripts/make-conformance.ts --check","proto:embed:check":"node scripts/embed-proto-schema.ts --check","survey:fieldinfos":"node scripts/survey-field-infos.ts","harvest:predicates":"node scripts/harvest-predicates.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ae9532b-733a-4854-9be9-e2b6a36091c4"}},"overrides":{"vite":"^7.0.0"},"repository":{"url":"git+https://github.com/den-frie-vilje/cupertino-files.git","type":"git"},"_npmVersion":"12.0.2","description":"Read, inspect, and edit Apple Pages, Numbers and Keynote documents (iWork / Creator Studio, modern IWA format) in pure TypeScript with zero runtime dependencies.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.0","typedoc":"^0.28.20","vitepress":"^1.6.4","@eslint/js":"^10.0.1","protobufjs":"^8.7.1","typescript":"^6.0.3","@types/node":"^26.1.2","typescript-eslint":"^8.65.0","typedoc-plugin-markdown":"^4.12.0","typedoc-vitepress-theme":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/cupertino-files_0.3.0_1786656156621_0.26838919974219366","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"cupertino-files","version":"0.4.0","description":"Read, inspect, and edit Apple Pages, Numbers and Keynote documents (iWork / Creator Studio, modern IWA format) in pure TypeScript with zero runtime dependencies.","keywords":["iwork","pages","numbers","keynote","apple","iwa","snappy","protobuf","document","parser","key","creator-studio","cupertino"],"license":"MIT","author":{"name":"Ole Kristensen","email":"ole@kristensen.name"},"repository":{"type":"git","url":"git+https://github.com/den-frie-vilje/cupertino-files.git"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"bin":{"cupertino-files":"dist/main.js","cupertino-dump":"dist/cli.js"},"engines":{"node":">=22"},"sideEffects":false,"scripts":{"build":"tsc -p tsconfig.build.json","test":"node --test test/*.test.ts","typecheck":"tsc -p tsconfig.json --noEmit","coverage":"node scripts/coverage-matrix.ts","coverage:check":"node scripts/coverage-matrix.ts --check","harvest":"node scripts/harvest-functions.ts","harvest:check":"node scripts/harvest-functions.ts --check","harvest:predicates":"node scripts/harvest-predicates.ts","prebnc":"node scripts/analyse-prebnc.ts","stress":"node scripts/stress-readers.ts","proto:check":"node scripts/check-proto-drift.ts --check","required:check":"node scripts/check-required-fields.ts","survey:fieldinfos":"node scripts/survey-field-infos.ts","probe":"node scripts/probe-unknowns.ts","verify:doc":"node scripts/make-verification-doc.ts","bisect:docs":"node scripts/make-bisect-docs.ts","privacy:check":"node scripts/scan-fixture-privacy.ts","test:e2e":"node --test --test-concurrency=1 test/e2e/*.e2e.test.ts","blanks":"node scripts/make-blanks.ts","blanks:check":"node scripts/make-blanks.ts --check","test:all":"npm run test && npm run test:e2e","pages:docs":"node scripts/make-pages-docs.ts","proto:embed":"node scripts/embed-proto-schema.ts","proto:embed:check":"node scripts/embed-proto-schema.ts --check","shape:audit":"node scripts/audit-authored-shape.ts","shape:check":"node scripts/audit-authored-shape.ts --check","lint":"eslint src test scripts","conformance":"node scripts/make-conformance.ts","conformance:check":"node scripts/make-conformance.ts --check","bundle:format":"node scripts/make-release-bundle.ts","keynote:docs":"node scripts/make-keynote-docs.ts","prepublishOnly":"npm run build && npm run lint && npm test","docs:dev":"vitepress dev docs","docs:build":"npm run api:docs && vitepress build docs","docs:preview":"vitepress preview docs","prepare":"npm run build","api:docs":"typedoc --plugin typedoc-plugin-markdown --plugin typedoc-vitepress-theme --out docs/api","tooldocs":"node scripts/generate-tool-docs.ts","tooldocs:check":"node scripts/generate-tool-docs.ts --check","audit:check":"npm audit --omit=dev && npm audit --audit-level=high","seeds":"node scripts/make-seeds.ts","demos":"node scripts/make-demos.ts"},"devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^26.1.2","eslint":"^10.8.0","protobufjs":"^8.7.1","typedoc":"^0.28.20","typedoc-plugin-markdown":"^4.12.0","typedoc-vitepress-theme":"^1.1.3","typescript":"^6.0.3","typescript-eslint":"^8.65.0","vitepress":"^1.6.4"},"homepage":"https://den-frie-vilje.github.io/cupertino-files/","overrides":{"vite":"^7.0.0"},"gitHead":"8a539ad4b75d9650a42c876083e96f1c4ddf3ccc","_id":"cupertino-files@0.4.0","bugs":{"url":"https://github.com/den-frie-vilje/cupertino-files/issues"},"_nodeVersion":"24.18.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-eZ2cSs4Mb3MyQSb6Cg3ASCQuNeTKFBmEIHwO6CRnMwpcv8K8E0e7yLyAvyY6OUt/dPfH0Seh4di/Ippq2G+s3Q==","shasum":"812f35ec8c842d1d59e9f4a8e0c44e081178c9cf","tarball":"https://registry.npmjs.org/cupertino-files/-/cupertino-files-0.4.0.tgz","fileCount":265,"unpackedSize":3976660,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/cupertino-files@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDdd6+K95rwVsINIlZAAkwiNBtlY7JzEBLshRMVeV1WBAiBzjSI4U06Q03WpZXOTkLK041yOOF/jmFQcMsJdxVHhUw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ae9532b-733a-4854-9be9-e2b6a36091c4"}},"directories":{},"maintainers":[{"name":"olekristensen","email":"ole@kristensen.name"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cupertino-files_0.4.0_1786682078269_0.38638250033533117"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-03T08:34:58.320Z","modified":"2026-08-14T04:34:38.787Z","0.1.0":"2026-08-03T08:34:58.548Z","0.2.0":"2026-08-03T12:50:36.537Z","0.3.0":"2026-08-13T21:22:36.813Z","0.4.0":"2026-08-14T04:34:38.455Z"},"bugs":{"url":"https://github.com/den-frie-vilje/cupertino-files/issues"},"author":{"name":"Ole Kristensen","email":"ole@kristensen.name"},"license":"MIT","homepage":"https://den-frie-vilje.github.io/cupertino-files/","keywords":["iwork","pages","numbers","keynote","apple","iwa","snappy","protobuf","document","parser","key","creator-studio","cupertino"],"repository":{"type":"git","url":"git+https://github.com/den-frie-vilje/cupertino-files.git"},"description":"Read, inspect, and edit Apple Pages, Numbers and Keynote documents (iWork / Creator Studio, modern IWA format) in pure TypeScript with zero runtime dependencies.","maintainers":[{"name":"olekristensen","email":"ole@kristensen.name"}],"readme":"# cupertino-files\n\n**Open, edit, and save Apple Pages, Numbers, and Keynote documents —\nanywhere JavaScript runs.** Pure TypeScript, zero runtime dependencies,\nno Mac required. You work with paragraphs, cells, and slides; the bytes\ntake care of themselves.\n\n**Docs: <https://den-frie-vilje.github.io/cupertino-files/>**\n\n```sh\nnpm install cupertino-files\n```\n\n```ts\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { PagesDocument, NumbersDocument } from \"cupertino-files\";\n\nconst doc = PagesDocument.load(new Uint8Array(readFileSync(\"report.pages\")));\ndoc.replaceText(\"2024\", \"2025\");\ndoc.appendParagraph(\"Conclusion\", \"Heading 1\");\nwriteFileSync(\"report-2025.pages\", doc.save());\n\nconst sheet = NumbersDocument.load(new Uint8Array(readFileSync(\"budget.numbers\")));\nconst table = sheet.tables()[0]!;\ntable.setCell(1, 1, 143_800);\ntable.setFormula(1, 2, \"=B2*1.25\", { value: 179_750 });\nwriteFileSync(\"budget.numbers\", sheet.save());\n```\n\nEverything you don't touch is preserved byte-for-byte\n([how](https://den-frie-vilje.github.io/cupertino-files/guide/fidelity)).\nWorks in Node ≥ 22 and modern browsers, ESM-only. Bytes in, bytes out.\n\nThe format is undocumented; this library is an ongoing\nreverse-engineering of it, measured from real documents.\n[`docs/COVERAGE.md`](docs/COVERAGE.md) is the always-current answer to\n\"does it do X?\". The short version:\n\n## What you can do\n\n### Pages\n\n- **Text** — find & replace, append, insert; styles and fields stay attached\n- **Styles** — named paragraph and character styles: apply, edit, create; direct formatting too\n- **Layout** — sections, headers & footers, page setup, margins, orientation\n- **Images** — inline insertion, floating placement, crops, filters\n- **Extras** — comments, footnotes, bookmarks, links, page-number and date fields, lists, table of contents\n\n### Numbers\n\n- **Cells** — read and write every value type; formatting, styles, and comments survive your edits\n- **Formulas** — author them as text — `=SUM(A1:A5)`, `=Other::B2` — 272 functions\n- **Formatting** — fills, borders, alignment, wrap; number, currency, date and duration formats; bands\n- **Structure** — sheets and tables (add, rename, move, remove), rows and columns, merges, column widths\n- **More** — conditional rules, cell controls, and category regrouping write too; filter sets toggle and switch mode, though their rules read only, as do category groups\n\n### Keynote\n\n- **Slides** — add, duplicate, reorder, remove, skip; titles, bodies, presenter notes\n- **On a slide** — a slide's content is drawables and tables, so everything under *Everywhere* applies: edit the text in a text box, restyle a shape, swap or crop an image, copy a drawable onto another slide, edit an embedded table cell-by-cell\n- **Decks** — slide size, auto-advance; transitions read and write; builds read, retime and remove\n\n### Everywhere\n\n- **New documents** — `NumbersDocument.blank()` and friends: a fresh A4 document or 16:9 deck, no template file needed\n- **Drawables** — shapes, text boxes, and images on any page, sheet, or slide: move, resize, copy, restyle — shadows, fills, strokes, opacity\n- **Tables** — one table model for all three apps: a table on a slide or a page reads and writes exactly like one in Numbers\n- **Charts** — data (categories, series, values) and appearance (type, colours, gridlines, legend)\n- **Fidelity** — byte-identical round trips; future app versions load with their new features intact\n- **Honesty** — iWork '09 XML and password-protected documents are detected and declined, never mis-parsed\n\nDeeper detail, per capability and with the evidence:\n[the capability matrix](docs/COVERAGE.md) · [what each open question\nwaits on](docs/BLOCKERS.md) · [the format itself](docs/FORMAT.md).\n\n## Tools for every kind of work\n\n- **The API** — typed, synchronous, documented: [take the tour](https://den-frie-vilje.github.io/cupertino-files/guide/documents)\n- **The CLI** — `npx -y cupertino-files dump info file.pages` inspects; `call` runs any editing tool from the shell\n- **For AI agents** — `npx -y cupertino-files mcp`: an MCP server with twenty creating, editing and formatting tools, plus a Claude Code skill in the package\n- **For other implementations** — a language-neutral [conformance suite](conformance/README.md) and format bundle, so a C++ or Rust port can check itself\n\nMore in [For AI agents](https://den-frie-vilje.github.io/cupertino-files/guide/agents)\nand the [API reference](https://den-frie-vilje.github.io/cupertino-files/api/).\n\n## Development\n\n```sh\nnpm install && npm test   # unit + fixture suite; never launches an app\nnpm run test:e2e          # macOS only: drives the real apps\n```\n\nContributions are warmly welcome — [CONTRIBUTING.md](CONTRIBUTING.md)\nshows the way, and [docs/BLOCKERS.md](docs/BLOCKERS.md) lists questions\nwhere a few minutes with a Mac genuinely helps. Test fixtures are real\nApple-written documents from open-source test suites and public\nrepositories ([attribution](fixtures/ATTRIBUTION.md)).\n\nBuilt on the shoulders of\n[iWorkFileFormat](https://github.com/obriensp/iWorkFileFormat),\n[keynote-parser](https://github.com/psobot/keynote-parser),\n[numbers-parser](https://github.com/masaccio/numbers-parser) and\n[WorkKit](https://github.com/6over3/WorkKit).\n\n## Legal\n\nAn independent project, not affiliated with or endorsed by Apple Inc.\nApple, iWork, Pages, Numbers and Keynote are trademarks of Apple Inc.,\nused only to name the formats this library interoperates with. It\ncontains no Apple code and declines encrypted documents by design;\ndetails in [docs/LEGAL.md](docs/LEGAL.md).\n\n## License\n\n[MIT](LICENSE) © Ole Kristensen\n","readmeFilename":"README.md"}