From 18eee9dbc7bef69b486cba178d8c875e6e44fbfc Mon Sep 17 00:00:00 2001 From: Local Dev Date: Tue, 22 Sep 2026 00:06:50 +0200 Subject: [PATCH] feat(docx-editor): blue page with a pilcrow, matching pdf-editor's badge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mark now shares pdf-editor's silhouette, corner geometry and weight, in blue against its red, so the two editors read as a pair in the dock. It carries a pilcrow rather than a format label: at 16px "DOC" is a smudge while the paragraph mark is still a glyph, and it says word processor rather than file extension. Drawn as paths, not . An icon that needs a particular font installed to make sense is an icon that eventually renders wrong somewhere. Still nothing of Microsoft's: their blue sheet carries a white W, and the page-with-a-folded-corner is the universal document glyph rather than anyone's property. Also adds docs/DESIGN-one-extension-catalogue.md, which writes down the larger point this kept bumping into — that bundled and community extensions are two systems for one kind of thing, with two trust rules and two lists in Settings, and that "ships by default" should be a line of configuration rather than a separate distribution path. Proposed only; the awkward part is keeping a fresh offline install usable, which the note answers by treating the shipped copies as a pre-seeded cache that still verifies like everything else. --- bundled-addons/docx-editor/addon.json | 2 +- bundled-addons/docx-editor/icon-128.png | Bin 3937 -> 1537 bytes bundled-addons/docx-editor/icon-16.png | Bin 695 -> 398 bytes bundled-addons/docx-editor/icon-256.png | Bin 8140 -> 2911 bytes bundled-addons/docx-editor/icon-32.png | Bin 1248 -> 576 bytes bundled-addons/docx-editor/icon-48.png | Bin 1710 -> 680 bytes bundled-addons/docx-editor/icon.svg | 57 ++++++---------- docs/DESIGN-one-extension-catalogue.md | 87 ++++++++++++++++++++++++ 8 files changed, 109 insertions(+), 37 deletions(-) create mode 100644 docs/DESIGN-one-extension-catalogue.md diff --git a/bundled-addons/docx-editor/addon.json b/bundled-addons/docx-editor/addon.json index 435cbe4..9dab536 100644 --- a/bundled-addons/docx-editor/addon.json +++ b/bundled-addons/docx-editor/addon.json @@ -4,7 +4,7 @@ "version": "0.1.1", "description": "Open, edit and save Word documents (.docx) in a full Theseus tab, or export them as PDF. Ribbon-style formatting, tables, lists, images and links; headers, footers, footnotes, page setup and the document's own styles are carried through a save untouched.", "author": "Silent Mode", - "icon": "data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%20role%3D%22img%22%20aria-label%3D%22Word%20editor%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22dx-page%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%220%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%23ffffff%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23e9edf4%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Cpath%20d%3D%22M6.5%202.5h12l7%207v20a1%201%200%200%201-1%201h-18a1%201%200%200%201-1-1v-26a1%201%200%200%201%201-1z%22%20fill%3D%22url(%23dx-page)%22%20stroke%3D%22%232a3242%22%20stroke-width%3D%221.5%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20d%3D%22M18.5%202.5v7h7%22%20fill%3D%22%23cfd8e6%22%20stroke%3D%22%232a3242%22%20stroke-width%3D%221.5%22%20stroke-linejoin%3D%22round%22%2F%3E%3Crect%20x%3D%229.5%22%20y%3D%2213%22%20width%3D%229%22%20height%3D%222.2%22%20rx%3D%221.1%22%20fill%3D%22%230ac18e%22%2F%3E%3Crect%20x%3D%229.5%22%20y%3D%2217.6%22%20width%3D%2213%22%20height%3D%221.6%22%20rx%3D%22.8%22%20fill%3D%22%2397a3b6%22%2F%3E%3Crect%20x%3D%229.5%22%20y%3D%2221%22%20width%3D%2213%22%20height%3D%221.6%22%20rx%3D%22.8%22%20fill%3D%22%2397a3b6%22%2F%3E%3Crect%20x%3D%229.5%22%20y%3D%2224.4%22%20width%3D%228.5%22%20height%3D%221.6%22%20rx%3D%22.8%22%20fill%3D%22%2397a3b6%22%2F%3E%3Cg%20transform%3D%22translate(20.4%2019.2)%22%3E%3Ccircle%20cx%3D%224.6%22%20cy%3D%224.6%22%20r%3D%225.4%22%20fill%3D%22%230ac18e%22%2F%3E%3Cpath%20d%3D%22M6.6%201.9H3.9a1.85%201.85%200%200%200%200%203.7h.8M5.3%201.9v5.6M6.6%201.9v5.6%22%20fill%3D%22none%22%20stroke%3D%22%230a0f16%22%20stroke-width%3D%221.15%22%20stroke-linecap%3D%22round%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E", + "icon": "data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%202h8l6%206v12a2%202%200%200%201-2%202H6a2%202%200%200%201-2-2V4a2%202%200%200%201%202-2z%22%20fill%3D%22%232563eb%22%2F%3E%3Cpath%20d%3D%22M14%202v6h6z%22%20fill%3D%22%231e40af%22%2F%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cpath%20d%3D%22M12.3%208.6a3.1%203.1%200%200%200%200%206.2z%22%2F%3E%3Crect%20x%3D%2212.05%22%20y%3D%228.6%22%20width%3D%221.7%22%20height%3D%2210.8%22%20rx%3D%22.2%22%2F%3E%3Crect%20x%3D%2214.85%22%20y%3D%228.6%22%20width%3D%221.7%22%20height%3D%2210.8%22%20rx%3D%22.2%22%2F%3E%3Crect%20x%3D%2212.05%22%20y%3D%228.6%22%20width%3D%224.5%22%20height%3D%221.7%22%20rx%3D%22.2%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E", "main": "index.js", "capabilities": [ "sidebar-panel", diff --git a/bundled-addons/docx-editor/icon-128.png b/bundled-addons/docx-editor/icon-128.png index 8444ed57f58c03f63410fc8809f471a5fddf341b..64bcaa1fc3145f19105f47303e6486831987618e 100644 GIT binary patch literal 1537 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 diff --git a/bundled-addons/docx-editor/icon-16.png b/bundled-addons/docx-editor/icon-16.png index 557e864425f3d6aa8ec67ccd3250d123d90c681d..c69dc44e4e3bf097e8aafcb41b193a8f03342dc7 100644 GIT binary patch delta 372 zcmV-)0gL{(1Û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 diff --git a/bundled-addons/docx-editor/icon-32.png b/bundled-addons/docx-editor/icon-32.png index 7400ae48b0a21f92934985aab5196850d6ac8517..4d4bc80aae2b8e9255ea54d22073c70462e475f4 100644 GIT binary patch delta 552 zcmV+@0@wZE3BUx9BYy$)Nklz)zq{#a&TXABdZy+Cdz2P!S&};sdo{OH13NN$kV67Si_KHf901PS8Sj_3<|>2R+9^i5U3{puz&Feau6Bp1|^c;4cYg( z_joWk1_o41z;jq&NuEIVeT~{3$2%<7WO@d=kSCE@7_&Q$c4^O77a$~v0*KE9okY>z z0$PcpzJ@dsMehT-Bs3Es1|x{MMs-spakP2j!l`y$hDM|a8Cpb=S_{EoM+L_FO)zi- z*U!}miH+!N;eQd9fmx>qLikTa1vUnO>iuXzR?J>tq>p z?WF6y+^^rCe(k>RYdc8x!fDczbMNi_{m!}Po_i`_gT-nvPJi0EpYI_IE|e$&qf1j) zf0{s;8QP8#g)s)F(~0H8^6>S*=({LG){uA)^`Q9OfEKN;Z_z>$QkPSP>c&fvLJI}NPkYt38)=^(%Xi!r@q8;GNsu- z%9U_9g3mrbA=*_aF9OOH)6rNv?)9`HuU;rx=elY|FoM^DFdz@CEE^1FVx9vs>+_3I z3`Nf2PUf!ex+;quU$yMV3)MSh_EMr!Rt(-G0#tL=DAx%CaL9A3l&b3?gXe5xF|Px1 z#=Xov`+vD}5cBC&{_`atb)Bse&5o_=dbK{#V*Z;EV46zEcWvPSEeT1nKm_b;szas2Q4GJdN;oqcM_}qE$`Py00((OheqeLB zv!@XmlBq|a3<3(cD9ud`*jnvEhUs@O>Uv1?H-FNLICgsszXWHci8s2$@3Wg;?-^PZ z*uiw~;j2XnC?!5y`vrn+?k#G95v3{7v4hD442I6(?#lnbwHeN47DPF@y{&!LrkYVG!fe<)x|AQu6G*x&!+(%4kdD@8dAe_a%5J4f_?4~+i_?0gh#`X8y2N~A!BUb5Q= zJAajC$9q7IQ>!UBlPcmicQrcO9tX=pAom)oVVCR~n!xNz7%aUCT;brKz6sJ)3wB@_ z;5nftEkT$4qN|lxmQayOC=qv5RG__Whw{D{>d0aQh{`_}0JAb^u?S*f7!yz`nfThJ z_<2TW=F~c0SOu!9oM^1C!De2PvkuyKl=p`Qgxc1SW32Zol rdjJ3c|Nm3TkaPe500v1!K~w_(-+ZZfw56>(00000NkvXXu0mjf8f{o} diff --git a/bundled-addons/docx-editor/icon-48.png b/bundled-addons/docx-editor/icon-48.png index ead429dd6fca7bfb5727840c460aeef4e5c2c229..c19dcd3d7ac17e6c574eb4fa41ccc71ddbabd89d 100644 GIT binary patch delta 657 zcmV;C0&e}T4X6c>BYy&2Nkl?0 z1?~fZaQTtn@ALltE`uH?gB~XpFiln^X!y*+IM47&aBIx6(0`8*xS!@{-rYZN2t-I{ zpfpiEA)=-&So^{j@5AcVgTGay1LV1Zo#F>I+?E*_hG2m%!LfHi^$pqdGV8NfzF zL@*N}C5)d!VI>lAjE0d&%srqhk*JGIM_ISa*2cJR#efFqY2I5lWNE-<<^iz}zr zV{BXJUvJ3!McW!z>XmscP{p?j(8l9rRoy{d+ltYqj=YA|K{`brHeW7 z*}mDv_}<)V%+D1LUC2(MQL$up4s|XMkNy4b7k}g45`U)W8vn#JTxdf!10!2vKhOfm zvih6X1Y}uXd}zT0WCE3sW(3GK@$aP5(&LfwY-(MDd3w z9o%}b3>K3Ic{jS;1TNpMW6wDUr>`$!r5UYBWbJgl!ST4_qS@+Efw)KoOp^+jCKWJE z(p5AcJ_xbmz^aG7@k;&x4HR`*HeRQ)+k*3M-) r00030|1B`F?*IS*21!IgR09C(hR^lW5eIhw015yANkvXXu0mjfY)vtJ delta 1695 zcmV;Q24MN91+EQ{BYy^CNklxhCMNnvc^Cr57!wgRf`$eY^p_+UFeVg)s(<)}MNpt>E7I1MQf1qPb}RI; z?RIHr#ydMZyR)y^dv~`gU$Q-O=FGk4oO{nX_v~~Hc*tSELw^nv%R@_+*RFslr6EBO zVi4~Mrk@9XJ3o#jf#?YrSFT-YAf$APk*1j15v2yXl?FB0*H~s#4ER$Ei?io#S}>~j+a-QQczc4ht2i%`GlA* zE`FlA7&GU93XL%Y!Nzg$TF6e+Z?4NV8cjbY;skRUm9$Q1c~N4Nha(wIFgc*uL_)%Y zC`OV9_an+9BT*;VcR*{LYLpbk_=s}Mh!bo(5adLJFnLsv- z>TW>-PB66+h_iHtmr`J4cm(_RAJA22%eLh@2c0dYk5w=0`MueWgdOl1LrDBIJKO4= ziMA5x?C6ZC(UfA!qH1gDV{m4Q0zBA94cN6!^iA3NA{z}wLWPTB@X3l8;N1rKCr_ZC!n$3rupH}1_UUpZ%(TI2*P(xEx zOC6;Jc~<1pk4_PaNj>y5-)Fy!W6tYQb$`w*!7BNOI}h z_KP^-Y!B%8dknZc47#lW#pYCyvV3{SPIGe~+`uk=2Q>AY_^8X}#$S#B|7#OoToar) z;Zcm2oV1_%xCx}AKeGCLTRuRz+W#4vc{O&6CWgu6&A-&K*%fAg63^^dfb^v!d9q`3IB!9zoy`z^pz<-{^z4lqy zw0^aBeEICGVBxD9AdOBaRVYd&3bMw4R`5CC%K`XSm|kSfOGE!%r*}nJkd=|{9V|ax zZng%=h@7kkw*?IRsSD(TGnxm2L&!5d&F6sRr)n4JOX8A3AZ7p&4X5xqra5>vvlQP9 z_aF`&N9|sJ2*vkyItl!N`F~I0k<|3a$_lNJ(rKQoDOc!%Y-J8ey%U+jYuZP-dLjM( zo{wf4XX9{DEjIU@3+tc>bpR)JD9ol6s_`NW#;vH>9rQ0+&K+QJhF!jLP9Cl;-G+@B zB{6iP(M?kF+-r7S36;h1W-jz)R3yqSx0x*XbisPGObp=qgcIGKVSjvg^)dw7P6%^S zPfk=8eCDnR^gdh;5F)u{MK{_zkei$1|0XpP)IjMnxx`Lc@awS_xZRTwB=PJYJ1<<) zwNX#Fv~t~-bn>nE&mfk?`j5VD4m=PhchT%=q@Seywt)!}+UfFdVfi^ieC_1_2>$>8 p0RR8a=cmH}000I_L>NI-0{~~(0acL`RAvAG002ovPDHLkV1nU7CI0{b diff --git a/bundled-addons/docx-editor/icon.svg b/bundled-addons/docx-editor/icon.svg index 410e318..a82386d 100644 --- a/bundled-addons/docx-editor/icon.svg +++ b/bundled-addons/docx-editor/icon.svg @@ -1,42 +1,27 @@ - - Word editor + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/docs/DESIGN-one-extension-catalogue.md b/docs/DESIGN-one-extension-catalogue.md new file mode 100644 index 0000000..aac49fb --- /dev/null +++ b/docs/DESIGN-one-extension-catalogue.md @@ -0,0 +1,87 @@ +# One catalogue, one set of rules + +Status: proposed, 2026-09-22. Not implemented. + +Theseus currently runs two extension systems that happen to produce the same +kind of thing. + +| | Bundled add-ons | Community extensions | +|----------------|-------------------------------------|---------------------------------------| +| How it arrives | compiled into the build, seeded into the profile on first run | installed from the gateway catalogue | +| Who signs | the Silent Mode operator's Ed25519 key, pubkeys compiled into the app | the owner of a BNS name, checked against the chain | +| Update channel | `theseus.x/extensions//updates.json` | `theseus.x/extensions/community//updates.json` | +| In Settings | a section headed "Built into Theseus" | a separate section headed "Community" | +| How to publish | `scripts/sign-addon-update.mjs` + `sia-upload` | the publish page, or `PUT /api/ext/…` | + +Two catalogues in the UI, two trust rules, two publishing paths — for a +difference that is really only "who wrote it" and "is it there on day one". + +## What this should be instead + +**One catalogue.** Every extension is listed in the same place, whoever wrote +it. Silent Mode publishes under a Silent Mode name the same way anyone else +publishes under theirs. Being first-party is a fact about the publisher, not +a separate distribution system, and the UI should say so with a line of text +rather than a second list. + +**One rule for trust.** An extension is installable because a signature +checks out against the current owner of the publisher's name. That is +already what `verifyPublisherEntry` does; the operator Ed25519 key becomes +either one more accepted signer or nothing at all. `pickChannelEntry` +already accepts both, so this is mostly deletion. + +**Defaults are configuration.** Which extensions a fresh Theseus starts with +is a list of ids in the app's config, not a folder that gets copied. Changing +the default set should be editing that list, not moving directories around +and rebuilding. + +## The one thing that needs care + +If defaults are fetched from the catalogue on first run, a fresh install with +no network — or with the gateway down — has no editor, no wallet and no +screenshot tool. That is a real regression from today, where the build +carries them. + +So keep shipping the code, but stop treating it as a different kind of thing: + +- The build continues to include the default extensions' folders. They are a + **pre-seeded cache**, not a separate class of add-on. +- On first run they are installed from that cache, then verified and updated + against the catalogue exactly like anything the user installed by hand. +- If a seeded copy fails verification, it is quarantined rather than run — + a cache is only a cache. + +That keeps offline first-run working while leaving one set of rules +everywhere else. + +## Sketch of the work + +- **Config**: `defaultExtensions: [{ id, publisher }]` in the app's settings, + read at first run and on profile migration. Ids the user has removed are + remembered and not re-seeded — uninstalling a default must stick. +- **`main.js`**: seeding installs *through* the normal install path instead + of copying a folder and calling it built-in. One code path, one place where + a signature is checked. +- **`settings.html`**: one list. "Installed by default" becomes a badge on a + row, next to the publisher's name. The separate Community section and its + Install button fold into the single catalogue view. +- **`addon-updater.js`**: drop the distinction between the two channel + shapes; an extension has a publisher and an updates URL. +- **Gateway**: the catalogue gains first-party entries. Nothing changes + structurally — `/api/ext` already stores whatever a name owner signs. +- **Publishing**: `scripts/sign-addon-update.mjs` and the operator key stop + being the first-party route. Silent Mode's own extensions go through + `PUT /api/ext///` like everyone else's, which means + the release process needs that name's wallet rather than a key file. + +## Open questions + +- **Which name publishes Silent Mode's extensions?** Whoever goes first owns + each id permanently. Worth deciding once, deliberately. +- **Pinning.** A default extension is installed without anyone choosing it, + so a compromised or coerced catalogue entry reaches every fresh profile. + Pinning the default set to a version and a publisher in the app's config + bounds that. +- **Does the operator key survive at all?** Keeping it as an accepted signer + for the default set is a hedge against the name-owner key being lost; + keeping it forever means the two-rules problem never fully goes away.