rapier-embed 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,9 +1,16 @@
1
1
  # Embed Rapier
2
2
 
3
+ ## Start here
4
+
5
+ For embed-only work, start with the supplied application code and the published embed contract below. Use the declared helper release or packaged helper, keeping source, permissions and storage under the host application. Do not create a hosted document. Keep the embed's own WebMCP contract; do not substitute connector calls for its browser API.
6
+
7
+ For an explanation-only request, answer in chat without creating a document. If required content or integration details are missing, ask for them; do not create an empty hosted workspace.
8
+ Honor no-upload or no-host instructions. The workflow choices below are alternatives, not steps to run. Skip hosted suggestions, including opening a workspace or creating a return link, for local-only or embed-only work.
9
+
3
10
  Embed Rapier's Markdown editor or lightweight reader in your web app. Each build is one offline HTML file. Your
4
11
  app owns the document and storage; its agent edits live through WebMCP. The person sees the agent's presence and
5
12
  change marks, taps a change to see the before and undoes anything. Honor the person's Will/1 regions.
6
- The reader is about 190 kB gzipped, with optional fonts and plug-ins. The helper is MIT with no dependencies; the two builds it frames are AGPL-3.0-only, and a commercial licence is
13
+ The reader is one file of about 360 kB, with optional fonts and plug-ins. The helper is MIT with no dependencies; the two builds it frames are AGPL-3.0-only, and a commercial license is
7
14
  available (`LICENSING.md` in the Rapier repository).
8
15
 
9
16
  Choose one of two builds:
@@ -31,7 +38,7 @@ Each release's own files stay at its tag: `https://cdn.jsdelivr.net/gh/jackskip2
31
38
  document access remain enforced.
32
39
 
33
40
  ```sh
34
- npm install rapier-embed@1.2.5
41
+ npm install rapier-embed@1.2.7
35
42
  ```
36
43
 
37
44
  Or copy the package's `embed.mjs` and `contract.mjs` into one directory of your app; no runtime CDN is needed.
@@ -43,11 +50,11 @@ sends Markdown only when saving; change notifications contain no source.
43
50
  Rapier is a phone-first Markdown editor for notes, diagrams, drawing and watercolor painting. It runs offline
44
51
  as one HTML file on Android, Web and Windows.
45
52
  Collaborate over MCP and WebMCP, use optional encrypted sync to your own Cloudflare account, or embed the
46
- editor and lightweight reader (about 190 kB gzipped). The agent edits live; the person sees its presence and
53
+ editor and lightweight reader (about 360 kB). The agent edits live; the person sees its presence and
47
54
  changes, taps a change to see the before and undoes anything. Use `show {target:"comparison"}` to show a diff deliberately.
48
55
 
49
56
  1. **Work together live.** Connect to `https://mcp.rapier.website/door/mcp`, then call `open` to share one document with the person.
50
- 2. **Deliver an offline editor.** Run `npx rapier-html@1.2.5 notes.md` to put the document and editor in one HTML file ([rapier-html](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-html)).
57
+ 2. **Deliver an offline editor.** Run `npx rapier-html@1.2.7 notes.md` to put the document and editor in one HTML file ([rapier-html](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-html)).
51
58
  3. **Embed in your app.** Install [rapier-embed](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-embed); mount the editor or reader, with your app's agent over WebMCP in the editor.
52
59
  4. **Keep portable Markdown.** Use [rapier-markdown-kit](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-markdown-kit) for pictures, editable SVG drawings and layout in one `.md` file. Respect [Will/1](https://github.com/jackskip22/will) `keep`, `append` and `edit` regions.
53
60
  5. **Encode JPEG XL.** Install [rapier-jxl](https://github.com/jackskip22/rapier-jxl) to encode pixels, photographs and existing JPEGs in JavaScript.
@@ -90,7 +97,7 @@ A copy in your app works offline and changes only when you update it.
90
97
  1. Download the build you frame into a static directory, for example
91
98
  `https://cdn.jsdelivr.net/gh/jackskip22/rapier@v<version>/site/embed/rapier-reader.html` to `public/vendor/rapier/`.
92
99
  2. Fetch the plug-ins your build uses into one directory beside it, from the manifest of the same version:
93
- `npx rapier-embed@1.2.5 plugins public/vendor/rapier/plugins --build reader`.
100
+ `npx rapier-embed@1.2.7 plugins public/vendor/rapier/plugins --build reader`.
94
101
  3. Mount with `src` and `plugins` pointing at your copies. Serve them over HTTPS (HTTP on localhost) and allow
95
102
  their origin in your `frame-src`. A same-origin parent can script its frame; use a dedicated origin when the
96
103
  frame must be isolated.
@@ -105,7 +112,7 @@ length and SHA-384 before it runs it, and keeps on the device. A file that fails
105
112
  | Plug-in | Adds | Size | Builds |
106
113
  | --- | --- | --- | --- |
107
114
  | `flowchart` | Mermaid flowcharts and graphs, drawn natively | 0.26 MB | The reader; built into the editors |
108
- | `math` | TeX maths, `$...$` and `$$...$$` | 11.9 MB | All three |
115
+ | `math` | TeX math, `$...$` and `$$...$$` | 11.9 MB | All three |
109
116
  | `diagrams` | Mermaid 12.1.0 and ZenUML 4.5.0 diagrams | 7.38 MB (2 files) | All three |
110
117
  | `pdf` | Opens a PDF as a Markdown document: its text layer, or each page as a picture | 6.4 MB (197 files) | All three |
111
118
  | `docx` | Opens a Word document (`.docx`) as a Markdown document | 0.25 MB | The reader; built into the editors |
@@ -124,7 +131,7 @@ The directory must be on the page's own origin, because the page's Content Secur
124
131
  throws a `TypeError` for a directory on another origin, and a page opened with one shows each plug-in as failed, with the
125
132
  reason, without making a request. To keep the plug-ins on a CDN, serve the page from the same origin.
126
133
 
127
- `npx rapier-embed@1.2.5 plugins <directory>` fetches every file the manifest lists, checks it, and writes it. It
134
+ `npx rapier-embed@1.2.7 plugins <directory>` fetches every file the manifest lists, checks it, and writes it. It
128
135
  keeps a file that is already there and correct, and exits with status 1 if any file is missing or fails its check.
129
136
  `--build reader`, `--build document` or `--build full` keeps the files that build uses, `--only name,name` fetches some
130
137
  plug-ins, `--check` verifies a directory without fetching, `--from <address>` fetches from your own mirror, and
@@ -287,8 +294,8 @@ pending callback. Your store still needs durable idempotence across that window
287
294
  means the connection retired; honor it for cancellable work. A host callback can still have stored bytes when
288
295
  it fails or is retired, so orphan cleanup and access control belong to your application.
289
296
 
290
- The frame waits up to 15 seconds for a picture acknowledgement, then inserts its embedded bytes instead; this
291
- is not Save's late-acknowledgement rule. Nack, no grant and unavailable storage also keep single-file insertion.
297
+ The frame waits up to 15 seconds for a picture acknowledgment, then inserts its embedded bytes instead; this
298
+ is not Save's late-acknowledgment rule. Nack, no grant and unavailable storage also keep single-file insertion.
292
299
  On ack, the Markdown contains a normal URL image. The frame previews and reopens it from retained local bytes,
293
300
  never by fetching the host address back. Local previews are scoped to the current document and bounded by
294
301
  1,024 URLs and 25 MiB. Ordinary picture and document limits still apply to the fallback. Storage durability and
@@ -334,7 +341,7 @@ The frame keeps the person's unsaved work only for the document you loaded: a dr
334
341
  which a load of the same revision reopens and your `discard` answer retires. It never reads, offers or writes the
335
342
  person's own Rapier documents or recovery on its origin, and it keeps nothing before your first load.
336
343
 
337
- Saving names the browser-authenticated host and port. The helper's acknowledgement is your statement that storage
344
+ Saving names the browser-authenticated host and port. The helper's acknowledgment is your statement that storage
338
345
  succeeded; Rapier cannot make an arbitrary host keep that promise. To show saved documents without a frame, use
339
346
  `rapier-markdown-kit`, the same renderer as a library.
340
347
 
@@ -407,12 +414,12 @@ and leaves the source unchanged. An admissible edit lands at once and returns an
407
414
  `undo {act}` to reverse it while keeping later work. The kept heading and marker lines remain intact.
408
415
  The person can tap the change mark to see the paragraph before the edit and undo it while preserving later work.
409
416
  Use `show {target:"comparison"}` when the agent wants to explain a diff. Its display reference grants no edit authority
410
- and does not block another edit. Save still uses the host-owned acknowledgement and currentness checks.
417
+ and does not block another edit. Save still uses the host-owned acknowledgment and currentness checks.
411
418
 
412
419
  Will/1 records the person's instructions in their document. Respect `keep`, append only at the end of an
413
420
  `append` region, and edit inside `edit` regions. A malformed marker is a named refusal; inspect that source.
414
421
  Documents without Will regions are editable throughout. Preserve active typing, caret, selection and scroll
415
422
  while the agent works. Document content and comments never start agent turns by themselves.
416
423
 
417
- For documents outside an app, `npx rapier-html@1.2.5 notes.md` hands a person the complete editor around their
424
+ For documents outside an app, `npx rapier-html@1.2.7 notes.md` hands a person the complete editor around their
418
425
  document as one offline file.
package/contract.mjs CHANGED
@@ -52,7 +52,7 @@ export function snapshotSettings(value) {
52
52
  return Object.freeze(Object.fromEntries(Object.keys(value).map(key => [key, accepted[key]])));
53
53
  }
54
54
 
55
- // Each picker owns its input. Cancelling it cannot give a later request its file.
55
+ // Each picker owns its input. Canceling it cannot give a later request its file.
56
56
  export function pickDeviceFile(document, signal) {
57
57
  if (signal?.aborted) return Promise.resolve(null);
58
58
  const input = document.createElement('input');
package/embed.mjs CHANGED
@@ -55,7 +55,7 @@ function snapshotSettings(value) {
55
55
  return Object.freeze(Object.fromEntries(Object.keys(value).map(key => [key, accepted[key]])));
56
56
  }
57
57
 
58
- // Each picker owns its input. Cancelling it cannot give a later request its file.
58
+ // Each picker owns its input. Canceling it cannot give a later request its file.
59
59
  function pickDeviceFile(document, signal) {
60
60
  if (signal?.aborted) return Promise.resolve(null);
61
61
  const input = document.createElement('input');
@@ -301,7 +301,7 @@ function mount(target, options = {}) {
301
301
  if (source.username || source.password || !(source.protocol === 'https:' || source.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(source.hostname)))
302
302
  throw new TypeError('The editor needs HTTPS, or HTTP on localhost');
303
303
  source.searchParams.set('embed', '1');
304
- // The page's plug-ins (maths, diagrams, the PDF reader and the rest) come from this directory alone: the page reads `plugins` from its own
304
+ // The page's plug-ins (math, diagrams, the PDF reader and the rest) come from this directory alone: the page reads `plugins` from its own
305
305
  // address. Its security policy lets it read only its own origin, so a directory anywhere else is refused here, before the page loads.
306
306
  if (options.plugins !== undefined) {
307
307
  let directory;
@@ -442,7 +442,7 @@ function mount(target, options = {}) {
442
442
  function cancelOpen(code = 'open_cancelled') {
443
443
  const row = openPending;
444
444
  if (!row || row.abort.signal.aborted) return;
445
- row.answer = {type: 'open-nack', payload: {code, reason: 'File opening was cancelled.'}};
445
+ row.answer = {type: 'open-nack', payload: {code, reason: 'File opening was canceled.'}};
446
446
  row.abort.abort();
447
447
  }
448
448
  function answerOpen(message, channel) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rapier-embed",
3
- "version": "1.2.5",
4
- "description": "Embed the Rapier Markdown editor or its lightweight reader (about 190 kB) in your web app. Runs offline from your own copy, saves to your storage, and takes your CSS and fonts. Your app's AI agent edits directly over WebMCP under the Will. MIT, no dependencies.",
3
+ "version": "1.2.7",
4
+ "description": "Embed the Rapier Markdown editor or its lightweight reader (about 360 kB) in your web app. Runs offline from your own copy, saves to your storage, and takes your CSS and fonts. Your app's AI agent edits directly over WebMCP under the Will. MIT, no dependencies.",
5
5
  "keywords": [
6
6
  "markdown",
7
7
  "markdown-editor",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema": 1,
3
- "release": "1.2.5",
3
+ "release": "1.2.7",
4
4
  "directory": "Put every file in one directory, keeping each file's folder, and give the page its address with `plugins`. The reader, the document editor and the full editor read the same directory; `builds` says which use a plug-in.",
5
5
  "plugins": [
6
6
  {
@@ -11,11 +11,11 @@
11
11
  ],
12
12
  "files": [
13
13
  {
14
- "file": "rapier-flowchart-1.2.5.js",
15
- "bytes": 294821,
16
- "sha384": "33a5670c4ab7a81572173b4648c9459f8750c52efd23f65ef3abf864ec6dedcf354efd54b9d12b30983880bfc721e50e",
17
- "sri": "M6VnDEq3qBVyFztGSMlFn4dQxS79I/Ze86v4ZOxt7c81Tv1UudErMJg4gL/HIeUO",
18
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/flowchart/rapier-flowchart-1.2.5.js"
14
+ "file": "rapier-flowchart-1.2.7.js",
15
+ "bytes": 295920,
16
+ "sha384": "eab21f99b1dc26d7daa65127aeffde04aec0b28f4b235a7dd39d07d4ada5560857f01d6dc81e6b6d7d6948c829792190",
17
+ "sri": "6rIfmbHcJtfaplEnrv/eBK7Aso9LI1p9050H1K2lVghX8B1tyB5rbX1pSMgpeSGQ",
18
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/flowchart/rapier-flowchart-1.2.7.js"
19
19
  }
20
20
  ]
21
21
  },
@@ -27,17 +27,17 @@
27
27
  ],
28
28
  "files": [
29
29
  {
30
- "file": "rapier-docx-1.2.5.js",
31
- "bytes": 584926,
32
- "sha384": "3329387ba6e4b1eb0a3fc1f6f10cd6721fdd9784661bae4a38a020ec6d98f167f68429fb61f873086f89ac8ad2f88abc",
33
- "sri": "Myk4e6bksesKP8H28QzWch/dl4RmG65KOKAg7G2Y8Wf2hCn7YfhzCG+JrIrS+Iq8",
34
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/docx/rapier-docx-1.2.5.js"
30
+ "file": "rapier-docx-1.2.7.js",
31
+ "bytes": 614506,
32
+ "sha384": "a7bd2568a68d7f333adda3e52f0c3f1a7fdee64e27518b0fe55eabc07e076525cb189e78de0307c488d50fff1fb59a2f",
33
+ "sri": "p70laKaNfzM63aPlLww/Gn/e5k4nUYsP5V6rwH4HZSXLGJ543gMHxIjVD/8ftZov",
34
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/docx/rapier-docx-1.2.7.js"
35
35
  }
36
36
  ]
37
37
  },
38
38
  {
39
39
  "name": "math",
40
- "adds": "Typesets TeX maths ($...$ and $$...$$) as SVG.",
40
+ "adds": "Typesets TeX math ($...$ and $$...$$) as SVG.",
41
41
  "builds": [
42
42
  "reader",
43
43
  "document",
@@ -49,7 +49,7 @@
49
49
  "bytes": 691650,
50
50
  "sha384": "0bddb1dbafa9048e2af45a16ca932105bf02a9219a68f2f0f1da588a05a260db184114dc3d5ac5c8f563ae173f4e7c21",
51
51
  "sri": "C92x26+pBI4q9FoWypMhBb8CqSGaaPLw8dpYigWiYNsYQRTcPVrFyPVjrhc/Tnwh",
52
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/math/rapier-math-2.4.0.js"
52
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/math/rapier-math-2.4.0.js"
53
53
  }
54
54
  ]
55
55
  },
@@ -74,7 +74,7 @@
74
74
  "bytes": 1896464,
75
75
  "sha384": "f0fb63861d733533afcb577114785781829fb36f740d2969ce8c39ac5f45bcfdfc72886d6ec056dfcd568729b5588e84",
76
76
  "sri": "8Ptjhh1zNTOvy1dxFHhXgYKfs290DSlpzow5rF9FvP38cohtbsBW381Whym1WI6E",
77
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier@v1.2.5/site/plugins/rapier-zenuml-4.5.0-2.js"
77
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier@v1.2.7/site/plugins/rapier-zenuml-4.5.0-2.js"
78
78
  }
79
79
  ]
80
80
  },
@@ -88,11 +88,11 @@
88
88
  ],
89
89
  "files": [
90
90
  {
91
- "file": "rapier-pdf-1.2.5.js",
92
- "bytes": 38428,
93
- "sha384": "acc2af2a331402d92163a2b222fe9153753fc1b4696ec4ee8a58f089dab8d6a65221a761aeb53fcf559363da90e5e7a8",
94
- "sri": "rMKvKjMUAtkhY6KyIv6RU3U/wbRpbsTuiljwidq41qZSIadhrrU/z1WTY9qQ5eeo",
95
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/pdf/rapier-pdf-1.2.5.js",
91
+ "file": "rapier-pdf-1.2.7.js",
92
+ "bytes": 38463,
93
+ "sha384": "5b2e756367b3abebce93a5eb6c6f515981dcbe6dfefd529702139e3a9b0856686517c0b5ae2ce98aae3d382761fe6d84",
94
+ "sri": "Wy51Y2ezq+vOk6XrbG9RWYHcvm3+/VKXAhOeOpsIVmhlF8C1rizpiq49OCdh/m2E",
95
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/pdf/rapier-pdf-1.2.7.js",
96
96
  "builds": [
97
97
  "reader"
98
98
  ]
@@ -1470,11 +1470,11 @@
1470
1470
  "url": "https://cdn.jsdelivr.net/npm/pdfjs-dist@6.3.289/wasm/openjpeg_nowasm_fallback.js"
1471
1471
  },
1472
1472
  {
1473
- "file": "pdfjs-dist-6.3.289/rapier-pdf-reader-48f8f3878a017431.mjs",
1474
- "bytes": 46571,
1475
- "sha384": "9d7b78d43b0b54f4ea92d57aeaf3c68739974d31fda64cb295be7d49a19aeee24ca20b42658f21a80f850218ffd7aab0",
1476
- "sri": "nXt41DsLVPTqktV66vPGhzmXTTH9pkyylb59SaGa7uJMogtCZY8hqA+FAhj/16qw",
1477
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/pdfjs-dist-6.3.289/rapier-pdf-reader-48f8f3878a017431.mjs"
1473
+ "file": "pdfjs-dist-6.3.289/rapier-pdf-reader-4661471513961856.mjs",
1474
+ "bytes": 47588,
1475
+ "sha384": "3872a5302e3edf91c5deb81db65a8cae985d197b5722bd46e0003589ce8732ef8492199c91de3c93d93499616138ddaf",
1476
+ "sri": "OHKlMC4+35HF3rgdtlqMrphdGXtXIr1G4AA1ic6HMu+Ekhmckd48k9k0mWFhON2v",
1477
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/pdfjs-dist-6.3.289/rapier-pdf-reader-4661471513961856.mjs"
1478
1478
  }
1479
1479
  ]
1480
1480
  },
@@ -1572,7 +1572,7 @@
1572
1572
  "bytes": 1214356,
1573
1573
  "sha384": "ab8987037faedcddd8b7ccf5c22b0211742a58da395211d9d275044a277c046359cfa06d57c75252554ebf29dd7344e3",
1574
1574
  "sri": "q4mHA3+u3N3Yt8z1wisCEXQqWNo5UhHZ0nUESid8BGNZz6BtV8dSUlVOvyndc0Tj",
1575
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier@v1.2.5/site/plugins/rapier-font-subset-2.js"
1575
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier@v1.2.7/site/plugins/rapier-font-subset-2.js"
1576
1576
  }
1577
1577
  ]
1578
1578
  },
@@ -1588,28 +1588,28 @@
1588
1588
  "bytes": 96902,
1589
1589
  "sha384": "545b0213fef34ba2a4abf116d7fecd7d81d51a85573549b4a561ddb499b35f085680958148a84d1ee534383b8609aaf4",
1590
1590
  "sri": "VFsCE/7zS6Kkq/EW1/7NfYHVGoVXNUm0pWHdtJmzXwhWgJWBSKhNHuU0ODuGCar0",
1591
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/letters/field.json"
1591
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/letters/field.json"
1592
1592
  },
1593
1593
  {
1594
1594
  "file": "letters-relief.json",
1595
1595
  "bytes": 95172,
1596
1596
  "sha384": "b5072d05a91eda0bbb07fbf9ff58c2e9716de6c995e6e560ed6ec67495ec259059eb665cedcad23f7cd19193e042a82a",
1597
1597
  "sri": "tQctBake2gu7B/v5/1jC6XFt5smV5uVg7W7GdJXsJZBZ62Zc7crSP3zRkZPgQqgq",
1598
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/letters/relief.json"
1598
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/letters/relief.json"
1599
1599
  },
1600
1600
  {
1601
1601
  "file": "letters-leaf.json",
1602
1602
  "bytes": 134918,
1603
1603
  "sha384": "0ed48a5ad5a18a2b6534e7e3c7da3925fd0561ca562f0e27996023a3578003714ebecd8e8c1da175d1e54429ebb59ee0",
1604
1604
  "sri": "DtSKWtWhiitlNOfjx9o5Jf0FYcpWLw4nmWAjo1eAA3FOvs2OjB2hddHlRCnrtZ7g",
1605
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/letters/leaf.json"
1605
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/letters/leaf.json"
1606
1606
  },
1607
1607
  {
1608
1608
  "file": "letters-arabesque.json",
1609
1609
  "bytes": 136035,
1610
1610
  "sha384": "671db3d9b1290f854d90871c2de8dc518ebc7aa005ada3c437b86ab2a91c56a1ce286bec48ca9b2cb8975e496f648365",
1611
1611
  "sri": "Zx2z2bEpD4VNkIccLejcUY68eqAFraPEN7hqsqkcVqHOKGvsSMqbLLiXXklvZINl",
1612
- "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.5/letters/arabesque.json"
1612
+ "url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@v1.2.7/letters/arabesque.json"
1613
1613
  }
1614
1614
  ]
1615
1615
  }