Multiplayer canvas tool with programmable brushes!
Find a file
リキ萌 ec7ee9626f implement . and | operators
`f . x` is the same as `f x`, and is mostly useful when used as an argument to another function call.
this allows us to simulate record field syntax very well: `d.Num` is the same as `d Num`, but with high precedence

`a |f b` is the same as `f a b` and effectively allows you to turn any function into an arithmetic operator.
it's the main reason behind + - * / having the same precedence---they now chain very nicely with pipes

closes #126 (`|` operator)
closes #127 (`.` operator)
2025-09-02 22:06:16 +02:00
.cargo a whole load of work in progress 2024-08-15 20:01:10 +02:00
admin s/liquidex/riki 2025-05-26 18:53:17 +02:00
crates implement . and | operators 2025-09-02 22:06:16 +02:00
docs fix a few bugs with the new precedence rules 2025-09-02 20:03:41 +02:00
scripts implement brush cost gauges 2024-10-25 21:39:53 +02:00
static disable ligatures in code 2025-09-02 20:04:09 +02:00
template sidebar layout 2025-06-27 23:24:09 +02:00
.editorconfig initial commit 2024-08-10 23:10:22 +02:00
.gitignore beginning of haku2: a reimplementation of haku in Zig 2025-06-01 23:19:05 +02:00
.ignore add .ignore file 2025-09-02 20:52:34 +02:00
Cargo.lock removing server-side brush rendering 2025-06-30 18:55:53 +02:00
Cargo.toml removing server-side brush rendering 2025-06-30 18:55:53 +02:00
jsconfig.json add jsconfig.json 2024-09-06 22:50:42 +02:00
Justfile #broken haku2: progress on making it work 2025-06-11 16:42:43 +02:00
README.md update readme again 2024-08-24 22:03:06 +02:00
rkgk.toml removing server-side brush rendering 2025-06-30 18:55:53 +02:00

rakugaki - digital multiplayer graffiti

rakugaki is a multiplayer paint canvas with programmable brushes!

At the heart of rakugaki is the brush - a little program for manipulating pixels on a wall. Brushes are written in a tiny programming language called haku.

I wanna try it out!

Since the app is currently in very early alpha stages, there's no public instance at the moment.

You're free to spin up a server for your friends though! Here's the setup procedure for production instances.

# As of writing this, 1.81 is not yet released, so we have to use Rust nightly.
rustup toolchain install nightly-2024-08-11
rustup default nightly-2024-08-11
rustup target add wasm32-unknown-unknown

# We use `just` to wrangle the process of building the client-side WebAssembly and the server.
cargo install just

# Now it's time to run the backend!
just port=8080 profile=release

Then, you can connect to localhost:8080 to see the app in action.

For development, I recommend using cargo watch for live reloading. just defaults to a sensible development configuration. If you need to override the port, use the port variable as shown above.

cargo install cargo-watch
cargo watch -- just