@profullstack/readm3 0.19.0 → 0.20.0

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
@@ -421,8 +421,17 @@ the whole open document: a short abstract and its key points. Signed in, the fir
421
421
  **10 documents a week are free** (Monday 00:00 UTC to the next); after that each one is
422
422
  charged from the balance like a change summary. Free summaries carry no price arm, so
423
423
  the experiment counts only paid ones. Up to 400 KB of text; the first 60,000
424
- characters are sent. Pressing Summarize again on an unchanged document shows the same
425
- summary without a second call.
424
+ characters are sent. Every summary is **kept for the account**, keyed by exactly what
425
+ the model was given: the same document (or the same change) asked for again, on any
426
+ device or after a reload, is answered from that copy with no model call, no charge and
427
+ no free summary used.
428
+
429
+ **Listen** (optional) reads a summary aloud with ElevenLabs. The first listen is
430
+ charged from the balance at the account's price multiple of the voice's cost; the audio
431
+ is kept with the summary, so every replay is free. The whole server reads at most
432
+ `READM3_TTS_DAILY_CHARS` characters a day (default 5,000) so a shared ElevenLabs plan
433
+ cannot run dry; past that, Listen pauses until midnight UTC and the summary stays
434
+ readable.
426
435
 
427
436
  It works on every kind of file, not just text:
428
437
 
@@ -445,13 +454,18 @@ It works on every kind of file, not just text:
445
454
  | `GET /api/v1/billing/topups/<id>` | `pending` or `paid` |
446
455
  | `POST /api/v1/summaries` `{ path, before, after }` | the abstract, `chargedMicros`, new balance |
447
456
  | `POST /api/v1/summaries/document` `{ path, text }` or `{ path, data, mime? }` | a summary of a whole document, from its text or from the file as base64 `data` (PDF, PNG/JPEG/GIF/WebP, Office, OpenDocument, EPUB; the type comes from `mime` or the name); `free`, `chargedMicros`, `freeSummaries { perWeek, left, resetsAt }`, new balance |
457
+ | `POST /api/v1/summaries/<summaryId>/speech` | a kept summary read aloud as `audio/mpeg`; `x-charged-micros` (0 on a replay) and `x-balance-micros` headers |
448
458
  | `GET /api/v1/billing/experiment` | admins: per arm accounts, payers, top-ups, summaries, revenue, model cost |
449
459
  | `POST /api/v1/billing/coinpay/webhook` | CoinPay's signed webhook (`t=…,v1=` HMAC-SHA256) |
450
460
 
451
461
  Server configuration: `ANTHROPIC_API_KEY` turns summaries on (`READM3_SUMMARY_MODEL`,
452
462
  default `claude-opus-5-5`, run at low effort) and `OPENAI_API_KEY` is the fallback when
453
463
  the Claude call fails (`READM3_OPENAI_MODEL`, default `gpt-5.2`); either one alone works.
454
- `READM3_FREE_SUMMARIES_PER_WEEK` changes the free allowance (default 10). `COINPAY_API_KEY`, `COINPAY_BUSINESS_ID`
464
+ `READM3_FREE_SUMMARIES_PER_WEEK` changes the free allowance (default 10).
465
+ `ELEVENLABS_API_KEY` turns Listen on (`READM3_TTS_VOICE`, default Matilda
466
+ `XrExE9yKIg1WjnnlVkGX`; `READM3_TTS_MODEL`, default `eleven_flash_v2_5`;
467
+ `READM3_TTS_MICROS_PER_CHAR`, our cost per character, default 100;
468
+ `READM3_TTS_DAILY_CHARS`, default 5,000). `COINPAY_API_KEY`, `COINPAY_BUSINESS_ID`
455
469
  and `COINPAY_WEBHOOK_SECRET` open top-ups (`COINPAY_API_URL` defaults to
456
470
  coinpayportal.com). Without them the history still works and the paid parts say so.
457
471
 
package/dist/cli.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type ColorMode } from "./print.ts";
2
2
  import { type ViewerOptions } from "./viewer.ts";
3
- export declare const VERSION = "0.19.0";
3
+ export declare const VERSION = "0.20.0";
4
4
  /** The help text, exported so a test can hold it to the flags it documents. */
5
5
  export declare const USAGE: string;
6
6
  export interface ParsedArgs extends ViewerOptions {
package/dist/cli.js CHANGED
@@ -11,7 +11,7 @@ import { printDocument, COLOR_MODES } from "./print.js";
11
11
  import { run } from "./viewer.js";
12
12
  import { isCloudCommand, cloudMain, CLOUD_USAGE } from "./cloud-cli.js";
13
13
  import { isDesktopCommand, desktopMain, installedDesktop, prefersDesktop, DESKTOP_USAGE } from "./desktop-cli.js";
14
- export const VERSION = "0.19.0";
14
+ export const VERSION = "0.20.0";
15
15
  /** The help text, exported so a test can hold it to the flags it documents. */
16
16
  export const USAGE = `readm3 — a plain text editor for Markdown and code
17
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@profullstack/readm3",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "description": "Markdown editing and sharing for people and teams. Web/PWA, CLI, API and MCP with version history, view/edit links, and a terminal reader.",
5
5
  "type": "module",
6
6
  "license": "MIT",