TachiSnap
TachiSnap — Pixel Snapper for animation pixel artists. Rust + WebAssembly client-side tool for cleaning up AI-generated…
A classic Mac loaded with everything you'd want
80's, 90's and early 2000s classic Macs that load instantly in a browser and have access to a large software library. The full collection is at infinitemac.org. Shortcuts are available for System 6, System 7, Mac OS 8, Mac OS 9 and KanjiTalk (Japanese). For a high-level overview and the backstory, see the launch blog post and subsequent ones.
This project uses submodules, use git clone --recursive https://github.com/mihaip/infinite-mac.git to clone it (or run git submodule update --init --recursive if you have an existing checkout).
Dependencies need to be installed:
npm install npm run build-tools
Supporting data files need to be generated. This will build a minimal set of files, sufficient for running System 1 through System 7.5.5.
npm run import-disks minimal npm run import-cd-roms placeholder npm run import-library placeholder
You can then run the local dev server:
npm run start
It will be running at http://localhost:3127.
Common development tasks, all done via npm run:
start: Run local dev server (at http://localhost:3127)import-emulator <emulator>: Copy generated WebAssembly from an emulator submodule (only necessary if modifying the emulator cores, see below for how to rebuild them). The following emulators are supported:
basiliskii: Basilisk II from https://github.com/mihaip/macemusheepshaver: SheepShaver from https://github.com/mihaip/macemuminivmac-Plus (and others): Mini vMac variants from https://github.com/mihaip/minivmacdingusppc: DingusPPC from https://github.com/mihaip/dingusppcprevious: Previous from https://github.com/mihaip/previouspearpc: PearPC from https://github.com/mihaip/pearpcimport-disks: Build disk images for serving. Copies base OS images for the above emulators, and imports other software (found in Library/) into an "Infinite HD" disk image. Chunks disk images and generates a manifest for serving.
placeholder may be passed in as an argument to only build System 1 through 7.5.5, to skip populating the "Infinite HD" disk image.import-cd-roms: Build CD-ROM and floppy libraries (most CD-ROMs are hosted on other sites, while floppies and local media are self-hosted)
placeholder may be passed in as an argument to make an empty CD-ROM library--sync-media may be passed in to sync self-hosted media files to the Cloudflare R2 bucket (this is separate from the disk image sync process done by sync-disks.sh)import-library: Build downloads library (actual downloads are hosted on macintoshgarden.org and other sites, the library contains metadata)
placeholder may be passed in as an argument to make the script generate a minimal library that does not depend on a Macintosh Garden data dump.Common deployment tasks (also done via npm run)
build: Rebuild for either local use (in the build/ directory) or for Cloudflare Worker usepreview: Serve built assets locally using Vite's server (will be running at https://localhost:4127)worker-dev: Preview built assets in a local Cloudflare Worker (requires a separate build invocation, result will be running at http://localhost:3128)worker-deploy: Build and deploy assets to the live version of the Cloudflare Workersync-disks: Sync disk images to a Cloudflare R2 bucket.
sudo -v ; curl https://rclone.org/install.sh | sudo bashimport-disks (and before worker-deploy).src/: frontend React app and assets.
app/: main UI pages/componentscontrols/: reusable UI widgets (buttons, dialogs, inputs, etc).defs/: type-safe data definitions for disks, machines, etc.lib/: shared utilities and hooksnet/: networking helpers (Ethernet providers for emulator-to-emulator connectivity).emulator/: emulator integration
ui/: code that runs in the main thread to drive emulators (config, files, audio/video, input).worker/: emulator worker runtime and helpers.
emscripten/: generated WASM emulator binaries of emulator cores.common/: shared types/utilities used by both UI and worker sides.Data/: support data files, including ROMs and disk manifests (generated via import-disks)Images/ and Fonts/: bundled assets and manifests (ROMs, disk manifests, UI art, fonts).monkey/: Infinite Monkey LLM-based computer use demonstrationworker/: Cloudflare Worker code for SSR, asset serving, and APIs.scripts/: helper scripts for importing emulators/disks and deployment utilities.public/: static files served as-isLibrary/: Infinite HD library, used by import-disks (either JSON manifests of files to download or .zip archives of snapshotted directories)CD-ROMs/: CD-ROM library, used by import-cd-romsImages/: System disk images, used by import-disks (larger images are stored as GitHub releases)Basilisk II, SheepShaver, Mini vMac, DingusPPC, Previous and PearPC are the original 68K and PowerPC emulators that enable this project. They are hosted in separate repos and are included via Git submodules. Rebuilding them is only required when making changes to the emulator core, the generated files are in src/emulator/worker/emscripten and included in the Git repository.
To begin, ensure that you have a Docker image built with the Emscripten toolchain and supporting libraries:
docker build -t macemu_emsdk .
To rebuild all the emulators, run the following script which automate all of the steps below:
scripts/rebuild-and-import-emulators.sh
To manually build individual emulators, open a shell into the Docker container:
scripts/docker-shell.sh
Once in that container, you can use a couple of helper scripts to build them:
cd /macemu/BasiliskII/src/Unix # Bootstrap Basilisk II, to generate the CPU emulator code ./_embootstrap.sh # Switch into building for WASM ./_emconfigure.sh # Actually compile Basilisk II targeting WASM make -j8
Once it has built, use npm run import-emulator basiliskii from the host to update the files in src/emulator.
cd /macemu/SheepShaver/src/Unix ./_emconfigure.sh make -j8
Once it has built, use npm run import-emulator sheepshaver from the host to update the files in src/emulator.
See this page for the full set set of build options (and this one for more esoteric ones).
cd /minivmac # Configure for building for WASM ./emscripten_setup.sh # This configures the Mac Plus model by default, alternative outputs can be # configured with additional arguments: # - `-m 128K -speed z`: Mac 128K (uses 1x speed by default to be more realistic) # - `-m 512Ke`: Mac 512ke # - `-m SE`: Mac SE # - `-m II`: Mac II # - `-m IIx -mem 32M`: Mac IIx # Actually compile Mini vMac targeting WASM make -j8
Once it has built, use npm run import-emulator minivmac-<model> from the host to update the files in src/emulator.
cd /dingusppc mkdir -p build cd build emcmake cmake -DCMAKE_BUILD_TYPE=Release .. make dingusppc -j8
Once it has built, use npm run import-emulator dingusppc from the host to update the files in src/emulator.
cd /previous mkdir -p build cd build emcmake cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_RENDERING_THREAD=0 .. make previous -j8
Once it has built, use npm run import-emulator previous from the host to update the files in src/emulator.
cd /pearpc ./_emconfigure.sh make -j8
Once it has built, use npm run import-emulator pearpc from the host to update the files in src/emulator.
cd /snow cargo build -r -p snow_frontend_im --target wasm32-unknown-emscripten
Once it has built, use npm run import-emulator snow from the host to update the files in src/emulator.
more like this
TachiSnap — Pixel Snapper for animation pixel artists. Rust + WebAssembly client-side tool for cleaning up AI-generated…
.Net 10 (.Net 8+) webassembly starter project using raylib-cs nuget 7.0.2 and raylib 5.5
search projects, people, and tags