June 16, 2025
Fixed an issue that would cause the app to crash if any of the bar chart date ranges had no data
(thanks Smil, SoM reviewer for finding this out :D)
The app now uses Hackclub's font Phantom Sans
Added a stacked bars chart with all the projects made in the last ~14 weeks (when clicking on any of the bars, it shows the time range and all the projects made in that timespan w/ their hours)
Added app version and build number in the settings
Updated the site to include a dummy account API key for whoever doesn't want to use their API key
Rename the app as per Rowan suggestion
Added a skeleton UI for projects when loading
Added N/A text when no data is available for the selected date range
Made a simple website for the app
Fixed login screen having a different background color
Fixed projects page having a large empty space on bottom
Updated the app build action to skip ntfy if the server is not responding instead of failing the action
Finished the main screen
Added a projects screen
Added optional biometric authentication
Added a settings screen (to change API key, logout or toggle biometric authentication
Added some more components
Added a sidebar to switch between main page and projects page
Added material symbols
Added home page (WIP) with main hackatime stats and pie chart of the languages (later i'll add more, i got in the todo to update the languages color to match the actual language color instead of just converting to hex the name)
Added internet check and a no internet page
Added login page and the login workflow with auth check
Added different components that match hackclub style
Update hackatime functions to show the error message instead of just returning null
Updated default layout
Added 404 screen and no internet screen
Added Hackclub colors & font
Updated & added some function w/ their types
Added a function to fetch the logged user stats and its typescript types
(i pasted wrong image for last devlog ðŸ˜)
An android app made to view your Hackatime data Includes your stats for any date range and your projects. The app can also be locked behind biometric authentication (optional)
Added a theme selector as per Anirudh's feedback and also added a custom theme option so the user can choose the hex color (theme data is stored in the localStore)
looks pretty good! add some more themes to make it even cooler
Added title and description metadata
Added a showAll query in /apps to get all the apps of all users (if the authenticated user is an admin)
Added an admin panel /dashboard/admin/users to manage the users as admin
Fixed text color in register & login page
Added logout and delete account buttons
Finished the documentation
Added the API models/type definitions
Added more API docs (added /platforms/* and /auth/* docs and finished /apps/* docs)
Updated some colors
Updated redirect function
Renamed component folder to components & added docs specific components
Added link to API docs in the user settings
Added API docs (some endpoints are still missing)
Added an API endpoint to manage own user tokens
Added an API endpoint to get current session's token (used to disable deleting that token in the user settings)
Added types for all API success responses
Added password check when updating via API
Finished user settings page
Moved the custom input into its own component
Added partial user settings (username + password inputs & currently non-working save button)
Added the ability to pin/unpin apps & versions
Added the dashboard UIs to manage apps & versions
Updated database values to remove platform icon and add the pinned value to apps & versions
Added Pinned option to apps
Added a 404 page
Added a (unfinished) WIP dashboard page
Updated the CSS to include all the catpuccin macchiato colors as variables
Added keypress handlers for the following keys:
- Left arrow = seek previous
- Right arrow = seek next
- Space = play/pause
- CTRL + L = toggle loop
- CTRL + S = toggle shuffle
Add an UI for when no media is playing
Show a default icon when the playing media has no cover art
Added the 2 missing layouts
Added a function to detect the main color of an image (used for the cover art background)
Media module, song data section, middle click now opens the media player instead of raising the spotify window
Updated the media player so now it correctly switches the main player when you open a new one or close the current one
Also the media player now correctly updated the track metadata when the song changes
Fixed volume slider not correctly updating
Almost finished the small layout, i just have to find out how to make the image auto resize without using too much width, only way i found is to set hexpand but that takes more width than needed making it look ugly
(2 more layouts to go.. yay...)
Fixed a empty gap on top of app launcher
Updated all icons to use Material Symbols
Created a WIP media player
Fixed an issue that would cause update button not to work for play store (changed in-app updates from FLEXIBLE to IMMEDIATE
Fixed a crash when you would dismiss lots of notifications
Removed formatting in notification title/summary because it's basically never used there
Removed out file which was a test compile which wasn't successful cause of my OS
Updated moveToProd.sh script to adapt better to my system
Added a popup for the install APK button with the download progress so the user knows that it's downloading instead of just showing a toast
Updated app.config.ts to look nicer and easier to change name, ID and assets path for the different variants (currently release, prerelease and development)
I also did some tests to try to implement a persistent notification for background uploads but sadly the only good lib i found didn't work cuz it doesn't support the framework i use (expo) :(
Added the permission REQUEST_INSTALL_PACKAGES to let the app install APK files
Added a Install APK button on files to download and install the APK file (unless password protected)
Updated all the icons to use Material Symbols instead of Material Icons (font & codepoints loaded locally)
Added a setup script to download the Material Symbols TTF file and codepoints
Fixed an issue that would cause the folders' visibility to not get updated
Added optional Biometric Authentication
Metrics page now follows the adminOnly feature instead of showing for non-admins too
Fixed an issue that would cause the admin settings to fail to reload because of a HTTP request to an API route that was removed
Added API login & register endpoints
Added frontend for login and register
Applied catpuccin-macchiato styles to the site
Added untested update system (if installed from play store, uses play.core API, otherwise, if installed via APK, it checks the latest github release's version)
Partially added a version check system (still not fully implemented or tested)
Added a line in user settings' App Settings menu for the apk source (either google play or apk, or development instance in built from source)
Fixed wrong indentation in a metrics button
Added a camera button in the upload file section that allows to take a picture and crop it
Updated the change avatar buttons for self user and admins (to other users) to use media picker and allow cropping with aspect ratio of 1:1 (self user can also take a picture & crop other than upload)
Formatted code with biomejs
Currently working on a installer check & in-app update system
Updated the github workflow, now slit into 2 workflows, one for prerelease and one for release
Updated the database schema
Added all the following API routes:
- GET /api/platforms
- POST /api/platforms
- GET /api/platforms/[id]
- PATCH /api/platforms/[id]
- DELETE /api/platforms/[id]
- GET /api/users
- POST /api/users
- GET /api/users/[username]
- PATCH /api/users/[username]
- DELETE /api/users/[username]
- GET /api/users/me
- PATCH /api/users/me
- DELETE /api/users/me
- GET /api/versions
- POST /api/versions
- GET /api/versions/[versionCode]
- PATCH /api/versions/[versionCode]
- DELETE /api/versions/[versionCode]
(hope i didn't miss any, also doesn't matter if i leak password or token, they're only usable on my local pc anyway)
Just created the repo and created a nextjs app to start the api
frontend will use tailwind + react
removed default nextjs images & create a template api route
setup db
A version control API I'll be using in my apps to know if there an available update or not and if so, prompt the user to update
Fixed chunked uploads not working
Added per-chunk percentage next to overall percentage
Fixed an issue that would cause the app to crash when select a color through the color picker (fixed by moving the onComplete function from the UI thread to the JS thread)
(Thanks SoM reviewer for finding the issue, i prob wouldn't have found it otherwise lmao)
Updated chunked uploads system
Added a website for the app at zipline.stefdp.com (following the reverse domain notation from the app package ID com.stefdp.zipline)
Fixed an issue that would cause the app not to show anything on login screen
Updated popups and large file view to make it display over the header instead of under
After multiple attempts at making back gesture work correctly (go back in pages or close popups instead of just closing the app) i realized it was enough to replace router.replace with router.push 💀
Added BackHandler to LargeFileDisplay and Popup to make it close the popup instead of going back through the pages
Fixed an issue where in text upload, the content of the text input was not cleared after the upload
[untested] added chunked uploads support by splitting the file into smaller chunks inside the app's cache directory and uploading those chunks with the appropriate chunk header
Switched Override Domain text input to a select menu
Applied freeze fix to folder upload too
Fixed app freezing when uploading large files by showing a loading message (both on file and text upload)
Update text File Type select to use webSettings.codeMap (fetched from /api/server/settings/web) from instead of hardcoded values
Fixed an issue that would cause the app to not load the user data
Moved metrics' change date button on a new line to avoid it overflowing
Fix date picker text styling (before it was all black on dark blue bg, now it's gray and white)
Fixed an issue that would cause newly installed apps to not appear until the shell gets restarted
Updated useAuth hook to use data from the AuthContext context instead of fetching the user data on every page change
Fixed Recent Files section having no height when there was no file (replaced by a text saying so)
Fixed text inputs' content not being vertically centered
Fixed password input not hiding the password after it has been displayed
Updated all pages to use the ZiplineContext for public server settings/data instead of fetching it on every page change
Added a message telling the max file size uploadable to the Zipline instance
Added a check and a error popup for when any selected file exceeds the max file size
Bumped app version to 1.15.0
Updated convertToBytes function to correctly convert strings such as 4096mb
Created AuthContext (user role) & ZiplineContext (public server settings) to avoid fetching the settings on every page change (not yet applied to the app)
Increased minimum Zipline version to 4.2.3 as it's the only version with /api/server/public & /api/server/settings/web
Added functions to fetch /api/server/public & /api/server/settings/web & their types
Fixed an issue where tray's popovers would have no padding or border-radius (i think it's an AGS issue since just removing the class property and using popover instead of .tray-popover works fine)
In the last commits i updated all the app code so it targets as main android SDK 35 instead of SDK 34 since play store was complaining about it and fixed some issues reported by the few people who enrolled in the play store 14 days closed testing period
An android app to manage your self-hosted Zipline instance (zipline is https://zipline.diced.sh)
In the last commits:
- Fixed server modules nginx config as addSSL and forceSSL are mutually exclusive
- Fixed Ntfy user script to run after Ntfy itself instead of before (this script is temporary until ntfy on nixpkgs is updated to v2.14.0 which has built-in declarative users and access list)
- Fixed glance throwing errors and causing the system rebuild to fail as it'd try to get the domain variable from services which don't have a domain
- Improve SSH setup
- Fixed Mailcow Dockerized + Roundcube installation script and added a Mailcow Dockerized uninstallation script
- Opened TCP port 80, 443 on the firewall for Nginx
- Open TCP ports 22000 and UDP ports 22000 & 21027 on the firewall for Syncthing
- Open TCP ports 25, 465, 587, 143, 993, 110, 995 & 4190 on the firewall for Mailcow Dockerized
- Updated allt he server modules' ports from 1234:1234 to 127.0.0.1:1234:1234 to avoid publishing all the ports publicly
- Installed GIMP, rclone & Java JDK
In the last 6 commits:
- Fixed an issue that would cause the bar to error and not display if Spotify was not running when it started
- Updated the getMainInterface() function to get the correct main network interface
- Increased bar height delay from 500ms to 5 seconds as before it was too quick and sometimes was set too soom, causing the notification panel and other UIs to go partially under the bar
- Updated README to add few required details in the How to Run section
- Fixed an error in the URL RegExp that would cause some notifications to appear as blank because of markup issues
- Fixed an error in the URL RegExp that would cause discord formatted urls ([example](<https://example.com>)) to return the url as https://example.com>
- Fixed an error in the italic RegExp that would cause it o return blank text or * because it would match the * from bold or _ from underline
finally finished setting up the server module and applied the settings to the server itself
Added my personal API to the server modules
Updated ntfy module:
- declaratively create & delete users
- declaratively create & delete topics/permissions (access list)
Added other server modules:
- Wireguard VPN (incomplete)
- Mailcow (untested but web UI seems to work)
- Nginx for all the modules
Added other server modules:
- Discod Create Addon Notifier (by me)
- Telegram Create Addon Notifier (by me)
- Crate Addons Website (by me & a friend)
- Personal Site (by me)
- Receiptify (by me)
Added other server modules:
- Apprise API
- Discord User Apps bot (by me)
- Grafana
- Prometheus
- Prometheus node_exporter
- Lyrics API (by me)
- Pi-Hole
- Syncthing
- SearXNG
Fix Linkwarden + Meilisearch modules
Updated yourspotify modules:
- yourspotify.web -> yourspotify-web
- yourspotify.api -> your_spotify-api
Add server modules that i'll use on my VPS once finished
- Zipline
- SearXNG
- ConvertX
- your_spotify
- Filebrowser
- Glance
- IT-Tools
- Jellyfin
- PostgreSQL
- Linkwarden
- Ntfy
- speedtest-tracker
- Umami
- Vaultwarden
Added /mod command to get info about a specific create addon
Added /search to search through create addons
Formatted code with biomejs
Only 1 devlog cuz I started coding this some months ago with a friend (orangci), then kinda abandoned it and finshed it now, anyway:
Fixed tooltip going out of the screen when close to the edge
Fixed Skip Loading text not bing displayed on smaller screens
Add Skip Animation button in the about me code block
Added credits for Maia and Vaporwave oneko variants
Removed aspect ratio on the rabbit images
V2 of my personal website (I started coding this some months ago with a friend (orangci), then kinda abandoned it and finshed it now)
Fixed an issue where it would not parse correctly the variables
Moved the variables from a normal message to a message that uses Discord's components V2 to make it look nicer (platform buttons inside the container and addon icon as thumbnail when available)
Added edit new addon and updated addon message to the settings
Moved button & select handler in the components folder and added modal handler too
fix a typo (findConditinals => findConditionals)
remove url parser from parseVariables as i realized it was completely useless
Added /help command
Added /preview command
The video shows the bot working all together (using a local create addons website (modified to fetch only 10 mods instead of thousands) just to test the websocket messages)
Added event handlers
Added /settings using components V2 to manage the bot settings along with button and select menu handlers for it
Added /setchannel to set the channel where the bot will send the notifications
Updated README.md with a guide on how to selfhost it
Added WebSocket handler (untested)
Made the basic bot code and took the websocket types from th create addons website code itself
ws handler is partially added, still missing the actual addon message handling
A Discord bot that connects to the Create Addons website's websocket (wss://create-addons.stefdp.com/ws) and notifies all configured guilds whenever a new addon for the Minecraft "Create" mod has been created or updated This bot is mainly for people who play the minecraft "Create" mod or made a modpack with it and want to be up to date with its new & updated addons (The bot was made for th Converge YSWS) used copilot autocomplete suggestions
Fixed an issue where fetch would not be sending headers
Removed Math.min and Math.max from volume handlers as the lib already handles it
Right clicking media module now copies the track ID (needed for the lyrics through local file)
add a config file in ~/.config/stef-shell/config.json that allows you to configure some parts of the desktop shell
lyrics can now be imported from a local file as long as it's a file matching this name .lrc and is inside the lyrics folder (configurable)
Fixed notification overflowing when too long and now the notification center closes on middle and right click too
Styled scrolledwindow's scrollbar
Added pointer cursor to all the buttons and DND switch
added pointer cursor to each app launcher's app along with a 1px border on hover
added transition for button background color which changes on hover
fixed an issue where lyrics click/middle click would error with file already exists
fixed notifications having a wrong input region cuz of the animation
made a few changes to the readme
- added a preview/showcase video
- added required libraries to run it and how to run it
Added more keybinds for the app launcher
- Tab & Arrow Down: focus next app
- Shift + Tab & Arrow Up: focus previous app
- Backspace (when not focused): fucus text input & run backspace
- Cancel/Delete (when not focused): focus text input & run cancel/delete
- Any other (non-special) key: focus text input & type the key using String.fromCharCode()
those following ones already existed but i'll list them so people know they exist
- Alt + 0-9: open app at position (0 = 10)
- Enter: open focused app
- Esc: close app launcher
Added animations:
- launcher toggles with a fade in/out animation
- OSD toggles with a fade in/out animation
- notification center toggles with a slide left/right animation
- noitification popup toggles with a slide left/right animation
- popovers open with a fade in animation (i can't handle close cuz it's closed by GTK4, not code managed by me)
- session menu toggles with a fade in/out animation
Fixed an issue where pressing enter in the app launcher would not reset the app list but only the entry (literally 1 line)
Configured everything to use my AGS dekstop shell and remove waybar + swaync
Now OSD and notification popup are hidden when session menu is open
Sorted imports cuz yes.
formatted code with biomejs
fixed 2 bugs in the launcher
- every typed character would bring the cursor to the start of the entry (so if you were to type OBS it would've written SBO)
- when closed it would not clear the search apps (so if search for prism, then close and reopen the entry would be empty but the apps would still be filtered for prism)
better handling of the opening of any window from a source that is not ags request
Modified the Hyprland window rules so now
- my desktop shell windows float, do not have blurred bg, do not have animations (i'll add them later in the desktop shell itself) and 2 of the windows are pinned (notification center & session menu)
43 minutes cuz it took me a while to discover the existance of negative:... i was doing with a negative lookahead which apparently is noy supported..
Gtk.Window instead of windowREADME.md
installed some other util apps (cloc for code line count and lm_sensors for sensors info) and modified hyprland config (apps can now request t raise themselves, disabled animation on selection layer to avoid black border)
Added click handlers for the media buttons:
- left click on the song's cover art opens it in your default file viewer
- middle click on the song's cover art saves it in $HOME/Music/spotifyData/.png
- middle click on the song artist & title raises spotify as a ctive window
- left click on the lyrics opens the lyrics in your default editor
- middle click on the lyrics saves the lyrics in $HOME/Music/spotifyData/.lrc.
Also calculator launcher now clears the last result on close and added the pointer cursor to tray items and media modules
I modified the bar modules ordering and added 2 new modules, power (lock, sleep, hybernate, shutdown, reboot, reboot to BIOS/UEFI, task manager, logout) and system tray integration.
Also modified the icons so instead of nerd font icons it uses adwaita icons (just for mic, speaker, wifi & battery) and material symbols (for everything else).
Also slightly modified lyrics so it shouldn't update the current lyrics with the previous fetch if you switch too fast (hopefully, not tested)
I also probably optimized it a bit while changing the icons, now the icons will only re-render if they change rather than re-render even on volume change, same for labels & tooltips of most bar modules
yoinked the screenrec module from orangc
added syncthing module so i can thing my fils between my phone and my laptop (with my VPS as middleware)
moved all the data for config inside the constants folder and handle invalid inputs for the calculator launcher
Renamed the AppLauncher to just Launcher because now it can serve multiple purposes:
- Normal app launcher as it was before
- Calculator (using qalc)
- Clipboard (disabled until i find a way to get the clipboard from cliphist without errors caused by raw binary image data)
Also notification popup now stays hidden when DND is enabled
Now notification support markup (parsing MD to Pango markup), also now the clicks on the OSD pass through it as an intentional feature
and just formatted code with biomejs so it looks better
Added a OSD (On Screen Display) for microphone (default mic of the system), speaker (default speaker of the system) and screen brightness.
Also styled the calendar opened by right-clicking the time on the top bar to match more the bar styling.
still has some issues like OSD displays on startup and you can click through OSD except the startup run which blocks all the inputs in the middle of the screen, i'll try to fix those
This video shows how it all looks together
i created an application launcher which can be opened with ags request toggle-applauncher, it displays all the app with their icon, name and description (if avaible) and they can also be filtered with a fuzzy search thanks to AstalApps library
next i'll start working on the OSD
Fixed notifications taking more space than needed (using input area, ty mabi19 on discord for the help).
Fixed an issue where the current playing media would show null - null when spotify is closed.
Added a notification center (can be toggled with ags request toggle-notif or by pressing the notification icon on the top bar) to view all notifications (sorted by date), they're grouped by app with a button to close/dismiss all notifs by that app, and also a button to dismiss all notifications by all apps.
I improved the notification popup, now it has a custom progress bar to show when it expires, it correctly follows the timeout set by the app but that can be paused on hover
now it also handles the default action as notification left click instead of displaying a button
also fixed an issue where if a notification timeout expired and later it was replaced, it wouldn't be displayed and issue where transient notification would be stored anyways instead of being dismissed right away
Continued implementing the notification daemon, now the notifications received by it are displayed on the top right corner of the screen, they support image, icon, body, summary and actions like all notification daemons (still gotta fix some stuff like the overlay of the notifs either takes too much un-needed space or doesn't take enough space, i want it to take only the required space, eventually growing on new notifs and start to scroll only at around half screen).
Next I'll do a notification center to watch all received notifs and once i finish that i'll make an app launcher, after that i'll make a OSD (on screen display, the thing that appears when you change the volume/brightness etc.)
Finally finished the bar (well technically still missing the notification list but for that i'll have to first a notif view and notif popup with the astal notif daemon)
styled the bar and moved its tsx file along with its modules in the bar/ folder, so it'll be more ordered and clean.
ordered imports by length cuz yes.
I managed to fix the lyrics issue by subscribing just to the notify::metadata event instead of notify::position, notify::trackid and notify::volume
also added the catpuccin macchiato colors in the styles.scss file and constants/colors.ts which will be used for styling
I set the VSCodium font to FiraCode Nerd Font so i can see the icons directly in VSCode (needed for my linux widget with AGS v3 & Astal), and well, for that to work also installed the font itself.
Also enabled the gnome keyring pam SDDM service (for some reasons vscode complained otherwise and would have forced me to use weaker encryption)
how that took me 26m? first i didn't know the correct vscode setting name so i tried diff ones (i couldn't just set it through vscode and copy cuz nix saves its setting file as read-only meaning i can only edit it through nix) and also i couldn't find how to fix the vscode encryption thing so i tried diff things before ending up with this + setting "password-store": "gnome-libsecret" in the vscode runtime args
This widget is still very work in progress, i still haven't styled it, just added some of the modules (CPU, RAM, Disk, Battery. Clock, Speaker, Microphone, Network, Media), later i'll add other modules (just notifications for now and maybe hyprland workspaces).
Currently I'm tryna fix an issue where the media module shows the correct lyrics and metadata (artist, track etc.) for the first song but for the next ones shows correct metadata but the lyrics of the previous song (if anyone wanna help, the fetching is handled in utils/lyrics.ts)
(in the picture the red line is to be ignored cuz it's waybar, and the main modules are the unstyled stuff in the blue rectangle, other stuff is debug/test)
Made completely by myself with TSX, AGS & Astal libraries This desktop shell includes: - A top bar for my desktop as a replacement for "waybar" - A custom notification daemon using AGS and Astal as a replacement for "swaync" - A launcher (apps & calculator) - An OSD (On Screen Display for speaker, microphone and screen brightness) - A session menu (lock, sleep, logout, task manager, hibernate, shutdown, reboot, reboot in UEFI/BIOS) using Astal & AGS v3 features used copilot autocomplete suggestions
I switched to NixOS around a week ago and I started configuring my system using NixOS' flakes (basing myself on a friends' dots, orangci/dots, as startup).
Following orangc's model I kept adding any app i needed in the modules so i can just install/uninstall it by changing a boolean value in hosts/nixos/(config | home).nix.
The waybar on top is just temporary, i'm currently working on making a custom bar on the top using Astal and AGS.
This is what the system currently looks like:
I switched to NixOS just a few days before SOM started, so i thought, "why not ship my dotfiles too" since technically nix is a language Basically these are my NixOS dots (Thanks orangci for helping me start with nix)
This was widely regarded as a great move by everyone.