Call for contributors to the Rust Playground for upcoming features

I am one of the recipients of the recent Rust Foundation grants with a focus on Rust Playground maintenance and I want to share a bit about what is in store.

Rust Explorer has proven that using a longer-lived compilation session can unlock some much-desired playground capabilities, including (but not limited to) an increased number of crates available. My plan is to extend the official Rust Playground with similar support.

More importantly, I'm looking to mentor some new long-term contributors to the playground. If you are interested in contributing, read on!

Codename: Marathon[1]

The current playground implementation is a traditional HTTP request / response architecture: each execution sends an HTTP request that spawns a Docker container that starts cargo / rustc, and the results are collected and sent back.

The plan is to add an additional mode where the playground opens a WebSocket connection to the backend which in turn starts a corresponding Docker container. This long-running container will allow the user to perform actions that take longer, such as compiling crates that are outside of the top 100 or with different features enabled. A rough diagram:

  Web browser               Playground backend                  Docker
 ┌───────────┐             ┌──────────────────┐                ┌──────────────┐
 │           │             │                  │                │  supervisor  │
 │           │  WebSocket  │                  │  stdin/stdout  │ ┌──────────┐ │
 │           │◄───────────â–ē│                  │◄───────────────┤â–ē│          │ │
 │           │             │       Axum       │                │ │  Cargo   │ │
 │           │             │                  │                │ │          │ │
 │           │             │                  │                │ └──────────┘ │
 │           │             │                  │                │              │
 └───────────┘             └──────────────────┘                └──────────────┘

I've noodled with a prototype for the connection between the backend and the Docker container that gives me some confidence that this plan should work.

Tech stack

This is a partial list of the technologies used by / relevant to the playground. You do not need to know all of these to be able to contribute, but the more you know the quicker you will be able to come up to speed.

  • Web Frontend
    • HTML
    • CSS
    • TypeScript / JavaScript
      • React
      • Redux
    • WebSockets
  • Nginx
  • Rust
    • Async (Tokio)
    • Axum
    • Serde
    • Cargo
  • Docker
  • Ruby
    • RSpec
    • Capybara
  • Git
  • GitHub Actions

Next steps

Update (2023-01-18):

If you are interested in contributing to this feature, please reach out here or on Discord, Zulip, or Mastodon and we can work out further details. Let me know a bit about your experience and why working on this would be interesting.

In the unlikely case that...

  • no one is interested, don't despair: I will implement the feature by myself.
  • too many people are interested, I'll figure out some way of picking from the candidate pool.

About me

Since we will be working together, it's only fair for you to know a bit about me as well! I've been working with Rust since before 1.0. I've contributed to some Rust-related posts on Stack Overflow and am a professional Rust programmer and trainer through our company Integer32.

I'm a pedantic code reviewer and care about things like small commit size and useful commit messages. I have strong opinions on the way that code should be organized but I am willing to have a reasoned discussion on occasion.

Future features

Maybe this feature isn't interesting to you, but contributing to the playground is? If so, and depending on the success of this first phase, there are a number of areas I'd like to investigate next:

  • Codename: Jackrabbit. Experiment with using the work done for Marathon to increase the speed of traditional playground requests.
  • Codename: Cabinet. Allow creating multiple modules and crates as distinct files.
  • Codename: Micromanage. Allow modifying detailed compilation settings.
  • Codename: Annals. Add historical versions of the compiler.
  • Codename: Providence. Allow interactive sharing of the editing experience.

I'll post a similar message in the future when one of these projects is ready to start.


  1. Because it runs for a long time, get it? ↩ī¸Ž

34 Likes

Hi, I am very interested in working on this project.

I wrote a real-time collaborative drawing website demo with actix-web, websockets and Vue3 (Not much experience with frontend though).
My other rust experience includes a simple LSM-tree based key-value store (As a approach to learning about LevelDB and RocksDB).

As a guy who are interested in compilation, it's quite convenient to check out assembly/MIR/HIR on rust playground.
Also I have longed for an opportunity to participate in open source projects and I enjoy writing rust.
That's why I find this Call for Participation appealing.

By the way, how about the naming client, coordinator and worker in providence?

1 Like

If I may suggest a mobile friendly version of playground? I would really enjoy such a feature as I often like to try out playgrounds that I read on urlo with my phone.

12 Likes

I am interested in this project because I loved platforms like CodeSchool, CodeAcadamy that taught me programming interactively.

I have ten years of experience writing backend and frontend code (More work done in the backend). However, I am still new to Rust. I have used languages like Java, JS (Node) & Python.

I hope to improve my skills in Rust by working with you.

1 Like

I'd be happy to help making the playground more mobile friendly. I'm the creator of Pomsky, and made a playground for Pomsky that is mobile friendly. It also happens to be written in TS/React.

5 Likes

I would also be happy to help. I have worked with the larger part of your tech stack and would love a bit of a challenge. I'm also looking to get more into open source contributing.

1 Like

Thanks all! I've replied to the 8 people who have contacted me with further details and next steps.


Yeah, that would be nice. Right now, the mobile support is best when you enable the "simple" editor in the configuration menu as neither Ace nor Monaco do a super job on mobile devices.

Thanks for the tip. Last I tried them they all had their drawbacks. I don't quite remember anymore why I stopped using simple. I think maybe because it has no bracket completion or auto indentation.

Now that you've had some actual response to your call, I just wanted to say...

"Some" :joy: Almost every time I end up in Rust SO, you've contributed to the answer.

So thank you for your work there, and especially in the Playground too! I use it practically every day.

13 Likes

Hi, looking for project to gain experience in rust.

I have several years as django + react fullstack and now I'm python data engineer.

I am fond of functional programming, type theory and everything around.

Hello! I want to contribute.

I'm Probably late to the party but I'd be pleased to help in any way possible. I have some experience working with the frontend tech stack. And I'm a newbie in the Rust world so, hoping to master Rust along the way.

Thanks all! I've received enough interest at this point. If you've received a direct message from me, then you've gotten your next steps. I might do another call later for more people, depending on how this group turns out. :wink:

(but not limited to) an increased number of crates available.

It looks like Rust Explorer uses a comment to declare dependencies. If/when you get to the point of designing how to specify that in the playground, I would be interested in collaborating on that. My hope is that by mid-year I'll have a Pre-RFC for a cargo-script design for shipping in rustup and think it'd be good to have these two systems use the same syntax.

2 Likes