Published: Feb 11, 2025 by Isaac Johnson
From the Github Blog I saw this post about they built the Github Skyline extension. It touches on the tool but is really more of a pitch of all the paid features of Github (Codespaces, Copilot, etc).
However, I really wanted to try this and see a full print of my history. Today we’ll cover how I did that with PrusaSlicer and AnyCubic Photon Workshop with my Prusa Mini+ to print in PLA and my AnyCubic Resin printer (to print, obviously, in Resin).
I’ll also explore some ways to turn profile photos of ourselves into 3d Prints with some AI tools and converters. I’ve done this for some select coworkers before but here I’ll show you how to do it with a simple photo of myself.
Lastly, I’ll cover a bit on Ghostty (or attempting to use Ghostty) and using Scoop to install BTOP++ for windows as well as Chromium Dev.
Github Skyline
I had bookmarked this article which talks about how they built the GH Skyline App.
Let’s install the GH extension:
$ gh extension install github/gh-skyline
✓ Installed extension github/gh-skyline
A new release of gh is available: 2.49.2 → 2.65.0
To upgrade, run: brew upgrade gh
https://github.com/cli/cli/releases/tag/v2.65.0
I can then run it to generate a Skyline STL
I just have a Prusa Mini+ for PLA printing, so it’s a bit out of range for size
That said, I can manipulate it to fit and reduce to 80%
At the second highest resolution that will still be over 2d
I settled on a faster 0.20mm print that would take 18h on 100% speed (and i can often get away with 150% speed)
I’ll also try with the Resin printer (though guessing it won’t work as well)
I kicked it off to the Prusa Mini+ to print in PLA
and to the Resin printer. The Anycubic did detach slightly due to weight
But still kept the skyline part which is what mattered
If you aren’t aware, unlike PLA printers which print bottom to top like squeezing a toothpaste tube, Resin printers print upside down pulling the module up and out of a vat of Resin goop.
However, because of some leftover glitter that got into the vat, the city legitimately sparkled while in the curing station
It really looks pretty cool
Results
And here was the end result in Resin
There are some whisps and cleanup in the PLA print which is lighter and larger
But still turned out pretty slick
Also, it may not be immediately apparent how the Skyline shows commit history. It’s left to right by year and bottom to top by month
I could really see the commits rise around 2020/2021 when I moved a lot of my code work out of Azure Repos in Azure DevOps into Github
Ghostty
I’ve known Mitchel Hashimoto has been working on a new Open Source terminal for some time. Recently he released Ghostty with rather rave reviews.
There are binaries for Mac and Linux.
Since my WSL is Ubuntu based, I’ll get the Ubuntu DEB package.
They have some shorthand steps to make it easy
source /etc/os-release
ARCH=$(dpkg --print-architecture)
GHOSTTY_DEB_URL=$(
curl -s https://api.github.com/repos/mkasberg/ghostty-ubuntu/releases/latest | \
grep -oP "https://github.com/mkasberg/ghostty-ubuntu/releases/download/[^\s/]+/ghostty_[^\s/_]+_${ARCH}_${VERSION_ID}.deb"
)
GHOSTTY_DEB_FILE=$(basename "$GHOSTTY_DEB_URL")
curl -LO "$GHOSTTY_DEB_URL"
sudo dpkg -i "$GHOSTTY_DEB_FILE"
rm "$GHOSTTY_DEB_FILE"
It shows it’s installed now
builder@LuiGi:~/Workspaces$ ghostty version
info: ghostty version=1.0.1
info: ghostty build optimize=ReleaseFast
info: runtime=apprt.Runtime.gtk
info: font_backend=font.main.Backend.fontconfig_freetype
info: dependency harfbuzz=8.3.0
info: dependency fontconfig=21500
info: renderer=renderer.OpenGL
info: libxev backend=main.Backend.io_uring
info(os): setlocale from env result=C.UTF-8
info(gtk): GTK version build=4.14.2 runtime=4.14.2
info(config): creating template config file: path=/home/builder/.config/ghostty/config
warning(config): error creating template config file err=error.FileNotFound
info(config): default shell source=env value=/bin/bash
warning(gtk): configuration error: cli:1:version: invalid field
warning(gtk): CLI errors detected, exiting
We can see help
$ ghostty +help
Usage: ghostty [+action] [options]
Run the Ghostty terminal emulator or a specific helper action.
If no `+action` is specified, run the Ghostty terminal emulator.
All configuration keys are available as command line options.
To specify a configuration key, use the `--<key>=<value>` syntax
where key and value are the same format you'd put into a configuration
file. For example, `--font-size=12` or `--font-family="Fira Code"`.
To see a list of all available configuration options, please see
the `src/config/Config.zig` file. A future update will allow seeing
the list of configuration options from the command line.
A special command line argument `-e <command>` can be used to run
the specific command inside the terminal emulator. For example,
`ghostty -e top` will run the `top` command inside the terminal.
On macOS, launching the terminal emulator from the CLI is not
supported and only actions are supported.
Available actions:
+version
+help
+list-fonts
+list-keybinds
+list-themes
+list-colors
+list-actions
+show-config
+validate-config
+crash-report
+show-face
Specify `+<action> --help` to see the help for a specific action,
where `<action>` is one of actions listed below.
Here is where I got a bit stuck, it seems to fall down after drawing the window frame and crash in WSL
builder@LuiGi:~/Workspaces$ ghostty --font-size=14
info: ghostty version=1.0.1
info: ghostty build optimize=ReleaseFast
info: runtime=apprt.Runtime.gtk
info: font_backend=font.main.Backend.fontconfig_freetype
info: dependency harfbuzz=8.3.0
info: dependency fontconfig=21500
info: renderer=renderer.OpenGL
info: libxev backend=main.Backend.io_uring
info(os): setlocale from env result=C.UTF-8
info(gtk): GTK version build=4.14.2 runtime=4.14.2
...
info(grid): loaded OpenGL 4.1
info(io_exec): found Ghostty resources dir: /usr/share/ghostty
info(io_exec): shell integration automatically injected shell=termio.shell_integration.Shell.bash
warning(gtk): unimplemented action=apprt.action.Action.Key.cell_size
warning(gtk): unimplemented action=apprt.action.Action.Key.size_limit
info(io_exec): started subcommand path=/bin/sh pid=629596
info(io_exec): subcommand cgroup=-
error(gtk): unable to get current color scheme: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.portal.Desktop was not provided by any .service files
Making GLX context 0x558c6a2c0190 current to drawable 4194329
Segmentation fault (core dumped)
BTOP (for Win)
Some time ago I spoke about BTOP++ and I use it regularly with Linux for performance debugging.
However, I saw that Jakob now has a BTOP for Windows that can install with scoop using scoop install btop
PS C:\Users\isaac> scoop install btop
... snip ...
* b2b19e2d882c minor changes ingenarel_.. 4 months ago
Scoop was updated successfully!
Installing 'btop' (1.0.4) [64bit] from 'main' bucket
btop4win-x64.zip (963.6 KB) [=================================================================================] 100%
Checking hash of btop4win-x64.zip ... ok.
Extracting btop4win-x64.zip ... done.
Running pre_install script...done.
Linking ~\scoop\apps\btop\current => ~\scoop\apps\btop\1.0.4
Creating shim for 'btop'.
Persisting themes
Persisting btop.conf
'btop' (1.0.4) was installed successfully!
'btop' suggests installing 'extras/vcredist2022'.
I can now fire it up
and we can see it in Action
Of course, you can go fullscreen for even higher resolution. Ctrl-P
will dance you around a lot of the screens and f
filters
I often use it for performance checks.
Chromium Dev
Scoop can also install Chromium to Windows for us just as easily
PS C:\Users\isaac> scoop install chromium-dev
Installing 'chromium-dev' (134.0.6984.0-r1411666) [64bit] from 'versions' bucket
chrome-win.zip (269.4 MB) [===============================================================================> ] 78%
And then launch it
This can be really handy for separating identities like Home and School or Personal and Work where I want to be different identities, say to Github, depending on browser.
I had hoped I might install Opera this way, but I do not see a recipe published for it
PS C:\Users\isaac> scoop install opera
Couldn't find manifest for 'opera'.
PS C:\Users\isaac> scoop install opera-dev
Couldn't find manifest for 'opera-dev'.
PS C:\Users\isaac> scoop search opera
Results from local buckets...
Name Version Source Binaries
---- ------- ------ --------
camunda-operate 8.5.10 main
camunda-operate1.3 1.3.7 versions
Meshy.ai
I have used Meshy before to create some rather interesting head busts of former managers. One (which I kept a copy) was of a wonderful manager who in a late night call said he was going to eat yogurt and I heard “beef yogurt” and well, the joke just rolled on from there.
The other was of my current manager who came in on so many Code Reds we joked he was Rob the Red, as a Viking. I made AI art, but that turned into a full model (with Axe).
Let’s try and make one of myself using a photo from a recent trip to a sledding hill
The first draft had one rough version, but i would argue missed the mark
I’ll try prompting it a bit better:
Mid-40s male bust wearing coat. coat has canvas exterior and wool interior. The hair is short and tussled. The man is smiling.
The way meshy tends to work is much like Midjourney in that it gives us some draft images and if we like it, we move on to a deeper refinement.
That was even worse
The third try was just as bad, but there is at least one model who is a lot more gaunt than I, but we can try
I’ll expand on it and wasted the credits to generate a texture
This really isn’t usable, but I’ll show you what it created
Huggingface Trellis
I found this Huggingface generator which I tweaked slightly and fired up the same image
This actually did a great job. I mean, I look even older, but it’s pretty close
I liked the second run even better. I’ll preview and download the GLB
I’ll use ImageToSTL to convert the GLB to STL.
This should print nicely in the Resin printer. Note, I made a hole for draining which I find helps at times (and i can paint over later)
I went back to try some more but hit the free-tier limit
I decided it might be worth joining Huggingface at this point.
First, the Resin print took a few tries since I had some real troubles with my plate. That said, I did kick out a print
and back
The print looks pretty good
And it did a pretty good job inventing a top and back
DeepAI
Let’s try the one on DeepAI.org with the same image.
Different. I don’t hate it, but it is a bit different.
That downloads as a “GLB” which I can’t really use. So I leveraged ImageToSTL to convert the GLB to an STL file.
It had a few things to fix but I can fix that with my slicer program
I think that looks okay. I’ll kick it out to the Printer
It came out fair. I’m thinking paint might smooth out the rough surface
3DAIStudio and those like it
I found some tools that suggested they would generate an image
But the moment you try, it forces you into a “pay me first” model
If these sites don’t offer even a lo-rez preview or a couple trials, they are not worth even considering.
Results
We can see results once painted are okay
Compared to the source image:
Summary
This was a bit of fun with 3d Printing. We started with using the GH Skyline tool to build out some Skyline Prints using both Resin and PLA. I moved on to trying a few AI generation tools. Tools like Meshy.ai, this Huggingface generator (Trellis) and DeepAI.org.
I also touched on using scoop
to install some apps in Windows like Chromium Dev and BTOP for windows. I had tried to get Ghostty working but without success (that said, it seems very directed at Linux and Mac which isn’t my daily driver).