Skip to content

v0.6.0

Choose a tag to compare

@moiku moiku released this 28 Oct 10:45
· 247 commits to main since this release

Egatari Studio v0.6.0

Egatari 1.0 Working Draft wd-2026-10-28 に従います。

v0.6.0 は、Egatari ファイルの形を 1.0 にし、教材を作る画面を作り直した版です。先生が気づく変更から先に書きます。

先生にとって変わること

1. Egatari ファイルが 1.0 の形になりました

  • Egatari ファイル(.ega.html)は、再生するプレーヤーを中に持ちます。ファイルは、どのプレーヤーで作られたか(player)と、どの Studio で作られたか(generator)を記録します。
  • ファイルには、外へつながらない安全のポリシー(Content-Security-Policy)が入ります。配った教材が、知らないうちにどこかへ通信することはありません。ライブや埋め込みを使うときだけ、使う行き先がそのポリシーに加わります。
  • 見た目と再生は、これまでと同じです。

2. 前の版のファイルは、読むだけで開き、お知らせが出ます

v0.4.8 までに作った Egatari ファイル(「前の版のファイル」)は、これまでどおり再生できます。編集アプリで開くと読むだけになり、編集と保存はできません(元のファイルは書き換わりません)。画面のお知らせに 2 つのボタンが出ます。

  • 前の版の Studio で開く:その教材を作った版の Studio(studio.egatari.org/v<版>/)が新しいタブで開きます。そこで直して保存してください。
  • 移行の手引きを開く:新しい形に移すときの手順です(docs/migrating-0.x.ja.md。人でも AI のコーディングエージェントでも順に進められるように書いてあります)。

前の版の作業フォルダ(どのスライドにも id がないもの)にも、同じお知らせが出ます。npm run ids で id を足すと消えます。今の版の教材に手でスライドを足しただけなら、お知らせは出ず、エクスポートのときに id が付きます。

3. 新しい画面

  • 道具の列が 4 つになりました:ファイル ▾・スライド ▾・品質チェック・プレビュー ▾。ほかのアプリと同じ名前の並びです。保存は「保存」と「名前を付けて保存…」、配るときは ファイル ▾ → エクスポート ▸ → 参加者用(再生専用)… です。
  • 品質チェックは、組み直すたびに自動で動きます(1 秒ほど待ちます)。見つかった数がボタンに出ます。
  • **新規作成…**は、チャットの AI に頼む方法だけの、5 つの質問になりました:①どこで使うか ②何について、誰向けか ③見た目 ④チャットの AI に指示を送る ⑤AI の出力を貼る。答えた質問は 1 行にたたまれ、「変更」で戻れます。AI の出力は、スライドと台本の 2 つの欄に貼れば、まとめて貼っても振り分けられます。
  • **ファイルの情報…**で、題名・ライセンス・作り手、形式、作った Studio の版を見られます。
  • スライド ▾ → テーマを変更…で、開いている教材のテーマを替えられます(保存するまでは元に戻すで戻せます)。
  • 長い教材(9 枚以上)は、構成案を先に作り、そのあと 6 枚ずつ頼む 2 段で作ります。

4. ツールバーの出し方が分かりやすくなりました

プレーヤーの下のツールバー(再生や発表の操作)は、これまで近づかないと出ず、出し方が分からない人がいました。

  • 教材を開くと、ツールバーが約 5 秒見えます。その端末で初めて開いたときだけ、出し方を 1 行で案内します。
  • ツールバーが隠れている間も、左下に小さな薄いボタンツールバーを表示が残ります。クリック・タップ・キーボードで出せます。動画と印刷には出ません。
  • iPad やスマホでは、スライドをタップするとツールバーが戻ります(スライドは進みません)。Safari でもボタンが 1 回のタップで 1 回だけ効きます。
  • 編集中は、ペン・レーザーポインター・自動再生などの発表の道具が自動で切れ、道具のボタンも隠れます(編集と発表の道具がぶつかる不具合を直しました)。

5. 無料のプランの分野に、音楽と英語が加わりました(選べるのは今までどおり 2 つ)

新規作成…の「内容の分野」に、音楽(鍵盤で音階・和音・音程)と英語(文型:S V O C M、句・節)が加わりました。無料のプランでは、分野と道具をあわせて 2 つまで選べます(選べる数は変わりません)。有料のプランでは全部の分野のパーツが入ります。チャットの AI が無料か有料かは、④で聞きます。

パーツライブラリのパーツも増えました:筆算・数直線・テープ図、鍵盤、ひらがなの書き順、英文の構造、ヒートマップ、世界地図、ほか。一部は有料のプランの指示にだけ入ります。

6. 章の扉が読めるようになりました

章の扉(<section class="slide sec">)の題を <h2> で書くと、字が地に溶けて読めませんでした(#128)。直しました。品質チェックも、扉の題が <h1> でないとき、字と地のコントラストが足りないときに知らせます。

7. 保存のとき、プレーヤーが変わるなら先に聞きます

別のプレーヤーを持つファイルを組み直して保存するとき、プレーヤーが変わりますと、今のプレーヤーと保存後のプレーヤーを見せて、保存するかキャンセルするか聞きます。同じプレーヤーの新しい版に変わるだけのときは聞きません。

8. そのほか

  • 発表者ビューで、黒い画面(b)の状態が見え、発表者ビューの b でも切り替えられます。
  • 編集中にも、マーカー(m)で円や矢印を描いてコメントを付けられます。
  • 「授業」は表示のモードではなくなり、先のステップを薄く見せる(l)のオプションになりました。現在のステップの蛍光ペン風の強調はなくなりました。
  • 基調色のテーマ default 1.2.0:結論の行に左の太い線と薄い灰色の地を付けました(デザインの提案:@totasuko-lab)。テーマ business 1.0.1、default 1.1.0 も含みます。前の版の色のままの教材は、その色を保ちます(「テーマを更新」で新しい色にできます)。
  • 画面とドキュメントの言葉を 1 つの用語集(docs/terms.json)にそろえました(ステップ・台本・パーツ・Egatari ファイル・再生専用・エクスポートなど)。
  • Colab で AI 音声を作る流れが、CPU でも使えるようになり、手順が画面に出ます。

技術的なこと

  • 形式:Egatari 1.0(Working Draft wd-2026-10-28)。索引と deck-meta に player(egatari-player 1.0.0)と generator(egatari-studio、この版)を書く。contracts は {"source": 1}(contracts.runtime は書かない・読まない)。player のない索引は 1.0 より前の草案として読み、preDraft と知らせる。
  • ファイルのポリシー:<meta charset> の直後に Content-Security-Policy の <meta>(外へつながらない基準)。extensions.embed を deck-extensions に写し、宣言した行き先だけを該当のディレクティブに足す(embed は frame-src、Live は connect-src)。ポリシーが欠けている・位置が違う・違うときは、読み手が適合しないと報告する。
  • プレーヤー:Egatari Player 1.0.0 を最初のリリースとして固定(kit/player.json、kit/player.lock.json、npm run player:check -- --strict)。中身が違うビルドは +dev.<commit> が付く。
  • 保存:組み直さない保存(tier A)は player と generator をバイトのまま保つ。組み直しで別のプレーヤーのファイルなら playerChange を出す。egatari.json は、自分の項目だけを書き、ほかの項目はバイトのまま残す(updateConfig)。
  • 書き出し:id のないスライドと台本の見出しに id を振り、作業フォルダへ書き戻す。1.0 の語彙の外(blue・red・gray、data-steps、data-anim、data-mode="lecture")は品質チェックが警告する。教材の seed(data-egatari-seed)はもう書かない。
  • パーツライブラリ:components v1.13.1 が既定(1.0.0 以降を記録した教材には、その版が残る)。新しい分野 music・english。m-kakijun のライセンスは MIT AND OFL-1.1(NOTICE に記載)。m-map-world の地図は Natural Earth(パブリックドメイン)。
  • チャットの AI への指示:無料のプランの大きさの上限は、分野 1 つで 40 KB、2 つで 50 KB。パーツの名前を出すのは、コピーした指示に入っているものだけ。
  • セキュリティ:KaTeX 0.18.2 → 0.19.0(109 の数式で出力が同じことを確認)、@fontsource/source-sans-3 5.3.1、ajv 8.20.0(開発のみ)。Node は ^22.23.4 || ^24.22.1 || >=26.12.1。CI とリリースの配布物は npm ci --ignore-scripts。Dependabot は 7 日(major は 14 日)待つ。
  • 配布物:サンプルの Egatari ファイルと、編集アプリの凍結した写し editor-site-v0.6.0.tar.gz。写しは /v0.6.0/ で配られ、下の sha256 で照らされる。
  • 全部の変更は CHANGELOG.md(下に同じ節を載せる)。

Egatari Studio v0.6.0

Follows Egatari 1.0 Working Draft wd-2026-10-28.

v0.6.0 moves Egatari files to the 1.0 shape and rebuilds the screens where you make a lesson. What you will notice comes first.

What changes for teachers

1. Egatari files now have the 1.0 shape

  • An Egatari file (.ega.html) carries its own player. It records which player (player) and which Studio (generator) made it.
  • Every file carries a security policy (a Content-Security-Policy) that connects nowhere. A lesson you hand out cannot quietly contact anything. Only when you use Live or an embed does the policy add the address that feature needs.
  • How lessons look and play does not change.

2. Files from an earlier version open read-only, with a notice

Egatari files made up to v0.4.8 (a "File from an earlier version") still play as before. In the editor they open read-only: you cannot edit or save them, and the original is not changed. The notice offers two buttons:

  • Open in the earlier Studio: the Studio that made the lesson (studio.egatari.org/v<version>/) opens in a new tab. Edit and save there.
  • Open the migration guide: the steps for moving a lesson to the new shape (docs/migrating-0.x.md, written so that a person or an AI coding agent can follow it step by step).

A working folder from an earlier version (no slide has an id) gets the same notice; adding ids with npm run ids makes it go away. A slide you add by hand to a current lesson gets no notice; export gives it an id.

3. The new screens

  • Four items in the toolbar row of the editor: File ▾, Slide ▾, Quality check and Preview ▾, named like the menus of other apps. To hand a lesson out, use File ▾ → Export ▸ → For participants (play only)….
  • Quality check runs by itself after each build (about a second later) and shows the number of findings on its button.
  • New… is now the chat-AI way only, in five questions: ① where you will use it, ② what it is about and who it is for, ③ how it should look, ④ send the instructions to your chat AI, ⑤ paste the AI's output. Answered questions fold to one line with Change. The output goes into two fields, Slides and Script; pasting everything at once is sorted for you.
  • File info… shows the title, license and creators, the format, and the Studio version that made the file.
  • Slide ▾ → Change theme… changes the theme of an open lesson (Undo restores it until you save).
  • Long lessons (more than 8 slides) are made in two passes: an outline first, then 6 slides at a time.

4. The toolbar is easier to bring back

The toolbar of the player (the playback and presentation controls) used to show only when you moved toward it, and some people could not find it.

  • When a lesson opens, the toolbar stays for about 5 seconds. The first time on a device, one line says how to bring it back.
  • While it is hidden, a small faint button, Show toolbar, stays at the bottom left. Click, tap or use the keyboard. It is not shown in video or in print.
  • On iPads and phones, tapping the slide brings the toolbar back (the slide does not advance). In Safari, a button now acts exactly once per tap.
  • While you edit, the presenting tools (pen, laser pointer, autoplay, and so on) turn off automatically and their buttons are hidden, so editing and presenting no longer fight.

5. Free subjects now include Music and English (still two choices)

In New…, the subjects now include Music (scales, chords and intervals on a keyboard) and English (sentence structure: S V O C M, phrases, clauses). On the free plan you can choose two subjects and tools in all, as before. The paid plan includes the parts of every subject. Step ④ asks whether your chat AI is on a free or a paid plan.

The parts library grew too: column arithmetic, number lines, tape diagrams, a keyboard, kana stroke order, sentence structure, heatmaps, a world map and more. Some are in the instructions of the paid plan only.

6. Chapter dividers are readable

A chapter divider (<section class="slide sec">) whose title was written with <h2> was unreadable, because the text kept the colour of ordinary titles on the divider's ground (#128). Fixed. Quality check now also warns when a divider's title is not an <h1> and when text and background do not have enough contrast.

7. Saving asks first when the player will change

When you rebuild and save a file that carried a different player, The player will change shows the file's player and the one the saved file will carry, and asks you to Save or Cancel. A newer version of the same player does not ask.

8. Also

  • In the presenter view, the black screen (b) state is shown, and b there toggles it too.
  • While editing, the marker (m) draws a circle or an arrow and opens a comment box.
  • "Lecture" is no longer a display mode; it is the option Show later steps faintly (l). The highlighter on the current step is gone.
  • Theme default 1.2.0: the conclusion row gets a thick bar on its left and a light grey ground (design proposed by @totasuko-lab). business 1.0.1 and default 1.1.0 colours are included. A lesson that recorded the earlier colours keeps them (Update theme applies the new ones).
  • Words on screen and in the docs follow one termbase (docs/terms.json).
  • Making AI voice on Google Colab also works on the CPU, and the steps are written in the panel.

Technical notes

  • Format: Egatari 1.0 (Working Draft wd-2026-10-28). The index and deck-meta carry player (egatari-player 1.0.0) and generator (egatari-studio, this version). contracts is {"source": 1}; contracts.runtime is no longer written or read. An index without player is read as a pre-1.0 draft and reported (preDraft).
  • File policy: a Content-Security-Policy <meta> right after <meta charset> with the baseline that connects nowhere. extensions.embed is copied into deck-extensions, and each declared destination goes into its own directive (embed → frame-src, Live → connect-src). A missing, misplaced or different policy is reported by readers as not conforming.
  • Player: Egatari Player 1.0.0 is pinned as its first release (kit/player.json, kit/player.lock.json, npm run player:check -- --strict); a build whose player files differ gets +dev.<commit>.
  • Saving: a save without rebuilding (tier A) keeps player and generator byte for byte; a rebuild of a file with another player reports playerChange. egatari.json writers change only their own members and keep the rest byte for byte (updateConfig).
  • Export: slides without an id and script headings get ids, written back to the working folder. Source outside the 1.0 vocabulary (blue, red, gray, data-steps, data-anim, data-mode="lecture") is warned about by the quality checker. The lesson seed (data-egatari-seed) is no longer written.
  • Parts library: components v1.13.1 is the default (lessons that recorded 1.0.0 and later keep their version). New subject groups music and english. m-kakijun is MIT AND OFL-1.1 (see NOTICE); the m-map-world map data is Natural Earth (public domain).
  • Instructions for the chat AI: free-plan size caps are 40 KB for one subject and 50 KB for two; only parts present in the copied text are named.
  • Security: KaTeX 0.18.2 → 0.19.0 (all 109 formulas render the same), @fontsource/source-sans-3 5.3.1, ajv 8.20.0 (dev only). Node is ^22.23.4 || ^24.22.1 || >=26.12.1. CI and the release asset install with npm ci --ignore-scripts; Dependabot waits 7 days (14 for a major).
  • Assets: the example Egatari files, and editor-site-v0.6.0.tar.gz, a frozen copy of the editor served at /v0.6.0/ and checked against the sha256 below.
  • The full list is in CHANGELOG.md (the same section follows).

CHANGELOG [0.6.0]

Added

  • Blackout in the presenter view: while the main window is blacked out (b), the presenter view shows "Blacked out" and dims its current-slide preview, and b in the presenter view toggles blackout on the main window (not in edit mode). As on the main window, the arrows, Space and PageUp/PageDown in the presenter view end blackout without moving the slide.
  • Components v1.10.0 is the default version: m-hissan (筆算: addition, subtraction, multiplication and division, decimals too, step by step like the textbook), m-numberline (数直線: points, □, jumps, inequality ranges, a 0.1 magnifier, two lines for proportions) and m-tape (テープ図・線分図 with braces and “2 倍” arrows), in the series academic. For now they are paid-only (FREE_OUT): a free pack never names them, and their purposes fall back to the nearest part or HTML there. Release notes: egatari/components v1.10.0
  • Components v1.11.0 adds m-keyboard (鍵盤: scales, chords and intervals lit on a piano keyboard, with the notes as component sounds), in the new series music, and m-kakijun (書き順 of kana, stroke by stroke), in the series kokugo. m-keyboard comes with the subject Music on both plans; m-kakijun is paid-only for now (FREE_OUT). m-kakijun's licence is MIT AND OFL-1.1 (its stroke data is derived from strokesvg / Klee One): it is recorded in the vendored manifest and NOTICE, and the hosted editor ships the part's OFL.txt, LICENSE-strokesvg.txt and strokes-CHANGES.md under vendor/components/kakijun/<version>/. m-timeline gains project-plan (Gantt) options: after arrows, progress, today and unit. Release notes: egatari/components v1.11.0
  • Components v1.12.0 adds m-syntax (英文の構造: S V O C M marks, phrase and clause brackets, modifier arrows, parts of speech, then the Japanese translation), in the new series english. It comes with the subject English (foreign language) on both plans. Release notes: egatari/components v1.12.0
  • Components v1.13.0 is the default version: m-heatmap (ヒートマップ: a grid of cells coloured by value, such as a confusion or correlation matrix), in the series academic, and m-map-world (世界地図: countries and regions, categories and values, points and arrows on a Pacific-centred world map; map data from Natural Earth, public domain), in the series social. Both are paid-only for now (FREE_OUT). m-tree gains branch labels and paths (paid only), m-flow gains decision diamonds and loops, and m-bars gains negative values and stack="percent". Release notes: egatari/components v1.13.0
  • Components v1.2.0 is the default version (1.0.0–1.1.0 are kept for lessons that recorded them). Eight new parts: m-compare, m-venn, m-tree, m-fishbone, m-scatter, m-pie, m-timeline and m-cycle. For now they are in the instructions only under the paid plan (New…, “Paid plan”); under the free plan, no text names them and the purpose table falls back to “not in this text: the nearest part, or HTML or inline SVG” for their purposes. m-kpi has presentation variants (count, rise, flip, underline) chosen with variant (format spec §8.4). m-bars has stack (stacked bars). Release notes: egatari/components v1.2.0
  • Free plan: FREE_CORE (kit/core/llm-pack-assemble.mjs) lists the common parts whose notes go into the free common body (m-bars, m-flow, m-menu, the v1.1.0 set). m-curves, m-kpi and m-quad, now common in the components, come in only with their v1.1.0 subjects under the free plan (FREE_HOME: Math and statistics, Business, Business). The paid plan has every part. npm run gen prints the size of each plan (free per subject and with all subjects, paid), and node kit/llm-pack.mjs --plan paid prints the paid pack.
  • A part's notes that name another part (“to compare values by aspect, use m-compare”) leave that clause out when the other part is not in the copied text (a purpose turned off, a subject not chosen, or a paid-only part); the “do not use” line of New… names only parts that are in the copied text.
  • Components v1.5.0: m-map-japan, the 47 prefectures of Japan for geography and history (regions, a choropleth, points, arrows and shapes, each by step; the territory dots and insets are fixed in the data), in a new series social. New subject 地図(社会:地理・歴史) / Maps (social studies: geography, history) in New… (step 4, small text 日本地図 / Map of Japan; guessed from 地図, 都道府県, 地理, 人口 and the like), with its series instructions docs/llm-parts/social.md. The free plan still allows two subjects, and every subject and pair stays within the caps (40 KB, 50 KB; paid 120 KB).
  • m-curves, m-scatter and m-map-japan: anchor also accepts top and bottom, as names for above and below. Release notes: egatari/components v1.5.0
  • Components v1.7.0: m-predict (predict, then check: a question and choices, the class's counts as bars, then the answer) and m-timer (a group-work timer, one phase per step), the first parts that take viewer input. The manifest now carries interactive, viewerInput and clock. A 16th purpose tile in New…, 予想して確かめる / Predict, then check (手を挙げて数える・答えを開く); the timebox purpose makes no tile. On the free plan both parts are paid-only for now (never named in a free pack), and every free subject and pair stays within the caps. Release notes: egatari/components v1.7.0
  • Components v1.8.0: m-timer is a tool (manifest components.timer.group: "tool" with its own tile 「タイマー」 / "Timer"), and it has bells (bells, declared with events(k)). Studio ignores the bells for now; the clock and colours still carry the time.
  • Components v1.9.0 is the default version: m-hist (histogram, frequency polygon, dot plot, with mean, median and mode lines) and m-boxplot (a box plot built step by step like the textbook procedure; groups side by side), both in the series academic. The 伝えたいこと tile ばらつき / Spread now reads ヒストグラム・箱ひげ図・ドットプロット. On the free plan both are paid-only for now (FREE_OUT: never named in a free pack; spread and compare fall back to the nearest part or HTML), so the free 数理・統計 pack stays under 40 KB. Instructions pack 8e0efb1a → fb9e430d; the largest free pair is ja 49,233 B (academic + kokugo; cap 51,200 B), paid ja 101,615 B. Release notes: egatari/components v1.9.0
  • Files from an earlier version (no player in the index, format spec §7.1) open read-only: the lesson plays in the preview with its own player, editing and saving are refused, and a notice offers Open in the earlier Studio (studio.egatari.org/v<made-with>/, or the newest pre-1.0 version in versions.json) and Open the migration guide. Working folders with egatari.json in which no slide has an id get the same notice, with npm run ids; it goes away once the ids are added. A slide added by hand without an id to a 1.0 folder does not bring the notice (the next export gives it an id).
  • Migration guide for lessons made with an earlier version: docs/migrating-0.x.md (日本語: docs/migrating-0.x.ja.md), written so that a person or an AI coding agent can follow it step by step.
  • npm run player:check (information only; --strict for the release candidate) and npm run player:bump -- patch|minor|major keep the bundled player's version and lock (RELEASING.md).
  • Exporting an Egatari file gives every slide without an id an id and every script heading {#id}, and writes them back to the working folder (with the keys in audio/manifest.json, timeline.json, comments.json and egatari.json; backups in .cache/edits/). Files never carry heading-text keys, hand-written data-key or s<n> keys; the build and the quality checker still accept id-less source.
  • The quality checker warns (never an error) about source outside the 1.0 vocabulary (format spec §8.0): the colour classes blue, red, gray (use term, emph, muted), data-steps and data-anim (steps and motion come from data-step, data-at, draw and parts), and <html data-mode="lecture"> (the viewer's “Show later steps faintly”). Studio writes none of them, and no lesson seed (data-egatari-seed).
  • The index validator accepts index.article and article-only lessons (no entry); reading a file written before the 1.0 shape (no player) still works and reports it (preDraft).
  • Markers in edit mode (#70): m (or the "Marker (m)" button in the editor's edit-mode bar, or the slide controls' pen button, which reads "Marker" with the key m while editing and is the only tool button left there; the pen key d also opens it) turns the pointer into a comment pen; d typed into a text field stays text and the presenter view still cannot choose tools while editing. Drawing a circle or an arrow on the slide opens the same note box as Alt+click, and the preview stays drawable while the box is open, so further strokes (an arrow plus a circle, several underlines) join the same pending note; Leave keeps them all, Cancel discards them all. The marks are kept in comments.json as strokes: [[[x, y], …], …] in slide coordinates (at most 20 strokes, 500 points each, 2000 in all); pin is the length-weighted centroid over all strokes, set by the writers. An entry with a single stroke is read as strokes: [stroke], and writers write only strokes (contract §13). The editor's overlay and npm run comment-shots draw every stroke in the pin colour, the crop covers all of them, and the mode indicator reads "Editing: marker".
  • New…, step 2 asks Is your chat AI a free or a paid plan? (お使いのチャットの AI は無料版ですか、有料版ですか). Free plan (the default) copies today's light instructions: the common body plus the subjects you choose. Paid plan copies the parts of every subject and hides the subject choice. The choice is recorded as plan (free or paid) in egatari.json studio.newDeck; an earlier record without it reads as free (AI_PLANS, planOf, seriesForChoice in kit/core/new-deck.mjs).
  • Size caps per plan for the generated instructions: PACK_CAP_KB in kit/core/llm-pack-assemble.mjs (free: 40 KB with one subject, 59 KB with any set; paid: PAID_PACK_KB, 120 KB, provisional). Tests check every subject set, and the sweep over purposes turned off now runs in both plans and checks each plan's cap.
  • New…, Guides (手引き) gets three subcategories with their structure templates: Manual (マニュアル: goal → the steps, one at a time → common pitfalls), Rules and regulations (規程・法令の説明: what the rules are about → who they apply to and when → what you must do → the original text and its date) and Information and orientation (案内: the situation → a list to look up by item or situation → where to ask; for example waste sorting, using the library, evacuation routes, orientation for new students or staff, course registration).
  • New ④ has a subject tile English (foreign language) (英語, “Sentence structure (S V O C M, phrases, clauses)”), placed after Japanese language arts, with the series english of the AI instructions and m-syntax. It is a free subject: it counts as one of the two choices on the free plan. The en label says “(foreign language)” so that it is not confused with the lesson language English. The title and content suggest it (英語, 英文, 文型, 関係代名詞, …; not the word “English” alone).
  • Tests: the stories S1–S7 walked end to end in the editor (tools/test-app-newdeck.mjs). Every free pack is checked to name no m-* part outside its own catalog.
  • New ④ has a subject tile Music (音楽, “Keyboard (scales, chords)”), the series music of the AI instructions with m-keyboard. It is a free subject: it counts as one of the two choices on the free plan. The title and content suggest it (音楽, 音階, 和音, ピアノ, music, chords, …). The purpose music has no tile of its own (tile: "none"); its icon is drawn wherever purposes are listed with icons.
  • New… step 4: a 道具 / Tools row, 「スライドで道具を使いますか」 / “Will you use any tools on the slides?”, with the hint 「選んだ道具だけを、AI が使います」 / “The AI uses only the tools you choose.”, built from the components' manifest (components.<name>.group: "tool" and its tile; today タイマー / Timer). A tool part goes into the instructions only when its tile is on, on either plan; the timer is pre-ticked when the title, content or other wishes mention グループワーク, a number of minutes (「10 分」) or 時間, never over your own choice. The chosen tools are stored in studio.newDeck.tools. node kit/llm-pack.mjs takes --tools, and --plan paid now honours --series (--series all --tools all --plan paid is the full pack). npm run gen checks the free plan with a tool too (a tool alone against 40 KB, every subject + tool against 50 KB), every paid pair of subjects with every tool against 120 KB, and only warns for the paid all-ticked worst case.
  • Editor app, New… has six steps (backlog #99): 1. the kind, a category (Teaching, Research, Business, Guides, Other; “Academic” is gone) and a subcategory that sets the structure template (10 subcategories; Guides has a structure of its own), added to the request with its structure and presentation; 2. subjects and purposes: subjects are part sets (Math and statistics, Business, Japanese language arts, Information science), the materials Table, Image, Equation and Shape are always available, and 14 purpose tiles are all on by default. A tile turned off tells the AI not to use those representations and leaves the parts used only for it out of the copied catalog (kit/core/purposes.mjs, kit/core/new-deck.mjs). Purposes are read from the components' release manifest when it lists them, otherwise from the decided table.
  • New… records the choices in egatari.json as studio.newDeck (through updateConfig) when the lesson is created.
  • Player: when a lesson opens, the toolbar stays for about 5 seconds. The first time on a device, one line above it says how to bring it back: "Move the mouse to the bottom of the screen (or tap) to show the toolbar" / 「マウスを画面の下に動かす(タップする)と、ツールバーが出ます」 (backlog #122)
  • Player: while the toolbar is hidden, a small faint button at the bottom left, Show toolbar / 「ツールバーを表示」, brings it back with a click, a tap or the keyboard. It is not shown in video mode, in the presenter view's inner screens, when an embedding page turns the controls off (embed=1&controls=0, which now also leaves out the toolbar), or in print
  • Player: the first-time hint line is hidden from screen readers (aria-hidden), so it is not announced when the lesson opens; keyboard users reach the toolbar with Tab, and the handle keeps its accessible name
  • Player: under Show later steps faintly, an element marked data-preview="none" keeps its later steps hidden instead of faint (an answer the audience should work out first), and so does a component that declares static preview = "none" (m-predict, m-hissan and m-timer from the components release that adds it); the player no longer dims such a component from outside (format spec §8.4, Player P1)
  • Player: ?mode=talk&preview=1 opens a slide show with later steps shown faintly (Player P8); ?mode=lecture keeps working as before
  • Player: the key list (?) of an Egatari file shows its versions in the order Format → Player → Made with (「形式」「プレーヤー」「作成」, e.g. Format: Egatari 1.0 · Made with: Egatari Studio 0.6.0), using title from player and generator when present and name otherwise; the Player line appears when the file names its player (format spec §4.1, Player P3)
  • Saving an Egatari file with a rebuild asks first when the file carried another player (format spec §4.1): The player will change names the file's player and the one the saved file will carry; Save saves, Cancel keeps the changes unsaved. It follows playerChange from the export, so a newer version of the same player is not asked about.
  • The quality checker warns about a chapter divider with an <h2> and no <h1> (secHeading: the title of a divider is <h1>), and about heading or body text whose computed colour has less than 4.5:1 contrast with the background behind it (textContrast, one per slide; never over images or gradients). Both are warnings, in the command line and the editor.
  • The AI instructions describe the chapter divider: <section class="slide sec noconcl static"><h1>…</h1></section>, and R-headings says dividers use h1.
  • Editor app: Slide ▾ → Change theme… changes the theme of an open deck. It lists the themes of New… ③ (display names, color swatches, the current one marked, own themes under My themes, and Load theme…, which opens the same Load theme dialog and adds what it loads to the list), rewrites only data-theme on the source's <html> (other attributes and the slides stay), pins the new theme and the themes it builds on (extends) at their current versions (a theme of your own, from the theme folder or a ZIP file, at its theme.json version or "local"; it is found in the same place as the build looks) in egatari.json themes, even over an earlier pin, and drops pins nothing uses (other members keep their bytes).
    The preview is rebuilt; it is an unsaved change and Undo in the slide list restores the source and egatari.json byte for byte. Disabled, with the reason, in files where only narration, audio and timing can be edited.
  • Editor: load custom themes from a ZIP file in every browser, including Safari, Firefox and the iPad. Load theme… (theme list, theme notice, My themes…) opens a small dialog with Choose ZIP file… and, where the browser can choose folders, Choose folder…. Themes are found up to 5 levels deep (a GitHub “Download ZIP” works), all themes in the file are loaded so extends within it resolves, and the file is read as untrusted (size, entry and per-file limits; .., absolute paths, symbolic links and bad theme names refuse it). The themes are saved in the browser as “My themes”, can be deleted one by one in My themes…, and with a theme folder the theme chosen or loaded last wins.
  • npm run lint:terms (also in npm test): flags avoided words of the termbase in UI strings, docs and skills, with docs/terms-allow.json for legitimate uses, and fails where a Japanese UI string's term has no matching English term in its partner.

Changed (API)

  • assemble(data, {series, lang, exclude, off, plan}), buildPack({…, plan}), packWithRequest({…, plan}), commonBody(lang, exclude, series, off, plan) and seriesPart(name, lang, exclude, plan): plan is 'free' (default; FREE_CORE, FREE_HOME, no paid-only parts) or 'paid' (every series and every part; series is ignored). New: packParts, planData, paidOnly, freeSeriesOf, goneParts (kit/core/llm-pack-assemble.mjs), PAID_ONLY, loadedParts(series, plan) and membersOfSeries(name, plan) (kit/core/llm-pack.mjs), hidden in purposesTable, and node kit/llm-pack.mjs --plan paid.
  • Egatari files follow the 1.0 file shape (format spec §4.1, §4.2, §7.1, §8.1): the index and deck-meta carry player ({"name": "egatari-player", "version": …, "title": "Egatari Player"}, the bundled Egatari Player; its version is in kit/player.json, with +dev.<commit> when the player files differ from the release in kit/player.lock.json) and generator ({"name": "egatari-studio", "version": <Studio's version>, "title": "Egatari Studio"}, was motion-academic-slides; title is the name shown to people). contracts is {"source": 1}; contracts.runtime is no longer written or read.
  • Every Egatari file carries the file policy: a Content-Security-Policy <meta> right after <meta charset> with the baseline that connects nowhere. Every Egatari file copies extensions.embed into deck-extensions, and the policy adds the declared destinations of each extension in its own directive (embed → frame-src, Live → connect-src); a play-only copy with Live merges the endpoint into the policy and adds live to the same block, also next to embed. Readers report a missing, misplaced or different policy (compared as parsed directives) as not conforming.
  • assemble(data, {series, tools, lang, exclude, off, plan}) (kit/core/llm-pack-assemble.mjs), buildPack, packWithRequest, commonBody(…, plan, tools), seriesPart(…, plan, tools) and loadedParts(series, plan, tools) take an optional tools list (tags or names, or 'all'); without it no tool is included. With plan: 'paid', series is now honoured (it used to be every series): pass series: 'all', tools: 'all' for the full pack. kit/core/llm-pack.mjs exports TOOLS; kit/core/new-deck.mjs exports guessTools and toolsForChoice, and studio.newDeck has tools.
  • assemble(data, {series, lang, exclude}) (kit/core/llm-pack-assemble.mjs), commonBody(lang, exclude), seriesPart(name, lang, exclude) and packWithRequest({…, exclude}) take an optional exclude list of component tags left out of the catalog; without it the output is unchanged.
  • Component context (format spec §8.4): ctx.entered is true on the first render after the viewer entered the slide from another slide or by a jump (a link, the slide overview, a slide number, a position chosen in the presenter view or the editor, opening the lesson), and false otherwise, so a component knows when to reset viewer input. deck:pos still fires for components pinned to earlier releases
  • Component context (format spec §8.4): ctx.mode is "talk" or "video", never "lecture"; later steps shown faintly are ctx.preview === true (with mode: "talk"). Components pinned before v1.10.0 that test only ctx.mode === "lecture" draw their later steps hidden under preview. ctx passes preview: false to a component inside an element marked data-preview="none"
  • Component context (format spec §8.4): ctx.slide is the slide's key (a string), no longer the slide's element; a component that needs its slide finds it in the document. No component in the library reads it
  • DECK.VERSION is the version of the running player: player.version in deck-meta (format spec §4.1), generator.version for a file from before 1.0, and Studio's version in a plain build. The new DECK.MADE_WITH is generator.version. Send feedback fills version with the player's version and adds made=<Studio version> to the context when it differs.
  • assemble(data, {series, lang, exclude, off}), commonOf(data, lang, exclude, series, off) / commonBody(lang, exclude, series, off) and packWithRequest({…, off}): the common body's purpose table depends on the included series (default: none, as in docs/authoring-with-llms.md) and on the purposes turned off. partSpans(text, exclude) drops text tied to excluded parts.

Changed

  • The Audio panel is redesigned in three parts. A (always on top) is one status line — how many steps have audio, how many need updating because the script changed, how many AI-made steps are still in the old voice after you changed the voice (compared through recipe.voice, since inputHash ignores the voice), and “Not in the file until you save” in a single file — with one action, Make the rest (n steps), Update audio (n steps) or Save, that continues with the method used last (kept as studio.audioMethod in egatari.json). B asks “How do you want to add audio?”: make AI audio in the cloud (Google Colab, the default), on this computer (shown only with WebGPU, then the default) or record your own voice (recording mode); the voice fields sit above the answers and read “Voice of the explainer” / “Voice of the questioner” for a dialogue. C is this step: Play, Listen with read-aloud, Record (r), Import from a file…, Revert and Remake on this computer.
  • The cloud path is three ticked steps: Export the script (the privacy question is asked once per browser), Open Colab (the steps — Connect, switch to CPU if a T4 cannot connect, Run all, choose the file, the ZIP downloads — are written in the panel and at the top of the Colab notebook, in Japanese and English) and Import the audio… (a plain file input; no folder picker).
  • Removed from the Audio panel: the “when there is no WebGPU” framing, the export scope, the “marked” list of steps whose script changed after the export (they are offered as Update audio instead), “Regenerate with TTS” (now “Remake on this computer”), and the stale pre-processing list. Recording mode wording: step, script, “points where the animation follows the voice”, “Use and next”.
  • Theme business 1.0.1, --emph #C2410C → #BA3C05: the same orange (OKLCH hue 38.4), slightly darker, so that orange text on its own --emph-tint reaches 4.66:1 (was 4.34:1, under the 4.5:1 text floor; emph boxes and the kpi, quad and flow components); 5.62:1 on white.
    Protan/deutan ΔE00 to the other tones moves by at most 1.7. A lesson that recorded business 1.0.0 keeps it (theme pinned: …, --update-themes), as for default 1.1.0.
  • Live: the pressed I don't follow button takes the deck theme's --emph (was a fixed #c2410c), so it matches every theme.
  • Colab notebook, Japanese (Irodori) on the CPU: without a GPU, or after the fallback to the CPU, it uses a CPU profile — fewer diffusion steps (IRODORI_CPU_STEPS in colab/egatari_tts.py, 16; 40 on the GPU — the owner heard no difference between 16 and 24) and the fp32 weights (onnx/), which run faster than fp16 on the CPU. Cell 1 says so in its env: line (… · CPU(Irodori の steps=16)). The worker now encodes each reference voice once instead of on every segment (same audio). On a Mac CPU one segment went from about 12.4 s (fp16, 40 steps) to about 2.7 s (fp32, 16 steps).
  • Colab notebook timing: each progress line shows the step's time and the running total (3/10 s-intro:2 (+41.2 s, total 2:15)) and the end prints the total, from a monotonic clock around the real synthesis, since Colab's cell timer can be wrong on long runs. A PROFILE box in cell 3 prints the time of each stage per segment.
  • Records from the notebook carry recipe.diffusionSteps and recipe.precision (Japanese) as provenance; the import keeps them and they are not part of inputHash. The verified note adds the owner's 2026-10-25 timings (T4 and CPU, Japanese and English), and npm run gen now keeps the docs' <!-- colab-verified --> lines in step with it.
  • Components v1.10.0, visible in lessons: m-timer's built-in label 「時間です」 now reads 「時間」, and the −1/+1 controls of m-predict and the −1 分/+1 分 controls of m-timer use 27 px text. The demos of m-boxplot, m-predict and m-timer now pass Studio's quality check (their known errors are removed from the component test); the new m-numberline demo has one (slide 3 overflows by 47 px), listed as known until it is fixed upstream. The lecture checks inside the parts read ctx.preview || ctx.mode === "lecture"; Studio still passes mode lecture, so nothing changes yet.
  • Components v1.11.0, visible in lessons in the lecture view only (“Show later steps faintly”): every part shows its later steps faintly at the theme's --preview-opacity, except m-predict, m-hissan and m-timer, which declare static preview = "none" and show nothing ahead. With no lesson seed, a part without variant shows its first variant (no change for lessons without a seed). Drawing fixes: the same step now leaves the same DOM whatever was drawn before (m-cycle, m-codetree, m-seq, m-sweep, m-hist, m-map-japan, m-menu), and m-tree, m-venn and m-numberline no longer rasterize differently after being redrawn. The expired known flake for macOS m-cycle (slide 1, step 5) is removed from tools/step-reset-known.mjs.
  • Components v1.12.0, visible in lessons: m-predict and m-timer keep what the viewer chose or set while the viewer stays on the slide (stepping forward and back), and return to the author's values when the slide is entered from elsewhere or after a jump (ctx.entered).
  • Components v1.13.0, visible in lessons: m-bars draws bars with negative values below the zero line (before, a negative value was drawn as 0).
  • m-flow: edge labels and the text in muted boxes now use --fg (they used --muted, which was faint when projected). Existing lessons that use them look different when they are rebuilt with v1.2.0.
  • The instructions keep only the names of a part's presentation variants (the AI does not need to write them), and shorten how stacked bars are drawn. Instructions pack ff02abc6 → 26de0e58.
  • Components v1.2.1 is the default version (1.0.0–1.2.0 are kept for lessons that recorded them). No part's code (index.js) changed. The captions on the presentation-variant demo slides are now 27 px, so the quality check's known smallText issue for those demos is removed from tools/test-components.mjs. Several part notes (READMEs) no longer split an attribute's description to mention another part; the free-plan common parts (m-bars, m-flow, m-menu, m-curves, m-quad, m-kpi) are unchanged, so the free-plan sizes stay the same and only the paid pack is smaller. Instructions pack 214a0876 → 5cc9551c.
  • Components v1.3.0 is the default version (1.0.0–1.2.1 are kept for lessons that recorded them). m-curves gains the series words of m-scatter: step (series with the same step are drawn together), tone, labelAt (where the series name sits) and anchor right / left / above / below. The old forms still work and draw identically (color, at as the x of the name, anchor start / middle / end); they are described only outside the AI notes. The m-scatter notes no longer refer to m-curves for the axes. Instructions pack 5cc9551c → 0f5e51c9; free plan with all subjects: ja 59,825 B, en 58,528 B (cap 60,416 B). Release notes: egatari/components v1.3.0
  • Components v1.4.0: m-kanbun now gives one step per line (句) of the reading order (before, one step for the whole reading order): the default phases="kunten order kaki" gives 訓点 1 + one step per line read + 書き下し文 1, and a return to an earlier line by a 返り点 or a 再読文字 starts a step of its own. An existing lesson that updates to this version gets stale steps: its narration [n] must be re-aligned (one [n] per 句), and audio recorded for those steps no longer matches. order-by="all" keeps the old single step, with the same drawing and timing as v1.3.0. Lessons that recorded an earlier version stay on it until their author updates. The kokugo series instructions and the worked example now write one [n] per 句, and examples/kokugo-kanbun uses the new default (its narration has one [n] per 句 instead of {cue}).
    Also fixed in v1.4.0: the current-character highlight of m-kanbun fades out within its step, and the m-kobun translation lines finish within the step. Release notes: egatari/components v1.4.0
  • Components v1.6.0 is the default version (the tarball is the same as v1.5.0; only the release manifest adds tile fields to its purposes). The purpose tiles in New… are built from the manifest: tile: "own" makes a tile with its label, examples and icon, {"into": id} folds a purpose into another tile (ranking into compare: turning the tile off turns both off), "none" makes none. The 14 tiles read as before, plus a 15th, 場所・地図 / Place / map (日本地図・塗り分け・地点と矢印), backed by m-map-japan only when the Maps subject is in the instructions; otherwise the AI draws it in HTML, as for any tile without a part. A manifest without tile fields (before v1.6.0) is mapped onto the same 15 tiles by Studio's table, with a warning from npm run gen. The hint under the tiles reads 「今は全部使えます。押した表し方は、AI が使いません」 / “All are in use. Press one and the AI won't use that representation.” Instructions pack 0f5e51c9 → 8e0efb1a; the largest free pair is ja 49,079 B (academic + kokugo; cap 51,200 B), paid ja 92,900 B. Release notes: egatari/components v1.6.0
  • Components v1.8.0: m-map-japan draws differently by default, a visible change for existing lessons once they move to v1.8.0: the 小笠原諸島 inset is off unless islands="all", and 北方領土・竹島・尖閣諸島 are drawn at every size. Lessons that recorded v1.7.x or earlier keep their drawing until their author updates. New demo slide 「日本の範囲(本当の位置)」 with layout="true"; labels no longer sit inside the inset frames. Release notes: egatari/components v1.8.0
  • Components v1.9.1: only README text changed. m-kobun's and m-kanbun's implementation notes moved into llm: omit, so their part of the instructions is 645 B and 163 B shorter, and Studio no longer needs its own shortening of the m-kobun text, which is removed. No code changed. Release notes: egatari/components v1.9.1
  • Docs: the format specification's §8 is now the normative text of the authoring source. docs/contract(.ja).md points to it (a table of which section says what) and keeps only Studio's notes: its run-time API, the dev server, the ✎ placeholders, the quality checker's codes and Studio's CSS hooks; docs/reference(.ja).md points to §8 and §5.5 for slides, script and timing. The legacy data-steps, data-anim, data-mode="lecture" and .blue/.red/.gray are no longer listed as current; the migration guide says what to replace them with.
  • Theme default 1.2.0, the conclusion row: a 5px bar in --emph on its left, bold text, its fixed position and a light grey ground (--concl-bg transparent → #F5F5F5), left-aligned instead of centred in a frame. Position and height are unchanged (571px / 72px), so the quality checks give the same results.
    --emph text on the ground is 5.32:1 and --fg 14.59:1; the neutral grey looks the same for every colour-vision type and in greyscale. Vertical (layout-tate) slides keep the framed conclusion column. kokugo takes the bar in its own red; business keeps its pale-orange ground. A lesson that recorded default 1.1.0 keeps it (theme pinned: …, --update-themes). Conclusion row design proposed by @totasuko-lab
  • Saving without rebuilding (tier A) keeps player and generator byte for byte; a rebuild warns when the file carried another player (playerChange). A lesson with an article is not rebuilt (article-unsupported).
  • Chat AI: free plan: m-predict (予想と答え / Predict and check) is a standard part (FREE_CORE is now m-bars, m-flow, m-menu, m-predict), so the free instructions describe it and the 予想して確かめる tile has a part on both plans. Every free cap still holds, with a tool counted as one of the two choices: the largest single subject is ja kokugo 40,723 B (cap 40,960 B), the largest pair ja academic + kokugo 50,496 B and ja kokugo + timer 42,593 B (cap 51,200 B). Instructions pack 48ab84a3 → 1561b3b8.
  • Japanese and Chinese text no longer starts a line with a small kana (ゃ, っ, ァ …), a long vowel mark (ー), a closing bracket or a punctuation mark (line-break: strict, format spec §8.0). This now applies to horizontal slides, captions, the presenter view's script and components, as it already did to vertical slides. Some line breaks on existing Japanese slides can move; the quality check gives the same results on the bundled examples. ……, ―― and runs of digits were already never split
  • Lecture view (?mode=lecture, key l): the highlighter on the current step is removed (the underline-style background on .cur, and the row tint on a current table row), and no other mark replaces it. The runtime no longer adds the .cur class to step elements. Steps not yet reached stay dimmed with the theme variable --lecture-dim (0.5 by default; a theme may set it within 0.45–0.5); steps already reached are at full strength. Talk and video modes are unchanged, byte for byte. --emph-tint stays in the themes but the kit no longer uses it. Backlog #86
  • New…: the 14 purpose tiles are in a fold, closed by default, Choose representations the AI should not use (optional) (AI に使わせない表し方を選ぶ(選ばなくてよい)), whose summary says how many are off. The tiles work as before (they only turn representations off) under both plans.
  • New… is rewritten as five questions in thinking order: 1. Where will you use it? → 2. What is it about, and who is it for? → 3. How should it look? → 4. Send the instructions to your chat AI → 5. Paste the AI’s output. Answered questions collapse to one line with Change. Step 1 must be answered: nothing is pre-selected, and the subcategory question ends with None of these. Other and None of these add no structure lines and are stored as subcategory: null in studio.newDeck.
  • New…, step 2: Title (shown on the cover) is required and replaces the topic. Audience, Length (a number of slides or minutes) and Content each default to “Leave it to the AI”, and items left to the AI are not written. Content has a third answer, Already given to the chat AI, which asks for the lesson from the material given in that chat. A More fold holds Language, Speakers (one, or two as Expert and Novice) and Other wishes. The plan and subject questions move to step 4, where the subjects are ticked from the title and content.
  • Pasting the AI’s output (New…, Insert slide…, Revise…): two fields, Slides (deck.html) and Script (narration.md), each showing what it holds. The whole output pasted into either field is split, and a block in the wrong field is moved. The hidden one-block-at-a-time state, “Import just this” and its reset are removed. The buttons are Create, Insert and Replace, and Create shows “It will be made without a script” when the script is empty.
  • Lengths in minutes count toward asking in two rounds (1 min ≈ 1 slide; slideCountOf).
  • Instructions for the AI (pack text): the request form has Title (used as is on the cover) instead of Topic, Other wishes instead of examples or figures, and a title line in B. B now reads “Make the lesson from the material given in this chat and what we have discussed so far.” R-dialogue keeps at most two roles when asked for three or more speakers.
  • The free-plan cap for every subject set is 59 KB (was 58). Over a cap, npm run gen names the pack (plan, language, subject set), the bytes over and its three largest sections.
  • docs/authoring-with-llms*.md and docs/llm-parts/ now show the full (paid-plan) pack. They have a note that a free plan should copy the lighter version from New…, and a size table for both plans.
  • Create, Insert and Replace stay in place and, while disabled, show the first missing thing right beside them (“Answer step 1”, “Write the title in step 2”, “Paste the slides in step 5”, and the step 3 forms for Insert and Revise). Notes such as “It will be made without a script” move from the left of the footer to beside the button.
  • Pasting: a code block pasted with text around it or with its fence lines leaves only the extracted block in the field and says so.
  • New…, “Already given to the chat AI”: the More fold (language, speakers, other wishes) is shown again, and those lines go into the B request in the same form as A. Pack text: the B heading is now “B. From the material and discussion in this chat” (ja 「B. 渡した資料と話し合いの内容で作る」), and the blank B form has Language, Speakers and Other wishes. Instructions pack d737805d → 214a0876.
  • New…, Insert slides… and Revise…: only the current step is open (a one-open flow, like a checkout). All headings stay visible in order as buttons (aria-expanded, the current one aria-current="step"); steps not reached yet show only their heading, greyed. Next folds the answered step to its one-line summary with Change and opens the next one (scrolled into view, focus on its first control). Copying the instructions opens the paste step, so you land on the paste fields when you come back from the chat. Change reopens that step alone.
  • New… step 4: the plan no longer means “every part”; it changes how much goes in. Subjects are chosen on both plans and pre-ticked from step 2 on both (never all ticked by default; the paid “all of them are included” state is gone). Chat AI: free plan sends the standard parts (FREE_CORE) and up to two choices, subjects and tools together (a tool counts as one: a subject plus a tool falls under the 50 KB pair cap; with two on, the other subject and tool tiles are disabled and 「チャットの AI が無料のプランなので、分野と道具を合わせて 2 つまで選べます」 / “Your chat AI is on a free plan, so you can choose up to two subjects and tools in total.” is shown); Chat AI: paid plan sends every standard part and the chosen subjects and tools with no limit. Switching back to the free plan keeps the first two ticks in tile order (subjects first, then tools) and shows the limit message. The strip 「この指示に入るパーツ」 and the answered line follow the chosen subjects and tools on both plans. Instructions pack fb9e430d → 48ab84a3.
  • Instructions for the AI: pack version e43dedc5 → 2f046ca0: new §2.7 with R-purpose and the purpose → representation → steps table (parts-map §10), R-whole (lists, KPI cards and pies are shown whole unless the narration discusses each item), and a one-line index of all parts with their pack and a pinned link to the components' READMEs in §3. Fitting the slide is now §2.8. m-curves and m-quad stay in their packs until components v1.2.0.
  • egatari.json studio.outline (long lessons) is written through updateConfig, so other members stay byte for byte; a file that is not a JSON object is refused instead of overwritten.
  • New…, step 4: the subjects are tiles like the purpose tiles (an icon, the name, a small line of what is inside; aria-pressed, an on tile has a check mark and a frame). Under the free plan two can be on and the rest are disabled; under the paid plan every tile is on and not pressable, with “The paid plan includes all of them.” (有料のプランでは全部入ります). The tiles come from SUBJECTS (label, inside, icon), so a new subject is one entry.
  • New…: the fold is now See parts, turn off representations (usually not needed) (パーツを見る・表し方を外す), with “Parts: N (M turned off)” in its summary. Inside, above the purpose tiles, a read-only strip Parts in these instructions (この指示に入るパーツ) shows each part in the pack (the same list as the assembly, loadedParts); parts turned off are faded and struck through. Under the purpose tiles, one line always says “Representations without a part are drawn by the AI in HTML.” Names and icons of the parts: kit/core/part-labels.mjs.
  • New…: the subjects hint names the standard parts from FREE_CORE’s labels: “With none, only the standard parts (Bar chart, Flow diagram, Contents, …)” (標準パーツ(棒グラフ・流れ図・目次など)).
  • New…, free plan: up to two subjects can be ticked (FREE_SUBJECT_MAX, freeSubjects in kit/core/new-deck.mjs). With two ticked the other boxes are disabled and the list says “Up to two on the free plan.” (無料のプランでは 2 つまで選べます); unticking one enables them again. The guess from steps 1 and 2 ticks two at most (the first two in subject order). The paid plan has no limit.
  • New… always starts with no subject ticked; it does not read the open lesson's studio.newDeck. A record written elsewhere with more than two subjects is kept as it is, and the free plan's pack uses its first two (seriesForChoice).
  • Size caps for the free plan: PACK_CAP_KB.free is now { one: 40, two: 50 } (every single subject ≤ 40 KB, every pair ≤ 50 KB, in ja and en); the cap for every subject (59 KB) is gone. npm run gen prints each single subject and the largest pair, and the size table in docs/authoring-with-llms*.md lists the largest pair instead of every subject.
  • Egatari Player 1.0.0 (the bundled player that files carry, player in the index and deck-meta): the first fixed release of the player, following Egatari 1.0 (wd-2026-10-28). Files now record which player they play with, and Studio asks before a save would change it. For lessons: the toolbar shows for 5 s when a lesson opens, with a first-time hint and a faint handle while it is hidden; on touch screens a tap shows the toolbar without pressing the button underneath; Japanese and Chinese line breaks follow strict kinsoku; parts whose previews are dimmed use --preview-opacity.
  • Player: the address bar shows the position as the slide's id and step (#s-k3f9q2, #s-k3f9q2:2, #s-k3f9q2:concl), as format spec §9.1A writes links to slides, instead of the slide number. A copied address opens at the same step. Addresses with a slide number (#3) still open, and a number typed into the address still moves there
  • Later steps shown faintly are drawn at the theme's --preview-opacity, 0.45 (was --lecture-dim, 0.5), so they are slightly fainter. kit/base.css and theme default define --preview-opacity: .45; --lecture-dim stays defined, equal to it, for components pinned before v1.10.0
  • Instructions for the AI: pack version 2f046ca0 → 88ecfc51. The R-purpose table is generated from the vendored parts: each purpose lists the parts that serve it (with their pack); a purpose with no part yet says to use the nearest part, or HTML or inline SVG (no * markers, and no part that is not vendored is ever named); a last row lists the parts no purpose uses. The table replaces the separate list of all parts (same pinned link). Steps come from the components manifest when it has them.
  • Instructions for the AI, smaller (en all 61.7 → 55.9 KB, ja all 62.9 → 57.1 KB): the worked example of each series pack shows only the slides that use its part (the full skeleton stays in the common example), a component's data example is left out where its README or the series example already shows it, “child JSON” lines that repeat the data shape column are cut, two internal notes of m-gendai and m-kobun are cut or shortened, and sentences that repeated R-components in the academic and business packs refer to it instead. Standards and their meaning are unchanged.
  • Purposes use the ids of the components' purposes.json (part-whole, key-number, cause-effect, correlation, …). With a manifest that lists purposes, the New… tiles follow its order and leave out reserved ids; component variants are read too.
  • npm run components:update keeps the release manifest.json in vendor/components/ (its sha256 in components.lock.json as manifestSha256; components:check verifies it), so purposes and variants are read offline. The v1.1.0 manifest is vendored.
  • New…: the purpose tiles are always the 14 decided ones (parts-map §9). The manifest's purposes are mapped onto them: ranking goes into Compare, now labelled 比べる(量・特徴) / Compare (amounts, features); ids without a tile (text-structure, parameter, grouping, unknown ones) make no tile and are reported by npm run gen.
  • School lesson presentation adds 国語は縦書き、隠して音読 (parts-map §7).
  • One size target for the generated pack: LIMITS.allTarget (59 KB, tools/make-llm-guide.mjs), used by the test.
  • motion-slides skill: the outline (構成案) gives each slide what to convey (伝えたいこと, from the parts library's purposes) and a recommended part, asked as a recommendation; interactive parts are marked “can be operated during the talk”, and tools (m-timer) are recommended only when the lesson has a timed activity (group work, an exercise, “think for 3 minutes”), not because of its total length; an activity counts as one slide. The outline is a numbered list, one item per slide (heading, what to convey, recommended part with the reason, conclusion line, material), and contains only numbers the user gave or the scripts will compute. The skill reads the full parts list (vendor/components/CATALOG.md, every part, standard and subject parts alike) and manifest.json; when no part fits, it may make a new expression from the components repository's expression catalogue and report it as a part candidate. One Egatari Studio clone is enough to use it (parts and themes are vendored); the components repository is needed only to propose parts.
  • The player's bar of playback and presentation controls is called the toolbar (ツールバー) in the interface and the docs; docs/terms.json adds the term and avoids 操作の帯, コントロールバー and “control bar”.
  • Editor app, toolbar (UI redesign, stage 1): four items, File ▾, Slide ▾, Quality check and Preview ▾, using the usual menu terms of other apps. File ▾ has New…, Open…, Save, Save as…, Export ▸ (For participants (play only)…, Print / PDF, and Export working folder… for a single file), File info… and Work in a folder…; Theme folder moves to “Load theme…” at the end of the theme list in New…. Slide ▾ has Insert slide… (from a template or a chat AI), Duplicate, Delete (the slide selected in the slide list, or the one on screen) and Revise…. Preview ▾ has the display modes Check as a slide show (f, also full screen), Check as a lecture and Check as a video, and Check in presenter view (p), with the note that you present from the saved .ega.html. Edit, Script, Notes and Audio stay as a temporary group until they become right-panel tabs. The toolbar still fits one row at 1280 px.
  • Editor app: the menus follow the ARIA menu-button pattern (↑ ↓ wrap, Home / End, letters, → / ← for Export ▸, Esc returns focus to the button, Tab closes). Keys are not sent to the preview, and e / n / c do not toggle the panels, while a menu or a dialog is open.
  • Editor app: Quality check runs by itself about 1 s after each build and preview load (debounced, skipped while a build is pending) and its badge shows the errors and warnings it found, in the error colour when there are errors; build and save warnings are listed at the top of its panel (the separate Warnings button is gone).
  • Editor app: Save as… replaces “Save as new lesson…” and “Save a copy…” (a checkbox “Save as a new file (it becomes separate from the original)” gives the new docId); in a working folder it writes the Egatari file (editable, .ega.html). Save is shown in a working folder too and explains that the folder is saved as you edit.
  • Editor app: For participants (play only)… asks in a dialog with an “Add Live (questions and polls)” checkbox; ticking it shows the Live settings in the same dialog, replacing “Distribute with Live…”. A Live export gets a mark on the title side of the file name, such as 題名(ライブ 10-30).play.ega.html (the day the Live starts); the extension is unchanged. Importing Live results is in File info… (attachments).
  • Editor app: File info… shows the title, license, creators, copyright and attribution of the lesson (read only), the format (version, with the spec snapshot from vendor/egatari-spec/SOURCE.json when present) and the Studio version that made the file (generator.version; “This Studio” for a working folder), with a note that playback uses the player inside the file, above the attachments, which move there from the toolbar.
  • Editor app, New… is the chat-AI way only, in five steps: subjects (parts; optional, none ticked), design (theme, by display name: Standard, Business, Kokugo, and user themes by their theme.json title or name; added to the request and given to a reply without one), what you want, copy, paste. The first screen is New… (with the 「…」 icon draft), Open, Recent files, Samples, a small “Make it with Claude Code or Cowork (advanced)” link and Work in a folder…; the table of file kinds moved to the help.
  • Editor app, wording: Export (エクスポート), File info (ファイルの情報), Template (テンプレート), Samples (サンプル), Subjects (parts) (分野(使うパーツ)), Script (台本).
  • Editor app, New… is a full-screen page (← Back and Esc leave it; the steps run top to bottom). Step 3 has a large Content field whose text goes into the request, with the size and a token estimate (UTF-8 bytes ÷ 3) against a 32k-token context and a soft note above about 80 %.
  • Editor app, long lessons (more than 8 slides) are made in two passes: an outline first (one ```outline block, parsed and stored in egatari.json as `studio.outline`), then 6 slides at a time through Insert slide's chat-AI path (“Ask for the next 6”, with the outline, the range and the previous slide; the notice shows how many are left).
  • Instructions for the AI: pack version 4cc280e2 → 6fa429af: new R-outline (an outline-only reply in one ```outline block, and later ranges written exactly); “make fewer slides (5–7 is plenty)” is replaced by “keep it short (5–8) without an outline; for a range of an outline, write exactly those slides (at most 6 are asked at a time)”.
  • The words on screen, in the docs and in the skills now follow one termbase (docs/terms.json, with the table docs/terms.md): step (was 段階), script (was 口述原稿 / narration), part (was 部品 / component), Egatari file (was 1 ファイル / single file), play-only (was 再生のみ), Export and its messages (エクスポート, not 書き出し; only the audio panel's 「台本を書き出す」 keeps 書き出す), template, samples, Live / host / participant / join code (was 授業の部屋 / 教員 / 学ぶ人 / 鍵, room, teacher, learner, key), black screen (was 暗転 / blackout), laser pointer, thumbnail (was 縮図), player (was 再生器), emphasis (was 注目の演出 / 印, attention marks), timing (was 動きに合わせる所 / cue), comments (was AI へのメモ / notes for the AI), Cancel (キャンセル, was 取消) and What to convey (伝えたいこと, was 言いたいこと / purposes). Ids, file formats, CLI flags and the instructions for the AI (pack version 8e0efb1a) are unchanged.
  • Audio panel: an unknown voice now says 「声「x」はこのエディタでは使えません。既定の声「bob」で作ります」; Export script reports 「台本を書き出しました(n ステップ)。次は「Colab を開く」」 without the file name; unused imported audio names the place in plain words (「使っていません:スライド 3・ステップ 2(台本が変わっています)」); the voice sample button is 「▶ 試聴」 / “▶ Preview”. The edit prompt is titled 「このファイルを編集しますか」 with 「編集を有効にする」.
  • 授業 is no longer a display mode: it is the option 「先のステップを薄く見せる」 / “Show later steps faintly” (key l), shown like captions in the toolbar, the presenter view, the key list and Preview ▾ (a checkbox next to the slide show and video modes). ?mode=lecture still opens the slide show with the option on.

Removed

  • New…: the size and token estimate under Content (with its 32k-token warning) and the sizes next to each subject. The AI plan question replaces them.
  • Lesson seed (format spec §8.4, owner 2026-10-26): New…, npm run new, Revise… and on-slide edits (editor app and dev server) no longer write or restore data-egatari-seed. A part's presentation variant is chosen by name only (variant="<name>"); without it, every part shows its default variant (the first in its manifest). variant attributes in a source are kept byte for byte, and an earlier source's data-egatari-seed is left as it is (nothing reads it; saving does not strip it, so tier A stays byte-preserving).
  • Editor app: Blank and From a template in New… (slide templates stay in Insert slide…; npm run new makes a new working folder).
  • Editor app: “Export built HTML” (the built out/deck.html is still made by node kit/build.mjs).

Fixed

  • Long lessons made in two rounds: after creating the first slides from the outline, opening "Ask for the next 6" right away could leave "Insert" disabled for good, even with both fields accepted (✓ slides, ✓ script). The creating dialog still finished its work (the quality check after the build) in the background and then recomputed the shared button as if it were still waiting for the outline. A dialog now updates the button only while it is the one shown.
  • Components v1.13.1: m-cycle writes an attribute only when its value changed, which fixes the macOS step-reset raster flake. Release notes: egatari/components v1.13.1
  • Components v1.4.1: m-kanbun fits its columns to the element's height and width (characters shrink 1 px at a time, to 42 px at least, and a console.warn says what is missing); its notes say that a poem that still does not fit is split, 2 句 per slide. Release notes: egatari/components v1.4.1
  • Components v1.7.1: m-bars no longer draws negative bar heights in an element with no height (it warns instead), and m-map-japan in small elements places the territory names in the nearby sea with a leader line instead of leaving them out. Release notes: egatari/components v1.7.1
  • Dev server: p in the preview closes the presenter view again when it is open (before, it only reopened it), and p, Esc or Close presenter view (p) in the presenter view close its window (before, nothing happened). Fullscreen is left first, as in the editor app.
  • Pasting an AI's output: when the script repeats the same step marker on consecutive marker lines within one slide (one [k] per dialogue turn, as some models write: [2] Expert: … / [2] Novice: …), the repeats are now merged under the first [k] as the next turns of that step, every turn kept in order, with a warning (「台本で同じステップの番号([2])が続けて繰り返されていたので、1 つのステップの発言としてまとめました」 / “The script repeated the same step marker ([2]) on consecutive lines, so those turns were kept together under one step.”). Before, the build reported the step as a duplicate and dropped a turn. A non-consecutive repeat ([2] … [3] … [2]) is still reported as before. The instructions pack is unchanged.
  • Instructions for the AI (music series): m-keyboard's range now says to include every key the lesson uses (both ends white keys, 1–3 octaves), and the keyboard is no longer described as sounding the notes: the 0.6.0 player never calls events(k), so parts make no sound. Restore the sound wording with #114 (planned for 0.6.3).
  • Quality check: boxes an ancestor hides are no longer measured. A component's readable layer (a visually hidden <ul> in a 1×1 overflow:hidden box with clip-path: inset(50%) or clip: rect(0 0 0 0), with or without the .sr-only class) made bodyBottom report e.g. "1056px > 565px" on slides that fit, so AI fix rounds could not converge; such content no longer counts for the body-position checks, smallText, smallSvgText, textOverlap or cellWordBreak, and the body-position checks measure only the part of a box that its ancestors' overflow leaves visible (text cut off by a visible box is still textClipped; contract §10)
  • npm run check -- --json piped to another program no longer loses the end of a large result: it waits for the output to be written before exiting
  • Quality check (R-fit): an overflow of the body under 1 px is no longer reported. A fractional overflow such as 565.4px against 565px was an error whose message read 「本文が下に 0 px はみ出す(565px > 565px…)」. The overflow is now rounded to whole pixels before it is compared, and the message uses the same rounded value, so a reported overflow is never "0 px" (2 px reads "2 px"). The same rule applies to bodyBottom, bodyRight, bodyLeft, tateBodyHead and bodyConclCol. Slides that overflowed by less than half a pixel lose that error, and the reported px of the others can move by under 1 px.
  • Player: with reduced motion (prefers-reduced-motion), a component that shows elapsed time as its content (static clock = true, such as m-timer) now gets the real time and keeps counting, instead of jumping to its end. Everything else is still shown at its final state (Player P3). The player reads clock and preview from the component class, never from a manifest
  • Player on touch screens (iPad, phones, tablets): tapping the slide brings back the toolbar after it has hidden; before, it only came back when a mouse moved. The tap does not advance the slide
  • Player on touch screens: the toolbar's buttons respond to a finger tap, also in Safari and other WebKit browsers, which sent no click. Each tap acts exactly once, also when the browser sends a click afterwards, and the bar still hides after a tap
  • Player: a tap on the hidden toolbar, or a mouse click while it is still fading in, now only brings the toolbar back. Before, it also pressed the button underneath, such as Listen with read-aloud or Next; this came with the touch-screen change in this release
  • Editor app, New…: the small text of a purpose tile wraps instead of being clipped (checked at widths 360–1280 px in Japanese and English).
  • Quality check: the "component draws differently depending on call order" error no longer fires for renderer anti-aliasing noise: when the
    component DOM is byte-identical and a few differing pixels all lie on shape edges inside the component (plus up to 4 isolated faint pixels), it is logged as info compOrderNoise instead
  • Instructions for the AI (pack 88ecfc51 → ff02abc6): a purpose turned off in New… no longer leaves its parts anywhere in the copied text. The R-purpose table is now made when the text is assembled (kit/core/llm-pack-assemble.mjs): rows of purposes that are off are left out, excluded parts are dropped from the other rows, and worked-example slides, narration sections and sentences tied to a part (<!--part:m-x--> in tools/llm-guide/) are dropped with it. A test checks every single purpose and every pair across all pack combinations.
  • The R-purpose table names only parts whose description is in the copied text: parts of packs that are not included are left out of the rows, and one line says which purposes those packs would serve (without naming their parts). Rows with no part say to use the nearest part, or HTML or inline SVG.
  • New…: studio.newDeck records the choices as they were when the instructions were last copied.
  • Reading the components manifest: bad purpose entries are dropped one by one with a warning (npm run gen) instead of silently shrinking the list; reserved is any truthy value; a component without tag is m-<dir>; a manifest.json that is not JSON falls back to the decided table with a warning; only vendored parts are named in the “do not use” line.
  • Editor app: saving a lesson that has never been saved (made from the AI's output, or a deck.html opened on its own) no longer asks to rebuild; this editor built it, so the rebuild changes nothing else.
  • Editor app: when only the theme changed (Change theme…), the rebuild dialog says so, instead of “You edited the slides HTML” and “Slides you did not edit may look different”.
  • A chapter divider (<section class="slide sec">) whose title was written with <h2> was unreadable: the h2 kept the colour of ordinary slide titles on the divider's ground. .sec h2 is now styled like .sec h1 (#128).
  • Edit mode and the presenting tools no longer fight (#69): entering edit mode in the editor app or the dev server turns off the pen, fading pen and laser, stops autoplay and its audio, and closes the overview, blackout, key list, fullscreen, read-aloud and a half-typed slide number; while editing, the tool buttons are hidden and tool keys do nothing (also b, a and f forwarded from the editor's toolbar, header or status bar), and keys typed into text fields (also inside shadow DOM) are never tool or slide keys. Leaving edit mode restores nothing. The current mode (Editing / Presenter tool / Viewing) is shown at the screen edge, outside the slides, with an aria-live announcement.
  • Editor app, New…: the sizes use one measure (UTF-8 bytes / 1024 of the copied parts), so the total is no longer smaller than the common body.

Security

  • Player: slide-show commands sent with postMessage (deck-cmd, presenter tools) are accepted only from the presenter view the slide show opened, or, in the editor's preview, from the editor window that relays them. The current and next views inside the presenter view follow only the presenter view. Before this, any window or frame holding a reference to the slide show could move it
  • Player: positions (deck-pos) are sent only to the presenter view and to the editor's preview window, never to another parent. A page that embeds the lesson with embed=1 gets only the position events of Player P8
  • Dependency updates from Dependabot: KaTeX 0.18.2 to 0.19.0 (exact pin; its commander goes from 8.3.0 to 15.0.0, which needs Node 22.12 or later). All 109 formulas in the examples, fixtures and docs render to the same HTML and MathML byte for byte, and the font files are unchanged; katex.min.css adds math to the font fallbacks and a .reflectbox rule. @fontsource/source-sans-3 5.3.0 to 5.3.1. Dev only: ajv 8.17.1 to 8.20.0 (ReDoS with $data, GHSA-2g4f-4pwh-qvx6) and fast-uri 3.1.8 to 3.1.9 (four advisories); npm audit now finds nothing, with or without dev dependencies
  • Node floor: engines is ^22.23.4 || ^24.22.1 || >=26.12.1 (the 2026-10-20/21 security release), and CI asks for >=22.23.4 <23 and >=24.22.1 <25 instead of 22 and 24, which took the runner's cached 22.23.3 and 24.21.0 (SECURITY.md)
  • Supply chain: CI and the release asset (tools/site-versions.mjs) install with npm ci --ignore-scripts (the only install script, esbuild's postinstall, is not needed); Dependabot waits 7 days (14 for a major version) before proposing a release (cooldown); the Pages workflow uses actions/upload-pages-artifact v5 and actions/deploy-pages v5. SECURITY.md and the threat model say how, and the Colab exception (onnxruntime-node's postinstall)
editor-site-v0.6.0.tar.gz sha256: ae945a0de036329813d9c414903c3413f8b26f29c2790ef2426f611c0b7fbf9a