Inspiration
I built biwa as a modern, actively maintained successor to cserun. cserun demonstrated how useful it is to run UNSW CSE commands from a local project, but its workflow can repeatedly copy the entire directory and the project is no longer actively maintained. I wanted to preserve its simple experience while making synchronization faster, safer, and more configurable.
What it does
biwa synchronizes a local project with a UNSW CSE server and runs commands remotely as though they were local.
It lets students:
- Use their preferred local editor and development tools
- Run CSE-only commands such as
autotestandgive - Synchronize only changed files
- Forward arguments, standard input, and environment variables
- Automatically clean up stale remote projects to avoid disk-quota issues
For example:
biwa run 1511 autotest lab01
How I built it
I built biwa as a Rust CLI using SSH and SFTP. It compares local and remote file states, synchronizes the required changes, and executes commands inside an isolated remote project directory.
It includes configuration support, environment-variable forwarding, terminal input and signal handling, automatic cleanup, shell completions, generated schemas, integration tests with containerized SSH servers, and a VitePress documentation website.
Challenges I ran into
One major challenge was making synchronization safe and efficient. biwa must correctly handle changed and deleted files, empty directories, excluded paths, permissions, and project roots without damaging unrelated remote data.
UNSW’s environment also has unusual constraints, including unsupported SSH features, failing SFTP permission operations, and strict storage quotas. Another challenge was making remote execution feel local when forwarding input, output, environment variables, and process signals.
Accomplishments that I’m proud of
I’m proud that biwa retains the simplicity that made cserun useful while modernizing the underlying workflow.
In particular, I’m proud of its incremental synchronization, isolated remote directories, interactive terminal support, automatic cleanup, comprehensive testing, and distribution through both mise and crates.io.
What I learned
I learned a great deal about SSH, SFTP, terminal behavior, Unix permissions, process signals, filesystem synchronization, and cross-platform CLI design.
I also learned that developer tools operating on files need careful defaults and strong safeguards. Successful synchronization is only one case; partial failures, unexpected paths, permission differences, and destructive operations must also be considered.
What’s next for biwa
I plan to continue developing biwa as a maintained successor to cserun. Future work includes faster synchronization, additional synchronization engines, better diagnostics, simpler onboarding, and broader support for remote development environments.
Built With
- cli
- dx
- rust
- sftp
- ssh
Log in or sign up for Devpost to join the conversation.