You are browsing as a guest. Sign up (or log in) to start making projects!

Axwabo

@Axwabo

Joined June 1st, 2026

  • 28Devlogs
  • 3Projects
  • 2Ships
  • 4Votes
Ship Pending review

Soundboword is an actually usable desktop soundboard for (primarily) Linux and (with apparent support for) windows

tired of other soundboards paywalling slots? not anymore! [insert Phil Swift Flex Tape meme, not sponsored]

this is a .NET app built with Avalonia, SoundFlow, and YoutubeExplode

  • you don’t need to install .NET, it’s compiled into a native binary
  • the SoundFlow backend in use is based on miniaudio, so the app only supports mp3 and wav files
  • download audio from YouTube (paste a link or search)

for Linux, there is additional PipeWire support
use the PipeWire wizard to create a virtual device named “Soundboword Microphone” which you can select in apps (e.g. Discord)

after setting up the microphone, you can use the toggles in the bottom left to manage some node links (connect/disconnect audio nodes)

  • Hear Sounds: plays the soundboard to your headphones
  • Mic Sounds: plays the soundboard into the virtual microphone
  • Mic Passthrough: connects the selected physical microphone to the virtual mic
  • Hear Myself: connects your physical mic to your headphones, echoing what you say

windows support is partial, macos support will not be provided

global hotkeys should work out of the box on losedows

the Linux version uses xdg-desktop-portal for global shortcuts

if you have a Launchpad Mini MKII lying around, you can use it with this program :3

  • 13 devlogs
  • 69h
Try project → See source code →
Open comments for this post

2h 28m 25s logged

my final devlog of Stardance

i’m turning 19 in a few hours so this is my last thingy :3

brave browser ate my cursor so i can’t really see where i’m clicking lol


completed BaSL integration: the window now scrolls automatically + i’ve improved the UX with a Send and Terminate button

moved enter key handling to JavaScript because for some reason, .NET doesn’t get the input value before you press enter (so the input was percieved as empty on keydown)


updated Nowotes with new file dialogs

took a bit to refactor the code, i wanted a common component that does most stuff

the SaveFileDialog and OpenFileDialog have only a few lines of code thanks to this

the dialogs don’t look amazing, yeah, but you can tell directories apart by their trailing slash

you can use the input field similarly to actual file dialogs:

  • enter a directory in the current one
  • go to a directory by specifying its full path
  • open/save by providing a filename with no trailing slash, no .. (idk if the .. check works tbh)

added an analog clock cuz i didn’t want to deal with window maximizing

tiny detail: usename is now in the meta menu, which looks similar to how KDE handles it


fixed file system restoration by using the location origin instad of the href

fixed task manager buttons not being able to minimize their respective window

0
0
7
Open comments for this post

2h 11m 25s logged

last devlog, ship time soon

here is the final line from Kőbánya-Kispest to Újpest-központ!
i hadn’t chosen the best starting time for this as right now midnight overflow is not handled properly lol

so yeah, i’ve built the remaining tracks (Deák Ferenc tér <> Újpest-központ) which are pretty much half the line, as well as the Újpest-központ reversing sidings

i had misconfigured a switch at the latter siding, so one of the assemblies just hit you in the face on the wrong track


added a relation picker to the main menu, so you can pick which line to travel on

i didn’t have time for escalators unfortunately


made doors white and added the secondary beep sound for a bit more M3 resemblance


oh btw, i’ve managed to fix the WebGL build!

back in the day, SSAO (screen-space ambient occlusion) annoyed me in SpaceTransit, but i had forgotten how to turn it off

now i’ve found it… it wasn’t enabled in the mobile renderer (which gets used on the web) but it was on for PC… so i removed it from both, and now everything renders in your browser!

you’re gonna need a decent GPU to run this though :3

0
0
11
Open comments for this post

2h 17m 27s logged

final stretch up next!!

carriage house & Kőbánya-Kispest reversing siding area are DONE (just like i am)

the video shows a wrong turnout (switch) configuration, the lines were flipped because the curve is so curvy that the left state looked like the right state


fun fact: the bug about the onboard display’s destination was already present in the previously released version, i typed Description for the binding path instea of Destination :facepawm:


8 vehicles are most definitely not gonna be enough xd


added a relation picker to the main menu… it’s not perfect but it lets you choose lol

0
0
9
Open comments for this post

3h 40m 6s logged

most likely the last devlog before i outgrow hackclub :’3

finalized the project, improved the CI workflow to bundle the program properly and include 3rd party licenses

completed the README


added a simple sound “editor” that lets you specify the following:

  • start time: where to begin playback
  • loop start: where to jump when restarting on loop (start of file by default)
  • loop end: the point where loop triggers (end of file by default)

made the sidebar (Sounds and Inputs views) consistent


added icons to almost every window (Linux crashed because the PipeWire icon wasn’t in that project lol)

message to future self: you need the leading slash in the Icon property (e.g. /Assets/sus.ico works but not Assets/sus.ico)

the video shows the new configure sound on trigger click feature, resembling the behavior of Voicemod


implemented the missing “Auto Mic Passthrough” (as described in the README)

the physical microphone preference is now saved


fixed the hidden toggles taking up space on slopdows

RowDefinitions don’t support binding, not even OnPlatform :(


hopefully i don’t gotta fix anything, and it’s ready to ship :33:

0
0
4
Open comments for this post

56m 24s logged

Kőbánya-Kispest reversing sidings done

though they don’t work because the carriage house has not been built yet :kek:

dw, i fixed the overpass height

i’ve also connected Kálvin tér & Deák Ferenc tér, luckily it was pretty simple geometry


ngl i kinda forgor how to use the components i had made back in the day, had to check M4 xd

0
0
31
Open comments for this post

1h 30m 40s logged

done with tunnels for now

some parts required multiple segments of different widths, but that’s fine

i created splines about halfway between the tracks which housed the floors and ceilings where two “half” tunnels needed to be connected
most of these were easy, i could just offset the spline by X amount
some required more work (e.g. Nagyvárad tér <> Semmelweis Klinikák)
for Határ út > Kőbánya-Kispest i added support for the tracks so they don’t just float lol


added blocks, pillars and station name signs to middle-platform stations


oh, foreshadowing was definitely there in the previous devlog

some track connections (next property) were not assigned or impropely assigned, so i had to double click each one to make sure that the next track is set to the correct one

replacing the middle-platform station prefab might have messed with it, too


the video showcases the currently working track


refactored the station ID cache to group by relation

added two new station IDs (stations not yet placed)

filled out transfers for M3 stops

0
0
52
Open comments for this post

1h 45m 19s logged

i’m gonna tweak out after making tunnels
the shape tracks are just so cooked in some plaes, idk who designed this IRL (they probably had a reason to do it like this, but i wasn’t alive during those times lol)

fully connected Kálvin tér > Kőbánya-Kispest (the other direction)

quickly made some cube-like tunnels for M3 in blender

i’ll have to fill in the gaps in some places, the 2nd image shows that only one half of the tunnel is there (there will be a separate floor and ceiling “tunnel” that connects the left and right pieces)

the last image is the completed line Kőbánya-Kispest <-> Kálvin tér (gotta test track continuity later)


the 3rd image shows a goofy ahh descent as i was beginning to adjust elevation


polished up some stations, double platform stations now have signs

also connected the two platforms of KöKi

0
0
13
Open comments for this post

1h 51m 50s logged

lock in

average unity moments as you can see on the first image and the video

i think the attachment limit is 4 which is sad


i’ve “modeled” Határ út in a way that vaguely resembles the actual station, which includes a high overpass and a ramp

the second image shows me checking if the assembly fits under the overpass… not the best amount of headroom but i don’t got a lot of time lol


designed the arrival display for M3

luckily i didn’t have to write a second component to handle this, i just added the properties NextMinutes NextSeconds Double

Double controls whether to show two lines

the display should show --:-- if there are no routes within the next 30 minutes

i had a skill issue trying to figure out how to get the next route:

  • i didn’t add extra time so it would detect the next one
  • i set the second line’s text to the time based on the first route

added station name only signs too, i extracted a superclass from the renderer component
luckily i had written the code in a way that i could just extract a method that does extra logic for the detailed station sign (see the previous devlog)

0
0
12
Open comments for this post

3h 11m 48s logged

a recent system upgrade broke unity hub, now it doesn’t show in the system tray (so i can’t fully close it :skulk: )


anyways, i’ve connected the line from Kőbánya-Kispest to Kálvin tér (one direction only for now)
fixed elevation betwen KöKi & Határ út, data taken from Google Earth (the track goes underground near the entrance)

also added tunnels, though i’ll have to rework the tunnel model between stations that have their tracks next to each other (the current models would overlap)

i recorded the video before creating the station sign, so that’s why it’s missing
i assume that the direction shows -> Keleti pályaudvar because that’s the placeholder, and i’d forgotten to assign the relation for station IDs


spent a bunch of time designing the M3 station sign

the lack of relation assignment caused the sign to throw an exception, but that was a quick fix

the 1st image (excluding the video) shows when i reused the material for M4, since signs there are tiled 4 times

progress on the 2nd image, some styles from M4 messed with the M3 one, so i moved those declarations to a separate stylesheet

the last image will probably be the final design

still gotta add name-only signs


gotta ship before the end of today because i’m turning 19 tomorrow :waa:

0
0
62
Open comments for this post

2h 55m 57s logged

BaSL integration almost complete

terminal :333

i’ve added my very basic Bash-like shell project as a program!
since BaSL written in .NET, i can “just reference it,” and it works
(not every package works out of the box in Blazor WebAssembly)

on the left you can see the version without escape sequence parsing

on the right, it parsed the output properly

currently, it only supports setting/resetting bold mode and 8 types of foregrounds (black, red, green, yellow, blue, magenta, cyan, white)

for some reason, using an inline <pre> tag sometimes inserts a newline even though it’s not in the content string… idk 😭


the other feature i added in these 3 hours was cache-based file storage (yes, the Cache API)
it only saves files in the /home/user directory
the files will be loaded on startup

since there’s no filesystem watcher in BaSL, saving has to be manually triggered either via the terminal or from the meta menu

i’ve still yet to make it so concurrent sync operations cannot occur
it would also be nice to have sync -f so it rewrites the whole cache (mode changes are not detected yet)

for some reason, IJSStreamReference didn’t marshal properly in an object, so i tried use byte[] from an Uint8Array which also didn’t work… string it is, hopefully it doesn’t mess up binary content

gotta integrate the file system with Nowotes

0
0
15
Open comments for this post

2h 39m 23s logged

started work on the M3 line

i lapsed about 1h 15 mins:

  • half an hour for screenshotting overpass turbo and stitching together map pieces in photopea (i should’ve expanded the canvas first to help arrange images when importing them, but i just slapped them into the same position, and suffered the consequences xd)
  • 48 minutes (does not include recording) for chopping up & exporting voicelines for metro line M3, some lines needed more editing because i forgor to record a few sections (e.g. “doors open on the right” at some stations in the opposite direction, i didn’t take the time to record all - 2 stops twice)

the image on the right shows the final audacity project


the left screenshot shows a steep descent into madness that is not supposed to be like that lol

i haven’t modeled the carriages for this line yet, so it’s just a recoroled M4 assembly for now

i’ve placed the stations from Kőbánya-Kispest to Kálvin tér which covers a little under half of the line

the connection from KöKi to Határ út is very basic, i’ve only connected two nodes for the track, and somehow managed to leave the second node at Y = 0 :kek:
gonna have to split that section into multiple segments because the mesh library i’m using is not happy about it

on the right side of the left image you can see the future tracks for the carriage house, but i’ll only be building half of it (just look at the horrors)
i really hope that 8 assemblies will be enough to fulfill the line’s needs (Sunday timetable), probably wishful sinking though


at some point i’ll have to make

  • escalators to connect the two lines
  • dynamic loading of scenes when you approach the station

alternative solution if i don’t have time: no transfer between the two lines (sad emoji)

0
0
11
Open comments for this post

9h 33m 59s logged

I’M GONNA TWEAK OUT

9 hours on slopdows bullshit… IT FINALLY WORKS (except not really because removing keybinds doesn’t..?)


okay so i restored some of the styling, 0 padding in the Inputs listbox looked bad

not sure what else i did that isn’t losedows suffering lmao


sooooooo “win”dows is special

if you hold Ctrl, it doesn’t call the TextInput event, meaning that i have to translate the Key enum

the TextInput event isn’t flawless either, it can be ambiguous (e.g. hungarian layout: AltGr+J = í, AltGr+I = Í, Soundboword makes them uppercase)

should i remove the automatic uppercase conversion?


i spent a lot of time “debugging” (as in, having the CI build it, download the zip, transfer it to a slopdows machine, since native cross-compilation is not supported)


the biggest headache was the shortcut list update handler… i negated the TryAdd call, which meant that the global hotkey would only get registered if the same gesture has been added to the dictionary already (therefore it would only work on subsequent binds)
i spent way too much time figuring this out


another oversight was the lack of Target assignment when you clicked ⚙️ on an input method, meaning that binding shortcuts did nothing

idk why the entire panel is bold, gotta fix that


hotkeys are temporarily removed while you’re assigning a shortcut
however, as mentioned before, this doesn’t work xd
i tried it on a slopdows laptop, and removing the A hotkey made the A key unusable until i closed Soundboword


setting up CI wasn’t difficult, gotta make sure to separate rm commands and use -f so files not found don’t error

using || doesn’t run the latter command if the first one succeeds, i should’ve known that :kek:

0
0
14
Open comments for this post

51m 8s logged

continuing a project i started outside of Stardance

this project is a somewhat-accurate recreation of the Budapest subway system, i’ll be building metro line M3 during Stardance


took quite a while, but i’ve added a 6th track (track 3) to the Kelenföld carriage house (this is for M4)

had to split up the house entry track to add a second turnout, but i forgot to change the switch to account for this, so the assembly rolled onto the left track (vewy scawy)

to be able to test it easier, i added a simple “Dispatch” context menu that can be used in the Unity editor (it ignores the maximum dispatch time)


experimented with secondary beeps for M3, gonna have to revert them on these prefabs lol

0
0
13
Ship

this is a simple “operating system” that runs in your browser!
made with Blazor (cuz i like seeing sharp ahaha) which complicated some things, but it could be worse


right now it includes the following:

  • date and time
  • a notepad that uses localStorage to save data (you can open multiple of them at once)
  • meta menu (“start menu,” useful when the icons are covered)
  • an image of 4 FLIRTs :3 (you need to open the “file”)
  • task manager (taskbar) that is very slightly buggy but it lets you restore windows that had been minimized

making the task manager was a bit of a headache due to the unpredictable nature of C# delegates
it works for bringing a window to the front

i used the <dialog> HTML element in several places because i didn’t want to reinvent the wheel (not a lot of people know about this somehow), though handling interactions outside of the area of non-modal dialogs is something i’ll have to look into later
dialog sizes should be restricted but ugh

Try project → See source code →
Open comments for this post

3h 9m 28s logged

i had a look at the guide, and decided that i don’t want to use z-index
instead, i use ObservableCollection.Move to bring a window to the front
window state stays intact because i specify @key
changing the window order has a slight side effect: the task manager (taskbar) is also reordered; ordering by Id fixes this issue (IDs are v7 Guids which start with a timestamp)


the welcome screen is now more descriptive


implemented the meta menu (start menu), it’s pretty simple atm, only includes desktop programs


the task manger now shows which window is focused (topmost and not minimized)


added a notepad with a simple textarea element
it saves data to localStorage


code is horrible but does it matter? x3

deployed to GitHub Pages, hopefully this will qualify for the mission

0
0
31
Open comments for this post

1h 37m 19s logged

genuinely forgot some of the things i’ve done, probably styling


anyways, now you can open windows and close them properly!
i’ll be adding a few more desktop icons and apps

finally figured out the architecture i like
the WindowManager has an ObservableCollection, so it’ll notify other components if a window is added or removed automatically

the task manager (taskbar for losedows users) needs to be updated a second time because the window’s init method (which sets the title) only gets called the “next frame” (in Unity terms at least, idk how to say it lol)

gonna need a to add minimizing windows, and a “start menu”

i was also thinking of creating a simple notepad that saves content to local storage

0
0
19
Open comments for this post

2h 37m 14s logged

i did mostly polishing work during this time, now i can torture myself with windows global shortcuts :harold:


gotta crash out first though cuz this wonderful website has 3 different markdown renderers somehow, and i’ve been using --- to make sections actually separate


changed the TabControl to a TabStrip so i can use my on page switching logic
most views are only created once now, which gives a slight performance boost
i’d noticed that quickly switching between tabs while using TabControl lead to slight crackles in audio, that’s taken care of now
oh and you can use the Tab key to navigate, cuz TabStrip can magically do that
getting the lazy-ish loading was pretty funky though, UserControls are lazy by default so i had to hack around it to preload the views by setting IsVisible to false after the control loads (i think that’s what i did, i kinda forgor)


fixed the YouTube stream loader, and added a local error display so you can immediately see if something went wrong


made it so non-bound XDG-Desktop-Portal shortcuts are no longer detected


removed the sound edit button for now, i would like to ship without having to figure all that out


made StackPanel spacing mostly uniform using a style selector, though it looks pretty bad in device selectors


general settings & logging settings are now saved and loaded


added Rescan and Relink All buttons
Rescan checks not found files again to locate them
Relink All lets you pick directories to look for not found sounds by their filenames

in the video, i unmounted the disk that had some files, then relinked sounds to locate it elsewhere

0
0
8
Open comments for this post

4h 49m 46s logged

devlog about logging, crazy

added logging in-app and also to files
you can configure log levels, None disables file logging altogether

i was looking around to find a simple file logger for Microsoft.Extensions.Logging, but i didn’t like it so i made my own, even simpler version

took a bunch of attempts to make the architecture bearable, but it’s still kinda jank with the existence of LogPreferences.Instance (instead of using the service provider… but whatever, i make the rules :3)

turns out that MultiBinding doesn’t work for a bool that hides the bottom bar (idk why), so i did some wiring by subscribing to PropertyChanged in the preferences and the log list
only at the time of recording did i realize that the initial value isn’t set properly, so i gotta fix that

tried to set PublishAot to true for all projects (so i don’t have to specify it in dotnet publish), but that breaks the preview, so i had to revert the change

unhandled UI exceptions are now written to the file
the unobserved task exception event just… doesn’t seem to fire… i got rid of that

tried to use SemaphoreSlim to make the exiting thread block until an in-progress write operation completes, but that probably caused a deadlock because the app wouldn’t close
if a log entry happens to be in the middle of being written while you’re quitting, it gets cut in half, oh well

fun fact: the ItemsRepeater Avalonia control exists on GitHub, even the docs describe how to use it, but it just didn’t show up for me despite using the latest Avalonia version
this made me use a ListBox, which has selection (although you can’t see it because of the background of each log entry)

0
0
15
Open comments for this post

4h 1m 27s logged

made settings sections with a whole lot of unnecessary abstractions for the funny :33:
[FromKeyedServices] when i could just access a static instance? absolutely yes!!


i couldn’t figure out how to style the children of an ItemsControl externally, so i had to give it an ItemTemplate with a class (which would be unnecessary if i could style the thing)
all that for a separator line… and padding… and margin… what if i just nuke this idea and simply have some spacing between the sections?


i tried organizing classes into vertical slices architecture, but i gave up and only did it for the Linux project instead
the using updates would’ve been funky + some global usings would become useless


PipeWire


the toggle list now no longer “flickers” on/off when refreshing devices, as i only set the link manager after PipeWire objects have been queried


device lists and link toggles are now disabled when switching devices so the user doesn’t accidentally break the linking process


added a button that refreshes links (in case things go wrong somehow)


you can now select the physical microphone from the PipeWire list, and it will update links
this preference isn’t saved to disk just yet


in my last devlog i mentioned some issues, which have now been fixed:

upon startup, the first two switches don’t work sometimes (race condition maybe?)

turns out that i had forgotten to add a potentially valid node to the list after looping through all lines, so it just discarded the last entry

certain links might not reconnect properly when switching the output device

what did i do to fix that? i’m not sure anymore
maybe it was a bit of delay?
this one might be linked related to the former issue

0
0
3
Loading more…

Followers

Loading…