Repository navigation
v0.6.0
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)のオプションになりました。現在のステップの蛍光ペン風の強調はなくなりました。 - 基調色のテーマ
default1.2.0:結論の行に左の太い線と薄い灰色の地を付けました(デザインの提案:@totasuko-lab)。テーマbusiness1.0.1、default1.1.0 も含みます。前の版の色のままの教材は、その色を保ちます(「テーマを更新」で新しい色にできます)。 - 画面とドキュメントの言葉を 1 つの用語集(
docs/terms.json)にそろえました(ステップ・台本・パーツ・Egatari ファイル・再生専用・エクスポートなど)。 - Colab で AI 音声を作る流れが、CPU でも使えるようになり、手順が画面に出ます。
技術的なこと
- 形式:Egatari 1.0(Working Draft wd-2026-10-28)。索引と
deck-metaにplayer(egatari-player1.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, andbthere 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
default1.2.0: the conclusion row gets a thick bar on its left and a light grey ground (design proposed by @totasuko-lab).business1.0.1 anddefault1.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-metacarryplayer(egatari-player1.0.0) andgenerator(egatari-studio, this version).contractsis{"source": 1};contracts.runtimeis no longer written or read. An index withoutplayeris 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.embedis copied intodeck-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
playerandgeneratorbyte for byte; a rebuild of a file with another player reportsplayerChange.egatari.jsonwriters 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
musicandenglish.m-kakijunisMIT AND OFL-1.1(seeNOTICE); them-map-worldmap 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 withnpm 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, andbin 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) andm-tape(テープ図・線分図 with braces and “2 倍” arrows), in the seriesacademic. 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 seriesmusic, andm-kakijun(書き順 of kana, stroke by stroke), in the serieskokugo.m-keyboardcomes with the subject Music on both plans;m-kakijunis paid-only for now (FREE_OUT).m-kakijun's licence isMIT AND OFL-1.1(its stroke data is derived from strokesvg / Klee One): it is recorded in the vendored manifest andNOTICE, and the hosted editor ships the part'sOFL.txt,LICENSE-strokesvg.txtandstrokes-CHANGES.mdundervendor/components/kakijun/<version>/.m-timelinegains project-plan (Gantt) options:afterarrows,progress,todayandunit. 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 seriesenglish. 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 seriesacademic, andm-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 seriessocial. Both are paid-only for now (FREE_OUT).m-treegains branch labels and paths (paid only),m-flowgains decision diamonds and loops, andm-barsgains negative values andstack="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-timelineandm-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-kpihas presentation variants (count,rise,flip,underline) chosen withvariant(format spec §8.4).m-barshasstack(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-kpiandm-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 genprints the size of each plan (free per subject and with all subjects, paid), andnode kit/llm-pack.mjs --plan paidprints 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 seriessocial. New subject 地図(社会:地理・歴史) / Maps (social studies: geography, history) in New… (step 4, small text 日本地図 / Map of Japan; guessed from 地図, 都道府県, 地理, 人口 and the like), with its series instructionsdocs/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-scatterandm-map-japan:anchoralso acceptstopandbottom, as names foraboveandbelow. 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) andm-timer(a group-work timer, one phase per step), the first parts that take viewer input. The manifest now carriesinteractive,viewerInputandclock. A 16th purpose tile in New…, 予想して確かめる / Predict, then check (手を挙げて数える・答えを開く); thetimeboxpurpose 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-timeris a tool (manifestcomponents.timer.group: "tool"with its own tile 「タイマー」 / "Timer"), and it has bells (bells, declared withevents(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) andm-boxplot(a box plot built step by step like the textbook procedure; groups side by side), both in the seriesacademic. 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 pack8e0efb1a→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
playerin 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 inversions.json) and Open the migration guide. Working folders withegatari.jsonin which no slide has an id get the same notice, withnpm 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;--strictfor the release candidate) andnpm run player:bump -- patch|minor|majorkeep 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 inaudio/manifest.json,timeline.json,comments.jsonandegatari.json; backups in.cache/edits/). Files never carry heading-text keys, hand-writtendata-keyors<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(useterm,emph,muted),data-stepsanddata-anim(steps and motion come fromdata-step,data-at,drawand 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.articleand article-only lessons (noentry); reading a file written before the 1.0 shape (noplayer) 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 keymwhile editing and is the only tool button left there; the pen keydalso opens it) turns the pointer into a comment pen;dtyped 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 incomments.jsonasstrokes: [[[x, y], …], …]in slide coordinates (at most 20 strokes, 500 points each, 2000 in all);pinis the length-weighted centroid over all strokes, set by the writers. An entry with a singlestrokeis read asstrokes: [stroke], and writers write onlystrokes(contract §13). The editor's overlay andnpm run comment-shotsdraw 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(freeorpaid) inegatari.jsonstudio.newDeck; an earlier record without it reads asfree(AI_PLANS,planOf,seriesForChoiceinkit/core/new-deck.mjs). - Size caps per plan for the generated instructions:
PACK_CAP_KBinkit/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
englishof the AI instructions andm-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 nom-*part outside its own catalog. - New ④ has a subject tile Music (音楽, “Keyboard (scales, chords)”), the series
musicof the AI instructions withm-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 purposemusichas 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 itstile; 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 instudio.newDeck.tools.node kit/llm-pack.mjstakes--tools, and--plan paidnow honours--series(--series all --tools all --plan paidis the full pack).npm run genchecks 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.jsonasstudio.newDeck(throughupdateConfig) 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 declaresstatic 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=1opens a slide show with later steps shown faintly (Player P8);?mode=lecturekeeps 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
titlefromplayerandgeneratorwhen present andnameotherwise; 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
playerChangefrom 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 useh1. - 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-themeon 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 itstheme.jsonversion or"local"; it is found in the same place as the build looks) inegatari.jsonthemes, 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 andegatari.jsonbyte 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
extendswithin 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 innpm test): flags avoided words of the termbase in UI strings, docs and skills, withdocs/terms-allow.jsonfor 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)andseriesPart(name, lang, exclude, plan):planis'free'(default;FREE_CORE,FREE_HOME, no paid-only parts) or'paid'(every series and every part;seriesis ignored). New:packParts,planData,paidOnly,freeSeriesOf,goneParts(kit/core/llm-pack-assemble.mjs),PAID_ONLY,loadedParts(series, plan)andmembersOfSeries(name, plan)(kit/core/llm-pack.mjs),hiddeninpurposesTable, andnode 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-metacarryplayer({"name": "egatari-player", "version": …, "title": "Egatari Player"}, the bundled Egatari Player; its version is inkit/player.json, with+dev.<commit>when the player files differ from the release inkit/player.lock.json) andgenerator({"name": "egatari-studio", "version": <Studio's version>, "title": "Egatari Studio"}, wasmotion-academic-slides;titleis the name shown to people).contractsis{"source": 1};contracts.runtimeis 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 copiesextensions.embedintodeck-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 addsliveto 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)andloadedParts(series, plan, tools)take an optionaltoolslist (tags or names, or'all'); without it no tool is included. Withplan: 'paid',seriesis now honoured (it used to be every series): passseries: 'all', tools: 'all'for the full pack.kit/core/llm-pack.mjsexportsTOOLS;kit/core/new-deck.mjsexportsguessToolsandtoolsForChoice, andstudio.newDeckhastools.assemble(data, {series, lang, exclude})(kit/core/llm-pack-assemble.mjs),commonBody(lang, exclude),seriesPart(name, lang, exclude)andpackWithRequest({…, exclude})take an optionalexcludelist of component tags left out of the catalog; without it the output is unchanged.- Component context (format spec §8.4):
ctx.enteredistrueon 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), andfalseotherwise, so a component knows when to reset viewer input.deck:posstill fires for components pinned to earlier releases - Component context (format spec §8.4):
ctx.modeis"talk"or"video", never"lecture"; later steps shown faintly arectx.preview === true(withmode: "talk"). Components pinned before v1.10.0 that test onlyctx.mode === "lecture"draw their later steps hidden under preview.ctxpassespreview: falseto a component inside an element markeddata-preview="none" - Component context (format spec §8.4):
ctx.slideis 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.VERSIONis the version of the running player:player.versionindeck-meta(format spec §4.1),generator.versionfor a file from before 1.0, and Studio's version in a plain build. The newDECK.MADE_WITHisgenerator.version. Send feedback fillsversionwith the player's version and addsmade=<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)andpackWithRequest({…, off}): the common body's purpose table depends on the included series (default: none, as indocs/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, sinceinputHashignores 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 asstudio.audioMethodinegatari.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
business1.0.1,--emph#C2410C → #BA3C05: the same orange (OKLCH hue 38.4), slightly darker, so that orange text on its own--emph-tintreaches 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 recordedbusiness1.0.0 keeps it (theme pinned: …,--update-themes), as fordefault1.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_STEPSincolab/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 itsenv: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. APROFILEbox in cell 3 prints the time of each stage per segment. - Records from the notebook carry
recipe.diffusionStepsandrecipe.precision(Japanese) as provenance; the import keeps them and they are not part ofinputHash. The verified note adds the owner's 2026-10-25 timings (T4 and CPU, Japanese and English), andnpm run gennow 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 modelecture, 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, exceptm-predict,m-hissanandm-timer, which declarestatic preview = "none"and show nothing ahead. With no lesson seed, a part withoutvariantshows 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), andm-tree,m-vennandm-numberlineno longer rasterize differently after being redrawn. The expired known flake for macOSm-cycle(slide 1, step 5) is removed fromtools/step-reset-known.mjs. - Components v1.12.0, visible in lessons:
m-predictandm-timerkeep 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-barsdraws bars with negative values below the zero line (before, a negative value was drawn as 0). m-flow: edge labels and the text inmutedboxes 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 knownsmallTextissue for those demos is removed fromtools/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 pack214a0876→5cc9551c. - Components v1.3.0 is the default version (1.0.0–1.2.1 are kept for lessons that recorded them).
m-curvesgains the series words ofm-scatter:step(series with the samestepare drawn together),tone,labelAt(where the series name sits) andanchorright/left/above/below. The old forms still work and draw identically (color,atas the x of the name,anchorstart/middle/end); they are described only outside the AI notes. Them-scatternotes no longer refer tom-curvesfor the axes. Instructions pack5cc9551c→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-kanbunnow gives one step per line (句) of the reading order (before, one step for the whole reading order): the defaultphases="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 句, andexamples/kokugo-kanbunuses the new default (its narration has one[n]per 句 instead of{cue}).
Also fixed in v1.4.0: the current-character highlight ofm-kanbunfades out within its step, and them-kobuntranslation 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 itslabel,examplesandicon,{"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 bym-map-japanonly 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 fromnpm run gen. The hint under the tiles reads 「今は全部使えます。押した表し方は、AI が使いません」 / “All are in use. Press one and the AI won't use that representation.” Instructions pack0f5e51c9→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-japandraws differently by default, a visible change for existing lessons once they move to v1.8.0: the 小笠原諸島 inset is off unlessislands="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 「日本の範囲(本当の位置)」 withlayout="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).mdpoints 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).mdpoints to §8 and §5.5 for slides, script and timing. The legacydata-steps,data-anim,data-mode="lecture"and.blue/.red/.grayare no longer listed as current; the migration guide says what to replace them with. - Theme
default1.2.0, the conclusion row: a 5px bar in--emphon its left, bold text, its fixed position and a light grey ground (--concl-bgtransparent → #F5F5F5), left-aligned instead of centred in a frame. Position and height are unchanged (571px / 72px), so the quality checks give the same results.
--emphtext on the ground is 5.32:1 and--fg14.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.kokugotakes the bar in its own red;businesskeeps its pale-orange ground. A lesson that recordeddefault1.1.0 keeps it (theme pinned: …,--update-themes). Conclusion row design proposed by @totasuko-lab - Saving without rebuilding (tier A) keeps
playerandgeneratorbyte 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_COREis nowm-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 pack48ab84a3→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, keyl): 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.curclass 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-tintstays 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: nullinstudio.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 gennames 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 onearia-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 packfb9e430d→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-curvesandm-quadstay in their packs until components v1.2.0. egatari.jsonstudio.outline(long lessons) is written throughupdateConfig, 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 fromSUBJECTS(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,freeSubjectsinkit/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.freeis 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 genprints each single subject and the largest pair, and the size table indocs/authoring-with-llms*.mdlists the largest pair instead of every subject. - Egatari Player 1.0.0 (the bundled player that files carry,
playerin the index anddeck-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.cssand themedefaultdefine--preview-opacity: .45;--lecture-dimstays 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-gendaiandm-kobunare 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; componentvariantsare read too. npm run components:updatekeeps the releasemanifest.jsoninvendor/components/(its sha256 incomponents.lock.jsonasmanifestSha256;components:checkverifies 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:
rankinggoes into Compare, now labelled 比べる(量・特徴) / Compare (amounts, features); ids without a tile (text-structure,parameter,grouping, unknown ones) make no tile and are reported bynpm 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-slidesskill: 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) andmanifest.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.jsonadds 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/cdo 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 fromvendor/egatari-spec/SOURCE.jsonwhen 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.jsontitle 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.jsonas `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 tabledocs/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=lecturestill 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 restoredata-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).variantattributes in a source are kept byte for byte, and an earlier source'sdata-egatari-seedis 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 newmakes a new working folder). - Editor app: “Export built HTML” (the built
out/deck.htmlis still made bynode 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-cyclewrites 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-kanbunfits its columns to the element's height and width (characters shrink 1 px at a time, to 42 px at least, and aconsole.warnsays 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-barsno longer draws negative bar heights in an element with no height (it warns instead), andm-map-japanin 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:
pin the preview closes the presenter view again when it is open (before, it only reopened it), andp, 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'srangenow 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 callsevents(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×1overflow:hiddenbox withclip-path: inset(50%)orclip: rect(0 0 0 0), with or without the.sr-onlyclass) madebodyBottomreport 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,textOverlaporcellWordBreak, and the body-position checks measure only the part of a box that its ancestors'overflowleaves visible (text cut off by a visible box is stilltextClipped; contract §10) npm run check -- --jsonpiped 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,tateBodyHeadandbodyConclCol. 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 readsclockandpreviewfrom 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 infocompOrderNoiseinstead - 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-->intools/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.newDeckrecords 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;reservedis any truthy value; a component withouttagism-<dir>; amanifest.jsonthat 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.htmlopened 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: theh2kept the colour of ordinary slide titles on the divider's ground..sec h2is 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,aandfforwarded 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 withembed=1gets only thepositionevents of Player P8 - Dependency updates from Dependabot: KaTeX 0.18.2 to 0.19.0 (exact pin; its
commandergoes 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.cssaddsmathto the font fallbacks and a.reflectboxrule. @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 auditnow finds nothing, with or without dev dependencies - Node floor:
enginesis^22.23.4 || ^24.22.1 || >=26.12.1(the 2026-10-20/21 security release), and CI asks for>=22.23.4 <23and>=24.22.1 <25instead of22and24, 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 withnpm ci --ignore-scripts(the only install script, esbuild'spostinstall, is not needed); Dependabot waits 7 days (14 for a major version) before proposing a release (cooldown); the Pages workflow usesactions/upload-pages-artifactv5 andactions/deploy-pagesv5. SECURITY.md and the threat model say how, and the Colab exception (onnxruntime-node'spostinstall)
editor-site-v0.6.0.tar.gz sha256: ae945a0de036329813d9c414903c3413f8b26f29c2790ef2426f611c0b7fbf9a