{"id":47710903,"url":"https://github.com/wiseair-srl/json-to-office","last_synced_at":"2026-06-15T00:02:13.848Z","repository":{"id":347341993,"uuid":"1179221136","full_name":"Wiseair-srl/json-to-office","owner":"Wiseair-srl","description":"Generate professional .docx and .pptx files from JSON definitions","archived":false,"fork":false,"pushed_at":"2026-05-07T09:31:49.000Z","size":5215,"stargazers_count":23,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-07T10:36:42.516Z","etag":null,"topics":["cli","document-generation","docx","json","office","open-source","powerpoint","pptx","typescript","word"],"latest_commit_sha":null,"homepage":"https://github.com/Wiseair-srl/json-to-office","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Wiseair-srl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-11T20:13:03.000Z","updated_at":"2026-05-07T09:30:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Wiseair-srl/json-to-office","commit_stats":null,"previous_names":["wiseair-srl/json-to-office"],"tags_count":92,"template":false,"template_full_name":null,"purl":"pkg:github/Wiseair-srl/json-to-office","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wiseair-srl%2Fjson-to-office","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wiseair-srl%2Fjson-to-office/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wiseair-srl%2Fjson-to-office/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wiseair-srl%2Fjson-to-office/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wiseair-srl","download_url":"https://codeload.github.com/Wiseair-srl/json-to-office/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wiseair-srl%2Fjson-to-office/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32979305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T06:31:55.726Z","status":"ssl_error","status_checked_at":"2026-05-13T06:31:51.336Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","document-generation","docx","json","office","open-source","powerpoint","pptx","typescript","word"],"created_at":"2026-04-02T18:31:51.232Z","updated_at":"2026-06-15T00:02:13.792Z","avatar_url":"https://github.com/Wiseair-srl.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# json-to-office\n\n**Documents as data, not code.** Describe `.docx` and `.pptx` files as plain JSON (serializable, portable, language-agnostic) and render them into real Office documents.\n\n[![CI](https://img.shields.io/github/actions/workflow/status/Wiseair-srl/json-to-office/ci.yml?branch=main\u0026label=CI)](https://github.com/Wiseair-srl/json-to-office/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/@json-to-office/json-to-docx?label=json-to-docx)](https://www.npmjs.com/package/@json-to-office/json-to-docx)\n[![npm](https://img.shields.io/npm/v/@json-to-office/json-to-pptx?label=json-to-pptx)](https://www.npmjs.com/package/@json-to-office/json-to-pptx)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n\u003e **Try the live playgrounds:** [DOCX Playground](https://docx.json-to-office.com) | [PPTX Playground](https://pptx.json-to-office.com)\n\n## Table of contents\n\n- [Quick start](#quick-start)\n- [The problem](#the-problem)\n- [The solution](#the-solution)\n- [Architecture](#architecture)\n- [Why not just use X?](#why-not-just-use-x)\n- [Features](#features)\n- [Full examples](#full-examples)\n- [Who it's for](#who-its-for)\n- [Use cases](#use-cases)\n- [Examples](#examples)\n- [Packages](#packages)\n- [Development](#development)\n\n## Quick start\n\n```bash\nnpm install @json-to-office/json-to-docx @json-to-office/json-to-pptx\n```\n\n```ts\nimport { generateAndSaveFromJson as docx } from '@json-to-office/json-to-docx';\nimport { generateAndSaveFromJson as pptx } from '@json-to-office/json-to-pptx';\n\n// DOCX\nawait docx(\n  {\n    name: 'docx',\n    props: { theme: 'minimal' },\n    children: [\n      { name: 'heading', props: { text: 'Q1 Report', level: 1 } },\n      {\n        name: 'paragraph',\n        props: { text: 'Revenue grew **32%** quarter-over-quarter.' },\n      },\n    ],\n  },\n  'report.docx'\n);\n\n// PPTX\nawait pptx(\n  {\n    name: 'pptx',\n    props: { theme: 'corporate', grid: { columns: 12, rows: 6 } },\n    children: [\n      {\n        name: 'slide',\n        props: { background: { color: 'background' } },\n        children: [\n          {\n            name: 'text',\n            props: {\n              text: 'Q1 Results',\n              style: 'title',\n              grid: { column: 0, row: 0, columnSpan: 12 },\n            },\n          },\n          {\n            name: 'chart',\n            props: {\n              type: 'bar',\n              data: [\n                {\n                  name: 'Revenue',\n                  labels: ['Q1', 'Q2', 'Q3', 'Q4'],\n                  values: [1.2, 2.4, 3.1, 4.2],\n                },\n              ],\n              grid: { column: 0, row: 1, columnSpan: 8, rowSpan: 5 },\n            },\n          },\n        ],\n      },\n    ],\n  },\n  'deck.pptx'\n);\n```\n\nOr explore interactively with the visual playground (Monaco editor, live preview, AI assistant):\n\n**Try it online:** [DOCX Playground](https://docx.json-to-office.com) | [PPTX Playground](https://pptx.json-to-office.com)\n\n```bash\nnpm install -g @json-to-office/jto\njto docx dev\njto pptx dev\n```\n\n![Visual Playground](docs/playground.gif)\n\nFor CI / scripted pipelines that don't need the playground, install the lean [`@json-to-office/jto-cli`](packages/jto-cli) instead — same `generate`/`validate`/`schemas`/`discover`/`init`/`fonts` commands, ~16 deps vs ~70.\n\n```bash\nnpm install -g @json-to-office/jto-cli\njto-cli docx generate doc.json\n```\n\n## The problem\n\nLibraries like [docx](https://github.com/dolanmiu/docx) and [pptxgenjs](https://github.com/gitbrent/PptxGenJS) are imperative, code-first APIs. You build documents by constructing class instances and chaining methods. Powerful, but the document definition _is_ the program. You can't store it in a database, send it over an API, generate it from an LLM, or hand it to a non-developer.\n\n## The solution\n\njson-to-office makes the document definition **data**. You describe a `.docx` or `.pptx` as a JSON tree, and the library renders it into a real Office file. The JSON can live in a DB row, travel over HTTP, come out of GPT-4, or be edited in a visual playground with autocomplete and validation. Definition and rendering are fully decoupled.\n\n```jsonc\n// This is a complete document definition. Store it, send it, generate it.\n{\n  \"name\": \"docx\",\n  \"props\": { \"theme\": \"minimal\" },\n  \"children\": [\n    { \"name\": \"heading\", \"props\": { \"text\": \"Q1 Report\", \"level\": 1 } },\n    {\n      \"name\": \"paragraph\",\n      \"props\": { \"text\": \"Revenue grew **32%** quarter-over-quarter.\" },\n    },\n    {\n      \"name\": \"table\",\n      \"props\": {\n        \"columns\": [\n          {\n            \"header\": { \"content\": \"Region\" },\n            \"cells\": [\n              { \"content\": \"North America\" },\n              { \"content\": \"Europe\" },\n              { \"content\": \"APAC\" },\n            ],\n          },\n          {\n            \"header\": { \"content\": \"Revenue\" },\n            \"cells\": [\n              { \"content\": \"$4.2M\" },\n              { \"content\": \"$2.8M\" },\n              { \"content\": \"$1.6M\" },\n            ],\n          },\n        ],\n      },\n    },\n    {\n      \"name\": \"image\",\n      \"props\": { \"path\": \"https://example.com/chart.png\", \"width\": \"80%\" },\n    },\n  ],\n}\n```\n\nYour document is just JSON now. Generate it, store it, validate it, version it, and render it anywhere, without touching TypeScript or Office internals.\n\n## Architecture\n\nA JSON document is a tree of **modules**. Each module contains **base components** (heading, paragraph, table, etc.) and optionally **custom components** that you define in your project via a plugin system.\n\n![Architecture](docs/architecture.png)\n\nThe **processor** walks the tree. When it encounters a custom component, it validates the props against the schema, resolves the requested semver version, calls `render()`, and splices the result back into the tree. If `render()` returns other custom components, the processor re-expands them recursively (up to 20 levels deep). The output is a flat tree of base components only, which the **renderer** converts into native Office objects via docx.js or pptxgenjs.\n\n### Custom components (plugin system)\n\nDefine custom components with `createComponent` + `createVersion`. Each version has a [TypeBox](https://github.com/sinclairzx81/typebox) schema for props (chosen over Zod for first-class JSON Schema support) and an async `render()` function that returns an array of standard components (or other custom components, which are expanded recursively):\n\n```ts\nimport {\n  createComponent,\n  createVersion,\n} from '@json-to-office/json-to-docx/plugin';\nimport { Type } from '@sinclair/typebox';\n\nconst kpiCard = createComponent({\n  name: 'kpi-card',\n  versions: {\n    '1.0.0': createVersion({\n      propsSchema: Type.Object({\n        label: Type.String(),\n        value: Type.Number(),\n        unit: Type.Optional(Type.String()),\n      }),\n      render: async ({ props }) =\u003e [\n        { name: 'heading', props: { text: props.label, level: 3 } },\n        {\n          name: 'statistic',\n          props: {\n            value: `${props.value}${props.unit ? ` ${props.unit}` : ''}`,\n          },\n        },\n      ],\n    }),\n  },\n});\n```\n\nThen register it in the generator and use it in JSON like any built-in component:\n\n```ts\nconst generator = createDocumentGenerator().addComponent(kpiCard).build();\n\nawait generator.generateToFile(\n  {\n    name: 'docx',\n    children: [\n      { name: 'kpi-card', props: { label: 'Revenue', value: 4.2, unit: 'M$' } },\n    ],\n  },\n  'report.docx'\n);\n```\n\n**Versioning.** Each component supports multiple semver-keyed versions with different props and rendering logic. The document specifies which version to use; if omitted, the latest is resolved automatically. This enables non-breaking evolution of enterprise templates across clients.\n\n**Schema generation.** The enriched schema (standard + custom components) is exportable as JSON Schema, so you get validation and IDE autocomplete even for your custom components.\n\n## Why not just use X?\n\nGenerating an Office document from a backend service usually means one of four things. Start from the question:\n\n**What should a document _be_, in a system?**\n\nAn artifact rendered once and emailed? Any tool works. An _output of your platform_ — emitted thousands of times, on demand, by services and LLMs, branded, regeneratable, auditable? Then it should behave like data: serializable, validatable, versionable, diffable. None of the four common approaches give you that.\n\n|                   | json-to-office               | Imperative libs\u003cbr/\u003e(docx, pptxgenjs, officegen, react-pdf) | Template-driven\u003cbr/\u003e(Carbone, docxtemplater) | SaaS / AI doc tools\u003cbr/\u003e(Gamma, Tome) | Plain Claude\u003cbr/\u003e(direct prompt → .docx/.pptx) |\n| ----------------- | ---------------------------- | ----------------------------------------------------------- | -------------------------------------------- | ------------------------------------- | ---------------------------------------------- |\n| **Document is**   | Declarative JSON             | Code                                                        | Binary template + data                       | Hosted artifact                       | Free-form prompt                               |\n| **Serializable**  | Yes                          | No: trapped in code                                         | Partial: data is JSON, structure isn't       | No: locked in platform                | No: prompt ≠ output                            |\n| **Reproducible**  | Yes: same JSON, same bytes   | Yes                                                         | Yes                                          | No                                    | No: stochastic                                 |\n| **LLM-friendly**  | Schema-constrained output    | Fragile: no schema                                          | Needs pre-made template                      | N/A                                   | No structure, no validation                    |\n| **Validation**    | Full TypeBox schemas         | None                                                        | None                                         | N/A                                   | None                                           |\n| **Themes**        | Built-in, swappable          | Manual styling                                              | Baked into template                          | Built-in                              | Whatever the model picks                       |\n| **Extensibility** | Plugin architecture + semver | Library APIs                                                | Limited                                      | None                                  | None                                           |\n| **Self-hosted**   | Yes                          | Yes                                                         | Yes (+ LibreOffice)                          | No                                    | No (API)                                       |\n\n**vs. imperative libs.** docx and pptxgenjs are json-to-office's own rendering backends. The difference is the layer above: a schema-validated JSON contract, themes, layout pipeline, plugin architecture, and TypeBox schemas that double as TypeScript types and runtime validators. What your code emits stops being code and starts being a value — storable, sendable, replayable.\n\n**vs. template-driven.** Templates work when structure is fixed and only data changes. They break the moment structure becomes dynamic: conditional sections, variable-length tables, data-driven layouts. A `.docx` template is an opaque binary — you cannot diff it, lint it, or compose it. JSON you can.\n\n**vs. SaaS / AI doc tools.** Built for a human assembling one deck in a browser, not a backend emitting thousands of branded documents from structured inputs. No API contract, no self-hosting, no ownership of the pipeline or the artifact.\n\n**vs. Plain Claude.** Claude can emit a `.pptx` directly if you ask. Two problems: (1) output is non-deterministic — same prompt, different document, no validation, no replay; (2) it conflates _content_ with _rendering_. With a JSON layer the LLM emits a small, schema-constrained value, and rendering is deterministic code. Reliable structure, themed output, byte-for-byte regeneratable artifacts.\n\n## Features\n\n### DOCX: 13 components\n\n| Component          | Highlights                                                      |\n| ------------------ | --------------------------------------------------------------- |\n| paragraph, heading | Markdown-style bold/italic in text, h1–h6                       |\n| table              | Auto-width columns, merged cells, styled headers                |\n| image              | URL / file / base64, contain / cover / crop, captions, floating |\n| list               | 57 numbering formats, 9 nesting levels                          |\n| columns            | Multi-column layouts                                            |\n| text-box           | Positioned text regions                                         |\n| statistic          | KPI cards                                                       |\n| highcharts         | Server-side chart rendering                                     |\n| header / footer    | Per-section, first-page variant                                 |\n| table of contents  | Auto-generated from headings                                    |\n| section            | Independent page size, orientation, margins                     |\n\n### PPTX: 7 components\n\n| Component  | Highlights                                                                        |\n| ---------- | --------------------------------------------------------------------------------- |\n| text       | Bullets, hyperlinks, style presets                                                |\n| image      | Rotation, rounded corners, shadows                                                |\n| shape      | 15 types: rect, ellipse, arrow, star, cloud, etc.                                 |\n| table      | Auto-pagination with header repeat, colspan/rowspan                               |\n| chart      | 8 native PowerPoint types: bar, line, pie, area, doughnut, radar, bubble, scatter |\n| highcharts | Server-side chart rendering                                                       |\n| slide      | Grid-based positioning, backgrounds, templates                                    |\n\n### Document diff (DOCX)\n\nBecause documents are data, two versions diff like data — and the result opens in Word as native tracked changes:\n\n```bash\njto docx diff contract-v1.json contract-v2.json -o redline.docx\n```\n\nEvery text edit becomes a real Word revision (accept/reject, author, timestamp) and the file opens in review mode. Word-level diff on paragraphs, headings, and list items; structural changes (tables, images, charts) are replaced and reported in the CLI summary. Programmatic API: `diffDocuments(oldDoc, newDoc)` from `@json-to-office/json-to-docx`; HTTP API: `POST /api/docx/diff`. In the visual playground (`jto docx dev`), use the **Compare** button in the sidebar to diff two documents and open the redline with live preview. Try it with [examples/contract-v1.docx.json](examples/contract-v1.docx.json) and [contract-v2.docx.json](examples/contract-v2.docx.json).\n\n### Cross-format\n\n- **Theme system**: colors, fonts, spacing, component defaults. 3 built-in themes per format (minimal, corporate, vibrant/modern), or define your own.\n- **Font system**: curated Office-safe font list plus code-side `fonts.extraEntries` option for embedding Google Fonts and custom TTF/OTF across DOCX and PPTX. Themes name fonts; code registers them. See [docs/fonts.md](docs/fonts.md).\n- **Schema validation**: full TypeBox schemas that serve as TypeScript types _and_ runtime validators. Catch errors before rendering.\n- **Plugin architecture**: create versioned custom components with `createComponent()`. Full TypeScript support, chainable API, schema generation.\n- **Template / placeholder system** (PPTX): slide templates with named placeholder regions, static + dynamic content, style inheritance.\n- **Grid layout** (PPTX): 12-column responsive grid with configurable margins and gutters.\n\n## Full examples\n\n### DOCX\n\n```bash\nnpm install @json-to-office/json-to-docx\n```\n\n```ts\nimport { generateAndSaveFromJson as docx } from '@json-to-office/json-to-docx';\n\nawait docx(\n  {\n    name: 'docx',\n    props: { theme: 'minimal' },\n    children: [\n      { name: 'heading', props: { text: 'Q1 Report', level: 1 } },\n      {\n        name: 'paragraph',\n        props: { text: 'Revenue grew **32%** quarter-over-quarter.' },\n      },\n      {\n        name: 'table',\n        props: {\n          columns: [\n            {\n              header: { content: 'Metric' },\n              cells: [{ content: 'Revenue' }, { content: 'Users' }],\n            },\n            {\n              header: { content: 'Value' },\n              cells: [{ content: '$4.2M' }, { content: '12,847' }],\n            },\n          ],\n        },\n      },\n    ],\n  },\n  'report.docx'\n);\n```\n\n### PPTX\n\n```bash\nnpm install @json-to-office/json-to-pptx\n```\n\n```ts\nimport { generateAndSaveFromJson as pptx } from '@json-to-office/json-to-pptx';\n\nawait pptx(\n  {\n    name: 'pptx',\n    props: {\n      title: 'Q1 Review',\n      theme: 'corporate',\n      grid: { columns: 12, rows: 6 },\n    },\n    children: [\n      {\n        name: 'slide',\n        props: { background: { color: 'background' } },\n        children: [\n          {\n            name: 'text',\n            props: {\n              text: 'Q1 Results',\n              style: 'title',\n              grid: { column: 0, row: 0, columnSpan: 12 },\n            },\n          },\n          {\n            name: 'chart',\n            props: {\n              type: 'bar',\n              data: [\n                {\n                  name: 'Revenue',\n                  labels: ['Q1', 'Q2', 'Q3', 'Q4'],\n                  values: [1.2, 2.4, 3.1, 4.2],\n                },\n              ],\n              grid: { column: 0, row: 1, columnSpan: 8, rowSpan: 5 },\n            },\n          },\n        ],\n      },\n    ],\n  },\n  'deck.pptx'\n);\n```\n\n### CLI\n\n```bash\n# Start the visual playground with live preview\njto docx dev\njto pptx dev\n\n# Generate files directly\njto docx generate ./my-template.json -o ./report.docx\njto pptx generate ./my-template.json -o ./deck.pptx\n```\n\n### Visual playground\n\nThe dev server gives you a Monaco editor with JSON autocomplete and validation, live document preview, built-in templates, and theme switching, all in the browser. **LibreOffice is not required**: the playground renders previews natively. If LibreOffice (headless) is installed, the playground can optionally use it for high-fidelity PDF rendering, the only way to get pixel-accurate output, especially for PPTX where no browser renderer exists. It also integrates **Claude** (Opus/Sonnet/Haiku) as a built-in AI chat assistant: describe a document in plain English and get schema-validated JSON back, rendered live. Both LibreOffice and Claude are playground-only extras; the core rendering libraries have zero dependency on either.\n\n## Who it's for\n\n- **API-driven SaaS teams**: Document definitions live in the database, rendered on demand. No template files to deploy, no LibreOffice sidecar.\n- **LLM-powered generation**: An LLM can reliably emit a schema-validated JSON document definition. No hallucinated method names, no wrong constructor signatures — just data constrained by a schema.\n- **Decoupled pipelines**: A data team or visual editor produces JSON; a Node.js service renders it. No shared code, language, or deployment.\n\n## Use cases\n\n- **On-demand reports from a dashboard**: User clicks \"Export\" → your backend fetches data, builds JSON, renders `.docx` or `.pptx`, returns the file. No template files on disk.\n- **LLM document generation**: Prompt an LLM with the TypeBox schema → it outputs valid JSON → render it. No hallucinated method calls, no brittle code generation.\n- **Scheduled batch exports**: A cron job queries your DB, assembles JSON definitions, renders hundreds of personalized documents (invoices, contracts, reports) without spinning up LibreOffice.\n- **Multi-tenant SaaS templates**: Store document definitions per-tenant in your DB. Tenants customize structure and styling through a UI; your backend renders on demand.\n- **Internal tooling / back-office**: Non-developers define documents in the visual playground, save the JSON, and ops renders them via CLI or API — no deploys needed.\n- **Headless CMS → Office docs**: Content lives in a CMS as structured data. A pipeline transforms it into json-to-office JSON and renders downloadable `.docx`/`.pptx` files.\n- **CI/CD artifacts**: Generate changelogs, release notes, or test reports as `.docx` files directly in your pipeline from structured build data.\n\n## Examples\n\nSee the `[examples/](examples/)` directory for complete, runnable JSON definitions:\n\n- **[invoice.docx.json](examples/invoice.docx.json)**: Branded invoice with line items, payment instructions, and retainer terms\n\n## Packages\n\n| Package                                                 | Description                          |\n| ------------------------------------------------------- | ------------------------------------ |\n| `[@json-to-office/json-to-docx](packages/json-to-docx)` | DOCX generation from JSON            |\n| `[@json-to-office/json-to-pptx](packages/json-to-pptx)` | PPTX generation from JSON            |\n| `[@json-to-office/jto](packages/jto)`                   | CLI + dev server + visual playground |\n| `[@json-to-office/jto-cli](packages/jto-cli)`           | Lean CLI (no playground deps)        |\n\nInternal packages\n\n| Package                                               | Description                            |\n| ----------------------------------------------------- | -------------------------------------- |\n| `[@json-to-office/core-docx](packages/core-docx)`     | Core DOCX engine                       |\n| `[@json-to-office/core-pptx](packages/core-pptx)`     | Core PPTX engine                       |\n| `[@json-to-office/shared](packages/shared)`           | Format-agnostic schemas and validation |\n| `[@json-to-office/shared-docx](packages/shared-docx)` | DOCX-specific schemas                  |\n| `[@json-to-office/shared-pptx](packages/shared-pptx)` | PPTX-specific schemas                  |\n\n## Development\n\n```bash\ngit clone https://github.com/Wiseair-srl/json-to-office.git\ncd json-to-office\npnpm install\npnpm build\npnpm dev    # Start dev server with hot reload\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full development guide.\n\n## License\n\n[MIT](LICENSE), Wiseair srl\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwiseair-srl%2Fjson-to-office","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwiseair-srl%2Fjson-to-office","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwiseair-srl%2Fjson-to-office/lists"}