Have been running an in-school pilot over the last school term. Has been super insightful and led to a heap of changes to optimize UX. However, the biggest challenge has been delivery in this environment.
Trying to run a game in a browser on school iPads powered by really locked down networks has been challenging. Some school iPads will crash (out of memory) when launching the camera view, whilst others run flawlessly. We use a fork of Godot, and are constantly fighting to strike a balance between UX (increased parallelism) and browser device constraints i.e. a limit on how many web workers we can fit in memory.
In addition to our main (build and play your own RPG) experience, we also stream games direct to iPad. In particular a modded version of Overcooked! 2 that teaches kids to code — Overcooked itself was never even released on iPad. We've built our own Kubernetes system that spins up (a license limited number of) games/pods on demand backed by (time sliced) NVidia GPUs. This is literally running out of my home office. Despite the complexity of building all that, the Kubernetes and GPU time slicing wasn't even the largest hurdle. Turns out UDP is a no-go on the school network, so direct WebRTC was out the window. Instead we're using Cloudflare's TURN relay with TCP. Which much to my surprise, is holding up quite well.
Definitely a learning experience. However, kids are having a blast. Can't wait to roll this out further!
This is extremely interesting to me. I also have an 8 year old daughter who inspired me to build tooling for kids to create their own games. However, what I've come up with is quite different than this.
The primary mechanism through which kids create their game worlds is taking photos of their own hand drawn artwork.
I found traditional game dev tooling was far too technical and verbose for my daughter to stay interested. Honestly, it's not just a matter of her losing interest due to the complexity. Frankly, I don't want her sitting in front of a screen that long. She's a kid and I want her doing typical kid stuff. She and her younger sisters play sports, draw, paint, perform magic shows, and sing and dance around the house like complete nutbags — and I love it!
So whilst what I've built is highly technical for me to maintain, I'm not trying to expose all that complexity to kids. At least, not yet. I'm mostly interested in fueling creativity and letting kids explore. That's not to say kids that want to dive deep can't — we offer visual coding experiences etc. The intent is kids gain access to new features through self directed exploration and play. If some kids stop at just play, that's OK. The primary game mechanics (drawing and building worlds) are still inherently creative.
Although my approach is different, there is a heap in this article I resonant with. The hacking mentality, and letting kids go beyond the artificial constraints in particular. There's still much of Breaka Club that I can improve on. I'm running a limited in-school pilot at present and that's already yielded some really interesting insights. I'm really keen to continue to see what others put out in this space. I think it's drastically underserved and there's plenty of room for multiple approaches.
This looks really nice. Given the target age I imagine there's not a heap of text, so you could probably get away with LLM translations. Be sure to share it again in the coming months if you add English :)
I also attempted to make a game with my eldest daughter initially. Unsurprisingly, she didn't want to sit there watching me code or drag things around in Godot's level editor.
Admittedly, I really need to make a new blog post showing the latest improvements brought about from the in school pilot I'm running weekly at the moment.
Been dealing with this a bit at Breaka Club. We teach kids to code with a modded version of Overcooked 2!.
We stream OC2[1] with our mod preinstalled over WebRTC. This ensures that kids/schools don't have to try and install the mod. This is particularly important since we support running on school provided hardware. Installing a game without a mod would be hard enough. Added advantage though is kids play with a virtual (on screen) gamepad on iPads in Mobile Safari.
Game instances run in Docker containers in Kubernetes/k3s atop very outdated nVidia hardware. Given we're already going across the Internet into school networks, we've tried very hard to optimize latency across the board. Using NVidia NVEnc with DMABuf (zero copy) etc. We're unfortunately using XWayland at present so experience the documented input overhead. Although our inputs are virtual devices at this point, so the overhead may be a bit different. Trying to optimize this whole thing end to end has been a challenge. I would say that performance is currently "acceptable".
It's a really tricky one, but I think it's the right call for Godot, but probably not for other projects. I'm the current maintainer of GodotJS (TypeScript bindings for Godot). LLMs can generate genuinely useful solutions for Godot e.g. a functional WebGPU implementation for Godot — https://github.com/godotengine/godot-proposals/issues/6646.
However, as a senior engineer with fairly deep technical knowledge in these areas, I'm now using AI in my own projects. Frankly, before even touching Github, I'm already drowning in code reviews generated by my own use of an LLM!
There are meaningful, generally good PRs waiting for my attention against GodotJS, and other projects I (somewhat) maintain e.g. MoonSharp, C# Lua runtime. It was already extremely difficult to stay on top of PR code reviews for reasonably technical projects. When you're already somewhat burnt out from reviewing LLM code all day, it's so much more exhausting than it used to be.
Still plugging away at Breaka Club, where kids take photos of their hand drawn art and build games using it. Starts out as no-code, photograph an AprilTag and it imbues the image with functionality.
I'm running an in school pilot this week (Lunch time school club).
The tech stack for the main product is honestly pretty intense at this point with full multiplayer support, offline play, transitioning from client authoritative to joining a remote server. Built atop GodotJS, TypeScript bindings for Godot, which I maintain. Huge monorepo with over a million lines (yes, I'm aware that's NOT a good thing), and GodotJS itself is not included in that.
Odd. The main reason to use this style of commit message is for CI/CD automation.
EDIT: I didn't see this covered in the article on my first pass. It is covered though. My apologies.
The type of the commit informs the automated workflows how to handle the commit. This is why it comes first.
For example, if you're performing CD, if you only commit a bunch of `fix: ` then only your semantic versioning patch version number is incremented. If you commit a `feat: ` then it's a minor version is bump. `feat! ` is a major version bump.
Even if you're not using CD for releases, semantic commit messages are sometimes used to automate change log generation. Granted, your change logs should not typically include the Git commit messages themselves — those are developer facing, not user facing.
The article addresses both of these pretty clearly. Semantic versioning gets borked with reverts and the automatic changelog is targeting the wrong audience
My apologies, I missed this on first read due to the indentation style. That said, I don't agree on the commentary.
Why on Earth are people not writing commit messages for their reverts? They should have semantic commit messages just the same as any other commit.
Unless the point is that they're not following per-commit CD, and if you commit then revert that commit before a release was made. That sounds like a process failure. Which of course, process isn't infallible, and neither is the automated version management. If you screw up, use an escape hatch — just like reverting a commit that had previously gone through code review and been merged.
Re: change log generation. The article says change logs shouldn't have commit messages. I agree. Many tools (e.g. Changesets https://github.com/changesets/changesets) use the semantic commit type to sort change log entries, but require you to write those user facing change log entries separately.
The article is wrong about reverts (in my opinion). If a breaking change is introduced, and then removed, the removal should also most likely be considered a breaking change (both the addition and removal are changing your API). So it is correct that a major version bump should occur when reverting. Once a package has been published, the ship has sailed.
The issue is that if there was no release in between, or only a beta or similar, you now have two breaking changes indicated by the commits, although in sum there is none since the last official release.
That's true, but depends on your workflow and release strategy.
If you are releasing upon every push to main/master (following what semantic release and conventional commits provides you in terms of automation), then it makes sense to perform major version bumps for the reverts.
If you have a manual release strategy, then it might not make sense to use these tools in the way they have been designed.
If you have actual dependents in a SemVer fashion, then this isn’t useful for those still on the prior version. What you’d rather do is decrement the major version again because it’s compatible with the prior version again. Those dependents who already upgraded to the interim version have to consider another breaking change regardless.
And if you don’t have these kinds of dependents, then the versioning scheme isn’t important anyway.
release-please[0] allows you to do a manual version override in a commit, which would allow you to decrement the major version upon reverting a breaking change
I think that could be simplified, so the tool can tell that a commit is reverting a breaking change and thus the version should be decremented, but at least there's an escape hatch.
Use some convention for git trailers then. Having “fix” or “feat” in the commit title does not provide any useful information to someone scanning the log.
How... how is this not obviously the absolute very most useful information?
When I encounter a bug in a dependency of mine. Before I worry about submitting a PR, the very first thing I do is grab my version number and check the commit logs for fixes since my version number.
If I'm trying to decide whether I should bother upgrading, I scan the log for new features.
It's the title, not the details. The commit message body should contain MUCH more detail than the title.
If you don't like it because it looks ugly. Sure, that's subjective. And actually, I agree. Because it's standardized though, Git interfaces could even be configured to trim this off and provide different visual styles for the different kinds of commits. The types could be used as search filters too etc.
Now, I get people don't like the look of them. Neither did I when I first saw them. Then I started using them and found them useful.
It's fine, people have different preferences, it's just a convention and it's not going to work for every project. The article itself just doesn't seem to hold any water.
If one is writing trailers and custom formatters, then probably the information that the formatter uses should be even more structured that sticking it in the subject line.
If I'm at the point of contributing a PR to a dependency, I've already identified the root cause in detail. There's no way a change log should be going into that level of detail, or else you're just duplicating the Git log for no reason.
Will the change log make mention of fixing the bug? Perhaps. But I'm going to want to read the technical details of the fix to make sure they've specifically addressed my issue, and not just a similar problem. What is the performance impact of the fix? Are there security implications they've explained in the commit message.
I'm a software engineer, not an end user, I want the technical details of my dependencies.
https://breaka.club/blog/why-were-building-clubs-for-kids
Have been running an in-school pilot over the last school term. Has been super insightful and led to a heap of changes to optimize UX. However, the biggest challenge has been delivery in this environment.
Trying to run a game in a browser on school iPads powered by really locked down networks has been challenging. Some school iPads will crash (out of memory) when launching the camera view, whilst others run flawlessly. We use a fork of Godot, and are constantly fighting to strike a balance between UX (increased parallelism) and browser device constraints i.e. a limit on how many web workers we can fit in memory.
In addition to our main (build and play your own RPG) experience, we also stream games direct to iPad. In particular a modded version of Overcooked! 2 that teaches kids to code — Overcooked itself was never even released on iPad. We've built our own Kubernetes system that spins up (a license limited number of) games/pods on demand backed by (time sliced) NVidia GPUs. This is literally running out of my home office. Despite the complexity of building all that, the Kubernetes and GPU time slicing wasn't even the largest hurdle. Turns out UDP is a no-go on the school network, so direct WebRTC was out the window. Instead we're using Cloudflare's TURN relay with TCP. Which much to my surprise, is holding up quite well.
Definitely a learning experience. However, kids are having a blast. Can't wait to roll this out further!
reply