Skip to content

V0.4 dev - #13

Merged
FacioErgoSum merged 48 commits into
mainfrom
v0.4-dev
Sep 19, 2026
Merged

FacioErgoSum merged 48 commits into
mainfrom
v0.4-dev

Conversation

@FacioErgoSum

Copy link
Copy Markdown
Contributor

Check changelog for all updates.

Complete overhaul of UI, circuit view, visual view, AI coding agent integration, tinyService updates, project management and file handling, and GitHub integration.

FacioErgoSum and others added 30 commits September 13, 2026 10:29
…o AI

Snapshot of the uncommitted v0.4-dev work, pushed as a backup before the
audit fixes. Does not build yet: the typecheck fails until
@mister-industries/shared and tinyservice are bumped (audit REL-1).

- Parts move to the tinyparts repo: layered registry (this computer > dev
  checkout > GitHub > bundled snapshot), folder parts with pins read from
  pin-* SVG ids, bundled snapshot in assets/tinyparts, launch-time GitHub
  sync by blob sha with an IndexedDB cache, live dev loop through
  vite-plugin-tinyparts, Parts editor save/reset, rebuilt pack manager,
  parts:check / parts:new / parts:sync scripts and docs
- Projects: start screen, open dialog (folder, GitHub repo, recents), New
  Project dialog, save to computer for browser-only projects, browser
  compile of local folders
- Studio AI: agent core moved to src/shared and shared with a new browser
  agent; read_guide, inspect_circuit, find_parts and read_serial tools;
  bundled guides with screenshots
- Visual: theme object for p5 sketches, serial plotter as the default
  visual.js, redesigned web export
- Housekeeping: version 0.4.0, demo/ removed, old assets/parts JSON and
  tinyboards art removed

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The renderer already speaks the 1.2 protocol (request ids, board details),
but the lockfile still installed shared 1.1.1 and tinyservice 1.0.1, so the
typecheck failed and a packaged build would ship the pre-parity backend
without board watching or the language-server bridge.

- @mister-industries/shared ^1.1.1 -> ^1.2.0
- @mister-industries/tinyservice ^1.0.1 -> ^1.1.0

Typecheck passes; test:circuit 243/243.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Clears what earlier sandboxed sessions and the old circuit editor left in
the repo (audit LEFT-1 to LEFT-5, LEFT-7, B.5).

- 15 .fuse_hidden* temp copies tracked since v0.2.0; ignore the pattern
- scripts/_to_delete and circuit/__tests__/_to_delete (incl. a 633 KB SVG)
- tinyStudio-examples-old/ (110 files, superseded by tinyStudio-examples)
- tsconfig.web.tsbuildinfo; ignore *.tsbuildinfo
- 16 unreachable source files: lib/wireRouting and lib/circuitNets
  (replaced by circuit/core), WelcomeDialog (replaced by the start screen),
  UserMenu, BoardSelect, arduinoFileUtils, empty commands/index.ts, the
  arduino barrel, and the unused Accordion, Avatar, Form, Label, Radio,
  Separator, Switch and ThemeToggle primitives
- 4 unreferenced assets, including the electron-vite template logo
- scripts/sza-wrap: a one-machine 7-Zip workaround for electron-builder
- Declare the 8 @radix-ui packages the UI imports (they only resolved
  through the radix-ui meta package) and drop radix-ui, electron-updater,
  next-themes, react-zoom-pan-pinch, react-hook-form, @hookform/resolvers

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Most of the 2,117 lint warnings were formatting: 192 source files had CRLF
endings on Windows checkouts while Prettier expects LF (audit REL-9). A
.gitattributes now pins LF for text and marks binaries, so the repo stays
consistent whatever core.autocrlf says.

Prettier ran over TypeScript, CSS, scripts and root config only. The
tinyparts snapshot under assets/tinyparts is excluded: the app compares its
file hashes with the tinyparts repo on GitHub, so reformatting it would
make every install re-download unchanged parts.

No behavior change. Typecheck passes; test:circuit 243/243.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Lint on the sources goes from 113 errors to 4; the remaining four are the
any types in VisualPreview, which the sandboxed sketch runner replaces
(audit REL-9, REL-10, LEFT-8, GAP-10 follow-up).

- ESLint ignores dist-web, vendor and the generated tinyparts snapshot, and
  stops requiring return types in plain .mjs scripts, which can't have them
- Fast refresh: providers move to ArduinoProvider.tsx and SerialProvider.tsx
  (the context modules keep the hooks, so their importers are unchanged);
  ThemedToaster, the canvas Selection helpers, wire colours and the sim
  formatters/CSV export move out of component files
- Type the LSP client's JSON-RPC and LSP payloads instead of any
- prefer-const fixes, unused import and variable in gen-icon.mjs, unused
  createService parameter, stale eslint-disable in MonacoEditor
- Remove per-message debug logging from the Arduino service, a commented-out
  log, and the electron-vite template's ping handler and trailing comment
- build:mac and build:linux typecheck like build:win; add npm test

Typecheck passes; test:circuit 243/243.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The renderer now shows content from anywhere (examples, GitHub repos, pack
indexes, dropped .fzpz files), so it is no longer trusted with the disk
(audit SEC-1, SEC-2, SEC-3, SEC-4, SEC-6, BUG-1, BUG-2, BUG-7, REL-12).

- visual.js runs in a sandboxed iframe (public/sketch-runner, no same-origin)
  that talks to the app only through postMessage: code, theme, serial
  lines in; errors out. p5 is served from node_modules by vite-plugins.ts
  instead of a CDN, so the Visual view works offline.
- Main checks every file operation against folders the user picked in a
  folder dialog (persisted in userData/folder-access.json) plus the examples
  folder. open-path opens documents and images only; open-external and new
  windows accept http, https and mailto only. The agent refuses workspaces
  outside those folders. Recent projects from before this change ask for
  their folder once more.
- File, window and parts IPC move out of index.ts into src/main/ipc.
- Part SVG is cleaned with DOMPurify's SVG profile where it is inserted
  (canvas, palette, Parts editor), leaving the text transforms that run on
  part art untouched.
- Production CSP: no inline or eval script, no CDN, wasm allowed, backend
  reachable on any localhost port (tinyService moves off 3000 when taken).
  The dev server adds inline script back for Vite's React Refresh preamble.
- Links in docs open outside the app; relative links do nothing, and main
  refuses to navigate the window anywhere but the app.
- Explicit tinyService origin list (enforced once tinyService checks the
  Origin header); folder deletes use fs.rm; the preload drops its unused
  non-isolated fallback.
- .claude/launch.json gains web-preview to test the production build.

Verified in the production web build: no CSP violations, README links open
in a new tab, sanitized part art renders in the palette, and the runner
draws a sketch with theme colours, serial values and serialEvent, and
reports sketch errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… Edit

- Studio AI: the timeline, busy state and permission prompt move to
  lib/agentChat, so switching tabs no longer wipes the conversation, and
  replies or file edits that arrive while the panel is closed aren't lost
  (audit BUG-3)
- Backend connection: failed attempts that the client retries on its own no
  longer log console errors (the status bar could say Connected beside one);
  one warning per outage, and the client's debug logging is off (BUG-8)
- Mermaid diagrams follow the app's light/dark mode instead of a hardcoded
  dark palette, and re-render when it changes (BUG-6)
- The circuit edit toggle reads Edit / Done instead of a bare icon, matching
  the empty-canvas hint (UX-2)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The bundled core pack is Fritzing-derived CC-BY-SA art. tinyparts carries
its ATTRIBUTION.md, but parts:sync only copied the files a pack loads, so
the notice never reached the app (audit REL-4). The sync now copies it,
outside the pack's hash map so the launch-time update check doesn't see
the pack as changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- appId cc.tinystudio.app (was the electron-vite template's com.electron.app,
  which Windows uses to group taskbar icons and notifications); the runtime
  app user model id matches (audit REL-6)
- files is now an allowlist of out/ and package.json. Before, the default
  **/* put docs, scripts, sources and fetched binaries into every install;
  an unpacked Windows build now holds only node_modules, out and package.json
  under resources/app (REL-7)
- Remove the example.com update feed and dev-app-update.yml (nothing imports
  electron-updater any more), the camera, microphone and folder usage
  descriptions the app never uses, the third-party Electron download
  mirror, and the electronjs.org Linux maintainer
- About tinyStudio in the header menu: version, licence, and the third-party
  work the app ships with, including the Fritzing parts' CC-BY-SA credit
  (R-6)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- 167 classes using the old tinyForge palette names (bg-navy-900, text-fg-3,
  text-cyan, border-navy-600…) now use the semantic tokens those names
  already pointed at, so nothing renders differently; the alias block and
  its Tailwind colour mappings are deleted (audit LEFT-9)
- Remove the unused .ts-riso and .tf-gradient-text CSS
- Drop a stale TODO above code that already does it (GAP-10) and type the
  Monaco beforeMount parameter (CODE-9)
- .vscode/settings.json keeps the formatter settings and loses personal
  Peacock colours (LEFT-11)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Breadboard and schematic keep their own zoom and pan. Switching views used
  to remount the canvas and re-fit it every time (audit GAP-6)
- Pin and net-label hit targets grow to at least 12 screen pixels however
  far the view is zoomed out, instead of a fixed 16 world pixels that shrank
  to 4 at the minimum zoom; the pin dot stays centred

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- lib/storageKeys.ts names every localStorage key the renderer uses. The
  theme moves from the template's 'vite-ui-theme' to 'tinystudio.theme',
  carried over on first launch, and the exported Visual page reads the
  same key as the app.
- serialBus keeps its buffer in module state with a listener API, so
  VisualPreview and Studio AI's read_serial stop reading window.__tinySerial
  and the 'tinyserial' DOM event. sketchTheme caches without window.__tinyTheme.
- src/shared/tinyservice.ts holds tinyService's default port for both the
  main process and the renderer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
EditorPanel.tsx was 766 lines holding the Code, Circuit and Visual views,
the new-sketch dialog, the sketch templates and the project-file hook.
It now only picks the view; each piece lives in components/editor/.
The Circuit wrapper is CircuitPane, so it no longer shares a name with
circuit/views/CircuitView. No behaviour changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fileCommands.ts wrapped every action in a class with a constructor and an
execute() method, and a few carried undo() methods nothing called.
command.ts held a CommandManager and BatchCommand that were never used.
Each action is now an async function (openFolder, loadGitHubProject,
refreshWorkspace, openFileItem, renameItem, ...), and command.ts is gone.
Undo for the circuit editor lives in its own store and is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- README describes 0.4: circuit.json, tinyparts, the tinyService
  installer for the browser build, Node 22, current known issues.
- INTEGRATION_GUIDE.md covers the child-process backend, port selection,
  how the renderer finds the service, and the open origin check.
- packaging-windows.md matches the build as it is: asar off, npm deps,
  only out/ and package.json shipped, the GitHub client id, no 7-Zip
  wrapper.
- CHANGELOG.md (everything since 0.2.0) and THIRD_PARTY_NOTICES.md.
- docs/state-management.md: where each kind of state belongs.
- The circuit spec notes that the tinyparts layers replaced registry.ts.
- Agent working logs move to docs/archive/.
- CI runs typecheck, lint, tests and the web build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- docs/release-plan.md: the owner's decisions on every open audit item,
  ordered into 0.4.0 and 1.0 beta steps with file pointers, done-when
  checks, the rules for working in this repo, and what waits on the owner.
- docs/audit-2026-09.md: the 13 September audit as Markdown, each item
  marked with the owner's flag or discuss and its outcome (the fixing
  commit, or where the decision sits in the plan).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nothing could switch the editor on: no code dispatched setEditorMode, so
the BlocklyEditor component, the Arduino block definitions, the blockly
package and its 22 media files in public/ shipped for a feature nobody
could reach. Drop them, the editorMode state and the licence entries.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
npm audit fix: 16 of 18 advisories, including the critical one in tar
(7.5.20 -> 7.5.22) and Electron 42.5.0 -> 42.11.3. The two left are a
uuid advisory reachable only through tinyService's own dependency.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Opening the Circuit or Visual view used to write a default file into any
project that lacked one, and silently convert an old diagram.json. Both
views now show what's missing and a button: Create circuit, Create
visual.js, or Convert (which writes circuit.json and keeps the original as
diagram.json.bak). Opening a folder that holds only an .ino leaves it
unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
When the backend child exits without being asked, ServiceManager now
restarts it once on the same port, so the renderer's WebSocket URL stays
valid. If the restart fails, or the service dies again within a minute,
main sends service:error with stopped:true and BackendPrompt shows
"tinyService stopped" with the reason and a Restart button (new
service:restart and service:get-status IPC). The decision lives in
serviceRestart.ts, a pure function with tests; the test runner now scans
all of src so main-process tests are picked up.

Two fixes found while testing on the owner's machine:

- The free-port probe bound 127.0.0.1 only, so it missed the installed
  tray tinyService listening on the wildcard address. The child died with
  EADDRINUSE while the health check talked to the tray service and
  passed. The probe now binds the way the service does.
- The shared WebSocket client stops after 10 reconnect attempts, so a
  backend that came back later stayed "Disconnected" until the app was
  reopened. checkStatus() now kicks a reconnect, which makes the status
  bar's Retry work and lets the Restart button reconnect at once.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The agent was pinned to claude-opus-4-8. It now defaults to Opus 5 and the
Studio AI settings offer Opus 5, Sonnet 5 and Haiku 4.5. The list, the
default and each model's request options live in shared/agentModels.ts:
Opus 5 and Sonnet 5 get adaptive thinking with effort "high"; Haiku 4.5
predates both, so it gets a fixed thinking budget and no effort setting.

The choice is stored next to the API key on desktop (settings.ts, new
settings:get-model / set-model IPC) and under tinystudio.agent.model in
the browser. Changing it starts a new chat, since the history was produced
by another model. The panel header shows the chosen model instead of a
hardcoded name.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tinyparts 0085e41: new breadboard art and icons for the tinyCore,
tinyDisplay, tinyProto and tinySpeak. The pads are now <circle>s, so the
two tests that edit the art to move a pin match on cx and shift by one
pitch in viewBox units (5.4) instead of the old <rect> x.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
An Experimental badge and a one-line note at the top of the Simulate
panel, and the same word in the toolbar button's tooltip. Findings from
trying a resistor divider, an LED circuit and a tinyCore-driven LED are
recorded under beta step 5 in docs/release-plan.md: the first two are
right, the third reads 0 V because boards aren't modelled.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Arrow keys move the selected pin by one unit of the art's own coordinates
(the viewBox fitted into the part box), Shift by 0.1 in. While the pins
come from pin-* shapes, the nudge edits the shape in the SVG itself
(movePinInArt: circles by cx/cy, rects by x/y, anything else by a leading
translate, mapped through ancestor transforms and verified by a rescan),
so the file stays the source of truth; only a drag pins positions down in
part.json. Ctrl+Z / Ctrl+Y undo and redo pin, size and art changes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
With no project open the Files panel now only says so; creating and
opening projects happens on the start screen and in the header menu, and
the menu uses the start screen's names (Create new, Open existing, Try an
example; Close project).

Every shortcut the app defines now lives in lib/shortcuts.ts. The code
view, the circuit canvas, the circuit toolbar tooltips and the parts
editor read that list instead of comparing keys themselves, and a
Keyboard shortcuts dialog (header menu, or Ctrl+/ outside a text field)
renders it grouped by where each one applies.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Adds reportError(title, error) to lib/notify (error toast with the reason,
a bell entry, the full error on the console) and writes the rule into
docs/code-conventions.md, linked from the README: a failure of something
the user did gets a toast; a background failure gets console.warn with
context; a catch that ignores an error says why.

Converts the call sites. Actions that already toasted now go through
reportError; the Board and Library managers report a failed list instead
of showing an empty one; launch-time reopen, status checks and README
refreshes warn instead of erroring; the file-system wrappers stop logging
errors they rethrow (the caller reports), which also removed eight
try/catch blocks that only rethrew. The main process, the preload bridge
and the error boundary keep console.error: those are the app's own bugs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Comments now say what the code does and why, not what it replaced; the
history lives in git. docs/code-conventions.md states the rule. The
remaining matches for "old", "no longer" and "previously" describe
present behaviour (a renamed tab's old path, a part no longer in the
circuit) or are user-facing text.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
scripts/gen-example-tags.mjs now lives in tinyStudio-examples/tools with a
workflow that writes tags into that repo's examples.json on every push to
main. The manifest copies here (examples.json, examples-tagged.json) and
the fallback to them in lib/examples.ts are gone: the Examples tab reads
the examples repo alone. docs/web-deploy.md describes the current setup
instead of calling the examples repo a future step.

tinyparts gets a CI workflow in its own commit (step 10 of the plan).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- folderAccess: granted folders and their subfolders, siblings refused,
  the examples folder, case rules per platform, grants persisting.
- externalLinks and the open-path allowlist (canOpenFile, now exported
  from ipc/files): only web and mail links leave the app; only documents
  and images open in other programs.
- fileCommands against a fake fileSystem: openFolder builds the tree
  (folders first, natural order) and opens the sketch; refreshWorkspace
  keeps every id; renameItem renames on disk and moves the open tab.
- readSavedTheme (now exported): the pre-0.4 key migrates once.

The runner stubs `electron` for main-process modules and resolves the
renderer's @Renderer alias. Found by the rename test: a renamed file's
tab kept its old name; rebaseOpenFiles now updates the name too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
FacioErgoSum and others added 18 commits September 14, 2026 14:45
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tinyService 1.2.0 listens on 127.0.0.1 and refuses browser origins it
doesn't know. The dependency is ^1.2.0 (package-lock.json still pins
1.1.0 until the package is on npm; run npm install then), the origins
passed are file://, http://localhost:*, https://studio.tinycore.cc and
https://app.tinystudio.cc, and the Known issue is gone from the README
and CHANGELOG.

Two changes the loopback bind needed in ServiceManager:

- The free-port probe now binds 127.0.0.1 and the wildcard address in
  turn. Windows allows one bind beside the other, so a single probe
  missed the installed tray tinyService and the app's own child died with
  EADDRINUSE. The probe lives in freePort.ts with tests.
- The health check and the renderer's WebSocket URL use 127.0.0.1, not
  localhost, which can resolve to ::1 first; and a cold start gets 30
  seconds instead of 10.

Verified on the owner's machine with the tray app (a local 1.2.0 build)
holding 3000: the app takes 3001, a foreign Origin gets 403, the dev
server's origin and the hosted origins get 200.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The tinyStudio OAuth app's client id is public and now built in
(src/shared/githubApp.ts), used by the desktop device flow, the web build
and the vite configs; VITE_GITHUB_CLIENT_ID still overrides it.

The web build signs in with the authorization-code flow and PKCE
(lib/githubWebAuth.ts): the page goes to github.com and comes back to
/auth/github/callback on its own host, and netlify/functions/github-token.ts
exchanges the code using GITHUB_CLIENT_SECRET from the site's environment.
The function accepts the app's origins, the transitional
app.tinystudio.cc, deploy previews at deploy-preview-N.preview.tinystudio.cc
and localhost, and checks that the redirect URI belongs to the calling
origin. The router ignores /auth/*, and App.tsx finishes the sign-in and
returns to the page it started from. The pasted token stays under
Advanced.

The web app's address becomes studio.tinycore.cc per
docs/accounts-and-domains.md, which is committed here with the release
plan's step 6 rewritten to match, and github-auth.md, web-deploy.md,
packaging-windows.md, INTEGRATION_GUIDE.md and the README updated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Schematic view of the parts editor gets a second mode, Symbol: a body
(rectangle, circle, or an op-amp triangle) with a fill (none, white, soft
yellow), a name, and pins placed by side and grid slot, dragged into
place on the canvas or moved with the arrows in the pin list. The draft
(circuit/parts/symbolDraft.ts) renders to a schematic SVG with pin-*
markers on the 0.1 in grid, so it saves as the part's schematic.svg and
loads back through the same pipeline as hand-drawn art; tests check that
the file scans back to the pins it was drawn from for every shape and
fill. It starts from the generated-box layout, sized to its pin names,
or from the part's existing art. Undo covers every change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
package.json asked for @mister-industries/tinyservice ^1.2.0, which isn't
published yet, so npm install failed with ETARGET. The dependency now points
at local-packages/mister-industries-tinyservice-1.2.0.tgz, packed from
tinyService's release/1.2.0 branch. npm install, npm ci and the Netlify build
work without the registry.

After 1.2.0 is published: set the dependency back to ^1.2.0, delete
local-packages/ and run npm install. The release plan and
docs/accounts-and-domains.md say the same.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
On localhost the page sent GitHub's code to
https://studio.tinycore.cc/.netlify/functions/github-token, a domain that
doesn't exist yet, so sign-in ended with the browser's bare "Failed to fetch".

- Every page now exchanges the code on its own site. npm run dev:web serves
  the Netlify function file itself (githubTokenDev in vite-plugins.ts), with
  GITHUB_CLIENT_SECRET from .env.local, which git now ignores, or the
  environment. The file is read on every request, so no restart is needed.
- When nothing answers, or the site has no function, the error names the host
  and says what to do instead of "Failed to fetch".
- The function crashed on preflight requests: it built a 204 Response with a
  body, which the Response constructor rejects. 204 replies are now empty.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Browser sign-in finishes in App.tsx when GitHub sends the page back. It saved
the account but told nothing, so the header's Sign in button and the GitHub
panel kept showing "signed out" until a reload. saveAccount now fires the
account event itself, so every way of signing in or out updates every surface.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Push used GitHub's contents API once per file, so pushing five files made
five commits, deleted files were never removed, and a file changed on GitHub
since the last sync was silently overwritten.

- Push (lib/githubSync.ts) makes one commit through the Git Data API with
  the typed message or a default, deletions included. It compares GitHub's
  blob ids with those recorded at the last sync and stops, naming the files,
  instead of overwriting someone else's change.
- Pull keeps local edits to files GitHub also changed and says which, takes
  GitHub's version of everything else, and removes files GitHub deleted.
- lib/repoSync.ts keeps one shared view of the changes, refreshed after any
  write through lib/fileSystem.ts (FILES_CHANGED_EVENT). A bar above the
  editor shows unpushed changes to a repo you can push to, with Push; the
  GitHub tab gains a commit message box and lists deleted files.
- Opening a folder whose .git points at a GitHub repo links it to the commit
  it has checked out (lib/gitClone.ts, commands/cloneLink.ts). Links made by
  hand are left alone.

docs/github-sync.md describes the link, Push, Pull and clones.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs/full-git.md outlines real clones with isomorphic-git: Node fs on
desktop, a File System Access adapter in a worker plus a first-party git
proxy in the browser, LightningFS for Firefox and Safari. It starts with a
spike to check line endings and index compatibility with Git for Windows.
The release plan's beta list gains the item.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The landing page is a page on the docs site instead of a new Netlify site.
Record how docs sign-in works, correct which repo the live docs come from,
and note the missing cookie domain in tinycore-cc's browser client.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1.2.0 is published, and the registry tarball is byte-identical to the
one packed from release/1.2.0 (same integrity hash), so the local
tarball and local-packages/ go.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The palette becomes a rail of tabs: Search, Core, Mine, then one tab
per installed pack, with every SparkFun pack in one tab. Core opens
with the tinyCore boards and follows Fritzing's Core bin (Basic, Input,
Output, Power, Breadboard View); Mine holds imported and new parts.
Tiles are icons in a grid, named on hover.

Each pack's pack.json decides its layout: parts in listing order, under
the Fritzing section their entry names, in the order "sections" gives.
Package variants and the simulation sources and probes get no tile;
search finds them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The tinyBoards row in Core is titled "tinyBoards". Saving a part to
tinyparts from the parts editor keeps its pack.json entry's other keys,
so the part stays in its palette section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Generated from tinyStudioLogo.svg:
- build/icon.ico (16 to 256 px, the sizes the old one had), build/icon.png
  (1024 px) and a square build/icon.svg
- build/icon.icns (16 to 1024 px, with the margin macOS icons sit inside)
- resources/icon.png, the window icon, now a 512 px square instead of the
  407 x 163 wordmark
- favicon.svg, linked from index.html: the web app had no favicon

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…fixes

- Text, comments and docs use colons, commas and parentheses instead of
  em dashes.
- Every panel shows the same "Open a project to ..." message before a
  project is open (NoProjectMessage).
- A blank circuit opens ready to edit; one with parts opens view-only.
- File explorer, status bar and Circuit view toolbar reworked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
release.yml builds on one runner per system when a v* tag is pushed and
drafts a GitHub release with the installers, SHA256SUMS.txt and notes
from the changelog; run by hand, it's a dry run that keeps the builds as
artifacts. Each installer now carries only its own system's arduino-cli
and language server. macOS builds both arm64 and x64 dmgs, ad-hoc
signed so Apple Silicon opens them; Linux drops snap. The README links
the downloads, and docs/releasing.md has the steps. 0.4.0 is dated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tinyGlow now fixes its pin positions in part.json (its LED-strip pins
aren't in the art), so the family test accepts fixed pins; the stack
connector is still checked against tinyCore's.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@netlify

netlify Bot commented Sep 19, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for tinystudios ready!

Name Link
🔨 Latest commit 8033deb
🔍 Latest deploy log https://app.netlify.com/projects/tinystudios/deploys/6aae1f4515c6550008479bfd
😎 Deploy Preview https://deploy-preview-13--tinystudios.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions

Copy link
Copy Markdown

Thanks for your interest in tinyStudio! 🙏

This project is in early alpha and is not accepting external contributions right now,
so this pull request is being closed automatically. Please feel free to fork and experiment.

Contributions will open up as the project stabilizes.

@github-actions github-actions Bot closed this Sep 19, 2026
@FacioErgoSum
FacioErgoSum merged commit 5632d07 into main Sep 19, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant