PhreeLabsStart a Project

Work / 003

Architect

From a folder of PNG artwork to a game you can actually play. Architect keeps art, animation, hitboxes, scripts, and stages in one project, tested on the real engine.

Type
Desktop authoring app
Platform
macOS, Apple silicon
Built With
AppKit, React, Python, C++, Lua
Status
In development · In-house build
Role
Founder: product direction, design, and testing
Architect on macOS: an empty Animation workspace with the Start with artwork prompt, tabs for Animation, Collision, Pixels, Effects, Audio, Runtime, Code and World, a Compile and test button, and the timeline at 60 ticks per second.
Animation workspace · App screenshot of the current build

01 Purpose

Architect is how PhreeLabs makes games on Webs: drawing, animating, scripting, and testing in one place, then packaging the result.

Intended user: a game author working on Webs, starting with PhreeLabs’ own projects.

02 Problem and Constraints

A Webs game needs art, animation, hitboxes, stages, and scripts that match the engine exactly. A preview that runs a separate simulator drifts from the real game.

  • The preview must run the engine’s own match code, not a second simulator.
  • Projects are real files (.wbs) with backups and revision conflicts, not browser storage.
  • Scripts are checked in the engine’s sandbox before each test.
  • Existing editors are reused where they already work, with their licenses kept.

03 What Was Built

  • Animation, Collision, Effects, Audio, and Code workspaces in one window, with Pixel and World workspaces embedded.
  • PNG import: drop artwork onto an empty canvas to create the first frames.
  • Code editing with the Monaco editor; real Webs Lua is validated before the test match restarts.
  • Scene testing: static orthogonal stages compile and run in the native Webs engine from inside the app.
  • Game packaging: a saved scene or menu screen becomes a standalone Mac app with the Webs player, compiled characters, stage art, and license notices.
  • Menu audio: choose looping music and sounds for entering a screen, focusing a button, and activating it. The sounds are included in the packaged game.
  • Saved settings and progress: menu scripts store small values across launches. Volume was checked after reopening a packaged game, and a damaged save file is set aside safely.
  • Throw authoring: mark a move’s attack as a throw that beats guard and misses airborne targets, using the engine’s existing hit behavior.

04 Design and Engineering Decisions

  1. 01

    Native Shell, Web Workspaces

    An AppKit shell owns windows, files, and packaging. The workspaces are React running in WebKit, each with its own private data store.

  2. 02

    One Simulation, Not Two

    The C++ preview uses the same match, input, frame, and hitbox code as the Webs player, so what you test is what plays.

  3. 03

    Python Owns the Document

    Python handles .wbs persistence, validation, and export, keeping file rules in one place for the app and its tests.

  4. 04

    Reuse Proven Editors

    Pixel art runs StudioX, PhreeLabs’ pixel tool built on the MIT-licensed Stretchy Studio. The World workspace embeds a build of the open-source Tiled map editor (1.12.2) as a native view, with only small boundary code added around it.

  5. 05

    Packaging That Never Overwrites

    Packaging writes a new app at a location you choose. Existing apps are never replaced, and a failed build leaves nothing behind.

05 Architecture

AppKit shellNative window, File menu, packaging
React workspaces in WebKitAnimation, Collision, Effects, Audio, Code (Monaco)
PixelStudioX, built on Stretchy Studio
WorldTiled 1.12.2 build (Qt), embedded natively
Python.wbs persistence, validation, export
Webs engine (C++)Preview runs the same match code as the game
Packaged gameStandalone Mac app with the Webs player
The web interface never simulates the game itself: Python turns documents into engine data, and the C++ engine runs it.

06 Verified Results

MeasureResultContext
Engine tests22 of 22 passingCTest on the committed source of the bundled player, 4 November 2026
Document persistence and export189 of 189 passingPython test suites that run without the packaged app, 4 November 2026
Editor workflow against the engine12 of 12, with 54 native tick and facing comparisonsBrowser-driven workflow test, 14 October 2026
Packaged app acceptance11 of 11 suites, 158 checksScripted runs of the built app, 4 November 2026
Saved settingsA volume setting survived two launchesA built game moved away from its project, with a corrupt-file recovery test, 4 November 2026
Menu audioPeak level 0.37 measured at the game’s mixerSoftware measurement at the game’s mixer with the output device muted
World map codec248 strict checks passing, also under AddressSanitizer and UndefinedBehaviorSanitizer15 October 2026

07 Third-Party Components

Stretchy Studio (MIT, © 2026 Nguyen Phan) as the base of StudioX; Tiled 1.12.2 and Qt in the World workspace; the Monaco editor; React, Zustand, Immer, Lucide, and JSZip; FreeType for screen text in packaged games. Runtime license notices ship inside packaged games.

Need something
like this?

Tell me what the software should do. Similar problems are a good place to start. Tools that connect an interface, Python, and C++ like this one are part of Custom Software.

Next Project
MarketHaven