Contributing to Morph

Help write a compiler
that changes what's possible.

Morph is a framework that turns your code into a native desktop app — no browser, no Electron. Write your UI with web tools you already know, and ship a fast, lightweight app with OpenGL rendering. It was started by a single author who refused to accept that this didn't exist. It can't be finished by one person. That's where you come in — and why your contribution helps Morph grow.

Why contribute to Morph?

This isn't another open-source project looking for free labor. Morph is a chance to help build something that genuinely doesn't exist yet.

Help a real framework grow

Morph turns your code into fast, lightweight native desktop apps — no browser, no Electron. It's early and full of opportunity. Every contribution helps it grow into something thousands of developers rely on.

Build the future of native apps

There's no mainstream framework that gives you the web developer experience while shipping true native desktop apps. Morph is building that — and it needs people who want to be part of shaping it from the ground up.

Your skill makes a real difference

Whether you're strong at rendering, layouts, docs, examples, or testing — there's a place for you. Small, focused contributions add up quickly and get reviewed fast.

Early-stage, real impact

Every contribution lands at the architectural layer — the design decisions you help make will define how developers ship native apps. Your name goes on something real, and your work directly helps Morph grow.

What exactly is Morph?

Morph is a compiler-based native UI framework. You write your UI with JSX and CSS (including Tailwind), and Morph compiles it into a standalone native binary — no browser, no Electron, no WebView.

Rendering is powered by OpenGL 3.3+ for GPU-accelerated drawing and sub-millisecond frame times, with zero runtime dependencies and a binary under 1 MB thanks to dead-code elimination.

The toolchain is written in Rust. The compiler binary, morph (crate morphc), is a single, fast binary compiled with cargo build --workspace, parsing JSX/TSX with Oxc and CSS with lightningcss, lowering to a typed IR, and emitting C++ (with a future Rust runtime).

The dev experience mirrors the web: morph dev watches your files, recompiles only the logic layer, and pushes IR over loopback TCP to the running window — hot-swapping the new logic.so via dlopen. The window never restarts.

A Rust workspace built for contributions.

The whole compiler is one Cargo workspace. Pick a crate that matches your interests — each has a clear job.

morphc
CLI binary

The `morph` command — new, install, update, dev, build, run, check, doctor, cache, plus direct file morphing (`morph app.ts --to cpp|rust`). clap-based CLI, version management, hot-reload over loopback TCP.

morpher
TS → C++ translator

Intent-based codegen: escape analysis picks stack, unique_ptr, or shared_ptr, with native types (int32_t, std::string) by default and --type strict for Js* wrappers.

morph-cache
Runtime + CSS cache

Global cache under ~/.morph/cache — versioned C++ runtimes, remote CSS and @font-face files, fingerprints for incremental builds.

morph-parser
JSX/TSX + CSS parsing

Oxc (3x faster than SWC, arena-allocated, spec-compliant) for JSX/TSX, lightningcss for CSS. Typed ASTs that feed the rest of the pipeline.

morph-ir
Intermediate Representation

The typed IR that sits between parsing and codegen. Style registry, Tailwind resolution, IRBuilder — JSON IR wire format shared with dev mode.

morph-codegen
C++ / Rust code generation

Tera templates that emit C++ (and a future Rust runtime). Feature flags, node/logic emitters, dead-code elimination.

morph-build
Build system

Cross-platform builds via g++/clang++, binary output, and the .morph/build directory structure.

morph-config
Config & lock parsing

morph.config.json, morph.lock, runtime versioning and compatibility checks.

Real bugs, waiting for you.

The author is upfront about it: Morph is buggy. A found bug is half-fixed.Here's the honest list — pick one and make it disappear.

Every flex child sits at double its left/top margin — rows drift sideways line by line

`flex-grow` centering reads a stale total and lands the whole row off-center

Lines that should wrap don't — the wrap test forgets the gap

`margin: auto` centers against a size clamped after centering

Text ignores its own padding — first glyph inside the gutter

Font inheritance reaches only one level deep

Emoji measure with the text font but draw with the emoji font

Hot reload drops a save if one is already running

Conditional rendering `{cond ? a : b}` leaks both branches' nodes on every save

Signals are read across threads without synchronization where fetch() resumes

Didn't see a bug you've hit? File an issue — a report is a contribution too.

Where you can make a difference.

Every part of Morph needs help. Pick what matches your skills.

Compiler & Tooling

Advanced

Morph's toolchain needs contributors to keep improving how quickly and reliably your code turns into a native app. Help with performance, hot reload, error messages, and build quality.

Improve dev mode: watch + hot reload
Speed up builds and app startup
Make error messages clearer
Add polish: check, doctor, CI/CD, distribution

Layout & Rendering

Advanced

The C++ runtime and OpenGL renderer — Flexbox layout, text shaping, CSS animations, and the compositing pipeline. The layout engine has real, named bugs listed below.

Fix flex margin / centering / wrap bugs
Implement missing CSS properties
Improve text rendering and emoji measurement
Optimize GPU draw call batching

Docs, Story & Examples

Beginner

Morph's docs tell the real story of why it exists. Write tutorials, build example apps, expand the docs in the repo, and add architecture explainers.

Write a 'Build your first app' tutorial
Create example projects (todo, chat, dashboard)
Improve API reference and the docs site
Add architecture diagrams and explainers

Bug Reports & Testing

Beginner

Morph is honest about being buggy — and a found bug is half-fixed. Confirm issues, write tests, squash bugs, and make the framework solid.

Reproduce and confirm reported issues
Write unit tests for the parser and layout
Fix bugs in the list below
Improve error / panic recovery

Platform & Tooling

Intermediate

Expand Morph's reach and the developer experience around it: Linux/macOS/Windows support, CI/CD, package distribution, and editor tooling.

Improve Windows support and testing
Add Homebrew / AUR / package installs
Build GitHub Actions for CI and releases
Create a VS Code extension for .mx files

Get started in minutes.

Four steps from zero to your first pull request — clone, build, fix, ship.

1

Clone the repo

Everything lives in the single Levizr/morph repository — no separate repos to hunt for.

terminal
git clone https://github.com/Levizr/morph.git
cd morph
2

Build the Rust workspace

The entire toolchain is Rust — one Cargo workspace, no Python to install. Build everything, then verify your C++ toolchain and graphics libs with morph doctor.

terminal
cargo build --workspace
target/debug/morph doctor
3

Find what needs a hand

Pick an open issue, or dive straight into one of the crates above. The bug list below is full of places to make an immediate difference.

4

Submit a PR

Run cargo fmt and the workspace tests first, keep PRs focused to one fix or feature, and open the pull request. The maintainer reviews quickly.

terminal
cargo test --workspace
git checkout -b my-feature
git commit -m 'feat: add X'
git push origin my-feature

Guidelines that keep Morph healthy.

Code quality matters

Write clear, readable code and follow the existing patterns in the codebase. Rust must be `cargo fmt` clean with no new warnings; C++ runtime headers stay header-only.

Explain your reasoning

In your PR, explain why the change is needed, not just what it does. Context helps reviewers approve faster.

Test what you change

Add tests when possible — `cargo test --workspace` plus the morpher fixture tests. For rendering and layout changes, include before/after screenshots or reproduction steps.

Keep PRs focused

One logical change per PR. Small, reviewable PRs get merged faster than sprawling 500-line diffs.

Be kind and constructive

A community that respects each other builds better software. Feedback is about the code, not the person.

It was never going to be built
by one person alone.

A 17-year-old built every line so far — the parser, the compiler, the renderer, the layout engine. He asked for help openly and honestly. Be the person who answers that call. A found bug, a fixed flex rule, a finished crate — it all adds up.