|
34940
|
My very own WebOS by @maragathasundaram383 | Stard My very own WebOS by @maragathasundaram383 | Stardance...
|
maragathasundaram383
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @maragathasundaram383 Title: My very own WebOS by @maragathasundaram383 | Stardance...
|
1793958724.5832114
|
1794563524.5832114
|
|
28895
|
luannzin.com by @luannzin | Stardance
|
luannzin
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T16:34:59Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I am currently shipping my stable website version, there is lefting experiences page yet, but i think that peoples can see my work and maybe, star my project, that will help me to continue evolving my personal website. I did my personal website focusing on internationalization and good UI.", "repo": "https://github.com/luannzin/luannzin.com", "demo": "https://luannzin.vercel.app"}]...
|
[{"post_id": 27760, "ts": "202 [{"post_id": 27760, "ts": "2026-07-13T16:31:38Z", "hours": 1.3772, "text": "now, we have blog in my webpage (with support for multiple languages)"}, {"post_id": 22213, "ts": "2026-07-04T15:59:35Z", "hours": 2.4767, "text": "I spent some time doing little UI improvements but the main, is that internationalization is finally full fixed and working fine"}, {"post_id": 20699, "ts": "2026-07-02T11:21:59Z", "hours": 0.8664, "text": "Next.js launched 16.3 preview version https://nextjs.org/blog/next-16-3-instant-navigations and with instant navigations, and some code my bugs are solved, internationalization it’s (almost) working next step, blog."}, {"post_id": 20087, "ts": "2026-07-01T16:33:58Z", "hours": 0.425, "text": "debugging… i have a bug with my better-intl library that causes client components to re render after detect another locale diff from the defaultLocale"}, {"post_id": 19585, "ts": "2026-06-30T22:37:37Z", "hours": 1.2767, "text": "I started adding internationalization using my own “better-intl” i18n library"}, {"post_id": 19332, "ts": "2026-06-30T16:42:23Z", "hours": 2.0372, "text": "2hours of work, and i did the initial version of website it includes Github contributions heatmap, includes projects + blog (no structure of blog yet) the next steps: internationalization blog projects experience everything is in one single page actually, i will improve that soon."}]...
|
Title: luannzin.com by @luannzin | Stardance
Devl Title: luannzin.com by @luannzin | Stardance
Devlogs:
2hours of work, and i did the initial version of website it includes Github contributions heatmap, includes projects + blog (no structure of blog yet) the next steps: internationalization blog projects experience everything is in one single page actually, i will improve that soon.
I started adding internationalization using my own “better-intl” i18n library
debugging… i have a bug with my better-intl library that causes client components to re render after detect another locale diff from the defaultLocale
Next.js launched 16.3 preview version https://nextjs.org/blog/next-16-3-instant-navigations and with instant navigations, and some code my bugs are solved, internationalization it’s (almost) working next step, blog.
I spent some time doing little UI improvements but the main, is that internationalization is finally full fixed and working fine
now, we have blog in my webpage (with support for multiple languages)
Ships:
I am currently shipping my stable website version, there is lefting experiences page yet, but i think that peoples can see my work and maybe, star my project, that will help me to continue evolving my personal website. I did my personal website focusing on internationalization and good UI....
|
1793958725.4804716
|
1794045125.4804716
|
|
31507
|
My own site! by @jair_snieder | Stardance
|
jair_snieder
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @jair_snieder | Stardance
|
1793958726.6811278
|
1794563526.6811278
|
|
14115
|
Clouds website by @shivamgupta_official13 | Starda Clouds website by @shivamgupta_official13 | Stardance...
|
shivamgupta_official13
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T12:27:28Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have made an clouds landing page and this is jsut an landing page featuring clouds which are renderd by the three js liblray in my node.js setup.I ahd thoguth of using clouds as it would look better and cool.This was very challenging to make espcially like in the part of in the end where soemtimes it didnt look that good and simple bugs too in before parts and at the end the redner scene was jsut dissapering but it was becuase of the dev mode i was using for preview but when i pushed to my github and conntect it to my vercel it was looking good.", "repo": "https://github.com/Shivam430-stack/Clouds-website", "demo": "https://clouds-website-two.vercel.app/"}]...
|
[{"post_id": 8511, "ts": "2026 [{"post_id": 8511, "ts": "2026-06-14T04:37:36Z", "hours": 0.2683, "text": "I had made the final changes on my website by making the buttons of the left functional and when you click them it will lead you somewhere so go try them and also a ligth weigth definition of clouds is included too and i added a link to my repo by clicking the github logo button.as you can see below in the screenshot the changes made and also see the buttons named as Top nav items now read: Clouds Pricing Menu Sign in .you can test the website in https://clouds-website-two.vercel.app/"}, {"post_id": 6812, "ts": "2026-06-11T13:06:10Z", "hours": 2.2311, "text": "Hi I had completed my project clouds website and it is just a landing page but it has a background of 3d clouds and I used the three.js library too for it. And it is based on next.js which i set up on my vs code folder and i have the github for the full code even though i have just added the file cloudbackground.tsx but it has the all the main things like the clouds rendering and also i put a simple Ui too and when you hover on it the buttons will grow a little and when you hover off it will reduce to its orignal size and you can also see my project in detail and see the demo link too."}]...
|
Title: Clouds website by @shivamgupta_official13 | Title: Clouds website by @shivamgupta_official13 | Stardance
Devlogs:
Hi I had completed my project clouds website and it is just a landing page but it has a background of 3d clouds and I used the three.js library too for it. And it is based on next.js which i set up on my vs code folder and i have the github for the full code even though i have just added the file cloudbackground.tsx but it has the all the main things like the clouds rendering and also i put a simple Ui too and when you hover on it the buttons will grow a little and when you hover off it will reduce to its orignal size and you can also see my project in detail and see the demo link too.
I had made the final changes on my website by making the buttons of the left functional and when you click them it will lead you somewhere so go try them and also a ligth weigth definition of clouds is included too and i added a link to my repo by clicking the github logo button.as you can see below in the screenshot the changes made and also see the buttons named as Top nav items now read: Clouds Pricing Menu Sign in .you can test the website in https://clouds-website-two.vercel.app/
Ships:
I have made an clouds landing page and this is jsut an landing page featuring clouds which are renderd by the three js liblray in my node.js setup.I ahd thoguth of using clouds as it would look better and cool.This was very challenging to make espcially like in the part of in the end where soemtimes it didnt look that good and simple bugs too in before parts and at the end the redner scene was jsut dissapering but it was becuase of the dev mode i was using for preview but when i pushed to my github and conntect it to my vercel it was looking good....
|
1793958727.5691383
|
1794045127.5691383
|
|
17548
|
magic8 by @damienzarich | Stardance
|
damienzarich
|
0
|
12.89
|
0
|
[]
|
[{"post_id": 21106, "ts": "202 [{"post_id": 21106, "ts": "2026-07-02T21:59:13Z", "hours": 12.8878, "text": "finished my magic 8 ball, when you get a postive/good answer the triangle inside turns green same thing happens when you get neutral(yellow) or bad(red). I added custom animations for when you dont move your mouse the triangle drifts around. Also when you shake the ball, a custom sound i modified plays and the triangle inside dissapears."}]...
|
Title: magic8 by @damienzarich | Stardance
Devlog Title: magic8 by @damienzarich | Stardance
Devlogs:
finished my magic 8 ball, when you get a postive/good answer the triangle inside turns green same thing happens when you get neutral(yellow) or bad(red). I added custom animations for when you dont move your mouse the triangle drifts around. Also when you shake the ball, a custom sound i modified plays and the triangle inside dissapears....
|
1793958728.7082603
|
1794563528.7082603
|
|
25811
|
My awesome macropad! by @aheibamsamson249 | Starda My awesome macropad! by @aheibamsamson249 | Stardance...
|
aheibamsamson249
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @aheibamsamson249 | Title: My awesome macropad! by @aheibamsamson249 | Stardance...
|
1793958729.6179712
|
1794563529.6179712
|
|
7748
|
Flow by @twinx | Stardance
|
twinx
|
6
|
106.0
|
791
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-11T13:20:24Z", "hours": 13.0, "multiplier": 17.94, "payout": 120, "blessing": "neutral", "text": "So after everyone’s request i added support for all platforms , i haven’t tested it on mac (cause i don’t that🙃️) but i have tested on all other platforms and hope that it works on your systems too. Also i have added some new features for u all : a new log for seeing what broke new display i.e. rich that makes it more cool looking new commands and insane customization 😎️", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 2, "ts": "2026-10-01T10:07:35Z", "hours": 35.0, "multiplier": 18.78, "payout": 331, "blessing": "neutral", "text": "Changes from last ship : new database from json to db ( sqlite ) and new codebase Added TUI and also improved the web mode Added new commands and docs Added plugins system and community plugins Major and minor bug fixes", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 3, "ts": "2026-08-02T15:52:05Z", "hours": 22.0, "multiplier": 7.29, "payout": 73, "blessing": "neutral", "text": "So added few not actually few but many like better ui for web formats using ffmpeg playlist feature bug fixes and much more I want to thank you all for support and hopping to add more features. Also do visit the flow page. Enjoy !", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 4, "ts": "2026-07-18T08:24:18Z", "hours": 12.0, "multiplier": 16.41, "payout": 33, "blessing": "neutral", "text": "Ship #3 Added many features such as : background playback so you don’t need to open a terminal just for flow. bars for you to enjoy the vibe. lyrics so you can sing along the song it is also time-synced . and much more such as configs customization. How to install : Head to release page for a linux binary or type it in terminal but make sure you have python and vlc installed pip install flow-twinx and then flow", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 5, "ts": "2026-07-05T01:38:26Z", "hours": 12.0, "multiplier": 14.1, "payout": 109, "blessing": "neutral", "text": "Flow version v0.4.0 This version includes Saavan playback , Saavan is a music player with high quality songs. Please do also keep this in mind that Songs on saavan are only playable on saavan commands and there is no radio mode for it. The difficult part about this thing is the API , actually the API is build by me hosted on NEST as a part of SINGULARITY my another project some similar features but more advanced. Do check out that also!", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 6, "ts": "2026-06-17T08:20:51Z", "hours": 12.0, "multiplier": 10.78, "payout": 125, "blessing": "neutral", "text": "I build a terminal music player that uses vlc and yt_dlp , that has both offline and online support for music you can either play from folders or online. Hardest part to make it run on all os.", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}]...
|
[{"post_id": 78737, "ts": "202 [{"post_id": 78737, "ts": "2026-10-11T13:09:32Z", "hours": 4.8319, "text": "v0.9.1 So after hours added support for all platforms and made website and hosted it on cloudflare here also i have added a better logs system to tell if anything goes wrong , aslo this time please rate it as much as u could i have spend 100+ hours working on this still i get 200 stardust :("}, {"post_id": 78322, "ts": "2026-10-10T12:35:40Z", "hours": 8.4858, "text": "v0.8.4 Forgot to add the versions from some devlogs. New features : added a full for showcase added a minimal version so ai agents and ssh terminals can work too added a new progress bar and some bug fixes… i tried adding cookies but it works good without cookies also so would add a import option to import external songs. Also i am working on making it play on all platforms including termux of mobile phones."}, {"post_id": 75842, "ts": "2026-10-01T10:00:50Z", "hours": 1.4978, "text": "So i have to really fix this bug not too much big but it resulted in multiple vlc instance to start also changed export to export songs instead of a zip file and with custom path can be used by -p PATH or default to Downloads/music ."}, {"post_id": 74510, "ts": "2026-09-27T15:17:11Z", "hours": 0.2864, "text": "#v0.8.0 Just finished some last parts and added it to ship."}, {"post_id": 73966, "ts": "2026-09-26T12:39:28Z", "hours": 8.5808, "text": "So mostly made changes to backend and the structure of the project. Changes : migrated from json to sqlite for history and other new features soon added a plugins system with a repo for community plugins separate commands for sperate playform like flow-web for flow"}, {"post_id": 69636, "ts": "2026-09-17T13:37:22Z", "hours": 2.6986, "text": "v0.7.0 So finally made the tui using textual and it looks pretty good i wasn’t expecting much but yeah looks good also there are pretty much 10 themes i guess so enjoy that are given in textual by default. Also changed the structure of the code repo as it was a disaster so now it has /backend /tui and /cli"}, {"post_id": 65826, "ts": "2026-09-11T07:08:47Z", "hours": 3.4658, "text": "v0.6.1 Replaced the old UI with new UI , as previous one looked awful for most people i hope this is good. Also added this demo video , i tried to add a more professional one with openscreen but quality issues with the app , so will add later till then this is the demo video."}, {"post_id": 62823, "ts": "2026-09-06T10:56:04Z", "hours": 5.4986, "text": "Hey everyone hope ur doing well. Today i think mostly i did was just making it cool and easy to navigate and bug fixes for the most time. Bugs: Ctrl + Q not working in radio mode d not working in new selection mode not showing [Paused] when paused and much more that is too big to explain here and started working on gui mode using PySide6"}, {"post_id": 60253, "ts": "2026-09-02T14:48:41Z", "hours": 2.2642, "text": "v0.6.0 So , i have added a new selection using arrow keys for config search and play for better navigation also to reduce the typing thing in terminal to change the value. Also replaced the bars for a better looking and customizable bars it includes custom char + 3 modes."}, {"post_id": 56448, "ts": "2026-08-28T06:39:47Z", "hours": 2.4575, "text": "So added more commands and few mid level bug fixes : added delete command added more flags to control it by using other programs improved the name shorter to include other laung added the m and pick songs in play also thing as shown in video. improved the –status command to show images."}, {"post_id": 52872, "ts": "2026-08-23T07:46:12Z", "hours": 2.0144, "text": "v0.5.8 So added a better playlist management system that has support for local songs before it had different playlist logic for different mode , now it shares same logic with also bug fixes and in future updates gonna add island as a way u can do it without any configs also better status."}, {"post_id": 50472, "ts": "2026-08-19T17:14:05Z", "hours": 6.7164, "text": "So yeah still alive after many days cause i thought it needed more work. I made something to help u in KDE and Hyprland by using dbus to expose name and a custom --status command wit img support and all that to provide u with a support for custom modules. The island shown here is my custom build and is not included in the flow project. Also made few more thing in here to help u out and fixed bugs."}, {"post_id": 39542, "ts": "2026-08-02T15:48:47Z", "hours": 0.27, "text": "So last fix i guess for this ship , it includes changes in dependencies i previously forgot to add toml so it caused error in some OS i think not in my one , so i switched to pyproject.toml i kept that so users can use pip also not only uv."}, {"post_id": 39528, "ts": "2026-08-02T15:25:31Z", "hours": 0.4983, "text": "So fixed a bug where after closing a radio when user searched for other song and then played it continued from last play instead of new one."}, {"post_id": 38934, "ts": "2026-08-01T15:24:47Z", "hours": 3.4775, "text": "v0.5.0 So fixed major stuffs mostly like : playlist not created error fixed format in web mode as it downloaded in mp3 fixed another download bug as it downloaded in mp4 , when set to default fixed loop during playback which caused one command execution only and other were not listened And added some more thing: a export feature added better port handling added –port ( ~5 commands ) and –version commands"}, {"post_id": 35788, "ts": "2026-07-27T13:20:01Z", "hours": 1.6367, "text": "Added playlist feature and a lot more features like format - opus , mp3 , m4a and webm. Also fixed some bugs regarding downloads and added a check feature to check flow gets all things like vlc , ffmpeg .etc"}, {"post_id": 34615, "ts": "2026-07-25T14:20:28Z", "hours": 0.4917, "text": "So trying to make the web version so u know a better docs instead of terminal one with better installation support. Thought of notifying everyone so u can guess what will be the next few develops about."}, {"post_id": 34070, "ts": "2026-07-24T15:03:24Z", "hours": 2.9269, "text": "Finally added playlist it has following commands: playlist ( to list all ) playlist add playlist remove pl.. -d radio -p ( to save as playlist ) also download or -d download radio as a playlist instead of songs in downloads"}, {"post_id": 32728, "ts": "2026-07-22T02:01:00Z", "hours": 0.74, "text": "v0.4.7 So i am just kinda dumb i think. I didn’t even commited the changes and lost all the works 🥲 i do managed to re-write the code once again for some parts like DEV MODE and bug fix regarding the playback. So playlist features are on a hold"}, {"post_id": 32438, "ts": "2026-07-21T16:57:32Z", "hours": 2.5728, "text": "So fixed some major and minor bugs and flaws like user can even download the song in /boot/ also added history and auto-completion , it also now has playlist commands and features with better UI in web mode not too much but still. Also added format option so u can download in whichever format u want. And made this banner"}, {"post_id": 31875, "ts": "2026-07-20T16:54:25Z", "hours": 8.9078, "text": "0.4.5 So after ~7hr ( some are not recorded which i spent in browser ) I made the UI of the flow in web looking forward for a desktop UI also but later i think. What is New and what is changed Web UI with pixel theme Local support for UI also and liked songs Minor bug fixes"}, {"post_id": 30572, "ts": "2026-07-18T08:19:25Z", "hours": 0.3758, "text": "Nothing added just fixed more things and made a new video for upload at github pages. You can see video here it also has audio. added a linux binary at release page and links to my github account in PyPi"}, {"post_id": 30520, "ts": "2026-07-18T05:06:55Z", "hours": 0.4369, "text": "So added these bars looks weird i know because i set their width to 3 and spacing : fit that’s why but u can customize it however you want. Also fully added the lyrics , mostly you will see lyrics not found if are listening in other laung then eng because YtLyrics doesn’t have much songs lyrics i guess."}, {"post_id": 30505, "ts": "2026-07-18T04:13:45Z", "hours": 1.0981, "text": "So this is going crazy like really! What i added today? A bar that reacts to sound. fixed errors in bg mode which triggered the playing of two music at the same time. Also trying to add like 50% added the lyrics with time synced."}, {"post_id": 30120, "ts": "2026-07-17T13:09:14Z", "hours": 9.635, "text": "So i made some new changes like a background player no need to open a terminal just for a music also fixed some major errors like calling fetch when not needed in radio mode."}, {"post_id": 22528, "ts": "2026-07-05T01:33:25Z", "hours": 3.9431, "text": "Published v0.4.0 this version includes Saavan playback also and new commands i.e. : savan : play songs directly( alias: svn ) savan-s : search songs by name ( alias : svn-s )"}, {"post_id": 16137, "ts": "2026-06-26T07:14:21Z", "hours": 2.9075, "text": "Added many features here are some of them : better radio with play next config feature theme changing better colors."}, {"post_id": 15463, "ts": "2026-06-25T04:23:40Z", "hours": 2.0053, "text": "uploaded to PyPi with features such as: radio mode which auto suggest songs alias for quick commands major bug fixes"}, {"post_id": 13075, "ts": "2026-06-21T11:57:16Z", "hours": 2.5681, "text": "added alias for commands such as hl for help , pl for play these are default and can be changed later by running short <index> <value> also added more detailed help command that gives user more info , can be run by using help -i or hl -i or as per your alias. Features in new update: suggestion of songs (fetched from youtube) custom themes more option for using tools"}, {"post_id": 11113, "ts": "2026-06-18T05:43:07Z", "hours": 0.3356, "text": "Finally after hard work as i have never uploaded anything to Pypi anything before so totally a disaster that includes import error and much more. You can install this package by typing pip install flow-twinx"}, {"post_id": 10500, "ts": "2026-06-17T07:47:16Z", "hours": 0.2867, "text": "fixed the error when doing install.sh in windows as the path are not same in linux and windows"}, {"post_id": 10490, "ts": "2026-06-17T07:23:31Z", "hours": 0.4394, "text": "added readme.md and finished by adding features listed also added install.sh"}, {"post_id": 10471, "ts": "2026-06-17T06:45:47Z", "hours": 2.6703, "text": "made few things as listed: a progress bar offline download of songs shuffle and repeat songs liked songs and much more adding : offline support like liked songs , album"}, {"post_id": 10390, "ts": "2026-06-17T02:17:36Z", "hours": 1.2692, "text": "Re-started the project and this time adding both offline and online features i.e. yet to implement , i have already made the ping.py file so it can check if host has connections. also some few changes in future :- online playback mode without downloading the song. offline mode. will try to add suggestion by adding &start_radio=1 to get suggestion directly from YouTube"}, {"post_id": 5516, "ts": "2026-06-09T10:11:49Z", "hours": 1.8011, "text": "Tried too much to add cross-fade but the audio just glitches , will be trying more if not possible i will leave this feature and focus on something different.Also added the bash install for different os so it becomes flow play not py main.py play."}, {"post_id": 4843, "ts": "2026-06-08T11:24:27Z", "hours": 2.4728, "text": "Finally made functional and working , have to make it once more took more help from AI i didn’t wanted to but sometimes vlc was giving error and sometimes yt_dlp even though i was following the module guide , i don’t know what was happening. Currently adding the spinners and more things. Features added till now: like music make playlist Fuzzy search or smart search"}, {"post_id": 4229, "ts": "2026-06-07T13:53:21Z", "hours": 2.8981, "text": "| | This is my first post on this project , this project is about a feature rich and apple music inspired terminal music player | | . Today i made basic commands like play , delete , random , like .etc . The best part was to create the file handling as i have learned how to handle the .yaml files instead of json files for settings and hardest part was nothing except me trying to use vlc without AI or docs."}]...
|
Title: Flow by @twinx | Stardance
Devlogs:
| | Th Title: Flow by @twinx | Stardance
Devlogs:
| | This is my first post on this project , this project is about a feature rich and apple music inspired terminal music player | | . Today i made basic commands like play , delete , random , like .etc . The best part was to create the file handling as i have learned how to handle the .yaml files instead of json files for settings and hardest part was nothing except me trying to use vlc without AI or docs.
Finally made functional and working , have to make it once more took more help from AI i didn’t wanted to but sometimes vlc was giving error and sometimes yt_dlp even though i was following the module guide , i don’t know what was happening. Currently adding the spinners and more things. Features added till now: like music make playlist Fuzzy search or smart search
Tried too much to add cross-fade but the audio just glitches , will be trying more if not possible i will leave this feature and focus on something different.Also added the bash install for different os so it becomes flow play not py main.py play.
Re-started the project and this time adding both offline and online features i.e. yet to implement , i have already made the ping.py file so it can check if host has connections. also some few changes in future :- online playback mode without downloading the song. offline mode. will try to add suggestion by adding &start_radio=1 to get suggestion directly from YouTube
made few things as listed: a progress bar offline download of songs shuffle and repeat songs liked songs and much more adding : offline support like liked songs , album
added readme.md and finished by adding features listed also added install.sh
fixed the error when doing install.sh in windows as the path are not same in linux and windows
Finally after hard work as i have never uploaded anything to Pypi anything before so totally a disaster that includes import error and much more. You can install this package by typing pip install flow-twinx
added alias for commands such as hl for help , pl for play these are default and can be changed later by running short <index> <value> also added more detailed help command that gives user more info , can be run by using help -i or hl -i or as per your alias. Features in new update: suggestion of songs (fetched from youtube) custom themes more option for using tools
uploaded to PyPi with features such as: radio mode which auto suggest songs alias for quick commands major bug fixes
Added many features here are some of them : better radio with play next config feature theme changing better colors.
Published v0.4.0 this version includes Saavan playback also and new commands i.e. : savan : play songs directly( alias: svn ) savan-s : search songs by name ( alias : svn-s )
So i made some new changes like a background player no need to open a terminal just for a music also fixed some major errors like calling fetch when not needed in radio mode.
So this is going crazy like really! What i added today? A bar that reacts to sound. fixed errors in bg mode which triggered the playing of two music at the same time. Also trying to add like 50% added the lyrics with time synced.
So added these bars looks weird i know because i set their width to 3 and spacing : fit that’s why but u can customize it however you want. Also fully added the lyrics , mostly you will see lyrics not found if are listening in other laung then eng because YtLyrics doesn’t have much songs lyrics i guess.
Nothing added just fixed more things and made a new video for upload at github pages. You can see video here it also has audio. added a linux binary at release page and links to my github account in PyPi
0.4.5 So after ~7hr ( some are not recorded which i spent in browser ) I made the UI of the flow in web looking forward for a desktop UI also but later i think. What is New and what is changed Web UI with pixel theme Local support for UI also and liked songs Minor bug fixes
So fixed some major and minor bugs and flaws like user can even download the song in /boot/ also added history and auto-completion , it also now has playlist commands and features with better UI in web mode not too much but still. Also added format option so u can download in whichever format u want. And made this banner
v0.4.7 So i am just kinda dumb i think. I didn’t even commited the changes and lost all the works 🥲 i do managed to re-write the code once again for some parts like DEV MODE and bug fix regarding the playback. So playlist features are on a hold
Finally added playlist it has following commands: playlist ( to list all ) playlist add playlist remove pl.. -d radio -p ( to save as playlist ) also download or -d download radio as a playlist instead of songs in downloads
So trying to make the web version so u know a better docs instead of terminal one with better installation support. Thought of notifying everyone so u can guess what will be the next few develops about.
Added playlist feature and a lot more features like format - opus , mp3 , m4a and webm. Also fixed some bugs regarding downloads and added a check feature to check flow gets all things like vlc , ffmpeg .etc
v0.5.0 So fixed major stuffs mostly like : playlist not created error fixed format in web mode as it downloaded in mp3 fixed another download bug as it downloaded in mp4 , when set to default fixed loop during playback which caused one command execution only and other were not listened And added some more thing: a export feature added better port handling added –port ( ~5 commands ) and –version commands
So fixed a bug where after closing a radio when user searched for other song and then played it continued from last play instead of new one.
So last fix i guess for this ship , it includes changes in dependencies i previously forgot to add toml so it caused error in some OS i think not in my one , so i switched to pyproject.toml i kept that so users can use pip also not only uv.
So yeah still alive after many days cause i thought it needed more work. I made something to help u in KDE and Hyprland by using dbus to expose name and a custom --status command wit img support and all that to provide u with a support for custom modules. The island shown here is my custom build and is not included in the flow project. Also made few more thing in here to help u out and fixed bugs.
v0.5.8 So added a better playlist management system that has support for local songs before it had different playlist logic for different mode , now it shares same logic with also bug fixes and in future updates gonna add island as a way u can do it without any configs also better status.
So added more commands and few mid level bug fixes : added delete command added more flags to control it by using other programs improved the name shorter to include other laung added the m and pick songs in play also thing as shown in video. improved the –status command to show images.
v0.6.0 So , i have added a new selection using arrow keys for config search and play for better navigation also to reduce the typing thing in terminal to change the value. Also replaced the bars for a better looking and customizable bars it includes custom char + 3 modes.
Hey everyone hope ur doing well. Today i think mostly i did was just making it cool and easy to navigate and bug fixes for the most time. Bugs: Ctrl + Q not working in radio mode d not working in new selection mode not showing [Paused] when paused and much more that is too big to explain here and started working on gui mode using PySide6
v0.6.1 Replaced the old UI with new UI , as previous one looked awful for most people i hope this is good. Also added this demo video , i tried to add a more professional one with openscreen but quality issues with the app , so will add later till then this is the demo video.
v0.7.0 So finally made the tui using textual and it looks pretty good i wasn’t expecting much but yeah looks good also there are pretty much 10 themes i guess so enjoy that are given in textual by default. Also changed the structure of the code repo as it was a disaster so now it has /backend /tui and /cli
So mostly made changes to backend and the structure of the project. Changes : migrated from json to sqlite for history and other new features soon added a plugins system with a repo for community plugins separate commands for sperate playform like flow-web for flow
#v0.8.0 Just finished some last parts and added it to ship.
So i have to really fix this bug not too much big but it resulted in multiple vlc instance to start also changed export to export songs instead of a zip file and with custom path can be used by -p PATH or default to Downloads/music .
v0.8.4 Forgot to add the versions from some devlogs. New features : added a full for showcase added a minimal version so ai agents and ssh terminals can work too added a new progress bar and some bug fixes… i tried adding cookies but it works good without cookies also so would add a import option to import external songs. Also i am working on making it play on all platforms including termux of mobile phones.
v0.9.1 So after hours added support for all platforms and made website and hosted it on cloudflare here also i have added a better logs system to tell if anything goes wrong , aslo this time please rate it as much as u could i have spend 100+ hours working on this still i get 200 stardust :(
Ships:
I build a terminal music player that uses vlc and yt_dlp , that has both offline and online support for music you can either play from folders or online. Hardest part to make it run on all os.
Flow version v0.4.0 This version includes Saavan playback , Saavan is a music player with high quality songs. Please do also keep this in mind that Songs on saavan are only playable on saavan commands and there is no radio mode for it. The difficult part about this thing is the API , actually the API is build by me hosted on NEST as a part of SINGULARITY my another project some similar features but more advanced. Do check out that also!
Ship #3 Added many features such as : background playback so you don’t need to open a terminal just for flow. bars for you to enjoy the vibe. lyrics so you can sing along the song it is also time-synced . and much more such as configs customization. How to install : Head to release page for a linux binary or type it in terminal but make sure you have python and vlc installed pip install flow-twinx and then flow
So added few not actually few but many like better ui for web formats using ffmpeg playlist feature bug fixes and much more I want to thank you all for support and hopping to add more features. Also do visit the flow page. Enjoy !
Changes from last ship : new database from json to db ( sqlite ) and new codebase Added TUI and also improved the web mode Added new commands and docs Added plugins system and community plugins Major and minor bug fixes
So after everyone’s request i added support for all platforms , i haven’t tested it on mac (cause i don’t that🙃️) but i have tested on all other platforms and hope that it works on your systems too. Also i have added some new features for u all : a new log for seeing what broke new display i.e. rich that makes it more cool looking new commands and insane customization 😎️...
|
1793958730.539741
|
1794045130.539741
|
|
40615
|
STEM Blog Website by @Probros535 | Stardance
|
Probros535
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: STEM Blog Website by @Probros535 | Stardanc Title: STEM Blog Website by @Probros535 | Stardance...
|
1793958731.9184759
|
1794563531.9184759
|
|
69986
|
My own site! by @shashanksingh30 | Stardance
|
shashanksingh30
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @shashanksingh30 | Stardanc Title: My own site! by @shashanksingh30 | Stardance...
|
1793958732.796119
|
1794822732.796119
|
|
34001
|
Finance Tracker by @hibernathan1212 | Stardance
|
hibernathan1212
|
0
|
10.33
|
0
|
[]
|
[{"post_id": 31165, "ts": "202 [{"post_id": 31165, "ts": "2026-07-19T10:36:17Z", "hours": 10.3325, "text": "Beancount Parsing, Lexing, and File Loading Been working on beancount processing for the app, tokenizing the raw beancount into a usable data structure for the app to access. Currently consists of three main parts: file loader, lexical analyzer, and directives parser. File loading was a surprising pain having to deal with apple’s security over reading arbitrary files. Is now able to load any directory with a ledger.beancount file and handle any includes. Lexer takes the raw text and breaks it down into beancount directives. The directives parser then takes the directives and checks double entries, account validity etc and also creates the data structures necessary to display data."}]...
|
Title: Finance Tracker by @hibernathan1212 | Stard Title: Finance Tracker by @hibernathan1212 | Stardance
Devlogs:
Beancount Parsing, Lexing, and File Loading Been working on beancount processing for the app, tokenizing the raw beancount into a usable data structure for the app to access. Currently consists of three main parts: file loader, lexical analyzer, and directives parser. File loading was a surprising pain having to deal with apple’s security over reading arbitrary files. Is now able to load any directory with a ledger.beancount file and handle any includes. Lexer takes the raw text and breaks it down into beancount directives. The directives parser then takes the directives and checks double entries, account validity etc and also creates the data structures necessary to display data....
|
1793958733.6500764
|
1794563533.6500764
|
|
2377
|
Space "land" by @Celine | Stardance
|
Celine
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T08:31:08Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a website where you can scan for aliens and chat with them too, it’s more of a game cause it’s completly bogus , i’m proud cause i used a lot of my creativity and i’ll be making something more real in my next project", "repo": "https://github.com/AlphaFifteen/Galaxy_Interact", "demo": "https://alphafifteen.github.io/my-website"}]...
|
[{"post_id": 9124, "ts": "2026 [{"post_id": 9124, "ts": "2026-06-15T08:27:23Z", "hours": 0.9522, "text": "I added a few responses in the intergalactic chat page When i clicked send on the Neptune planet message it wasn’t sending , i dicovered that it was because i hadn’t typed in the name correctly🤦♂️"}, {"post_id": 8697, "ts": "2026-06-14T13:28:41Z", "hours": 0.3778, "text": "Its a website made from html, css and javascript that has a “Alien radar scan “site, an “intergalactic chat site” and an Alien analyzer site where you decribe what you saw and it gives you the probability of it being an alien encounter"}]...
|
Title: Space "land" by @Celine | Stardance Title: Space "land" by @Celine | Stardance
Devlogs:
Its a website made from html, css and javascript that has a “Alien radar scan “site, an “intergalactic chat site” and an Alien analyzer site where you decribe what you saw and it gives you the probability of it being an alien encounter
I added a few responses in the intergalactic chat page When i clicked send on the Neptune planet message it wasn’t sending , i dicovered that it was because i hadn’t typed in the name correctly🤦♂️
Ships:
I made a website where you can scan for aliens and chat with them too, it’s more of a game cause it’s completly bogus , i’m proud cause i used a lot of my creativity and i’ll be making something more real in my next project...
|
1793958734.5704515
|
1794045134.5704515
|
|
5999
|
Tungsten by @DrewRat | Stardance
|
DrewRat
|
1
|
34.0
|
613
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T19:35:33Z", "hours": 34.0, "multiplier": 17.84, "payout": 613, "blessing": "neutral", "text": "Tungsten is a simple, self-hosted WYSIWYG Markdown editor. It serves as an open-source alternative to Obsidian. It’s got many features, including highlighted code blocks, KaTeX editing, and much more! To try the demo, open the website and click “Try the Demo”!", "repo": "https://github.com/MrDiamondDog/tungsten", "demo": "https://tungsten-demo.drewrat.dev"}]...
|
[{"post_id": 23038, "ts": "202 [{"post_id": 23038, "ts": "2026-07-05T19:28:28Z", "hours": 1.1903, "text": "Shipping time!!! VOTERS: OPEN THE WEBSITE AND CLICK “Try the Demo”!!!!! Did some quick bug fixes with the demo and we’re ready for launch! Specifically, making new files was completely broken for some reason, and I added the stardance logo to the README. Additionally, the readme is also fetched from github so I can update it on the fly if necessary. Error handling This was last on the list (for some reason), but all network errors are handled with a toast at the top of the screen, which makes it much clearer for everyone what went wrong."}, {"post_id": 22535, "ts": "2026-07-05T01:52:12Z", "hours": 2.1239, "text": "Themes, more bugs squashed! All the themes are based on the Catppuccin color palettes because they are wonderful, and allowed me to focus on other things instead of making a color palette. And it looks phenomenal! The theme switcher is painfully simple. React’s Context API is so underrated. It saves your theme in localstorage and loads it every time you open the page! File name restrictions This one was a little tricky to get correct. I had to go through a bunch of the old logic in the sidebar to ensure that no file names collided, and if they did, make sure that state doesn’t get pushed. Additionally, I had to make creating files look at the rest of the files in the folder and append a 1, 2, 3, etc. to “New File” so the names didn’t collide as soon as you created them. I was going to put these same restrictions on the server and realized that would take forever with little benefit, as if you break the client to send requests like that, then you’re going to break it. It doesn’t even break that badly, the files work perfectly fine, it’s really just links. After all, these are self-hosted instances, so if you forge some stupid requests I could not care less. Link handling Speaking of links, cross page links are functional again! I procrastinated this one too much but I just needed to make a new helper function, nodeFromPath . It takes an array of strings, being the path to a node, and give you the node (or undefined) that path leads to. I just love working with trees so much, recursive functions are my favorite"}, {"post_id": 21923, "ts": "2026-07-04T03:24:40Z", "hours": 4.4356, "text": "Self hosting, GitHub actions, SO MANY BUGS!!! Yay!!! Big updates!!! Almost ready to ship!!! (optimistically) Self hosting This is a big one. It also took me forever. But self hosting is fully functional through Docker! Not displayed is the 5 hours it took me to actually learn Docker… I have used it before but I haven’t actually learned what I was doing. Containers, images, volumes, compose, blah blag. But, it’s worth it because self-hosting is now just one or two commands away. A lot of the hours listed on this devlog is writing + refining the SELFHOST.md file! It’s a detailed document that describes Tungsten’s stack and how to host it on your hardware. Soon I hope to bring this to an actual website like the landing page for Tungsten. GitHub actions This is slightly less interesting, but gh actions are set up! It’ll test building the full project, then push a docker image, and do a quick codeql check. I copied most of this from Filatrack, I’ll be honest, but what can I say? It works great! Bugs I tried uploading an image while I was testing stuff and realized that Next.JS limits the body size of server actions quite a lot. Luckily there was an option to change it, and now you can change it to what you want! Also, the state of which files were unsaved got messed up somehow. When you clicked between an unsaved tab and a saved tab, the saved one would become unsaved! Quick fix but was pretty funny. What’s Next Well, my todo list is only getting fuller as the days go on. I pretty much add one or two things for every one I cross off. But all I’ve got left is to fix cross-page links (I broke them last devlog), file name restrictions (like a real filesystem), an options page, and proper error handling. After that (and whatever else I add), we’ll ship!"}, {"post_id": 20345, "ts": "2026-07-01T22:25:34Z", "hours": 3.1394, "text": "Landing page, demo mode (for you!) MANY bug fixes! The landing page is pretty simple. I’m not an artist by any means, so this will do. It’s mostly for you voters/reviewers to get an overview and try the demo! The demo is super simple. It’s a simple env flag that will change the landing page to what you see now. The demo button simply tries to log you in to the user “ [email protected] ” with password “demodemo”. This is the only user that will exist in the database, so it will just log in to that. All the server actions have their behavior changed in the demo to not make any changes to the database as well, so whatever you do isn’t saved. Bug fixes As you can see in the second image, I fixed many things that were bugging me. Namely, the URL bar. That’s how files would be selected, but it caused some really stupid state issues that caused a multitude of bugs and like 2 hours of headaches. That’s gone, and so is autosaving. Everything is now more performant as well!"}, {"post_id": 19680, "ts": "2026-07-01T02:15:07Z", "hours": 1.4117, "text": "Super not interesting update!! The editor now has a raw and read only view! The raw view lets you edit the raw markdown, and read only does exactly what you think it does. I ended up rewriting the logic for saving/loading in the editor, because it got extremely messy and was breaking down with all the features I’ve been adding. You won’t notice anything different, but it’s much more reliable!"}, {"post_id": 18627, "ts": "2026-06-29T20:28:21Z", "hours": 0.8939, "text": "Bug fixes, tables and a logo! We’re getting close to release. I’ve got a couple features I’d like to add and we’ll get going. Firstly, the logo! I made it myself of a reference image of actual tungsten, cause it’s a cool element. I based the style around the Obsidian logo, with distinct sections each with their own gradients to simulate lighting. My take on this uses all straight lines, as that’s part of the design of the UI. This is my first time really making SVG art, I think it looks pretty decent! Next, tables! and an upgraded menu bar! Surprisingly, tables were one of the easiest plugins to add. All my CSS work from like a week ago carried over here and it looks great. There might be some changes I do later on however. And a bunch of unrelated bug fixes that had to be done, as always."}, {"post_id": 18546, "ts": "2026-06-29T18:45:39Z", "hours": 2.6778, "text": "Cross file links! Links to different files work great! There’s a small dialog to edit the link and whatnot and it’ll take you to the specified page!! As much as I want to use wikilinks for this, that would require a custom plugin I don’t know how to make (I don’t even know if it’s really possible with MDXEditor). I’m gonna leave it at this for now, as the create link dialog works great for making them. I had to make some pretty major changes to how selecting files works, however. If you look at the URL bar, it now shows the selected file in it. That is now what determines the selected file, which I’ve been meaning to do for a while and makes links infinitely easier."}, {"post_id": 17984, "ts": "2026-06-28T22:56:11Z", "hours": 2.2972, "text": "Big updates today!!! Math and images!! Math was probably the hardest thing to add due to the lack of extensibility of the MDXEditor component I’m using. The plugin system is overly complex and makes zero sense since there is hardly any documentation on how to actually use it. Luckily, there is a jsxPlugin that lets the user make custom jsx components of your choosing. The other hard part was finding a suitable editor for the job. After much googling, I found MathLive, which is a currently unmaintained editor that does exactly what I need it to. Internally it uses KaTeX, which is what I was looking for. Now the problem arises: combining these libraries. This wasn’t easy; it took a lot of trial and error, as the documentation is limited. But the final result is incredibly worth it. A couple bugs still exist; notably, pressing the left or right arrow into the math editor does not focus your cursor in it; and similarly for moving out of it. I have no clue how to fix these, MDXEditor is not helpful in the slightest. A minor bug I can fix however is the autosaver not saving if only the MathEditor has changed. Images This one was so much easier! There’s a built in plugin for it. It even handles image resizing! I just have to handle uploading images to the server. I decided to make a table in the database that simply stores filenames and their associated users, just so you can’t access other user’s images. When you upload a file, it gives the editor a link to api/image/random-uuid.png . The api route checks the user id against the database and gives you the image in response. Possibly the dumbest thing ever is the fact that the image plugin limits the minimum size of the image at 100x100px. I don’t like this however cause I want to be able to put emojis in my markdown files, with possible support for later uploading custom emojis and using them in the editor. There is no customizing this value, it is hardcoded in the library. Luckily, pnpm natively supports patching node modules, and that’s exactly what I did. The minimum size is now 10x10!"}, {"post_id": 15955, "ts": "2026-06-25T22:24:57Z", "hours": 2.1378, "text": "Creating, renaming, and deleting files/folders! This one took a hot minute but it works really great! It’s so much better than using a modal to do everything! I didn’t actually know this but the tree component has support for creating files like this out of the box, it’s just not listed in any documentation so it took me a bit to find. It actually starts by creating a file named “New File”, then just immediately renaming it, which is a much cleaner solution than what I was planning Renaming is painfully simple, as it handles a bunch of the work too but it’s actually a completely different component it changes to when you start renaming, which ended up being so much easier to work with. I ran into one of the stupidest bugs ever while implementing renaming. The best way to describe it is “When renaming a file, if it is the open tab, whenever it autosaves it will reset the rename input cause it rerenders.” But basically, the autosaver would save the selected file, causing everything that uses useEditor to rerender, including the sidebar, which makes it re-render the input component for renaming, which resets the text to it’s initialName . It wasn’t hard to fix, I just made the autosaver not save if the content hasn’t changed, which I’ve been meaning to do anyway. For now, that is most of the hard features done the last hurdle that I’m not excited to implement is links between pages. I have no clue how that will work, especially with the component I’m using. But that’s next!"}, {"post_id": 14021, "ts": "2026-06-23T00:20:01Z", "hours": 2.2783, "text": "Code blocks!!! Now without major lag!! A very annoying bug with a solution I can’t believe I missed. Basically, to get large code blocks to work, MDXEditor gives you a codeMirrorPlugin . This plugin lets you pass a list of languages to have in the selector and to have syntax highlighting support for (codemirror provides a very large data set of them, luckily). The problem was, this list was very large and caused lag when typing. I ended up asking the discussions page and (after an unhelpful AI response), we figured out my onChange handler setting a content state that the markdown editor used was causing the whole thing to re-render every time you typed, and with the large language array, causing a lot of lag. You’ll notice in the video the language selector in the toolbar. So it was a very, very simple fix. I even went through and implemented auto-saving instead (every 5 seconds). It even stops you from leaving if it hasn’t saved yet! I also fixed a whole slew of scrolling issues with long markdown files. It was the stupidest thing ever and I’m not proud of the fix, but it works now."}, {"post_id": 12956, "ts": "2026-06-21T06:31:52Z", "hours": 1.0881, "text": "Little more work before the end of the day! (well, it’s past midnight so I guess not) Large code blocks work and are horribly laggy, will be fixing very soon. They are a pain to style properly since MDXEditor is heavily opinionated and makes everything hard to style. You can now drag and drop tabs! I only had to install a second library for DnD to make it work! (Drag and drop is the worst thing. Ever.) I love making my bundle size 10% larger with bloated libraries"}, {"post_id": 12901, "ts": "2026-06-21T04:02:48Z", "hours": 3.9036, "text": "The sidebar is fully functional!! You can drag and drop all your files and folders around, nest them as much as you want, and it will retain all of this information in the database. It only took a database rework and many hours of my life Let’s talk about it… So. The database was originally structured with file and folder tables. Both of them had parentId fields and folders had children . Unfortunately this complicated the code more when I tried implementing this as I had to get all the files and folders and combine them into one array. I looked up the proper way to do this because I clearly was not doing it correctly, and switched to just one table, nodes. This simplified just about everything, and this made me split off the file contents as another table as well. I was meaning to do that anyway just to save on memory, as otherwise all the content of every file would be in memory all the time. Now this node table has all the same fields as before. How do I render this tree? I looked around for good libraries (there’s almost none), and found react-arborist . Looked great, had alright documentation. I started implementing it, and realized I needed to implement the control functions for moving the elements. That’s easy, I said. It wasn’t After like an hour it still was just not working. It was really close but was being weird. I looked up the proper way to do it with this library and apparently there’s a class that has a move function that does all the work for you. And yep. It works. For some reason it turned folders back into files but ended up being an easy fix. So that was a mess but here we are. It works flawlessly. Now I’ve got to implement context menus in this mess, including creating files in folders, etc."}, {"post_id": 12670, "ts": "2026-06-20T18:14:56Z", "hours": 1.2053, "text": "You can now save files! The dot indicator works similarly to basically every IDE ever and has surprisingly complicated logic with the close button as well. The Markdown editor I’m using is kinda a pain, but a lot better than making one from scratch. I had to implement the key listener on the div container for it. Soon I’ll implement the key listener on the whole page with a special handler that components can listen to. The only reason I even implemented the save system is to make it easier on the database. Without saving, it would write to the database every key press. I like this style better anyway, I think it’s pretty cool that it feels like an IDE!"}, {"post_id": 10195, "ts": "2026-06-16T20:09:06Z", "hours": 2.8036, "text": "Made the sidebar, tabs, and creating files work! You can open tabs for each file you’re working on and see the content of them in the editor. I actually went to the react documentation to learn some best practices… as I wanted to avoid passing a million props down through the component tree and passing a bunch of callbacks back up. This is called “prop drilling” and it’s the worst thing ever. I learned how to use React’s context system to “teleport” the props I need to the part of the tree that needs them. As you can see, it works flawlessly! Most of the components you see don’t even have props, which makes it so much easier to work with."}, {"post_id": 9069, "ts": "2026-06-15T04:30:34Z", "hours": 2.8292, "text": "Log in page and basic editor UI! I used Auth.JS for the credentials login. I actually hate that framework and could do it myself but I’m lazy. It probably took longer to set it up than to figure out how JWTs work. The editor is a WYSIWYG markdown editor called MDXEditor. It’s a struggle to work with cause they use their own stupid styling with no real way to style it other than overriding CSS that I can tell. Next up is getting pages working in the database!"}]...
|
Title: Tungsten by @DrewRat | Stardance
Devlogs:
Title: Tungsten by @DrewRat | Stardance
Devlogs:
Log in page and basic editor UI! I used Auth.JS for the credentials login. I actually hate that framework and could do it myself but I’m lazy. It probably took longer to set it up than to figure out how JWTs work. The editor is a WYSIWYG markdown editor called MDXEditor. It’s a struggle to work with cause they use their own stupid styling with no real way to style it other than overriding CSS that I can tell. Next up is getting pages working in the database!
Made the sidebar, tabs, and creating files work! You can open tabs for each file you’re working on and see the content of them in the editor. I actually went to the react documentation to learn some best practices… as I wanted to avoid passing a million props down through the component tree and passing a bunch of callbacks back up. This is called “prop drilling” and it’s the worst thing ever. I learned how to use React’s context system to “teleport” the props I need to the part of the tree that needs them. As you can see, it works flawlessly! Most of the components you see don’t even have props, which makes it so much easier to work with.
You can now save files! The dot indicator works similarly to basically every IDE ever and has surprisingly complicated logic with the close button as well. The Markdown editor I’m using is kinda a pain, but a lot better than making one from scratch. I had to implement the key listener on the div container for it. Soon I’ll implement the key listener on the whole page with a special handler that components can listen to. The only reason I even implemented the save system is to make it easier on the database. Without saving, it would write to the database every key press. I like this style better anyway, I think it’s pretty cool that it feels like an IDE!
The sidebar is fully functional!! You can drag and drop all your files and folders around, nest them as much as you want, and it will retain all of this information in the database. It only took a database rework and many hours of my life Let’s talk about it… So. The database was originally structured with file and folder tables. Both of them had parentId fields and folders had children . Unfortunately this complicated the code more when I tried implementing this as I had to get all the files and folders and combine them into one array. I looked up the proper way to do this because I clearly was not doing it correctly, and switched to just one table, nodes. This simplified just about everything, and this made me split off the file contents as another table as well. I was meaning to do that anyway just to save on memory, as otherwise all the content of every file would be in memory all the time. Now this node table has all the same fields as before. How do I render this tree? I looked around for good libraries (there’s almost none), and found react-arborist . Looked great, had alright documentation. I started implementing it, and realized I needed to implement the control functions for moving the elements. That’s easy, I said. It wasn’t After like an hour it still was just not working. It was really close but was being weird. I looked up the proper way to do it with this library and apparently there’s a class that has a move function that does all the work for you. And yep. It works. For some reason it turned folders back into files but ended up being an easy fix. So that was a mess but here we are. It works flawlessly. Now I’ve got to implement context menus in this mess, including creating files in folders, etc.
Little more work before the end of the day! (well, it’s past midnight so I guess not) Large code blocks work and are horribly laggy, will be fixing very soon. They are a pain to style properly since MDXEditor is heavily opinionated and makes everything hard to style. You can now drag and drop tabs! I only had to install a second library for DnD to make it work! (Drag and drop is the worst thing. Ever.) I love making my bundle size 10% larger with bloated libraries
Code blocks!!! Now without major lag!! A very annoying bug with a solution I can’t believe I missed. Basically, to get large code blocks to work, MDXEditor gives you a codeMirrorPlugin . This plugin lets you pass a list of languages to have in the selector and to have syntax highlighting support for (codemirror provides a very large data set of them, luckily). The problem was, this list was very large and caused lag when typing. I ended up asking the discussions page and (after an unhelpful AI response), we figured out my onChange handler setting a content state that the markdown editor used was causing the whole thing to re-render every time you typed, and with the large language array, causing a lot of lag. You’ll notice in the video the language selector in the toolbar. So it was a very, very simple fix. I even went through and implemented auto-saving instead (every 5 seconds). It even stops you from leaving if it hasn’t saved yet! I also fixed a whole slew of scrolling issues with long markdown files. It was the stupidest thing ever and I’m not proud of the fix, but it works now.
Creating, renaming, and deleting files/folders! This one took a hot minute but it works really great! It’s so much better than using a modal to do everything! I didn’t actually know this but the tree component has support for creating files like this out of the box, it’s just not listed in any documentation so it took me a bit to find. It actually starts by creating a file named “New File”, then just immediately renaming it, which is a much cleaner solution than what I was planning Renaming is painfully simple, as it handles a bunch of the work too but it’s actually a completely different component it changes to when you start renaming, which ended up being so much easier to work with. I ran into one of the stupidest bugs ever while implementing renaming. The best way to describe it is “When renaming a file, if it is the open tab, whenever it autosaves it will reset the rename input cause it rerenders.” But basically, the autosaver would save the selected file, causing everything that uses useEditor to rerender, including the sidebar, which makes it re-render the input component for renaming, which resets the text to it’s initialName . It wasn’t hard to fix, I just made the autosaver not save if the content hasn’t changed, which I’ve been meaning to do anyway. For now, that is most of the hard features done the last hurdle that I’m not excited to implement is links between pages. I have no clue how that will work, especially with the component I’m using. But that’s next!
Big updates today!!! Math and images!! Math was probably the hardest thing to add due to the lack of extensibility of the MDXEditor component I’m using. The plugin system is overly complex and makes zero sense since there is hardly any documentation on how to actually use it. Luckily, there is a jsxPlugin that lets the user make custom jsx components of your choosing. The other hard part was finding a suitable editor for the job. After much googling, I found MathLive, which is a currently unmaintained editor that does exactly what I need it to. Internally it uses KaTeX, which is what I was looking for. Now the problem arises: combining these libraries. This wasn’t easy; it took a lot of trial and error, as the documentation is limited. But the final result is incredibly worth it. A couple bugs still exist; notably, pressing the left or right arrow into the math editor does not focus your cursor in it; and similarly for moving out of it. I have no clue how to fix these, MDXEditor is not helpful in the slightest. A minor bug I can fix however is the autosaver not saving if only the MathEditor has changed. Images This one was so much easier! There’s a built in plugin for it. It even handles image resizing! I just have to handle uploading images to the server. I decided to make a table in the database that simply stores filenames and their associated users, just so you can’t access other user’s images. When you upload a file, it gives the editor a link to api/image/random-uuid.png . The api route checks the user id against the database and gives you the image in response. Possibly the dumbest thing ever is the fact that the image plugin limits the minimum size of the image at 100x100px. I don’t like this however cause I want to be able to put emojis in my markdown files, with possible support for later uploading custom emojis and using them in the editor. There is no customizing this value, it is hardcoded in the library. Luckily, pnpm natively supports patching node modules, and that’s exactly what I did. The minimum size is now 10x10!
Cross file links! Links to different files work great! There’s a small dialog to edit the link and whatnot and it’ll take you to the specified page!! As much as I want to use wikilinks for this, that would require a custom plugin I don’t know how to make (I don’t even know if it’s really possible with MDXEditor). I’m gonna leave it at this for now, as the create link dialog works great for making them. I had to make some pretty major changes to how selecting files works, however. If you look at the URL bar, it now shows the selected file in it. That is now what determines the selected file, which I’ve been meaning to do for a while and makes links infinitely easier.
Bug fixes, tables and a logo! We’re getting close to release. I’ve got a couple features I’d like to add and we’ll get going. Firstly, the logo! I made it myself of a reference image of actual tungsten, cause it’s a cool element. I based the style around the Obsidian logo, with distinct sections each with their own gradients to simulate lighting. My take on this uses all straight lines, as that’s part of the design of the UI. This is my first time really making SVG art, I think it looks pretty decent! Next, tables! and an upgraded menu bar! Surprisingly, tables were one of the easiest plugins to add. All my CSS work from like a week ago carried over here and it looks great. There might be some changes I do later on however. And a bunch of unrelated bug fixes that had to be done, as always.
Super not interesting update!! The editor now has a raw and read only view! The raw view lets you edit the raw markdown, and read only does exactly what you think it does. I ended up rewriting the logic for saving/loading in the editor, because it got extremely messy and was breaking down with all the features I’ve been adding. You won’t notice anything different, but it’s much more reliable!
Landing page, demo mode (for you!) MANY bug fixes! The landing page is pretty simple. I’m not an artist by any means, so this will do. It’s mostly for you voters/reviewers to get an overview and try the demo! The demo is super simple. It’s a simple env flag that will change the landing page to what you see now. The demo button simply tries to log you in to the user “ [email protected] ” with password “demodemo”. This is the only user that will exist in the database, so it will just log in to that. All the server actions have their behavior changed in the demo to not make any changes to the database as well, so whatever you do isn’t saved. Bug fixes As you can see in the second image, I fixed many things that were bugging me. Namely, the URL bar. That’s how files would be selected, but it caused some really stupid state issues that caused a multitude of bugs and like 2 hours of headaches. That’s gone, and so is autosaving. Everything is now more performant as well!
Self hosting, GitHub actions, SO MANY BUGS!!! Yay!!! Big updates!!! Almost ready to ship!!! (optimistically) Self hosting This is a big one. It also took me forever. But self hosting is fully functional through Docker! Not displayed is the 5 hours it took me to actually learn Docker… I have used it before but I haven’t actually learned what I was doing. Containers, images, volumes, compose, blah blag. But, it’s worth it because self-hosting is now just one or two commands away. A lot of the hours listed on this devlog is writing + refining the SELFHOST.md file! It’s a detailed document that describes Tungsten’s stack and how to host it on your hardware. Soon I hope to bring this to an actual website like the landing page for Tungsten. GitHub actions This is slightly less interesting, but gh actions are set up! It’ll test building the full project, then push a docker image, and do a quick codeql check. I copied most of this from Filatrack, I’ll be honest, but what can I say? It works great! Bugs I tried uploading an image while I was testing stuff and realized that Next.JS limits the body size of server actions quite a lot. Luckily there was an option to change it, and now you can change it to what you want! Also, the state of which files were unsaved got messed up somehow. When you clicked between an unsaved tab and a saved tab, the saved one would become unsaved! Quick fix but was pretty funny. What’s Next Well, my todo list is only getting fuller as the days go on. I pretty much add one or two things for every one I cross off. But all I’ve got left is to fix cross-page links (I broke them last devlog), file name restrictions (like a real filesystem), an options page, and proper error handling. After that (and whatever else I add), we’ll ship!
Themes, more bugs squashed! All the themes are based on the Catppuccin color palettes because they are wonderful, and allowed me to focus on other things instead of making a color palette. And it looks phenomenal! The theme switcher is painfully simple. React’s Context API is so underrated. It saves your theme in localstorage and loads it every time you open the page! File name restrictions This one was a little tricky to get correct. I had to go through a bunch of the old logic in the sidebar to ensure that no file names collided, and if they did, make sure that state doesn’t get pushed. Additionally, I had to make creating files look at the rest of the files in the folder and append a 1, 2, 3, etc. to “New File” so the names didn’t collide as soon as you created them. I was going to put these same restrictions on the server and realized that would take forever with little benefit, as if you break the client to send requests like that, then you’re going to break it. It doesn’t even break that badly, the files work perfectly fine, it’s really just links. After all, these are self-hosted instances, so if you forge some stupid requests I could not care less. Link handling Speaking of links, cross page links are functional again! I procrastinated this one too much but I just needed to make a new helper function, nodeFromPath . It takes an array of strings, being the path to a node, and give you the node (or undefined) that path leads to. I just love working with trees so much, recursive functions are my favorite
Shipping time!!! VOTERS: OPEN THE WEBSITE AND CLICK “Try the Demo”!!!!! Did some quick bug fixes with the demo and we’re ready for launch! Specifically, making new files was completely broken for some reason, and I added the stardance logo to the README. Additionally, the readme is also fetched from github so I can update it on the fly if necessary. Error handling This was last on the list (for some reason), but all network errors are handled with a toast at the top of the screen, which makes it much clearer for everyone what went wrong.
Ships:
Tungsten is a simple, self-hosted WYSIWYG Markdown editor. It serves as an open-source alternative to Obsidian. It’s got many features, including highlighted code blocks, KaTeX editing, and much more! To try the demo, open the website and click “Try the Demo”!...
|
1793958735.6655593
|
1794045135.6655593
|
|
69990
|
Black Glass by @Eclipse | Stardance
|
Eclipse
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Black Glass by @Eclipse | Stardance
|
1793958736.8721879
|
1794822736.8721879
|
|
42190
|
My own site! by @Audra | Stardance
|
Audra
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-30T02:57:15Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I coded my first personal website! I used a bit of Ai as a learning tool to ask questions about what certain html and css tags mean for more explanation. At the start I found the description for how to use html files and tags to be a little difficult to understand for someone who has never even seen codes before. I worked around this issue by watching videos of other people using these tags and that made me understand how they work. I am overall very proud of this project in general and how I was able to essentially teach myself how to do something that I thought was just “behind the scenes.” I hope this project was able to better prepare me for future opportunities and that this site gives me the resources I need to learn even more!", "repo": "https://github.com/Audra-29/My-Site", "demo": "https://audra-29.github.io/My-Site/"}]...
|
[{"post_id": 57788, "ts": "202 [{"post_id": 57788, "ts": "2026-08-30T02:37:13Z", "hours": 0.8539, "text": "I finished my first project! Pretty simple site but the first one’s never the best. Completed my CSS work and published through GitHub today!"}, {"post_id": 44884, "ts": "2026-08-10T22:34:07Z", "hours": 1.9533, "text": "HI!! I organized the CSS files better (the right way finally) and did more work with html! I also figured out how to link the button! Still pretty rough for a start but I’m happy with it so far! Next step…we’ll see?!?"}, {"post_id": 39590, "ts": "2026-08-02T17:50:50Z", "hours": 1.1242, "text": "I’m Currently Trying to Teach Myself How to Code and This Is What I’ve Learned How to Do So Far! This is All Done with No Prior Experience and I Learn as I Go!"}]...
|
Title: My own site! by @Audra | Stardance
Devlogs Title: My own site! by @Audra | Stardance
Devlogs:
I’m Currently Trying to Teach Myself How to Code and This Is What I’ve Learned How to Do So Far! This is All Done with No Prior Experience and I Learn as I Go!
HI!! I organized the CSS files better (the right way finally) and did more work with html! I also figured out how to link the button! Still pretty rough for a start but I’m happy with it so far! Next step…we’ll see?!?
I finished my first project! Pretty simple site but the first one’s never the best. Completed my CSS work and published through GitHub today!
Ships:
I coded my first personal website! I used a bit of Ai as a learning tool to ask questions about what certain html and css tags mean for more explanation. At the start I found the description for how to use html files and tags to be a little difficult to understand for someone who has never even seen codes before. I worked around this issue by watching videos of other people using these tags and that made me understand how they work. I am overall very proud of this project in general and how I was able to essentially teach myself how to do something that I thought was just “behind the scenes.” I hope this project was able to better prepare me for future opportunities and that this site gives me the resources I need to learn even more!...
|
1793958737.7305632
|
1794045137.7305632
|
|
17853
|
My first slack bot! by @nachool | Stardance
|
nachool
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @nachool | Stardance
|
1793958738.944201
|
1794563538.944201
|
|
15119
|
Boeing 747 by @B754a | Stardance
|
B754a
|
1
|
16.0
|
217
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T00:10:11Z", "hours": 16.0, "multiplier": 13.82, "payout": 217, "blessing": "neutral", "text": "I have all the details, such as the landing gear; I also added wings and a back wing. I have cockpit windows and a nose in the front; I used no AI for this, and I have an exhaust hole in the back. This was very fun to make. Thanks for the support; this took about 17 hours. Coloring took about 1 hour. This was very fun!!", "repo": "https://github.com/B754a-Dev/Bowing-747", "demo": "https://cad.onshape.com/documents/8e36e5f046f0c73ee4755423/w/2eaa860d9c9adc9b232df59a/e/63c098fe42c01bdb255519f8"}]...
|
[{"post_id": 19618, "ts": "202 [{"post_id": 19618, "ts": "2026-06-30T23:55:17Z", "hours": 0.3697, "text": "I’m done!, I finished coloring the plane I have all the wings and cockpit windows this was very fun thank you for the support I hope you like this one, one of the first onshape projects I’ve done!! I will make more projects so stay tuned."}, {"post_id": 16441, "ts": "2026-06-26T19:13:22Z", "hours": 4.1364, "text": "This is one of my last devlogs I will do on this project but basically I made landing gear front and back. This one was really had to do because of the detail in hole wheel , but this was very fun to make I hope you guys like this one =)"}, {"post_id": 14377, "ts": "2026-06-23T14:22:01Z", "hours": 2.1894, "text": "I’m almost done, this part was really fun add more realism and a better cockpit windows, I added things on the top like APU Exhaust, TCAS, ATC, GPS, VHF L, SATCOM, another SATCOM, VHFC. On the bottom I added the ATC, TCAS, RA, DMEL, Marker Beacon, DME R, VHF R, and L R I will be adding landing gear and maybe more details."}, {"post_id": 12657, "ts": "2026-06-20T17:59:56Z", "hours": 2.1128, "text": "This part was very fun to make, I had some challenges such as the flap track fairings not in the correct spot. I also learned how to use the mirror tool and that help with getting good consistency. What I have so far -All the flap track fairings -All the nacelles -All the Pylons -All the Flaps -All the Ailerons -The Tail cone -The Rubber -The Vertical stabilizer -The Horizontal stabilizer -The Elevator -The Tail fin Also made the Wingspan bigger, made most of it evenly spaced, Added more details to the engines. I colored under the Plaine Blue and made the rest white and grey except for the Tail fin witch I changed the color to red and the tail cone red I also added Navigation lights on the wing tips. I will be adding a set of landing gear two in the back on in the front. I will be adding windows and two doors and a wheel well I will make a Cockpit windows, and Upper deck hump. This will be one of my hardest iterations but worth it"}, {"post_id": 11932, "ts": "2026-06-19T13:53:41Z", "hours": 1.6406, "text": "Added -Elevator✅ -Trim Tab✅ -Horizontal stabilizer✅ -Rubber✅ -Vertical stabilizer✅ -Tail cone✅ -Ailerons✅ -Spoilers✅ -Flaps✅ -Engine✅ -Nacelle✅ -Pylon✅ -Longer wings✅ -Nose Need to add -Nose gear (Maybe) -Main landing gear (Maybe) -Bogies (Maybe) -Nose landing gear (Maybe) make it more realistic in general Spent about 1 hour to implement the Horizontal stabilizer, Rubber, Vertical stabilizer, Tail cone still need to do stuff under both wings, color it better make engines more realistic maybe."}, {"post_id": 11288, "ts": "2026-06-18T13:54:42Z", "hours": 1.3853, "text": "Added -Engine -Nacelle -Pylon -Vertical stabilizer -Horizontal stabilizers made them hollow inside Add -Longer wings -Fix the front -Rudder -Elevators -tail cone This project still needs work with details but I’m getting closer and having fun"}, {"post_id": 10944, "ts": "2026-06-17T23:07:59Z", "hours": 3.8542, "text": "This is my Boeing 747, I have spent almost 4 hours on this first CAD project, I will start to add details now if you want you can tell me to add something or change something on the plane."}]...
|
Title: Boeing 747 by @B754a | Stardance
Devlogs:
Title: Boeing 747 by @B754a | Stardance
Devlogs:
This is my Boeing 747, I have spent almost 4 hours on this first CAD project, I will start to add details now if you want you can tell me to add something or change something on the plane.
Added -Engine -Nacelle -Pylon -Vertical stabilizer -Horizontal stabilizers made them hollow inside Add -Longer wings -Fix the front -Rudder -Elevators -tail cone This project still needs work with details but I’m getting closer and having fun
Added -Elevator✅ -Trim Tab✅ -Horizontal stabilizer✅ -Rubber✅ -Vertical stabilizer✅ -Tail cone✅ -Ailerons✅ -Spoilers✅ -Flaps✅ -Engine✅ -Nacelle✅ -Pylon✅ -Longer wings✅ -Nose Need to add -Nose gear (Maybe) -Main landing gear (Maybe) -Bogies (Maybe) -Nose landing gear (Maybe) make it more realistic in general Spent about 1 hour to implement the Horizontal stabilizer, Rubber, Vertical stabilizer, Tail cone still need to do stuff under both wings, color it better make engines more realistic maybe.
This part was very fun to make, I had some challenges such as the flap track fairings not in the correct spot. I also learned how to use the mirror tool and that help with getting good consistency. What I have so far -All the flap track fairings -All the nacelles -All the Pylons -All the Flaps -All the Ailerons -The Tail cone -The Rubber -The Vertical stabilizer -The Horizontal stabilizer -The Elevator -The Tail fin Also made the Wingspan bigger, made most of it evenly spaced, Added more details to the engines. I colored under the Plaine Blue and made the rest white and grey except for the Tail fin witch I changed the color to red and the tail cone red I also added Navigation lights on the wing tips. I will be adding a set of landing gear two in the back on in the front. I will be adding windows and two doors and a wheel well I will make a Cockpit windows, and Upper deck hump. This will be one of my hardest iterations but worth it
I’m almost done, this part was really fun add more realism and a better cockpit windows, I added things on the top like APU Exhaust, TCAS, ATC, GPS, VHF L, SATCOM, another SATCOM, VHFC. On the bottom I added the ATC, TCAS, RA, DMEL, Marker Beacon, DME R, VHF R, and L R I will be adding landing gear and maybe more details.
This is one of my last devlogs I will do on this project but basically I made landing gear front and back. This one was really had to do because of the detail in hole wheel , but this was very fun to make I hope you guys like this one =)
I’m done!, I finished coloring the plane I have all the wings and cockpit windows this was very fun thank you for the support I hope you like this one, one of the first onshape projects I’ve done!! I will make more projects so stay tuned.
Ships:
I have all the details, such as the landing gear; I also added wings and a back wing. I have cockpit windows and a nose in the front; I used no AI for this, and I have an exhaust hole in the back. This was very fun to make. Thanks for the support; this took about 17 hours. Coloring took about 1 hour. This was very fun!!...
|
1793958741.4699776
|
1794045141.4699776
|
|
14747
|
GoatOS by @sal2x | Stardance
|
sal2x
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T18:51:23Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made GoatOS, a goat themed web operating system. Since I’m just learning coding for the first time, the project took a while but I’m really proud of how it turned out! GoatOS features goat photos and a lot of educational information about goats.", "repo": "https://github.com/sclaireloucks-arch/veryfirstwebsite", "demo": "https://sclaireloucks-arch.github.io/veryfirstwebsite/"}]...
|
[{"post_id": 14561, "ts": "202 [{"post_id": 14561, "ts": "2026-06-23T18:44:48Z", "hours": 0.0, "text": "4th devlog- I finished the README for GoatOS, and completed my GoatGallery app. It took me a little while to sync all my changes, but now GoatOS is complete! You can now access it in the demo url, and I’ll be shipping this project."}, {"post_id": 14203, "ts": "2026-06-23T06:17:13Z", "hours": 0.0, "text": "3rd devlog- I made an app! GoatFacts-It’s a text-based app where you can see facts about goats by clicking on categories. I think I was coding faster than I was before, because it didn’t take super long. It was a lot of trial and error for me though, and I had to change the style of it about 4 times to try to get something I liked. I think I am satisfied with the results now! GoatGallery- also began working on a second app that shows pictures of goats, along with some information about the breed. It has been going smoothly, as I mostly just had to remember what I did for the other app, and then adjust. All that’s left mostly to do is to finish GoatGallery and tweak a few things, and then it’s basically finished! Hopefully last devlog 🤞 and then I’ll be shipping GoatOS!"}, {"post_id": 11069, "ts": "2026-06-18T03:19:03Z", "hours": 0.0, "text": "2nd devlog- Today I changed the welcome page to fit more to the vibe of the website, created it to be draggable, as well as open and close. I made the top bar it’s own color and used js to track the time, updating it. Some challenges I found while doing this was that it was hard 💀 I’ve never coded, except a little bit of Python so all of this was a learning experience for me, but it began to get faster as I learned. A lot of the hours were changing things to look different, or fixing errors. Hopefully the next devlog I’ll have worked faster and have learned more as well. The next thing to do is to create apps to make it look more like an official OS, and I hope to be able to ship it soon after that!"}, {"post_id": 10263, "ts": "2026-06-16T22:06:06Z", "hours": 0.0, "text": "Yesterday I began working on GoatOS. So far, I have created a welcome page with a desktop background, and a top bar that shows the date and time. In the welcome page I stated the purpose of the site, to serve as your go-to Goat operating system. Some challenges I found while doing these were that centering the welcome page was difficult, but after a few minutes of researching I was able to figure it out. It was also a struggle to figure out how to make it look more like an OS rather than a plain website. The next steps I plan to take are that I’ll create multiple different windows that will be draggable, have a random-goat picture generator, and create goat themed apps."}]...
|
Title: GoatOS by @sal2x | Stardance
Devlogs:
Yest Title: GoatOS by @sal2x | Stardance
Devlogs:
Yesterday I began working on GoatOS. So far, I have created a welcome page with a desktop background, and a top bar that shows the date and time. In the welcome page I stated the purpose of the site, to serve as your go-to Goat operating system. Some challenges I found while doing these were that centering the welcome page was difficult, but after a few minutes of researching I was able to figure it out. It was also a struggle to figure out how to make it look more like an OS rather than a plain website. The next steps I plan to take are that I’ll create multiple different windows that will be draggable, have a random-goat picture generator, and create goat themed apps.
2nd devlog- Today I changed the welcome page to fit more to the vibe of the website, created it to be draggable, as well as open and close. I made the top bar it’s own color and used js to track the time, updating it. Some challenges I found while doing this was that it was hard 💀 I’ve never coded, except a little bit of Python so all of this was a learning experience for me, but it began to get faster as I learned. A lot of the hours were changing things to look different, or fixing errors. Hopefully the next devlog I’ll have worked faster and have learned more as well. The next thing to do is to create apps to make it look more like an official OS, and I hope to be able to ship it soon after that!
3rd devlog- I made an app! GoatFacts-It’s a text-based app where you can see facts about goats by clicking on categories. I think I was coding faster than I was before, because it didn’t take super long. It was a lot of trial and error for me though, and I had to change the style of it about 4 times to try to get something I liked. I think I am satisfied with the results now! GoatGallery- also began working on a second app that shows pictures of goats, along with some information about the breed. It has been going smoothly, as I mostly just had to remember what I did for the other app, and then adjust. All that’s left mostly to do is to finish GoatGallery and tweak a few things, and then it’s basically finished! Hopefully last devlog 🤞 and then I’ll be shipping GoatOS!
4th devlog- I finished the README for GoatOS, and completed my GoatGallery app. It took me a little while to sync all my changes, but now GoatOS is complete! You can now access it in the demo url, and I’ll be shipping this project.
Ships:
I made GoatOS, a goat themed web operating system. Since I’m just learning coding for the first time, the project took a while but I’m really proud of how it turned out! GoatOS features goat photos and a lot of educational information about goats....
|
1793958742.7007215
|
1794045142.7007215
|
|
516
|
Nephthys by @Mish | Stardance
|
Mish
|
0
|
22.53
|
0
|
[]
|
[{"post_id": 77687, "ts": "202 [{"post_id": 77687, "ts": "2026-10-07T21:40:41Z", "hours": 21.1439, "text": "a lot of stuff has been done! notably: We now have API keys that let you access message content on the API! (see below) Give credit to the last responder (not the resolver) on recently-active threads Enforce type checks with Pyright Category tags v2: Now editable and assigned using a desicion model (Jev)!"}, {"post_id": 939, "ts": "2026-06-02T18:16:49Z", "hours": 0.5314, "text": "I had the idea of dynamically updating the topic in the team channel to include the number of open tickets! And then I scrapped that idea because I realised it would spam the channel with these messages…"}, {"post_id": 234, "ts": "2026-06-01T11:10:53Z", "hours": 0.8533, "text": "Added a new transcript to make Nephthys work for Stardance!"}]...
|
Title: Nephthys by @Mish | Stardance
Devlogs:
Add Title: Nephthys by @Mish | Stardance
Devlogs:
Added a new transcript to make Nephthys work for Stardance!
I had the idea of dynamically updating the topic in the team channel to include the number of open tickets! And then I scrapped that idea because I realised it would spam the channel with these messages…
a lot of stuff has been done! notably: We now have API keys that let you access message content on the API! (see below) Give credit to the last responder (not the resolver) on recently-active threads Enforce type checks with Pyright Category tags v2: Now editable and assigned using a desicion model (Jev)!...
|
1793958743.9099925
|
1794563543.9099925
|
|
17937
|
My awesome macropad! by @Tooba | Stardance
|
Tooba
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Tooba | Stardance
|
1793958744.8361022
|
1794563544.8361022
|
|
26108
|
My first slack bot! by @RayanF | Stardance
|
RayanF
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @RayanF | Stardance
|
1793958745.7273571
|
1794563545.7273571
|
|
24562
|
IDE by @JoonHyuk | Stardance
|
JoonHyuk
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-17T02:42:05Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a lightweight code editor from scratch in Python/PyQt6, with a real extension system: extensions are just Python files that expose an activate(api) function, and the API lets them register commands, add toolbar buttons, hook into file-open events, and print to the built-in terminal. I also built a Marketplace panel that reads a JSON catalog and installs extensions into the app with one click. The hardest part was debugging an environment issue that had nothing to do with my code — Windows Smart App Control was silently blocking PyQt6’s native Qt DLLs from loading because they aren’t signed with a certificate Microsoft’s reputation service recognizes. Traced it through the Korean-language error message down to the exact Windows security policy before I could even get the app running again. I’m proud of the extension API design — it’s small (four methods) but already enough to let a sample extension add its own button and command without touching core app code. To test it: clone the repo, pip install PyQt6, run python main.py. Click “Extensions” to open the Marketplace and install the sample extension, then use the toolbar button it adds. You can also open/edit files from the sidebar and run code directly with the ▶ button.", "repo": "https://github.com/coder1529/IDE", "demo": "https://github.com/coder1529/IDE/releases"}]...
|
[{"post_id": 29905, "ts": "202 [{"post_id": 29905, "ts": "2026-07-17T02:29:58Z", "hours": 0.5625, "text": "Finished the IDE!"}, {"post_id": 14325, "ts": "2026-06-23T12:42:01Z", "hours": 1.0711, "text": "Made A working file loading system and made file link and pip import"}, {"post_id": 14300, "ts": "2026-06-23T11:29:19Z", "hours": 1.51, "text": "Making mt own ide!"}]...
|
Title: IDE by @JoonHyuk | Stardance
Devlogs:
Maki Title: IDE by @JoonHyuk | Stardance
Devlogs:
Making mt own ide!
Made A working file loading system and made file link and pip import
Finished the IDE!
Ships:
I built a lightweight code editor from scratch in Python/PyQt6, with a real extension system: extensions are just Python files that expose an activate(api) function, and the API lets them register commands, add toolbar buttons, hook into file-open events, and print to the built-in terminal. I also built a Marketplace panel that reads a JSON catalog and installs extensions into the app with one click. The hardest part was debugging an environment issue that had nothing to do with my code — Windows Smart App Control was silently blocking PyQt6’s native Qt DLLs from loading because they aren’t signed with a certificate Microsoft’s reputation service recognizes. Traced it through the Korean-language error message down to the exact Windows security policy before I could even get the app running again. I’m proud of the extension API design — it’s small (four methods) but already enough to let a sample extension add its own button and command without touching core app code. To test it: clone the repo, pip install PyQt6, run python main.py. Click “Extensions” to open the Marketplace and install the sample extension, then use the toolbar button it adds. You can also open/edit files from the sidebar and run code directly with the ▶ button....
|
1793958746.5985186
|
1794045146.5985186
|
|
22259
|
Untitled project by @baraa | Stardance
|
baraa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @baraa | Stardance
|
1793958747.9266737
|
1794563547.9266737
|
|
37359
|
Sokoscale by @Paul1379 | Stardance
|
Paul1379
|
1
|
10.0
|
96
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-19T18:38:59Z", "hours": 10.0, "multiplier": 10.13, "payout": 96, "blessing": "neutral", "text": "I made a game for the kenney game jam: it’s a challenge where you have to make a game during arestricted time frame (here from July 17th at 5:00 PM to July 19th at 7:00 PM) and about a theme (the theme for this jam cas ‘scale’) In the game, you play puzzles about pushing boxes and changing your size to push bigger boxes. The game features nine rooms (~levels) The game is playable on web, and for windows and linux", "repo": "https://github.com/Paul-1379/Kenney-jam", "demo": "https://paul1379.itch.io/sokoscale"}]...
|
[{"post_id": 31382, "ts": "202 [{"post_id": 31382, "ts": "2026-07-19T18:26:15Z", "hours": 9.5197, "text": "The idea In order to practice for the big GMTK game jam , I did the kenney jam . The theme was “scale”, I did not took time to think of a good idea fitting the theme, but since one of my best game made for a jam was a puzzle game. I thought I could just make another one, but what type of puzzle game? One restriction specific of this game jam is that you have to use only kenney assets , I found the sokoban asset pack and I chose to make a sokoban game: this is a game based on blocks you have to push to solve the puzzles. This type of puzzle game is named after the original sokoban game , but the idea can be pushed futher, for example in game like Patricks Parabox , where the blocks you push are the entire level, and you can go inside the block to go back into the level but from another entrance… just watch the trailer if you want to understand this game is not text-explanable . But where is the original idea that fit the ‘scale’ theme of the jam? Well, you can change your own size: if you’re taller, you will be able to push big blocks, but you won’t be able to easily move throughout the puzzle, the challenge is around that dilemma. developping movement and block pushing features After the idea came the big part: developping the game. I started adding the player movement and collisions, I decided to use a custom movement system with scripts instead of using the godot physic system , which led me into a long debugging session, and maybe I could have used less time if I did not make this choice. The benefit of using my own system is to ensure that the player and the movable blocks are always on the grid (the game is based on a tilemap) But why this debugging session? It is because of the central feature of player growing/shrinking, when the player grows, the game has to ensure that there is some space around him, on top of that, the ‘tall’ player can push a big box, but not two big box, and cannot push a box if there is a wall or a box behind too… Some part of my code are not great clean code examples to follow, but you know, if it works, don’t touch it! #developping the camera Next I made a camera system based on rooms, like in Celeste , I used area2D to make a “camera_manager” script able to tell in wich room the player is, the script changes the camera target point and the player respawn point. Indeed I needed a respawn feature because some puzzles make being stuck a possibily. sprites and music I finished the game by adding music, SFX and the sprites of the player. The music did not have to be part of a kenney asset so I found it on OpenGameArt.org I did not use text and made the game playable with mouse in order to check the ‘no text’ and ‘mouse only’ bonus challenges of the game jam"}]...
|
Title: Sokoscale by @Paul1379 | Stardance
Devlogs Title: Sokoscale by @Paul1379 | Stardance
Devlogs:
The idea In order to practice for the big GMTK game jam , I did the kenney jam . The theme was “scale”, I did not took time to think of a good idea fitting the theme, but since one of my best game made for a jam was a puzzle game. I thought I could just make another one, but what type of puzzle game? One restriction specific of this game jam is that you have to use only kenney assets , I found the sokoban asset pack and I chose to make a sokoban game: this is a game based on blocks you have to push to solve the puzzles. This type of puzzle game is named after the original sokoban game , but the idea can be pushed futher, for example in game like Patricks Parabox , where the blocks you push are the entire level, and you can go inside the block to go back into the level but from another entrance… just watch the trailer if you want to understand this game is not text-explanable . But where is the original idea that fit the ‘scale’ theme of the jam? Well, you can change your own size: if you’re taller, you will be able to push big blocks, but you won’t be able to easily move throughout the puzzle, the challenge is around that dilemma. developping movement and block pushing features After the idea came the big part: developping the game. I started adding the player movement and collisions, I decided to use a custom movement system with scripts instead of using the godot physic system , which led me into a long debugging session, and maybe I could have used less time if I did not make this choice. The benefit of using my own system is to ensure that the player and the movable blocks are always on the grid (the game is based on a tilemap) But why this debugging session? It is because of the central feature of player growing/shrinking, when the player grows, the game has to ensure that there is some space around him, on top of that, the ‘tall’ player can push a big box, but not two big box, and cannot push a box if there is a wall or a box behind too… Some part of my code are not great clean code examples to follow, but you know, if it works, don’t touch it! #developping the camera Next I made a camera system based on rooms, like in Celeste , I used area2D to make a “camera_manager” script able to tell in wich room the player is, the script changes the camera target point and the player respawn point. Indeed I needed a respawn feature because some puzzles make being stuck a possibily. sprites and music I finished the game by adding music, SFX and the sprites of the player. The music did not have to be part of a kenney asset so I found it on OpenGameArt.org I did not use text and made the game playable with mouse in order to check the ‘no text’ and ‘mouse only’ bonus challenges of the game jam
Ships:
I made a game for the kenney game jam: it’s a challenge where you have to make a game during arestricted time frame (here from July 17th at 5:00 PM to July 19th at 7:00 PM) and about a theme (the theme for this jam cas ‘scale’) In the game, you play puzzles about pushing boxes and changing your size to push bigger boxes. The game features nine rooms (~levels) The game is playable on web, and for windows and linux...
|
1793958749.11346
|
1794045149.11346
|
|
15271
|
Voltchess by @jithesh_sarvin | Stardance
|
|
1
|
66.09
|
723
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T14:41:02Z", "hours": 62.0, "multiplier": 12.02, "payout": 723, "blessing": "neutral", "text": "if you don’t play chess user (jitheshsarvin) as the username in chess.com to tryout the analysis feature. I made a free chess game review tool like chess.com but better. I added new features with stockfish analysis, move classification and even additional metrics such as the position domination. For new user there is a tutorial. I added a backend for people to save their reports. (note the sign in does not work for regular users). Other features that i added of seo optimization and puzzles and play features to top it off.", "repo": "https://github.com/Lunarcolony/VoltChess", "demo": "https://www.voltchess.me"}]...
|
[{"post_id": 13941, "ts": "202 [{"post_id": 13941, "ts": "2026-06-22T21:40:10Z", "hours": 2.025, "text": "added debugging features"}, {"post_id": 12740, "ts": "2026-06-20T20:35:08Z", "hours": 2.0619, "text": "Created a whole couch hub which runs in a raspberry pi, which allows a coach to add multiple students and analyze and create game reports for the moth"}, {"post_id": 9969, "ts": "2026-06-16T14:35:51Z", "hours": 11.3247, "text": "trained a machine learning algorithm that could predict the future moves in threads. I had to do a lot of troubleshooting to fix the training process and i trained the couch model for about 5 hours"}, {"post_id": 9022, "ts": "2026-06-15T01:39:23Z", "hours": 10.7403, "text": "Created a backend for the website so that the users could sign in. I am changing focus to academy’s to get users. They could log in add their student and it generates reports automatically for each student. Also i have fixed a little bit of the ui to make is more clear and usable for others. I am using vercel to host the from end but i am using a raspberry pi to run the backend locally and run a Cloudflare tunnel to connect these two."}, {"post_id": 8677, "ts": "2026-06-14T12:37:04Z", "hours": 9.1492, "text": "I added a puzzle page which uses stock fish and a custom trained ml algorithm to find mate in two puzzles in complex position. It also takes in real games a input to improve its puzzles every time( try in out in voltchess.me"}, {"post_id": 8100, "ts": "2026-06-13T14:57:32Z", "hours": 9.0711, "text": "implemented a stockfish tab that runs in the browser of the user to reduce the servers stress"}, {"post_id": 7858, "ts": "2026-06-13T03:13:39Z", "hours": 1.0306, "text": "Added blogs and other text to increase seo optimization. I also integrated this new color theme which i asked ai to do it. In my opinion the color theme is mid and it took it only 10 seconds to do it which saved me a lot of work."}, {"post_id": 7693, "ts": "2026-06-12T21:01:55Z", "hours": 1.7822, "text": "Devlog-5 I focused more on marking my getting getting feedback from the users and improving some small bugs and ui and by this process I was able to receive 140 unique users in 2 days and more than 50 new users in the past 12 hours( check out the website - https://www.voltchess.me )"}, {"post_id": 7449, "ts": "2026-06-12T12:41:54Z", "hours": 9.2467, "text": "Dev log-4 added the ability to load a chess game using chess.com api and lichess ai. And integrated stockfish in the browser to analyze the games. Create a simple algorithm to predict accuracy based on their mistakes( which are calculated by sudden movements in eval) try it out at https://www.voltchess.me"}, {"post_id": 6803, "ts": "2026-06-11T12:27:05Z", "hours": 7.3647, "text": "Devlog-3 I deployed this website to Vercel and did some marketing to see how many people would be willing to use my website. As per thier views , it is lower than what i expected and they never returned. Based on these comments, I improved my ui and added new features such as game review but it is still buggy so i did not publish that."}, {"post_id": 6622, "ts": "2026-06-11T03:27:17Z", "hours": 1.6131, "text": "Devlog-2 I have worked to create a new side panel which is ridged for pc and is like a dropdown menu for phones. I also have routed 4 different pages analysis tab has the one with the chess board. I have designed my own logo to go on top to finish it off. I made black and gold color theme to make it feel premium"}, {"post_id": 6494, "ts": "2026-06-10T22:17:53Z", "hours": 0.9517, "text": "Devlog 1 Today i was able to explore different options to create a chessboard using typescript. A really important step to take is what tools and programs i chose to use. I chose vite because of its clean ui and deployments"}]...
|
Title: Voltchess by @jithesh_sarvin | Stardance
D Title: Voltchess by @jithesh_sarvin | Stardance
Devlogs:
Devlog 1 Today i was able to explore different options to create a chessboard using typescript. A really important step to take is what tools and programs i chose to use. I chose vite because of its clean ui and deployments
Devlog-2 I have worked to create a new side panel which is ridged for pc and is like a dropdown menu for phones. I also have routed 4 different pages analysis tab has the one with the chess board. I have designed my own logo to go on top to finish it off. I made black and gold color theme to make it feel premium
Devlog-3 I deployed this website to Vercel and did some marketing to see how many people would be willing to use my website. As per thier views , it is lower than what i expected and they never returned. Based on these comments, I improved my ui and added new features such as game review but it is still buggy so i did not publish that.
Dev log-4 added the ability to load a chess game using chess.com api and lichess ai. And integrated stockfish in the browser to analyze the games. Create a simple algorithm to predict accuracy based on their mistakes( which are calculated by sudden movements in eval) try it out at https://www.voltchess.me
Devlog-5 I focused more on marking my getting getting feedback from the users and improving some small bugs and ui and by this process I was able to receive 140 unique users in 2 days and more than 50 new users in the past 12 hours( check out the website - https://www.voltchess.me )
Added blogs and other text to increase seo optimization. I also integrated this new color theme which i asked ai to do it. In my opinion the color theme is mid and it took it only 10 seconds to do it which saved me a lot of work.
implemented a stockfish tab that runs in the browser of the user to reduce the servers stress
I added a puzzle page which uses stock fish and a custom trained ml algorithm to find mate in two puzzles in complex position. It also takes in real games a input to improve its puzzles every time( try in out in voltchess.me
Created a backend for the website so that the users could sign in. I am changing focus to academy’s to get users. They could log in add their student and it generates reports automatically for each student. Also i have fixed a little bit of the ui to make is more clear and usable for others. I am using vercel to host the from end but i am using a raspberry pi to run the backend locally and run a Cloudflare tunnel to connect these two.
trained a machine learning algorithm that could predict the future moves in threads. I had to do a lot of troubleshooting to fix the training process and i trained the couch model for about 5 hours
Created a whole couch hub which runs in a raspberry pi, which allows a coach to add multiple students and analyze and create game reports for the moth
added debugging features
Ships:
if you don’t play chess user (jitheshsarvin) as the username in chess.com to tryout the analysis feature. I made a free chess game review tool like chess.com but better. I added new features with stockfish analysis, move classification and even additional metrics such as the position domination. For new user there is a tutorial. I added a backend for people to save their reports. (note the sign in does not work for regular users). Other features that i added of seo optimization and puzzles and play features to top it off....
|
1793958750.2428293
|
1794045150.2428293
|
|
69482
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793958751.4630475
|
1794822751.4630475
|
|
69483
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793958752.349316
|
1794822752.349316
|
|
24732
|
CapyOS by @viivi | Stardance
|
viivi
|
2
|
11.0
|
24
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:51:40Z", "hours": 4.0, "multiplier": 5.52, "payout": 24, "blessing": "neutral", "text": "CapyOS This is just a silly project made just for fun! CapyOS is a capybara-themed web operating system. I followed WebOS 1 mission to build core features and for WebOS 2 I added 2 new apps, fixed full screen mode and made app menu scrollable. I also did some polishing for the UI and added “clear windows” -button. This was my first time building a website with pure html, javascript and css for a long time. I had a lot of fun designing while adding all those capybaras you will find when you test it! I accidentally used over 7hr with mission 1 because I had so much fun and I love to adjust small things little bit better. Also because this project was made just for fun, I didn’t have much pressure to make this “good” or “serious”. It’s still 100% (hopefully) working. Have fun while testing! More details in readme.", "repo": "https://github.com/ViLP357/WebOS-Stardance", "demo": "https://vilp357.github.io/WebOS-Stardance/"}, {"ship_num": 2, "ts": "2026-07-05T15:43:20Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Here is my project for WebOS 1: CapyOS. A capybara themed WebOs using HTML, JavaScript and CSS. Capybaras are cute chill guys. So why not to make a capybara themed WebOS? This isn’t supposed to be a very serious project. I took the right to make it kinda silly. But at the same time it’s an actual web app and you could go to play around with it right now (link: https://vilp357.github.io/WebOS-Stardance/ )! It’n not very complex yet, but I’ve planned to continue to WebOS 2 mission to finish what I’ve started (nothing is stopping me, hahaa). My own features: scrollable app menu (when it has more icons it’s actually scrollable). I don’t like my desktop being covered in icons, so this way icons will stay on the left side forever. fullscreen button. This one works best when there is only one window. Otherwise it might work, let’s say, in a different way. Before starting this project I was already familiar with HTML and CSS, but I wasn’t that familiar with plain JavaScript. I think that I learned most about coding webpages with JavaScript and I feel confident continuing to WebOS 2.", "repo": "https://github.com/ViLP357/WebOS-Stardance", "demo": "https://vilp357.github.io/WebOS-Stardance/"}]...
|
[{"post_id": 53271, "ts": "202 [{"post_id": 53271, "ts": "2026-08-23T18:38:17Z", "hours": 1.8197, "text": "#7 devlog Probably the last devlog for this project. CapyOS is now ready for shipping. Sorry for last devlog, I just wan’t to get these hours logged. The last feature I added was a timer. Its icon is, of course, caybara-themed."}, {"post_id": 43341, "ts": "2026-08-08T15:17:31Z", "hours": 2.4578, "text": "#6 devlog, webOS 2 Some updates A new app: a gallery for viewing cute capybara photos Full screen button works now, it aligns the window perfectly every time now. (It required actually only 2 new lines in to script!) A new scrollbar in the app menu with a green theme. I added extra icons so that the scrollbar can be tested"}, {"post_id": 22903, "ts": "2026-07-05T15:23:00Z", "hours": 0.4181, "text": "#5 devlog The final site (after webos 1). I’m going to ship it now!"}, {"post_id": 22275, "ts": "2026-07-04T17:36:45Z", "hours": 3.9961, "text": "#4 devlog I think I’ve completed part 5 now. I still have to finish readme and deploy this and the ship. This will actually be my first ship!! I’ve already planned things to do in WebOS 2 (and I actually started doing them). The new app I created in part 5 is link app because I often forget important websites and the app is a place to store links for those sites."}, {"post_id": 17881, "ts": "2026-06-28T20:22:06Z", "hours": 1.4325, "text": "#3 devlog Working on my WebOS. Today I completed part 3 which means that the welcome window is closeable and openable. I hope to finish WebOS 1 soon. Looking forward to make a new app next time :)"}, {"post_id": 16462, "ts": "2026-06-26T20:07:23Z", "hours": 1.0678, "text": "#2 devlog Part 2 done. I decided that my WebOS will be CapyOS so more of capybaras coming. I’m very happy with the navbar I made and I’ll update it later. I think it already looks really cool."}, {"post_id": 14528, "ts": "2026-06-23T17:50:38Z", "hours": 0.4672, "text": "#1 devlog Today I started making my own WebOS using the tutorial. There was nothing new to me but had fun with playing the elements. I don’t have any special plans for this project but hopefully I end making something (at least little bit) useful."}]...
|
Title: CapyOS by @viivi | Stardance
Devlogs:
#1 d Title: CapyOS by @viivi | Stardance
Devlogs:
#1 devlog Today I started making my own WebOS using the tutorial. There was nothing new to me but had fun with playing the elements. I don’t have any special plans for this project but hopefully I end making something (at least little bit) useful.
#2 devlog Part 2 done. I decided that my WebOS will be CapyOS so more of capybaras coming. I’m very happy with the navbar I made and I’ll update it later. I think it already looks really cool.
#3 devlog Working on my WebOS. Today I completed part 3 which means that the welcome window is closeable and openable. I hope to finish WebOS 1 soon. Looking forward to make a new app next time :)
#4 devlog I think I’ve completed part 5 now. I still have to finish readme and deploy this and the ship. This will actually be my first ship!! I’ve already planned things to do in WebOS 2 (and I actually started doing them). The new app I created in part 5 is link app because I often forget important websites and the app is a place to store links for those sites.
#5 devlog The final site (after webos 1). I’m going to ship it now!
#6 devlog, webOS 2 Some updates A new app: a gallery for viewing cute capybara photos Full screen button works now, it aligns the window perfectly every time now. (It required actually only 2 new lines in to script!) A new scrollbar in the app menu with a green theme. I added extra icons so that the scrollbar can be tested
#7 devlog Probably the last devlog for this project. CapyOS is now ready for shipping. Sorry for last devlog, I just wan’t to get these hours logged. The last feature I added was a timer. Its icon is, of course, caybara-themed.
Ships:
Here is my project for WebOS 1: CapyOS. A capybara themed WebOs using HTML, JavaScript and CSS. Capybaras are cute chill guys. So why not to make a capybara themed WebOS? This isn’t supposed to be a very serious project. I took the right to make it kinda silly. But at the same time it’s an actual web app and you could go to play around with it right now (link: https://vilp357.github.io/WebOS-Stardance/ )! It’n not very complex yet, but I’ve planned to continue to WebOS 2 mission to finish what I’ve started (nothing is stopping me, hahaa). My own features: scrollable app menu (when it has more icons it’s actually scrollable). I don’t like my desktop being covered in icons, so this way icons will stay on the left side forever. fullscreen button. This one works best when there is only one window. Otherwise it might work, let’s say, in a different way. Before starting this project I was already familiar with HTML and CSS, but I wasn’t that familiar with plain JavaScript. I think that I learned most about coding webpages with JavaScript and I feel confident continuing to WebOS 2.
CapyOS This is just a silly project made just for fun! CapyOS is a capybara-themed web operating system. I followed WebOS 1 mission to build core features and for WebOS 2 I added 2 new apps, fixed full screen mode and made app menu scrollable. I also did some polishing for the UI and added “clear windows” -button. This was my first time building a website with pure html, javascript and css for a long time. I had a lot of fun designing while adding all those capybaras you will find when you test it! I accidentally used over 7hr with mission 1 because I had so much fun and I love to adjust small things little bit better. Also because this project was made just for fun, I didn’t have much pressure to make this “good” or “serious”. It’s still 100% (hopefully) working. Have fun while testing! More details in readme....
|
1793958753.215078
|
1794045153.215078
|
|
10006
|
Exoplanet Habitability by @KhushiJ | Stardance
|
KhushiJ
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Exoplanet Habitability by @KhushiJ | Starda Title: Exoplanet Habitability by @KhushiJ | Stardance...
|
1793958754.3968883
|
1794563554.3968883
|
|
17181
|
Redo by @VibeSlayer | Stardance
|
VibeSlayer
|
1
|
6.68
|
58
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T10:08:58Z", "hours": 5.0, "multiplier": 12.02, "payout": 58, "blessing": "neutral", "text": "Hi everyone, so what exactly is Redo ? Imagine you are a programmer, and your everyday workflow after making changes is something like git add . , git commit -m \"fixed bugs\" , and git push . Typing all those commands again and again gets boring, right? That’s why Redo is here. Redo redefines terminal workflows by letting you save repeated command chains and run them sequentially in seconds. It is not just for Git workflows either. You can use it for frontend projects with commands like npm install , npm run dev , or npm run build , Python projects with commands like pip install -r requirements.txt and python main.py , or any other repeated setup, build, deploy, or cleanup workflow. Redo was originally an idea from my notebook, and I really wanted to build it for a long time. Stardance gave me the motivation to finally turn that idea into a real project. The biggest challenge I faced was making the UI module, because I am not very creative with interfaces and I often mess up while designing UIs. Still, I am proud of myself because seeing the final CLI look clean and usable feels really good. Making the storage module was not easy either, but completing it taught me a lot. Redo is an open-source project built by a programmer, for programmers. I hope voters like my project because it is a unique quality-of-life tool that solves a real problem in a simple way. Thanks y’all for creating such a wonderful platform that helped me turn an idea from my notebook into a real project. I really appreciate it. Thanks!", "repo": "https://github.com/VibeSlayer-code/Redo", "demo": "https://pypi.org/project/redo-cli/"}]...
|
[{"post_id": 17961, "ts": "202 [{"post_id": 17961, "ts": "2026-06-28T22:27:59Z", "hours": 1.6831, "text": "REDO RE-SHIP UPD V1.1.8 Hi guys, I have pushed this update to Redo because it was rejected because of no major 3 QoL improvement. I have worked hard and added these 3 new features- Project-local workflows Redo lets each project store reusable workflows in .redo/workflows.json , so setup/build/test/dev commands can be shared with contributors. Automatic workflow generation redo setup scans the project type and generates common workflows like install , dev , build , test , clean , and ship . Preflight checks before execution Redo checks for missing tools, missing files, missing .env , missing dependencies, dirty Git state, and busy ports before running workflows. The update has been pushed to PyPI and GitHub. Redo can be simply updated using redo update . Good luck!"}, {"post_id": 9146, "ts": "2026-06-15T09:58:12Z", "hours": 1.3356, "text": "Devlog #3 Hi developers, This will be my last devlog because Redo is finally complete! It is fully ready to be deployed, and all the modules have been completed. I have also attached a video so y’all can get a quick glimpse of Redo in action. Along with that, I have published it on PyPI, so you can install it directly using: pip install redo-cli The process of building this project was pretty smooth, and I did not face any major problems since I already have experience with Python. The only challenging part was designing a clean and less clumsy CLI using Rich, but I think I managed to achieve that pretty well. Anyways, I’m shipping the project today!"}, {"post_id": 8696, "ts": "2026-06-14T13:27:15Z", "hours": 2.0497, "text": "Devlog #2 Hi developers! I’ve finally built the base of Redo. I completed the storage module and the UI module, and Redo has finally started working properly. The biggest challenge I faced was configuring Rich to make the terminal UI look clean and beautiful, but I’m happy with how it’s coming together. My roadmap for tomorrow is to complete the placeholder module and fix the remaining bugs. Till then, bye!"}, {"post_id": 7359, "ts": "2026-06-12T08:22:23Z", "hours": 1.4117, "text": "Devlog #1 Started building Redo’s storage module today. Redo is a simple CLI tool that lets you save repeated terminal workflows and run them again with one command — for example, saving a Vite setup flow once and later running it with redo vite . The main progress today was getting the basic storage system working. I finished initialize_file() , load_workflows() , and save_workflows() , which handle creating the workflow JSON file, reading saved workflows, and writing updates back to storage. The tricky part was understanding how file paths, JSON loading, and return status messages should work together without making the code messy. I also learned why an empty JSON file breaks loading, so the storage file now starts with {} instead of being created blank. I also learned new libraries like pathlib There’s still a lot left in the storage module, especially add_workflow() , get_workflow() , delete_workflow() , and run-count tracking, but the foundation is finally in place. Next goal: make Redo actually save a new workflow from user input. No ss today :("}]...
|
Title: Redo by @VibeSlayer | Stardance
Devlogs:
D Title: Redo by @VibeSlayer | Stardance
Devlogs:
Devlog #1 Started building Redo’s storage module today. Redo is a simple CLI tool that lets you save repeated terminal workflows and run them again with one command — for example, saving a Vite setup flow once and later running it with redo vite . The main progress today was getting the basic storage system working. I finished initialize_file() , load_workflows() , and save_workflows() , which handle creating the workflow JSON file, reading saved workflows, and writing updates back to storage. The tricky part was understanding how file paths, JSON loading, and return status messages should work together without making the code messy. I also learned why an empty JSON file breaks loading, so the storage file now starts with {} instead of being created blank. I also learned new libraries like pathlib There’s still a lot left in the storage module, especially add_workflow() , get_workflow() , delete_workflow() , and run-count tracking, but the foundation is finally in place. Next goal: make Redo actually save a new workflow from user input. No ss today :(
Devlog #2 Hi developers! I’ve finally built the base of Redo. I completed the storage module and the UI module, and Redo has finally started working properly. The biggest challenge I faced was configuring Rich to make the terminal UI look clean and beautiful, but I’m happy with how it’s coming together. My roadmap for tomorrow is to complete the placeholder module and fix the remaining bugs. Till then, bye!
Devlog #3 Hi developers, This will be my last devlog because Redo is finally complete! It is fully ready to be deployed, and all the modules have been completed. I have also attached a video so y’all can get a quick glimpse of Redo in action. Along with that, I have published it on PyPI, so you can install it directly using: pip install redo-cli The process of building this project was pretty smooth, and I did not face any major problems since I already have experience with Python. The only challenging part was designing a clean and less clumsy CLI using Rich, but I think I managed to achieve that pretty well. Anyways, I’m shipping the project today!
REDO RE-SHIP UPD V1.1.8 Hi guys, I have pushed this update to Redo because it was rejected because of no major 3 QoL improvement. I have worked hard and added these 3 new features- Project-local workflows Redo lets each project store reusable workflows in .redo/workflows.json , so setup/build/test/dev commands can be shared with contributors. Automatic workflow generation redo setup scans the project type and generates common workflows like install , dev , build , test , clean , and ship . Preflight checks before execution Redo checks for missing tools, missing files, missing .env , missing dependencies, dirty Git state, and busy ports before running workflows. The update has been pushed to PyPI and GitHub. Redo can be simply updated using redo update . Good luck!
Ships:
Hi everyone, so what exactly is Redo ? Imagine you are a programmer, and your everyday workflow after making changes is something like git add . , git commit -m "fixed bugs" , and git push . Typing all those commands again and again gets boring, right? That’s why Redo is here. Redo redefines terminal workflows by letting you save repeated command chains and run them sequentially in seconds. It is not just for Git workflows either. You can use it for frontend projects with commands like npm install , npm run dev , or npm run build , Python projects with commands like pip install -r requirements.txt and python main.py , or any other repeated setup, build, deploy, or cleanup workflow. Redo was originally an idea from my notebook, and I really wanted to build it for a long time. Stardance gave me the motivation to finally turn that idea into a real project. The biggest challenge I faced was making the UI module, because I am not very creative with interfaces and I often mess up while designing UIs. Still, I am proud of myself because seeing the final CLI look clean and usable feels really good. Making the storage module was not easy either, but completing it taught me a lot. Redo is an open-source project built by a programmer, for programmers. I hope voters like my project because it is a unique quality-of-life tool that solves a real problem in a simple way. Thanks y’all for creating such a wonderful platform that helped me turn an idea from my notebook into a real project. I really appreciate it. Thanks!...
|
1793958755.2566361
|
1794045155.2566361
|
|
26174
|
Book Verse by @yashasvib | Stardance
|
yashasvib
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Book Verse by @yashasvib | Stardance
|
1793958756.4157832
|
1794563556.4157832
|
|
18502
|
Portable workbench futuristic bike by @jamesp | St Portable workbench futuristic bike by @jamesp | Stardance...
|
jamesp
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Portable workbench futuristic bike by @jame Title: Portable workbench futuristic bike by @jamesp | Stardance...
|
1793958757.3100731
|
1794563557.3100731
|
|
20497
|
ScreenExtend by @epiccodewizard | Stardance
|
epiccodewizard
|
2
|
129.0
|
985
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-29T04:58:19Z", "hours": 74.0, "multiplier": 12.07, "payout": 827, "blessing": "neutral", "text": "Initial second release for ScreenExtend! Please give feedback and read the devlogs; they’re detailed and describe the project a lot better than here. The website https://screenextend.app/ quickly summarizes it.", "repo": "https://github.com/ScreenExtend/ScreenExtend", "demo": "https://screenextend.app/"}, {"ship_num": 2, "ts": "2026-07-01T23:47:06Z", "hours": 55.0, "multiplier": 15.76, "payout": 158, "blessing": "neutral", "text": "Initial release for ScreenExtend! Please give feedback and read the initial devlog (shorter one here, longer one at https://github.com/ScreenExtend/ScreenExtend/blob/main/DEVLOG.md ) for detailed information.", "repo": "https://github.com/ScreenExtend/ScreenExtend", "demo": "https://screenextend.app/"}]...
|
[{"post_id": 60703, "ts": "202 [{"post_id": 60703, "ts": "2026-09-03T08:05:38Z", "hours": 9.5622, "text": "One step closer to finally shipping…or so I hope. I speedran shipping this next feature, so it took a lot of time. This feature is mainly for myself. I have an old Mac (running 10.13 from 2017, really old I get itttt). I want my app to run on there, but it currently only supports 10.15+. Hence, I went down a funny rabbit hole in an attempt to add support. 33. Cleaning up dylib signature lookups at run time One of the key challenges I faced throughout development was how to have a unified codebase for multiple API versions. I decided that instead of version-gating APIs and guessing which beta/normal versions they would be accessible on, I’d test for APIs at run time. I changed VideoToolbox to use this logic: it would attempt to set/use APIs and variables available at higher runtimes, but would work fine without them and have fallbacks. This ensured both legacy and modern systems functioned well. 34. Airplay automations…? As I was doing competitor research, I noticed many of the other apps supported Mac 10.13-10.15 as well as 10.15+, while mainly only supported 10.15+. Essentially, they started a fake Airplay server, had the Mac connect it, and set the display mode to “Use as separate display”. This would create a virtual display that the app would then use for its own functions. As ScreenExtend requires its own display on older machines, similar to this, where CGVirtualDisplay isn’t an option, I decided to use this method. I had my app automate opening the Airplay menu and connecting as well, in addition to running the fake server. Most of the process was straightforward, especially due to the abundance of fake Airplay server implementations online and my own experience with apps like LonelyScreen. The one issue of this approach is that only one display can be connected at a time, so any tertiary devices wanting to connect have to wait their turn. I guess the only option is to by a new mac then… 35. Client UI update cleanliness fixes Due to the one device restriction, I implemented a separate page that would be served if the display slot was being used up. It would be coupled with a short message explaining the consequences of the older Mac version. There were also bugs related to session teardown (keyboard still being locked, video stream still active in the background, etc) that I quickly squashed after finding them. Soooo in hindsight, I prolly should’ve bumped this up to 0.6.0, but I left it at 0.5.4. Oh well, I’ll increment the version by next release. Only a few more features to go on the feature list before hitting v1 and shipping!!!"}, {"post_id": 58576, "ts": "2026-08-31T01:22:07Z", "hours": 12.0222, "text": "Oh my lord, I keep forgetting to write devlogs every 10 hours and am losing hours on each one. Nevertheless, I finally finished audio work! Plus some other things like running claude security agents on the code base and patching stupid vulnerabilities. Here’s how the week went: 28. HiDPI and Mac Issues Whenever I use my Mac with ScreenExtend, the stream looks blurry due to Macs having HiDPI screens. I fixed this by adding basic HiDPI scaling on Windows. The UI has a DPR slider based on autodetected values. This DPR is multiplied by the screen resolution for a shaper display. One issue that arose with the new displays was the fact that the display would randomly not scale properly, so the task bar and apps would appear tiny. To mitigate this, I reapplied all display settings after resolution changes and a timeout. 29. AUDIO WORKS!!!! For the longest time, I tried getting audio to work. On Windows, the process was straightforward: a WASAPI loopback system audio capture session. I wanted to build my own custom driver to capture audio faster, but this would be too expensive to deploy. I read other Rust implementations and quickly wrote the code. On the other hand, Mac was a whole different issue. On older versions of Mac, system audio recording is not supported. Hence, for Macs below 13.0, I wrote a custom audio driver. I didn’t have a clue about implementing an AudioServerPlugIn on Mac, but worked out the specifics by looking at the Blackhole audio driver. I did have to proxy physical volume buttons to work (i.e. I listen for taps and change the audio level within the driver). For older Macs, I used ScreenCaptureKit with an extra audio flag. This was a simple fix to capture audio. On even newer Macs, there’s a Process Tap API to record system audio with low latency. Once again, I didn’t have much difficulties implementing these due to the abundance of documentation. 30. Streaming Audio over WebRTC (with A/V sync) When sending video and audio separately, the two are prone to fall out of sync, so watching movies or videos is difficult. To mitigate these issues, I wrote an A/V sync host clock. This packages the time on the host clock to audio samples and video frames, such that they can be reconstructed and coupled on the receiving end. On the browser side, I began by implementing a basic audio streamer with an audio element. However, similar to video, there’s always a faster method possible. I used the AudioDecoder class from WebCodecs to implement a worklet class and jitterbuffer. In simple terms, this would decode audio on a separate thread, like WebCodecs prefers, and send the audio back to be played to the user. 31. Windows Video Encoding Speedups I made a few encoding speedups on Windows targets: The NVENC capture encode system uses a texture ring implementation: a pool of 3-5 encoder instances paired with a frame queue, allowing multiple frames to be encoded concurrently BGRA encoding is done directly in the library instead of using a third-party implementation Unchanged frames in DXGI capture are not encoded again, reducing CPU load 32. Mac Video Encoding Speedups I made a few encoding speedups on Mac targets: Request LatencyCritical activity for the session to ensure App Nap and other sleep measures don’t affect the thread Analogous to DXGI, skip encoding when CGDisplayStream reports no dirty rects Not an encoding speedup, but preferring 5 GHz for Mac hosted networks to ensure higher speeds Lotta stuff done this week, am I right? I made lots of progress and finished the bulk of my features, although Linux support is still in the works. I’ll make the 1.0.0 release soon and start a Stardance ship as well. I’ll likely add Linux support after 1.0.0, as I need to research EVDI and the WSL display compositor, as well as other minor tweaks for Windows/Mac. See y’all in the next devlog!"}, {"post_id": 54119, "ts": "2026-08-24T22:53:29Z", "hours": 12.6531, "text": "I speedran shipping a buncha features…in the span of a few days. I logged a copious amount of hours on Hackatime building random stuff. I tried some things with recording system audio and building a driver…those didn’t go the best, but I’ll cover that in the next devlog. Here are the main changes this week: 24. Even more quality of life changes Compared to last time, I wanted the user experience to improve even more. Specifically, for the Windows client, a custom display driver is required. On Macs, the functionality I need is built in, so none is required. However, uninstalling this display driver used to be a pain for users. Now, I bundled it as part of the uninstall script. I wasn’t sure how to do this, but Tauri has many useful guides and issues opened regarding custom WiX/NSIS code. When the window isn’t focused, join and leave notifications are toasted. This allows the user to stay informed even when the app isn’t open. Basic feature but very useful. I’d often get annoyed that I needed to keep re-entering the password to log in to a previously connected device. Hence, I added auto-join for devices based on their IP. This ensures that commonly connected devices can save time when reconnecting. 25. Onboarding screens The app is intuitive to use…or so I thought? Some of my beta testers were confused as to the various features and how to use the interface. Hence, I used NextStepjs to add onboarding components. This would dim the UI and only highlight the component being displayed, along with a message next to it. I liked the styles of NextStepjs a lot, so I chose it. There were some issues regarding window resize, so I made the onboarding exit and reopen to the last step when the window is resized. This way, the positioning of elements was forcefully recalculated. 26. Random security fixes My app had various vulnerabilities scattered throughout, so I ran a vulnerability Claude skill and patched some holes. The main issues fixed were: Checksums of bundled DLLs and resources are checked before being pushed to GitHub Actions Tauri CSP and allow list are actually enforced instead of being set to allow all TLS cert used for hosting the HTTPS domain has more secure file system permissions to reduce unwanted tampering of files Devices are trusted by a uniquely generated token, not by IP, to decrease the chance of impersonators 27. Command-line interface A majority of the time on this devlog was spent on the CLI. It wasn’t that hard (from a technical perspective), mainly just translating a lot of the UI code into Tauri CLI commands and mapping them correctly in the generated JSON file. One of the harder things to figure out was setting up cross-thread AppState, when the app wasn’t exactly running…turned out I just had to move the initialization command to before the window is created, so it would run inside both CLI and GUI modes. To present the QR codes better. I used qr2term to display the QR codes. By default, all logging is hidden. This turns ScreenExtend into a clean CLI mimicking the GUI. Hoorah! That’s it for this devlog. Not much to conclude, but plenty more features coming. Stay tuned!"}, {"post_id": 51902, "ts": "2026-08-21T20:12:46Z", "hours": 10.3639, "text": "Oh my lord…I crammed a lot of features into this week. I have yet to do proper audits of the codebase as a whole, specifically related to latency optimizations. I added a lot more code that affects the WebRTC pipeline, but I at least got the core features working. 20. Automatic updates For a while, the app relied on manual updating. It would check the latest version on Github, but users would have to go to the website, download the installer, uninstall the current version, and reinstall the newer version. This also messed up config and was a huge pain. Hence, I generated my own signing keys and used the Tauri updater plugin to automatically update apps. When the app is first launched and if an update is available, it automatically downloads and installs it without any user action. To make this more robust, I added a progress bar while downloading the update. On Windows specifically, the app must be shut down and restarted, so a blocking modal prevents devices from joining till this is done. I originally made this modal manually, but switched to using AlertDialog from ShadCN. Another issue I faced was the latest.json manifest. As I used custom filenames when downloading and installing updates, I had to manually patch the JSON. I learned a lot about the Tauri updater Github action through this, as I had to figure out how Tauri generated build filenames and how I could safely update them. 21. Quality of life for client devices I finished QOL fixes on the client side: Remember past devices to quickly import preferences or ban devices (all config saving is IP-based) Warn if the user is attempting to connect from the same device (this app is a remote control tool, but you can’t exactly remote control yourself) If the screen orientation changes, the virtual display is updated accordingly using CSS media queries to ensure a seamless experience A no fullscreen mode was added so users could quickly switch apps and maintain productivity 22. Quality of life for host devices I converted all in-app modals and error messages to JSON. This allowed me to add i18n language support, so I could easily translate my app to other languages. To detect and ensure only a single instance of the app was running, I previously used a file lock. However, there was an issue with MSI builds falsely detecting a file lock and not opening. I switched to a basic TCP model for IPC so that multiple processes running can figure out which was there first and shut down the others. 23. More more more Mac features! I’ve always felt a bit sad for my Mac users. I don’t have a Mac to test on, so I keep borrowing my dad’s Mac, which results in insanely slow development times. Nevertheless, I made some serious progress this week. The biggest thing was a simpler installation process. Many users would complain that they didn’t remember if they’re on Intel or Apple Silicon, so I now distribute a universal DMG. In terms of the app itself, I added a permissions check for screen recording and input injection. It would run a live test of screen capture or key input to see if the app actually had permissions; therefore, down the road it wouldn’t cause issues. I initially tried to do a soft check without an actual test (i.e., read the settings app), but this didn’t work. The only foolproof way was to call the API itself. The biggest feature by far was adding Mac input injection. Using accessibility APIs and a charmap similar to Windows, it would inject input onto the Mac screen. I could remotely log in from my Chromebook and get a lot of work done. I mirrored the structure and code on the Windows input injection pipeline, so no major difficulties here. That’s it for this week! Lotta stuff added, especially for the Mac users. I have a long list of features to continue building, specifically regarding easier Windows uninstall processes, onboarding, and an overall better UX. See you soon!"}, {"post_id": 39065, "ts": "2026-08-01T19:07:47Z", "hours": 9.8208, "text": "I had so much fun at the conference in San Francisco! I met a lot of cool people who gave me advice on the app, although I didn’t see the downloads spike 😭. I primarily began working on a SW encoder and other miscellaneous changes: 17. Remote control toggle Sometimes, the user doesn’t want a client to have remote control access. Although the purpose of the app is to have remote control, it is useful to disable this feature. On the frontend, I added a toggle switch that enables or disables the remote control backend. I was debating whether WebRTC negotiation was required as well, but decided to do so in the end. The remote control used data channels, so an unused data channel would result in slightly lower latency. Renegotiation ensured the stream stayed as efficient as possible without sending redundant data. 18. Update checking In order for current users to access newer versions, I wanted to add an update functionality. I’m not using Tauri’s update plugin just yet, so I run a simple check. The app, on startup, checks the latest release tag on GitHub. If it’s not equal to the current version (rollback or higher version), the user is prompted to download the newer version. Automatic updates will come next. 19. The big boy: software encoding This one’s been a long time coming. A lot of machines like VMs or computers with a weird setup just don’t have a working hardware encoder (Intel/AMD/Nvidia), and until now that meant the app straight up didn’t work there. So I built a full CPU-only x264 fallback. For the pipeline, the frames come as raw BGRA bytes that the other supporters already encoded. They must be converted to I420 before going to libx264, whose build I pulled from OBS. As a side note, the DLL is bundled with the app at runtime to ensure no missing dependencies. As with any encoder, the rate control is ABR with a tight VBV, as well as an infinite GOP. Besides the technical jargon, this just means latency is the north star and nothing else matters. The whole software variant is added to the encoder vendor enum, and wired into the fallback chain: if NVENC fails, try Intel; if Intel fails, fall back to software before giving up entirely. There’s also a manual override if someone really prefers software encoding, but this is not the default. There’s a big CPU cost compared to hardware encoding, so it’s very much a last resort and only kicks in if absolutely no GPU encoders are available. But “last resort that works” beats “doesn’t work at all.” That’s it for this week! I plan to have some smaller quality-of-life changes and better updates coming soon…"}, {"post_id": 34237, "ts": "2026-07-24T19:29:18Z", "hours": 9.1139, "text": "Sooooo this devlog is mostly comprised of website changes. I have a conference in San Francisco and wanted to polish up the app before publishing. Here are the main changes I made: 13. Random chores and updating the website I absolutely love shadcn-ui, but so do AI models. In past reviews by stardance raters, as well as family and friends, they pointed out the website looked AI-generated. Hence, I decreased the number of gradients and added basic animations to make the site feel more alive. This was a first for me to implement animations, but the Tailwind docs made it quite simple. I used a specific code-like font instead of the generic fonts I had and tidied up CSS classes. The biggest change was adding a blurred-geometric background for a nicer feel. 14. Redesigning the website completely I felt it was better to update the website as a whole, so I changed up the user interface. When I tested the app with real users, they complained that they didn’t know how to actually use the app. I changed the hero design to have clearer text and added an SVG-animation component showing how the site actually works. The feature section stayed the same, but there was a highlights grid (inspo https://cider.sh/ ) to highlight the main features. The FAQ was shortened to my liking, and I pulled some utilities from Tailwind for animations. In terms of images, I updated the images of the app featured on the website and cleaned up some of the dimensions related to that CSS. The old homepage still lives inside OldHome() but isn’t used anymore. 15. Tidying up the README and build workflows I edited the README to remove redundant information and make it more developer-focused. I also updated some information regarding GPU builds. For the build workflow, I ensured it would only run if the commit ended in “rebuild”. This ensures unnecessary build minutes are not spent on small changes not requiring a full rebuild. 16. Wake lock API fallback This app aims to support all devices, but older devices have…funny APIs to say the least. For WebRTC, I implemented the legacy encoded streams API. However, the device would still turn off for seemingly no reason while the video was playing. On older devices, the wake lock API is not supported. However, there’s a unique workaround for this: any video element playing on the webpage will keep the screen from dimming. Hence, I used the NoSleep library to create an off-screen 1-second video element that keeps looping, ensuring the display doesn’t go dark. Some very fun stuff with browsers. That’s it for this devlog! Mostly minor changes, but the next one will have better SW encoding support among other changes. Stay tuned…"}, {"post_id": 28772, "ts": "2026-07-15T08:02:33Z", "hours": 10.7358, "text": "I met with some friends to discuss my app…and realized I gotta lock in with the features. Among the various topics we discussed like the difficult UI or lack of automatic updates, they really wanted remote control features. So, I set out to make the remote display something I can actually touch, click, and type into. And patching some other bugs along the way. 9. Remote input This is the main headline feature. Streaming pixels one way was solved; now the client had to send input back up the wire and have the host replay it as if it came from real hardware. Host side (Windows). A new input backend injects events through a synthetic pointer device , so mouse, touch, and pen all seem real as opposed to faked mouse moves. The synthetic device can execute touch or mouse movements from the tablet client. macOS and Linux backends are stubbed and will come later (trust me bro). The wire. This side had to be optimized for dead-low latency like the rest of the project. Instead of passing strings or using some wrapper library, I made my own binary protocol (a dedicated protocol module) serialized over WebRTC data channels , not the media path. Client-side input.js captures keyboard, mouse, pointer (touch/pen), wheel, clipboard, and drag-drop and ships them across. The code basically catches every single frontend input event and forwards all those events (20+)! The routing is latency-first, same as everything else, with three different paths. fast-path events (pointer moves, wheel) take an unreliable channel , where a dropped packet is cheaper than a late one, while clicks, keys, and clipboard take the reliable channel where every event must land exactly once. It’s not that big of a deal if one small mouse delta doesn’t go through, but it definitely is a big deal if a click doesn’t go through. 10. Browser compatibility detections Not every browser can do WebCodecs, secure contexts, or the input paths above. Rather than fail silently, I added a compatibility check on both the browser and client up front. It shows compatibility modals with per-feature lists to ensure the user knows what’s going on. 11. Some more small fixes I added two quality-of-life additions: avatars (upload custom profile pictures) and zoom controls (ctrl/cmd +/-). 12. Encoders that don’t explode when funny stuff happens Oh my god…one of the biggest issues by far. When I ran the NVIDIA encoder at high FPS, it didn’t crash. However, the Intel Quick Sync encoder would arbitrarily crash at high FPS and wouldn’t give a reason why. I audited a buncha different parts of my code and eventually found that FPS was the issue, not resolution or low-latency flags. Hence, I added a binary search that probes the hardware for its true maximum supported fps and clamps to it before the encoder can choke. Essentially, I ask the encoder “can you do 1920x1080 at 240 fps?” –> “no” –> “what about 120 fps?” –> “yes” –> “what about 180 fps?”. This keeps repeating till the max FPS is found and streamed to the client. Rounding out the release, I made a variety of different UI fixes like the modal fixes , backdrop overlap, a stray uninstall-modal backdrop, and cloud reconfig errors . More progress to come!"}, {"post_id": 20389, "ts": "2026-07-01T23:35:58Z", "hours": 54.7942, "text": "ScreenExtend Devlog: Building the Rust Engine Under a Wireless Second Monitor TL;DR ScreenExtend turns any device with a browser into a real, wireless extended monitor for a Windows host, no client app and no cables (it began so my brother could use his iPad for notes at debate tournaments). Scan a QR code and the host spins up a real virtual display, streamed over WebRTC with hardware H.264. The React/TS control UI existed before; everything else (Rust core, GPU pipeline, WebCodecs client, cloud relay) was built from scratch , always latency-first, quality-second. 1. The spine: Tauri + a typed Rust↔TS bridge tauri-specta exports a fully-typed src/lib/bindings.ts for commands (TS→Rust) plus typed events (Rust→TS): devices, network, cloud status, logs. A code-generated bridge beats maintaining one by hand. Let the code write itself! 2. Virtual displays: faking a real monitor Each client gets its own virtual display the OS treats as real hardware, a true second screen, not mirroring. On join the host creates one sized to the client , forces extend topology, then captures it once attached. On Windows a signed IDD driver installs at runtime (via nefconc + certutil ), and it tears down cleanly on leave. 3. First light: WebRTC + WHEP + H.264 The media path is WebRTC (real-time, in every browser). Signaling is WHEP : the client POSTs an SDP offer, the host answers in-response, no signaling server. Codec is H.264 , universal hardware decode on clients and encode (NVENC/QSV/AMF) on hosts. The first release streamed NVENC to a plain <video> ; it worked but was laggy. It binds HTTP + HTTPS (self-signed via rcgen ) , since WebCodecs needs a secure context. 4. The pipeline: capture → encode → broadcast Capture is Windows Graphics Capture (later a custom fork; DXGI Desktop Duplication fallback), with a repeater thread for idle keepalive/IDRs and transient-stall tolerance. 5. Going vendor-specific: the part that made it fast Generic capture→CPU-copy→encode is slow everywhere; the win: keep the frame on the GPU from capture to bitstream. Per vendor: NVENC (NVIDIA): no SDK linked (API dynamically loaded ); zero-copy writes capture into a shared D3D11 texture behind a keyed mutex, else a CPU bridge. Intel QSV/oneVPL: same-adapter capture+encode fuses the downscale into the VPP pass (BGRA→NV12 + resize in one shot). macOS (VideoToolbox): ScreenCaptureKit (12.3+, CGDisplayStream fallback) via objc2 runtime interop only , so one binary loads on every macOS version, same IOSurface zero-copy. 6. The client: WebCodecs over <video> Fast path: an RTCRtpScriptTransform feeds a worker VideoDecoder ( optimizeForLatency: true ) onto an OffscreenCanvas , latency hints zeroed. A <video> fallback covers missing WebCodecs or stalls. It also feels like a monitor: fullscreen + input/wake locks, /leave beacon on exit. 7. Adaptive bitrate, sessions & security A BWE driver reads getStats every 250ms, pushing a smoothed bitrate into the encoder. Changing settings triggers in-place renegotiation (a reconfig/kick epoch the client polls) with no display teardown. Each host is gated by a session ID + 6-digit OTP ( OtpLimiter lockout); every device is isolated, over HTTPS + DTLS/SRTP. 8. Networking + status (v0.2.3) Same-network is direct, no servers. Offline mode stands up an ad-hoc hosted network , no infrastructure needed. Cross-network adds a cloud relay (WebSocket to session.screenextend.app ) tunneling signaling while media stays P2P; a self-hosted TURN server covers hard NATs. A logbus feeds an in-app terminal. Working today: Windows/macOS hosts, per-vendor GPU encode, per-device displays, adaptive bitrate, OTP sessions, offline mode, and cloud relay."}]...
|
Title: ScreenExtend by @epiccodewizard | Stardance Title: ScreenExtend by @epiccodewizard | Stardance
Devlogs:
ScreenExtend Devlog: Building the Rust Engine Under a Wireless Second Monitor TL;DR ScreenExtend turns any device with a browser into a real, wireless extended monitor for a Windows host, no client app and no cables (it began so my brother could use his iPad for notes at debate tournaments). Scan a QR code and the host spins up a real virtual display, streamed over WebRTC with hardware H.264. The React/TS control UI existed before; everything else (Rust core, GPU pipeline, WebCodecs client, cloud relay) was built from scratch , always latency-first, quality-second. 1. The spine: Tauri + a typed Rust↔TS bridge tauri-specta exports a fully-typed src/lib/bindings.ts for commands (TS→Rust) plus typed events (Rust→TS): devices, network, cloud status, logs. A code-generated bridge beats maintaining one by hand. Let the code write itself! 2. Virtual displays: faking a real monitor Each client gets its own virtual display the OS treats as real hardware, a true second screen, not mirroring. On join the host creates one sized to the client , forces extend topology, then captures it once attached. On Windows a signed IDD driver installs at runtime (via nefconc + certutil ), and it tears down cleanly on leave. 3. First light: WebRTC + WHEP + H.264 The media path is WebRTC (real-time, in every browser). Signaling is WHEP : the client POSTs an SDP offer, the host answers in-response, no signaling server. Codec is H.264 , universal hardware decode on clients and encode (NVENC/QSV/AMF) on hosts. The first release streamed NVENC to a plain <video> ; it worked but was laggy. It binds HTTP + HTTPS (self-signed via rcgen ) , since WebCodecs needs a secure context. 4. The pipeline: capture → encode → broadcast Capture is Windows Graphics Capture (later a custom fork; DXGI Desktop Duplication fallback), with a repeater thread for idle keepalive/IDRs and transient-stall tolerance. 5. Going vendor-specific: the part that made it fast Generic capture→CPU-copy→encode is slow everywhere; the win: keep the frame on the GPU from capture to bitstream. Per vendor: NVENC (NVIDIA): no SDK linked (API dynamically loaded ); zero-copy writes capture into a shared D3D11 texture behind a keyed mutex, else a CPU bridge. Intel QSV/oneVPL: same-adapter capture+encode fuses the downscale into the VPP pass (BGRA→NV12 + resize in one shot). macOS (VideoToolbox): ScreenCaptureKit (12.3+, CGDisplayStream fallback) via objc2 runtime interop only , so one binary loads on every macOS version, same IOSurface zero-copy. 6. The client: WebCodecs over <video> Fast path: an RTCRtpScriptTransform feeds a worker VideoDecoder ( optimizeForLatency: true ) onto an OffscreenCanvas , latency hints zeroed. A <video> fallback covers missing WebCodecs or stalls. It also feels like a monitor: fullscreen + input/wake locks, /leave beacon on exit. 7. Adaptive bitrate, sessions & security A BWE driver reads getStats every 250ms, pushing a smoothed bitrate into the encoder. Changing settings triggers in-place renegotiation (a reconfig/kick epoch the client polls) with no display teardown. Each host is gated by a session ID + 6-digit OTP ( OtpLimiter lockout); every device is isolated, over HTTPS + DTLS/SRTP. 8. Networking + status (v0.2.3) Same-network is direct, no servers. Offline mode stands up an ad-hoc hosted network , no infrastructure needed. Cross-network adds a cloud relay (WebSocket to session.screenextend.app ) tunneling signaling while media stays P2P; a self-hosted TURN server covers hard NATs. A logbus feeds an in-app terminal. Working today: Windows/macOS hosts, per-vendor GPU encode, per-device displays, adaptive bitrate, OTP sessions, offline mode, and cloud relay.
I met with some friends to discuss my app…and realized I gotta lock in with the features. Among the various topics we discussed like the difficult UI or lack of automatic updates, they really wanted remote control features. So, I set out to make the remote display something I can actually touch, click, and type into. And patching some other bugs along the way. 9. Remote input This is the main headline feature. Streaming pixels one way was solved; now the client had to send input back up the wire and have the host replay it as if it came from real hardware. Host side (Windows). A new input backend injects events through a synthetic pointer device , so mouse, touch, and pen all seem real as opposed to faked mouse moves. The synthetic device can execute touch or mouse movements from the tablet client. macOS and Linux backends are stubbed and will come later (trust me bro). The wire. This side had to be optimized for dead-low latency like the rest of the project. Instead of passing strings or using some wrapper library, I made my own binary protocol (a dedicated protocol module) serialized over WebRTC data channels , not the media path. Client-side input.js captures keyboard, mouse, pointer (touch/pen), wheel, clipboard, and drag-drop and ships them across. The code basically catches every single frontend input event and forwards all those events (20+)! The routing is latency-first, same as everything else, with three different paths. fast-path events (pointer moves, wheel) take an unreliable channel , where a dropped packet is cheaper than a late one, while clicks, keys, and clipboard take the reliable channel where every event must land exactly once. It’s not that big of a deal if one small mouse delta doesn’t go through, but it definitely is a big deal if a click doesn’t go through. 10. Browser compatibility detections Not every browser can do WebCodecs, secure contexts, or the input paths above. Rather than fail silently, I added a compatibility check on both the browser and client up front. It shows compatibility modals with per-feature lists to ensure the user knows what’s going on. 11. Some more small fixes I added two quality-of-life additions: avatars (upload custom profile pictures) and zoom controls (ctrl/cmd +/-). 12. Encoders that don’t explode when funny stuff happens Oh my god…one of the biggest issues by far. When I ran the NVIDIA encoder at high FPS, it didn’t crash. However, the Intel Quick Sync encoder would arbitrarily crash at high FPS and wouldn’t give a reason why. I audited a buncha different parts of my code and eventually found that FPS was the issue, not resolution or low-latency flags. Hence, I added a binary search that probes the hardware for its true maximum supported fps and clamps to it before the encoder can choke. Essentially, I ask the encoder “can you do 1920x1080 at 240 fps?” –> “no” –> “what about 120 fps?” –> “yes” –> “what about 180 fps?”. This keeps repeating till the max FPS is found and streamed to the client. Rounding out the release, I made a variety of different UI fixes like the modal fixes , backdrop overlap, a stray uninstall-modal backdrop, and cloud reconfig errors . More progress to come!
Sooooo this devlog is mostly comprised of website changes. I have a conference in San Francisco and wanted to polish up the app before publishing. Here are the main changes I made: 13. Random chores and updating the website I absolutely love shadcn-ui, but so do AI models. In past reviews by stardance raters, as well as family and friends, they pointed out the website looked AI-generated. Hence, I decreased the number of gradients and added basic animations to make the site feel more alive. This was a first for me to implement animations, but the Tailwind docs made it quite simple. I used a specific code-like font instead of the generic fonts I had and tidied up CSS classes. The biggest change was adding a blurred-geometric background for a nicer feel. 14. Redesigning the website completely I felt it was better to update the website as a whole, so I changed up the user interface. When I tested the app with real users, they complained that they didn’t know how to actually use the app. I changed the hero design to have clearer text and added an SVG-animation component showing how the site actually works. The feature section stayed the same, but there was a highlights grid (inspo https://cider.sh/ ) to highlight the main features. The FAQ was shortened to my liking, and I pulled some utilities from Tailwind for animations. In terms of images, I updated the images of the app featured on the website and cleaned up some of the dimensions related to that CSS. The old homepage still lives inside OldHome() but isn’t used anymore. 15. Tidying up the README and build workflows I edited the README to remove redundant information and make it more developer-focused. I also updated some information regarding GPU builds. For the build workflow, I ensured it would only run if the commit ended in “rebuild”. This ensures unnecessary build minutes are not spent on small changes not requiring a full rebuild. 16. Wake lock API fallback This app aims to support all devices, but older devices have…funny APIs to say the least. For WebRTC, I implemented the legacy encoded streams API. However, the device would still turn off for seemingly no reason while the video was playing. On older devices, the wake lock API is not supported. However, there’s a unique workaround for this: any video element playing on the webpage will keep the screen from dimming. Hence, I used the NoSleep library to create an off-screen 1-second video element that keeps looping, ensuring the display doesn’t go dark. Some very fun stuff with browsers. That’s it for this devlog! Mostly minor changes, but the next one will have better SW encoding support among other changes. Stay tuned…
I had so much fun at the conference in San Francisco! I met a lot of cool people who gave me advice on the app, although I didn’t see the downloads spike 😭. I primarily began working on a SW encoder and other miscellaneous changes: 17. Remote control toggle Sometimes, the user doesn’t want a client to have remote control access. Although the purpose of the app is to have remote control, it is useful to disable this feature. On the frontend, I added a toggle switch that enables or disables the remote control backend. I was debating whether WebRTC negotiation was required as well, but decided to do so in the end. The remote control used data channels, so an unused data channel would result in slightly lower latency. Renegotiation ensured the stream stayed as efficient as possible without sending redundant data. 18. Update checking In order for current users to access newer versions, I wanted to add an update functionality. I’m not using Tauri’s update plugin just yet, so I run a simple check. The app, on startup, checks the latest release tag on GitHub. If it’s not equal to the current version (rollback or higher version), the user is prompted to download the newer version. Automatic updates will come next. 19. The big boy: software encoding This one’s been a long time coming. A lot of machines like VMs or computers with a weird setup just don’t have a working hardware encoder (Intel/AMD/Nvidia), and until now that meant the app straight up didn’t work there. So I built a full CPU-only x264 fallback. For the pipeline, the frames come as raw BGRA bytes that the other supporters already encoded. They must be converted to I420 before going to libx264, whose build I pulled from OBS. As a side note, the DLL is bundled with the app at runtime to ensure no missing dependencies. As with any encoder, the rate control is ABR with a tight VBV, as well as an infinite GOP. Besides the technical jargon, this just means latency is the north star and nothing else matters. The whole software variant is added to the encoder vendor enum, and wired into the fallback chain: if NVENC fails, try Intel; if Intel fails, fall back to software before giving up entirely. There’s also a manual override if someone really prefers software encoding, but this is not the default. There’s a big CPU cost compared to hardware encoding, so it’s very much a last resort and only kicks in if absolutely no GPU encoders are available. But “last resort that works” beats “doesn’t work at all.” That’s it for this week! I plan to have some smaller quality-of-life changes and better updates coming soon…
Oh my lord…I crammed a lot of features into this week. I have yet to do proper audits of the codebase as a whole, specifically related to latency optimizations. I added a lot more code that affects the WebRTC pipeline, but I at least got the core features working. 20. Automatic updates For a while, the app relied on manual updating. It would check the latest version on Github, but users would have to go to the website, download the installer, uninstall the current version, and reinstall the newer version. This also messed up config and was a huge pain. Hence, I generated my own signing keys and used the Tauri updater plugin to automatically update apps. When the app is first launched and if an update is available, it automatically downloads and installs it without any user action. To make this more robust, I added a progress bar while downloading the update. On Windows specifically, the app must be shut down and restarted, so a blocking modal prevents devices from joining till this is done. I originally made this modal manually, but switched to using AlertDialog from ShadCN. Another issue I faced was the latest.json manifest. As I used custom filenames when downloading and installing updates, I had to manually patch the JSON. I learned a lot about the Tauri updater Github action through this, as I had to figure out how Tauri generated build filenames and how I could safely update them. 21. Quality of life for client devices I finished QOL fixes on the client side: Remember past devices to quickly import preferences or ban devices (all config saving is IP-based) Warn if the user is attempting to connect from the same device (this app is a remote control tool, but you can’t exactly remote control yourself) If the screen orientation changes, the virtual display is updated accordingly using CSS media queries to ensure a seamless experience A no fullscreen mode was added so users could quickly switch apps and maintain productivity 22. Quality of life for host devices I converted all in-app modals and error messages to JSON. This allowed me to add i18n language support, so I could easily translate my app to other languages. To detect and ensure only a single instance of the app was running, I previously used a file lock. However, there was an issue with MSI builds falsely detecting a file lock and not opening. I switched to a basic TCP model for IPC so that multiple processes running can figure out which was there first and shut down the others. 23. More more more Mac features! I’ve always felt a bit sad for my Mac users. I don’t have a Mac to test on, so I keep borrowing my dad’s Mac, which results in insanely slow development times. Nevertheless, I made some serious progress this week. The biggest thing was a simpler installation process. Many users would complain that they didn’t remember if they’re on Intel or Apple Silicon, so I now distribute a universal DMG. In terms of the app itself, I added a permissions check for screen recording and input injection. It would run a live test of screen capture or key input to see if the app actually had permissions; therefore, down the road it wouldn’t cause issues. I initially tried to do a soft check without an actual test (i.e., read the settings app), but this didn’t work. The only foolproof way was to call the API itself. The biggest feature by far was adding Mac input injection. Using accessibility APIs and a charmap similar to Windows, it would inject input onto the Mac screen. I could remotely log in from my Chromebook and get a lot of work done. I mirrored the structure and code on the Windows input injection pipeline, so no major difficulties here. That’s it for this week! Lotta stuff added, especially for the Mac users. I have a long list of features to continue building, specifically regarding easier Windows uninstall processes, onboarding, and an overall better UX. See you soon!
I speedran shipping a buncha features…in the span of a few days. I logged a copious amount of hours on Hackatime building random stuff. I tried some things with recording system audio and building a driver…those didn’t go the best, but I’ll cover that in the next devlog. Here are the main changes this week: 24. Even more quality of life changes Compared to last time, I wanted the user experience to improve even more. Specifically, for the Windows client, a custom display driver is required. On Macs, the functionality I need is built in, so none is required. However, uninstalling this display driver used to be a pain for users. Now, I bundled it as part of the uninstall script. I wasn’t sure how to do this, but Tauri has many useful guides and issues opened regarding custom WiX/NSIS code. When the window isn’t focused, join and leave notifications are toasted. This allows the user to stay informed even when the app isn’t open. Basic feature but very useful. I’d often get annoyed that I needed to keep re-entering the password to log in to a previously connected device. Hence, I added auto-join for devices based on their IP. This ensures that commonly connected devices can save time when reconnecting. 25. Onboarding screens The app is intuitive to use…or so I thought? Some of my beta testers were confused as to the various features and how to use the interface. Hence, I used NextStepjs to add onboarding components. This would dim the UI and only highlight the component being displayed, along with a message next to it. I liked the styles of NextStepjs a lot, so I chose it. There were some issues regarding window resize, so I made the onboarding exit and reopen to the last step when the window is resized. This way, the positioning of elements was forcefully recalculated. 26. Random security fixes My app had various vulnerabilities scattered throughout, so I ran a vulnerability Claude skill and patched some holes. The main issues fixed were: Checksums of bundled DLLs and resources are checked before being pushed to GitHub Actions Tauri CSP and allow list are actually enforced instead of being set to allow all TLS cert used for hosting the HTTPS domain has more secure file system permissions to reduce unwanted tampering of files Devices are trusted by a uniquely generated token, not by IP, to decrease the chance of impersonators 27. Command-line interface A majority of the time on this devlog was spent on the CLI. It wasn’t that hard (from a technical perspective), mainly just translating a lot of the UI code into Tauri CLI commands and mapping them correctly in the generated JSON file. One of the harder things to figure out was setting up cross-thread AppState, when the app wasn’t exactly running…turned out I just had to move the initialization command to before the window is created, so it would run inside both CLI and GUI modes. To present the QR codes better. I used qr2term to display the QR codes. By default, all logging is hidden. This turns ScreenExtend into a clean CLI mimicking the GUI. Hoorah! That’s it for this devlog. Not much to conclude, but plenty more features coming. Stay tuned!
Oh my lord, I keep forgetting to write devlogs every 10 hours and am losing hours on each one. Nevertheless, I finally finished audio work! Plus some other things like running claude security agents on the code base and patching stupid vulnerabilities. Here’s how the week went: 28. HiDPI and Mac Issues Whenever I use my Mac with ScreenExtend, the stream looks blurry due to Macs having HiDPI screens. I fixed this by adding basic HiDPI scaling on Windows. The UI has a DPR slider based on autodetected values. This DPR is multiplied by the screen resolution for a shaper display. One issue that arose with the new displays was the fact that the display would randomly not scale properly, so the task bar and apps would appear tiny. To mitigate this, I reapplied all display settings after resolution changes and a timeout. 29. AUDIO WORKS!!!! For the longest time, I tried getting audio to work. On Windows, the process was straightforward: a WASAPI loopback system audio capture session. I wanted to build my own custom driver to capture audio faster, but this would be too expensive to deploy. I read other Rust implementations and quickly wrote the code. On the other hand, Mac was a whole different issue. On older versions of Mac, system audio recording is not supported. Hence, for Macs below 13.0, I wrote a custom audio driver. I didn’t have a clue about implementing an AudioServerPlugIn on Mac, but worked out the specifics by looking at the Blackhole audio driver. I did have to proxy physical volume buttons to work (i.e. I listen for taps and change the audio level within the driver). For older Macs, I used ScreenCaptureKit with an extra audio flag. This was a simple fix to capture audio. On even newer Macs, there’s a Process Tap API to record system audio with low latency. Once again, I didn’t have much difficulties implementing these due to the abundance of documentation. 30. Streaming Audio over WebRTC (with A/V sync) When sending video and audio separately, the two are prone to fall out of sync, so watching movies or videos is difficult. To mitigate these issues, I wrote an A/V sync host clock. This packages the time on the host clock to audio samples and video frames, such that they can be reconstructed and coupled on the receiving end. On the browser side, I began by implementing a basic audio streamer with an audio element. However, similar to video, there’s always a faster method possible. I used the AudioDecoder class from WebCodecs to implement a worklet class and jitterbuffer. In simple terms, this would decode audio on a separate thread, like WebCodecs prefers, and send the audio back to be played to the user. 31. Windows Video Encoding Speedups I made a few encoding speedups on Windows targets: The NVENC capture encode system uses a texture ring implementation: a pool of 3-5 encoder instances paired with a frame queue, allowing multiple frames to be encoded concurrently BGRA encoding is done directly in the library instead of using a third-party implementation Unchanged frames in DXGI capture are not encoded again, reducing CPU load 32. Mac Video Encoding Speedups I made a few encoding speedups on Mac targets: Request LatencyCritical activity for the session to ensure App Nap and other sleep measures don’t affect the thread Analogous to DXGI, skip encoding when CGDisplayStream reports no dirty rects Not an encoding speedup, but preferring 5 GHz for Mac hosted networks to ensure higher speeds Lotta stuff done this week, am I right? I made lots of progress and finished the bulk of my features, although Linux support is still in the works. I’ll make the 1.0.0 release soon and start a Stardance ship as well. I’ll likely add Linux support after 1.0.0, as I need to research EVDI and the WSL display compositor, as well as other minor tweaks for Windows/Mac. See y’all in the next devlog!
One step closer to finally shipping…or so I hope. I speedran shipping this next feature, so it took a lot of time. This feature is mainly for myself. I have an old Mac (running 10.13 from 2017, really old I get itttt). I want my app to run on there, but it currently only supports 10.15+. Hence, I went down a funny rabbit hole in an attempt to add support. 33. Cleaning up dylib signature lookups at run time One of the key challenges I faced throughout development was how to have a unified codebase for multiple API versions. I decided that instead of version-gating APIs and guessing which beta/normal versions they would be accessible on, I’d test for APIs at run time. I changed VideoToolbox to use this logic: it would attempt to set/use APIs and variables available at higher runtimes, but would work fine without them and have fallbacks. This ensured both legacy and modern systems functioned well. 34. Airplay automations…? As I was doing competitor research, I noticed many of the other apps supported Mac 10.13-10.15 as well as 10.15+, while mainly only supported 10.15+. Essentially, they started a fake Airplay server, had the Mac connect it, and set the display mode to “Use as separate display”. This would create a virtual display that the app would then use for its own functions. As ScreenExtend requires its own display on older machines, similar to this, where CGVirtualDisplay isn’t an option, I decided to use this method. I had my app automate opening the Airplay menu and connecting as well, in addition to running the fake server. Most of the process was straightforward, especially due to the abundance of fake Airplay server implementations online and my own experience with apps like LonelyScreen. The one issue of this approach is that only one display can be connected at a time, so any tertiary devices wanting to connect have to wait their turn. I guess the only option is to by a new mac then… 35. Client UI update cleanliness fixes Due to the one device restriction, I implemented a separate page that would be served if the display slot was being used up. It would be coupled with a short message explaining the consequences of the older Mac version. There were also bugs related to session teardown (keyboard still being locked, video stream still active in the background, etc) that I quickly squashed after finding them. Soooo in hindsight, I prolly should’ve bumped this up to 0.6.0, but I left it at 0.5.4. Oh well, I’ll increment the version by next release. Only a few more features to go on the feature list before hitting v1 and shipping!!!
Ships:
Initial release for ScreenExtend! Please give feedback and read the initial devlog (shorter one here, longer one at https://github.com/ScreenExtend/ScreenExtend/blob/main/DEVLOG.md ) for detailed information.
Initial second release for ScreenExtend! Please give feedback and read the devlogs; they’re detailed and describe the project a lot better than here. The website https://screenextend.app/ quickly summarizes it....
|
1793958758.2040858
|
1794045158.2040858
|
|
37425
|
My very own WebOS by @csiripelomadarak | Stardance
|
csiripelomadarak
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @csiripelomadarak | St Title: My very own WebOS by @csiripelomadarak | Stardance...
|
1793958759.4170032
|
1794563559.4170032
|
|
70008
|
Orbital by @najil_kilayil | Stardance
|
najil_kilayil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Orbital by @najil_kilayil | Stardance
|
1793958760.3057134
|
1794822760.3057134
|
|
1048
|
YaoiBot by @libewa | Stardance
|
libewa
|
2
|
6.0
|
17
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-29T10:15:34Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I upgraded the bot in many ways. The NixOS service is now security-hardened, no longer runs as root, and uses best-practice methods to keep the access token secret. I also added configuration options, so that you can run the bot with different search queries without modifying the source code yourself.", "repo": "https://codeberg.org/libewa/yaoibot", "demo": "https://mastodon.social/@yaoibot"}, {"ship_num": 2, "ts": "2026-06-01T20:47:38Z", "hours": 3.0, "multiplier": 6.42, "payout": 17, "blessing": "neutral", "text": "I made a Mastodon bot that posts Yaoi art every hour. I used Deno to build it, and learned how to use the megalodon NPM package. I first tried to run the bot using the cronjobs feature on Deno Deploy, but that did not work for some reason, so I decided to deploy it on Nest instead. Thus, I also learned how to configure NixOS on Proxmox (and I didn’t even get Hackatime credits for this), how to write NixOS modules, and how to package Deno applications for NixOS (you don’t). This was supposed to be a quick entry/starter project for Stardance, and I finished it in a single day (even though I was supposed to be doing other things, for school 🫣).", "repo": "https://codeberg.org/libewa/yaoibot", "demo": "https://mastodon.social/@yaoibot"}]...
|
[{"post_id": 57226, "ts": "202 [{"post_id": 57226, "ts": "2026-08-29T10:12:50Z", "hours": 1.9381, "text": "Many things can now be configured from the NixOS module, including the search query and rating filter. There is also documentation now!"}, {"post_id": 8223, "ts": "2026-06-13T17:54:52Z", "hours": 0.8958, "text": "Over some time, I made a few improvements. The service now no longer runs as root, but as a dynamic user, which allocates a UID and GID at random. I had a few issues in the meantime, because this also automatically enables a lot of hardening functionality, preventing Deno from downloading its dependencies. I overrode the DENO_DIR environment variable and had systemd create a cache directory, and now it works. Also, the access token is now no longer provided as a string, but inside an encrypted .env file. The dotenv file, however, is not loaded by Deno, but by systemd, which then passes it to the Deno process as usual. Thanks to @jak2k for a lot of pointers to these systemd features!"}, {"post_id": 406, "ts": "2026-06-01T20:08:37Z", "hours": 2.1683, "text": "It turns out the library hiccups when using a RAM buffer. I now save the files to /tmp, and create a ReadStream, and now it works! The rest of the time was spent writing a Nix flake, which both wraps the package (currently using a shell script, until I figure out how to run deno compile in the offline sandbox), and contains a NixOS module, which creates a systemd timer to run the bot as a oneshot service."}, {"post_id": 245, "ts": "2026-06-01T12:34:11Z", "hours": 0.5083, "text": "I wrote code that should work™. But for some reason, I get an HTTP error 400, and the stacktrace is of no use, since it is somewhere within the event loop. Also, some time is missing from Hackatime, since it only tracks git repositories."}]...
|
Title: YaoiBot by @libewa | Stardance
Devlogs:
I Title: YaoiBot by @libewa | Stardance
Devlogs:
I wrote code that should work™. But for some reason, I get an HTTP error 400, and the stacktrace is of no use, since it is somewhere within the event loop. Also, some time is missing from Hackatime, since it only tracks git repositories.
It turns out the library hiccups when using a RAM buffer. I now save the files to /tmp, and create a ReadStream, and now it works! The rest of the time was spent writing a Nix flake, which both wraps the package (currently using a shell script, until I figure out how to run deno compile in the offline sandbox), and contains a NixOS module, which creates a systemd timer to run the bot as a oneshot service.
Over some time, I made a few improvements. The service now no longer runs as root, but as a dynamic user, which allocates a UID and GID at random. I had a few issues in the meantime, because this also automatically enables a lot of hardening functionality, preventing Deno from downloading its dependencies. I overrode the DENO_DIR environment variable and had systemd create a cache directory, and now it works. Also, the access token is now no longer provided as a string, but inside an encrypted .env file. The dotenv file, however, is not loaded by Deno, but by systemd, which then passes it to the Deno process as usual. Thanks to @jak2k for a lot of pointers to these systemd features!
Many things can now be configured from the NixOS module, including the search query and rating filter. There is also documentation now!
Ships:
I made a Mastodon bot that posts Yaoi art every hour. I used Deno to build it, and learned how to use the megalodon NPM package. I first tried to run the bot using the cronjobs feature on Deno Deploy, but that did not work for some reason, so I decided to deploy it on Nest instead. Thus, I also learned how to configure NixOS on Proxmox (and I didn’t even get Hackatime credits for this), how to write NixOS modules, and how to package Deno applications for NixOS (you don’t). This was supposed to be a quick entry/starter project for Stardance, and I finished it in a single day (even though I was supposed to be doing other things, for school 🫣).
I upgraded the bot in many ways. The NixOS service is now security-hardened, no longer runs as root, and uses best-practice methods to keep the access token secret. I also added configuration options, so that you can run the bot with different search queries without modifying the source code yourself....
|
1793958761.185883
|
1794045161.185883
|
|
8290
|
My awesome macropad! by @nishamwagle_5477 | Starda My awesome macropad! by @nishamwagle_5477 | Stardance...
|
nishamwagle_5477
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @nishamwagle_5477 | Title: My awesome macropad! by @nishamwagle_5477 | Stardance...
|
1793958762.368316
|
1794563562.368316
|
|
39560
|
Energy Generating Floor by @sebasfregoso | Stardan Energy Generating Floor by @sebasfregoso | Stardance...
|
sebasfregoso
|
0
|
3.87
|
0
|
[]
|
[{"post_id": 45601, "ts": "202 [{"post_id": 45601, "ts": "2026-08-12T06:17:09Z", "hours": 1.7333, "text": "(Lowkey Burned myself with the Soldering Iron) Testing Stage and right now im working on finding the best way to wire the Piezo’s and also how I organize them!"}, {"post_id": 44351, "ts": "2026-08-10T01:49:19Z", "hours": 1.7669, "text": "Setting up the main part to redirect energy in one direction"}, {"post_id": 34554, "ts": "2026-07-25T11:10:45Z", "hours": 0.3667, "text": "Currently Designing the general electrical set up for my energy-generating floor. I still need to figure out the detailed setup for the piezoelectric sensors; ideas are welcome!"}]...
|
Title: Energy Generating Floor by @sebasfregoso | Title: Energy Generating Floor by @sebasfregoso | Stardance
Devlogs:
Currently Designing the general electrical set up for my energy-generating floor. I still need to figure out the detailed setup for the piezoelectric sensors; ideas are welcome!
Setting up the main part to redirect energy in one direction
(Lowkey Burned myself with the Soldering Iron) Testing Stage and right now im working on finding the best way to wire the Piezo’s and also how I organize them!...
|
1793958763.2541482
|
1794563563.2541482
|
|
37467
|
InkZone by @YoshiHack | Stardance
|
YoshiHack
|
1
|
13.88
|
98
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-20T19:46:21Z", "hours": 13.0, "multiplier": 8.76, "payout": 98, "blessing": "neutral", "text": "I made a A ESP-32 based sports scoreboard", "repo": "https://github.com/YoshiHack/InkZone", "demo": "https://wokwi.com/projects/470194904712457217"}]...
|
[{"post_id": 32629, "ts": "202 [{"post_id": 32629, "ts": "2026-07-21T22:19:12Z", "hours": 0.8811, "text": "Just finishing touches"}, {"post_id": 31955, "ts": "2026-07-20T19:36:31Z", "hours": 1.1572, "text": "I started by Making a gameday dashboard now all time zones are good and started getting it ready for official launch"}, {"post_id": 31554, "ts": "2026-07-20T01:44:44Z", "hours": 12.1111, "text": "July 16: Started working on the base code Today i started working on the base firmware including PIO, I’ve made placeholder games for now until i connect a API for the real sports broadcasts. Also I’ve made a web control panel where you can set your favorite team, time zone, and refresh rate. July 17: Started testing I’ve started using the Wokwi simulator to work on tests, i also adapted a ESPN API to pull NFL games and put them on the screen (it took a while to figure out the SPI configuration). I also added physical buttons and website buttons to switch between a screen with 1 game (you’re Favorite team) and 5 soonest games, I made a screen for if there are no games today, i also started working on different leagues July 18 : Kept working To start today i kept trying to fix the NCAA football error. Ok i finally fixed it. I started working on the NBA client, Now working on NCAA basketball July 19 : Kept working even more I started by working on NHL, then started working on adding a league selector to the webpage then removed all of the extra NFL names, worked on the readme a little, I started adding a score animation finished animation"}]...
|
Title: InkZone by @YoshiHack | Stardance
Devlogs: Title: InkZone by @YoshiHack | Stardance
Devlogs:
July 16: Started working on the base code Today i started working on the base firmware including PIO, I’ve made placeholder games for now until i connect a API for the real sports broadcasts. Also I’ve made a web control panel where you can set your favorite team, time zone, and refresh rate. July 17: Started testing I’ve started using the Wokwi simulator to work on tests, i also adapted a ESPN API to pull NFL games and put them on the screen (it took a while to figure out the SPI configuration). I also added physical buttons and website buttons to switch between a screen with 1 game (you’re Favorite team) and 5 soonest games, I made a screen for if there are no games today, i also started working on different leagues July 18 : Kept working To start today i kept trying to fix the NCAA football error. Ok i finally fixed it. I started working on the NBA client, Now working on NCAA basketball July 19 : Kept working even more I started by working on NHL, then started working on adding a league selector to the webpage then removed all of the extra NFL names, worked on the readme a little, I started adding a score animation finished animation
I started by Making a gameday dashboard now all time zones are good and started getting it ready for official launch
Just finishing touches
Ships:
I made a A ESP-32 based sports scoreboard...
|
1793958764.1624
|
1794045164.1624
|
|
27936
|
accessible lawn mower by @euler_rr | Stardance
|
euler_rr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: accessible lawn mower by @euler_rr | Starda Title: accessible lawn mower by @euler_rr | Stardance...
|
1793958765.3194807
|
1794563565.3194807
|
|
38888
|
Byte-Stream by @forkosssa | Stardance
|
forkosssa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Byte-Stream by @forkosssa | Stardance
|
1793958766.1980643
|
1794563566.1980643
|
|
6832
|
My first slack bot! by @hamzayasir9211 | Stardance
|
hamzayasir9211
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T22:15:45Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made my first ever slack bot. tbh every step seemed like a challenge but i made it to the end anyways it was fun making a bot of my own", "repo": "https://github.com/MuhammadHamzaYasir/api-bot", "demo": "https://drive.google.com/file/d/12CGFmHZzjKo2FQf19uWJ3U9rMLQyL159/view?usp=sharing"}]...
|
[{"post_id": 23260, "ts": "202 [{"post_id": 23260, "ts": "2026-07-06T03:19:48Z", "hours": 1.5958, "text": "just made my first ever bot, a slack bot cant wait to deploy it on nest my approval is pending.."}]...
|
Title: My first slack bot! by @hamzayasir9211 | St Title: My first slack bot! by @hamzayasir9211 | Stardance
Devlogs:
just made my first ever bot, a slack bot cant wait to deploy it on nest my approval is pending..
Ships:
i made my first ever slack bot. tbh every step seemed like a challenge but i made it to the end anyways it was fun making a bot of my own...
|
1793958767.0853665
|
1794045167.0853665
|
|
25414
|
personal website by @shuaiyf | Stardance
|
shuaiyf
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: personal website by @shuaiyf | Stardance
|
1793958768.241388
|
1794563568.241388
|
|
30993
|
Perfect Start by @Piez | Stardance
|
Piez
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T12:12:23Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Perfect Start! The Perfect Start Page for your browser’s new tab! Perfect Start is my attempt at making a cool and customizable Start Page that is built with React + Typescript! It is my first ever try in making a project in React, and by far the biggest project (in terms of scope) I have EVER made :D Features List! Live-clock, and Datetime features A custom google search bar Simple Shortcuts Card Add, Edit, and Delete Shortcuts while in Edit Mode! Persistent Shortcuts using localStorage!", "repo": "https://github.com/dumpiez/perfect-start", "demo": "https://perfect-start.vercel.app/"}]...
|
[{"post_id": 27528, "ts": "202 [{"post_id": 27528, "ts": "2026-07-13T05:06:57Z", "hours": 3.9581, "text": "dedededevvvloggg #04: shortcuts and more shortcuts!!! Perfect-Start now saves to localStorage, and has completed Shortcuts features like adding a new Shortcut, Editing an existing shortcut, and deleting a shortcut! This was honestly a rollercoaster of emotions because on one hand I’m so happy I got it over with, but on the other there was so much React concepts I had to learn I started to brain-fog when I was working on it lol. I didn’t wanna rush too much so I took a lot of breaks and thus, this update took me 2 days to complete. Let’s get it over with though! Shortcuts now save to localStorage !! This is my first time dealing with localStorage , so I’m happy its application is SOMEWHAT simple enough (atleast for this project). Shortcuts now have their own IDs , so React won’t be screaming at me anymore about keys!!! Finish Edit Functionality, so you can Add, Edit and Delete Shortcuts! And that’s the TLDR of this devlog!! You can continue reading if you want to read myself yapping about the challenges I went through to implement the edit shortcuts functionality though! storytime :O Implementing the localStorage feature was actually pretty easy, I just had to use the useEffect() hook for everytime the Shortcut List State changed, and check whether the Shortcut List is available in localStorage or not. If it doesn’t, then it’ll return the default Shortcut List. Implementing the Edit Shortcuts Function though was a completely different story. I thought it was just going to be a quick and easy change to /src/components/shortcut.tsx and /src/components/modal.tsx but oh boy, I was so wrong… At first, I rendered the Modal component inside the Shortcuts component, which rendered one Modal per Shortcut .. This was due to the Shortcuts component being rendered with .map() , and my smarty pants forgot about it. Great Start! I proceeded to write some more code for the Modal component, when I tried to call a function that I had passed in as a prop, but still doesn’t recognize it as a function. This had me inspect and change almost everything inside of the Modal component JUST for the sole purpose of debugging it, but it just… turned out… that I hadn’t… passed in anything in App.tsx … I was so ready to crash out Thank god for git’s amazing version control After this I decided to get some sleep (pointed out by my git commit lol) The next day came, and I got so much clarity! (especially after that disastrous session last night xD). I quickly got to work, and did the following changes: get rid of modalVisibility state in favor of modalMode , which has three states: “add”, “edit”, and null! this worked miraculously since the modal can now distinguish between popping up the “add shortcut” popup, “edit shortcut” popup, or don’t show any pop up at all. make the editShortcut() function actually… function properly instead of saying “i am so sleepy” using .map() again!!! and… that’s about how much i struggled with THIS supposed specific simple feature! thank you for reading this far!! i hope you have a nice day. peace out!!!!"}, {"post_id": 26328, "ts": "2026-07-11T01:55:59Z", "hours": 0.6381, "text": "devlog #03! I wanted to keep it really simple this time, (and I did!) so the changes I made were literally just: Turn each component in App.tsx into its own file in ./src/components/ This is so as to remove as much headache as possible before making new, even more complex features Styled the Add Shortcuts Modal I went for something simpler this time (mostly because I didn’t know how to style it lol). This is most likely subject to change though! Watch out for the next devlog! I reckon it’s going to be something big again! 👀"}, {"post_id": 26014, "ts": "2026-07-10T16:16:41Z", "hours": 5.9803, "text": "oh boy! This devlog was actually supposed to be really short, since I WAS supposed to be implementing ONLY the shortcuts, but one thing led to another and… hey! I’ve got shortcuts AND the edit shortcuts functionality (partially) done! Before we start.. Let’s start this off by; I STRUGGLED so much with this. From the previous devlog you probably know that I’m still very much a beginner in React, and if I’m being honest this is the BIGGEST project (by scope) I’ve ever tried to make, so you could probably imagine how much hassle I went through xD. Enough with that, here’s what I implemented! Shortcuts This should’ve been very basic stuff, but I (SOMEHOW) struggled with it. The biggest change I did was converting the hard-coded shortcut into a React State, which is rendered with .map() . This helped SO MUCH, and made state updates A LOT easier. shortcuts . map (( shortcut ) => { return ( < Shortcuts name = { shortcut . name } url = { shortcut . url } editMode = { editMode } deleteFunc = { deleteShortcut } /> ); }) After that ordeal is done, I ran into another problem again; implementing a way to get the destination website’s favicon. I decided to use favicon.im’s API for this one! Honestly this is only included as something I struggled with because I completely did NOT realize that the URL in the shortcut still has the HTTPS protocol and not only the domain This is what I was literally doing.. src = { `https://favicon.im/https://youtube.com?theme=dark&larger=true` } ..Yup. I fixed it by removing the HTTPS protocol from the URL, and then splitting it every “/”, and finally use the [0] index to get the favicon. Edit Mode The “Edit Mode” is supposed to be an all-you-can-edit type of feature, but for now it is only implemented for the Shortcuts card, primarily because I wouldn’t really know how to implement it to all components… Deleting This was the easiest part of the whole Edit Mode section! Basically, when in Edit Mode, every shortcut will have a delete button underneath them. When you click on it, it will delete said shortcut by using .filter() . Adding If deleting was the easiest part of the whole Edit Mode section, Adding is the opposite. Okay, let’s start off with how I had a button inside of another button; < button onClick = { () => { setModalVisibility ( ! modalVisibility ); } } > { editMode && < button > Add Shortcuts </ button > } </ button > Oh, how about when I accidentally force-added https:// to every single URL? if ( ! tempUrl . startsWith ( \" https:// \" ) || ! tempUrl . startsWith ( \" http:// \" )) { tempUrl = `https:// ${ url } ` ; } Okay I hope you get the point. I did a LOT of silly little mistakes that could’ve been avoided if I were just a LITTLE bit more careful while coding, but hey, you can’t improve if you don’t fail! Other miscellaneous changes.. I did some miscellaneous changes too, like; Changing the background-color Changing how big the button grows when hovered over, from 10px -> 5px. Bolded most of the text in the website Learnt how to use Git’s Interactive Rebase! (This was supposed to be its own section but I fear the devlog is getting too long) Probably some more that I didn’t remember Some Last Notes before I close this off For the next update/devlog, I really wanna keep it simple and do the following changes; Style the Add Shortcuts Popup box When in Edit Mode, add the function to Edit already existing Shortcuts instead of having to delete then adding And with that out of the way, Thank you for reading my devlog! See you next time!"}, {"post_id": 24745, "ts": "2026-07-08T15:00:06Z", "hours": 2.5469, "text": "Hello, World! This is the first Devlog of my project, Perfect-Start. The goal of this project is to serve as the perfect (in terms of customization, flexibility, and performance) start screen of a browser, with the hopes of enhancing your browsing session! First things first, I wanted to point out the fact that while making this project, I am STILL learning the basics of React (which is also what this website is made with), so forgive me for the horrible, unoptimized, and unclean code, and please bear with me. I wanted to start the project out with; A greeting (that I plan to make fully customizable) The greeting was the easiest, and also the most straight-forward to style! I plan on making the text and the overall accent color (of the whole page) to be customizable and set to whatever the user wants it to be. A live-clock, alongside the timezone Live-clock was kind of tricky for me to figure out, as it used React’s useEffect hook that didn’t really settle inside my brain the first time, so I had to look up some code online as an anchor/reference and went from there. The timezone was easy enough though, and it was also pretty simple to style. A (google) search bar This specific component I don’t know why took me too long to figure out. Should’ve paid more attention to HTML Forms I guess xD, this was also somewhat tricky to style but honestly I just messed around with the pixels. I also plan to change A LOT for the search bar. I don’t like how it shows previous search history (if that’s what it’s called) and how it lights up and stuff. I’ll probably change that next update! For future updates, I plan on adding; Shortcuts Button Actual customization/settings button Turning each components into a widget Weathers is planned, but not 100% sure if I want that on there Add more widgets.. I guess Make the page Web Responsive (to fit device screens) I am (somewhat) proud of its current state. Despite all the hassle I went through with styling the website (CSS is the bane of my existence), and having to adapt and learn a whole new Framework, I’d say this is a pretty good result! If I’m going to be honest, I’m really nervous about posting these type of devlogs because of the amount of interesting and cool projects here, plus I was never one to ever “publish” my own projects, but thanks to Hack Club, I’ve taken a step into (hopefully) becoming a better developer and publishing my projects to the world!"}]...
|
Title: Perfect Start by @Piez | Stardance
Devlogs Title: Perfect Start by @Piez | Stardance
Devlogs:
Hello, World! This is the first Devlog of my project, Perfect-Start. The goal of this project is to serve as the perfect (in terms of customization, flexibility, and performance) start screen of a browser, with the hopes of enhancing your browsing session! First things first, I wanted to point out the fact that while making this project, I am STILL learning the basics of React (which is also what this website is made with), so forgive me for the horrible, unoptimized, and unclean code, and please bear with me. I wanted to start the project out with; A greeting (that I plan to make fully customizable) The greeting was the easiest, and also the most straight-forward to style! I plan on making the text and the overall accent color (of the whole page) to be customizable and set to whatever the user wants it to be. A live-clock, alongside the timezone Live-clock was kind of tricky for me to figure out, as it used React’s useEffect hook that didn’t really settle inside my brain the first time, so I had to look up some code online as an anchor/reference and went from there. The timezone was easy enough though, and it was also pretty simple to style. A (google) search bar This specific component I don’t know why took me too long to figure out. Should’ve paid more attention to HTML Forms I guess xD, this was also somewhat tricky to style but honestly I just messed around with the pixels. I also plan to change A LOT for the search bar. I don’t like how it shows previous search history (if that’s what it’s called) and how it lights up and stuff. I’ll probably change that next update! For future updates, I plan on adding; Shortcuts Button Actual customization/settings button Turning each components into a widget Weathers is planned, but not 100% sure if I want that on there Add more widgets.. I guess Make the page Web Responsive (to fit device screens) I am (somewhat) proud of its current state. Despite all the hassle I went through with styling the website (CSS is the bane of my existence), and having to adapt and learn a whole new Framework, I’d say this is a pretty good result! If I’m going to be honest, I’m really nervous about posting these type of devlogs because of the amount of interesting and cool projects here, plus I was never one to ever “publish” my own projects, but thanks to Hack Club, I’ve taken a step into (hopefully) becoming a better developer and publishing my projects to the world!
oh boy! This devlog was actually supposed to be really short, since I WAS supposed to be implementing ONLY the shortcuts, but one thing led to another and… hey! I’ve got shortcuts AND the edit shortcuts functionality (partially) done! Before we start.. Let’s start this off by; I STRUGGLED so much with this. From the previous devlog you probably know that I’m still very much a beginner in React, and if I’m being honest this is the BIGGEST project (by scope) I’ve ever tried to make, so you could probably imagine how much hassle I went through xD. Enough with that, here’s what I implemented! Shortcuts This should’ve been very basic stuff, but I (SOMEHOW) struggled with it. The biggest change I did was converting the hard-coded shortcut into a React State, which is rendered with .map() . This helped SO MUCH, and made state updates A LOT easier. shortcuts . map (( shortcut ) => { return ( < Shortcuts name = { shortcut . name } url = { shortcut . url } editMode = { editMode } deleteFunc = { deleteShortcut } /> ); }) After that ordeal is done, I ran into another problem again; implementing a way to get the destination website’s favicon. I decided to use favicon.im’s API for this one! Honestly this is only included as something I struggled with because I completely did NOT realize that the URL in the shortcut still has the HTTPS protocol and not only the domain This is what I was literally doing.. src = { `https://favicon.im/https://youtube.com?theme=dark&larger=true` } ..Yup. I fixed it by removing the HTTPS protocol from the URL, and then splitting it every “/”, and finally use the [0] index to get the favicon. Edit Mode The “Edit Mode” is supposed to be an all-you-can-edit type of feature, but for now it is only implemented for the Shortcuts card, primarily because I wouldn’t really know how to implement it to all components… Deleting This was the easiest part of the whole Edit Mode section! Basically, when in Edit Mode, every shortcut will have a delete button underneath them. When you click on it, it will delete said shortcut by using .filter() . Adding If deleting was the easiest part of the whole Edit Mode section, Adding is the opposite. Okay, let’s start off with how I had a button inside of another button; < button onClick = { () => { setModalVisibility ( ! modalVisibility ); } } > { editMode && < button > Add Shortcuts </ button > } </ button > Oh, how about when I accidentally force-added https:// to every single URL? if ( ! tempUrl . startsWith ( " https:// " ) || ! tempUrl . startsWith ( " http:// " )) { tempUrl = `https:// ${ url } ` ; } Okay I hope you get the point. I did a LOT of silly little mistakes that could’ve been avoided if I were just a LITTLE bit more careful while coding, but hey, you can’t improve if you don’t fail! Other miscellaneous changes.. I did some miscellaneous changes too, like; Changing the background-color Changing how big the button grows when hovered over, from 10px -> 5px. Bolded most of the text in the website Learnt how to use Git’s Interactive Rebase! (This was supposed to be its own section but I fear the devlog is getting too long) Probably some more that I didn’t remember Some Last Notes before I close this off For the next update/devlog, I really wanna keep it simple and do the following changes; Style the Add Shortcuts Popup box When in Edit Mode, add the function to Edit already existing Shortcuts instead of having to delete then adding And with that out of the way, Thank you for reading my devlog! See you next time!
devlog #03! I wanted to keep it really simple this time, (and I did!) so the changes I made were literally just: Turn each component in App.tsx into its own file in ./src/components/ This is so as to remove as much headache as possible before making new, even more complex features Styled the Add Shortcuts Modal I went for something simpler this time (mostly because I didn’t know how to style it lol). This is most likely subject to change though! Watch out for the next devlog! I reckon it’s going to be something big again! 👀
dedededevvvloggg #04: shortcuts and more shortcuts!!! Perfect-Start now saves to localStorage, and has completed Shortcuts features like adding a new Shortcut, Editing an existing shortcut, and deleting a shortcut! This was honestly a rollercoaster of emotions because on one hand I’m so happy I got it over with, but on the other there was so much React concepts I had to learn I started to brain-fog when I was working on it lol. I didn’t wanna rush too much so I took a lot of breaks and thus, this update took me 2 days to complete. Let’s get it over with though! Shortcuts now save to localStorage !! This is my first time dealing with localStorage , so I’m happy its application is SOMEWHAT simple enough (atleast for this project). Shortcuts now have their own IDs , so React won’t be screaming at me anymore about keys!!! Finish Edit Functionality, so you can Add, Edit and Delete Shortcuts! And that’s the TLDR of this devlog!! You can continue reading if you want to read myself yapping about the challenges I went through to implement the edit shortcuts functionality though! storytime :O Implementing the localStorage feature was actually pretty easy, I just had to use the useEffect() hook for everytime the Shortcut List State changed, and check whether the Shortcut List is available in localStorage or not. If it doesn’t, then it’ll return the default Shortcut List. Implementing the Edit Shortcuts Function though was a completely different story. I thought it was just going to be a quick and easy change to /src/components/shortcut.tsx and /src/components/modal.tsx but oh boy, I was so wrong… At first, I rendered the Modal component inside the Shortcuts component, which rendered one Modal per Shortcut .. This was due to the Shortcuts component being rendered with .map() , and my smarty pants forgot about it. Great Start! I proceeded to write some more code for the Modal component, when I tried to call a function that I had passed in as a prop, but still doesn’t recognize it as a function. This had me inspect and change almost everything inside of the Modal component JUST for the sole purpose of debugging it, but it just… turned out… that I hadn’t… passed in anything in App.tsx … I was so ready to crash out Thank god for git’s amazing version control After this I decided to get some sleep (pointed out by my git commit lol) The next day came, and I got so much clarity! (especially after that disastrous session last night xD). I quickly got to work, and did the following changes: get rid of modalVisibility state in favor of modalMode , which has three states: “add”, “edit”, and null! this worked miraculously since the modal can now distinguish between popping up the “add shortcut” popup, “edit shortcut” popup, or don’t show any pop up at all. make the editShortcut() function actually… function properly instead of saying “i am so sleepy” using .map() again!!! and… that’s about how much i struggled with THIS supposed specific simple feature! thank you for reading this far!! i hope you have a nice day. peace out!!!!
Ships:
Perfect Start! The Perfect Start Page for your browser’s new tab! Perfect Start is my attempt at making a cool and customizable Start Page that is built with React + Typescript! It is my first ever try in making a project in React, and by far the biggest project (in terms of scope) I have EVER made :D Features List! Live-clock, and Datetime features A custom google search bar Simple Shortcuts Card Add, Edit, and Delete Shortcuts while in Edit Mode! Persistent Shortcuts using localStorage!...
|
1793958769.1411269
|
1794045169.1411269
|
|
70018
|
Portfolio by @Muhd_Haseeb | Stardance
|
Muhd_Haseeb
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Portfolio by @Muhd_Haseeb | Stardance
|
1793958770.315562
|
1794822770.315562
|
|
14221
|
Miramar-O1 by @joris_westphal01 | Stardance
|
joris_westphal01
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Miramar-O1 by @joris_westphal01 | Stardance
|
1793958771.1881723
|
1794563571.1881723
|
|
27099
|
. by @ayshine | Stardance
|
ayshine
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T12:06:41Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? XO OS – a fully functional desktop OS in the browser. Includes 10 apps, draggable windows, taskbar, start menu, and easter eggs (Konami Code, Secret Menu, Retro Mode). Built with HTML, CSS, JavaScript. What was challenging? Git issues (nested .git folder, master vs main) CSS vendor prefixes (background-clip bug) Window z-index management Secret Menu trigger (clock double-click) – added terminal backup Album app typo (win-photo album vs win-album) GitHub Pages not working – switched to Vercel What are you proud of? Complete OS in a single HTML file 10 working apps Creative easter eggs Mobile responsive Learned a ton and didn’t give up! How to test? Live Demo: https://webos1xo.vercel.app Double-click desktop Weeknd’s famous sayings Try the terminal: type help Konami Code: ↑ ↑ ↓ ↓ ← → ← → B A Secret Menu: double-click clock 7x OR type secret", "repo": "", "demo": ""}]...
|
[{"post_id": 25369, "ts": "202 [{"post_id": 25369, "ts": "2026-07-09T16:54:27Z", "hours": 2.39, "text": "tried adding konami code and a secret menu but ended up showing some errors. Will figure it out later."}, {"post_id": 22940, "ts": "2026-07-05T16:28:12Z", "hours": 1.1333, "text": "DONE WITH THE APP STYLE YALLLLLLLLL"}, {"post_id": 22891, "ts": "2026-07-05T15:05:21Z", "hours": 0.3064, "text": "Started off with my Weeknd based WebOs"}]...
|
Title: . by @ayshine | Stardance
Devlogs:
Started Title: . by @ayshine | Stardance
Devlogs:
Started off with my Weeknd based WebOs
DONE WITH THE APP STYLE YALLLLLLLLL
tried adding konami code and a secret menu but ended up showing some errors. Will figure it out later.
Ships:
What did you make? XO OS – a fully functional desktop OS in the browser. Includes 10 apps, draggable windows, taskbar, start menu, and easter eggs (Konami Code, Secret Menu, Retro Mode). Built with HTML, CSS, JavaScript. What was challenging? Git issues (nested .git folder, master vs main) CSS vendor prefixes (background-clip bug) Window z-index management Secret Menu trigger (clock double-click) – added terminal backup Album app typo (win-photo album vs win-album) GitHub Pages not working – switched to Vercel What are you proud of? Complete OS in a single HTML file 10 working apps Creative easter eggs Mobile responsive Learned a ton and didn’t give up! How to test? Live Demo: https://webos1xo.vercel.app Double-click desktop Weeknd’s famous sayings Try the terminal: type help Konami Code: ↑ ↑ ↓ ↓ ← → ← → B A Secret Menu: double-click clock 7x OR type secret...
|
1793958773.7146547
|
1794045173.7146547
|
|
33903
|
Senior Fitness Scheduler by @cognitayohan | Starda Senior Fitness Scheduler by @cognitayohan | Stardance...
|
cognitayohan
|
3
|
4.0
|
38
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-28T05:12:02Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Ship #3: After reviewing community requests, I added a few more features for the app to improve its usability! I streamlined some features to make it easier runtime and also added more helpful tools to make the application more meaningful.", "repo": "https://github.com/robot3-track/Senior-Fitness-Scheduler", "demo": "https://senior-fitness-scheduler.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-27T03:38:56Z", "hours": 3.0, "multiplier": 11.31, "payout": 31, "blessing": "neutral", "text": "Ship #2: After reviewing community requests, I added a few more features for the app to improve its usability! The original features include you can update schedules, log in to your account, and all physical activity monitors follow CDC physical activity guidelines. This app supports both UN SDG 3 and 10 in the UN Sustainability Goals. The new features added since the last ship includes Android offline APK artifact, Emergency contact/911 easy calling during emergency, better scrolling logic, fixed dark mode, and images to showcase exercises better (picture showcases this feature). Let me know if there is anything else to add in the future! Thank you for reading this and your support on this project🙏!", "repo": "https://github.com/robot3-track/Senior-Fitness-Scheduler", "demo": "https://senior-fitness-scheduler.vercel.app/"}, {"ship_num": 3, "ts": "2026-07-13T00:13:32Z", "hours": 1.0, "multiplier": 7.99, "payout": 7, "blessing": "neutral", "text": "Ship #1: The app is up and running with the core features all functioning as supposed to! Right now you can update schedules, log in to your account, and all physical activity monitors follow CDC physical activity guidelines. This app supports both UN SDG 3 and 10 in the UN Sustainability Goals. Let me know if there is anything else to add in the future!", "repo": "https://github.com/robot3-track/Senior-Fitness-Scheduler", "demo": "https://senior-fitness-scheduler.vercel.app/"}]...
|
[{"post_id": 83572, "ts": "202 [{"post_id": 83572, "ts": "2026-10-28T05:10:55Z", "hours": 0.2667, "text": "Worked on more UI improvements throughout the application for easier access for elderly, including better dark mode accessibility."}, {"post_id": 35575, "ts": "2026-07-27T03:28:15Z", "hours": 0.4836, "text": "Devlog 9: Updated scrolling features for better UI and also updated font size so mobile view can be fixed as well. In addition, I also added new exercises and images that correspond to the exercises so users can understand how the exercises are performed more accurately with no guessing!"}, {"post_id": 34765, "ts": "2026-07-25T19:04:47Z", "hours": 0.3461, "text": "Devlog 8: Added easy Android download and built new Favicon for the app"}, {"post_id": 34746, "ts": "2026-07-25T18:36:47Z", "hours": 0.5017, "text": "Devlog 7: Added new features for elderly safety! I added enhanced emergency modal contacts, with automatic-fillout on SMS/CALL for calling 911 on mobile devices upon the press of a button. Now the elderly can also add their own contacts for calling automatically. Lastly, one more integration included adding pdf export for sharing with doctors about daily routines."}, {"post_id": 34333, "ts": "2026-07-24T22:55:45Z", "hours": 0.4067, "text": "Devlog 6: I added new android files for offline access! This gives users the ability to have it on the go on Android devices, even if they are offline! I built this using Github Artifacts with android-build.yml in .github/workflows."}, {"post_id": 27966, "ts": "2026-07-13T22:30:01Z", "hours": 0.2867, "text": "Devlog 5: Completely recode page.tsx and app UI to match elderly support."}, {"post_id": 27908, "ts": "2026-07-13T20:41:20Z", "hours": 0.3103, "text": "Devlog 4: Continued to manually update UI to remove unappealing aspects in color scheme."}, {"post_id": 27811, "ts": "2026-07-13T18:13:30Z", "hours": 0.4475, "text": "Devlog 3: Updated UI to look more appealing to users and added more features to make the app more gamified."}, {"post_id": 26987, "ts": "2026-07-12T03:39:41Z", "hours": 0.5453, "text": "Devlog 2: Updated layout and favicon for the metadata of the app Included new UI format to match current health app-styles that can be seen around the world currently."}, {"post_id": 26935, "ts": "2026-07-12T00:47:00Z", "hours": 0.3681, "text": "Devlog 1: Initial Commit and Setup I created the base framework files and UI for the app, along with a clear Readme that describes the purposes of the app. Much more to come!"}]...
|
Title: Senior Fitness Scheduler by @cognitayohan | Title: Senior Fitness Scheduler by @cognitayohan | Stardance
Devlogs:
Devlog 1: Initial Commit and Setup I created the base framework files and UI for the app, along with a clear Readme that describes the purposes of the app. Much more to come!
Devlog 2: Updated layout and favicon for the metadata of the app Included new UI format to match current health app-styles that can be seen around the world currently.
Devlog 3: Updated UI to look more appealing to users and added more features to make the app more gamified.
Devlog 4: Continued to manually update UI to remove unappealing aspects in color scheme.
Devlog 5: Completely recode page.tsx and app UI to match elderly support.
Devlog 6: I added new android files for offline access! This gives users the ability to have it on the go on Android devices, even if they are offline! I built this using Github Artifacts with android-build.yml in .github/workflows.
Devlog 7: Added new features for elderly safety! I added enhanced emergency modal contacts, with automatic-fillout on SMS/CALL for calling 911 on mobile devices upon the press of a button. Now the elderly can also add their own contacts for calling automatically. Lastly, one more integration included adding pdf export for sharing with doctors about daily routines.
Devlog 8: Added easy Android download and built new Favicon for the app
Devlog 9: Updated scrolling features for better UI and also updated font size so mobile view can be fixed as well. In addition, I also added new exercises and images that correspond to the exercises so users can understand how the exercises are performed more accurately with no guessing!
Worked on more UI improvements throughout the application for easier access for elderly, including better dark mode accessibility.
Ships:
Ship #1: The app is up and running with the core features all functioning as supposed to! Right now you can update schedules, log in to your account, and all physical activity monitors follow CDC physical activity guidelines. This app supports both UN SDG 3 and 10 in the UN Sustainability Goals. Let me know if there is anything else to add in the future!
Ship #2: After reviewing community requests, I added a few more features for the app to improve its usability! The original features include you can update schedules, log in to your account, and all physical activity monitors follow CDC physical activity guidelines. This app supports both UN SDG 3 and 10 in the UN Sustainability Goals. The new features added since the last ship includes Android offline APK artifact, Emergency contact/911 easy calling during emergency, better scrolling logic, fixed dark mode, and images to showcase exercises better (picture showcases this feature). Let me know if there is anything else to add in the future! Thank you for reading this and your support on this project🙏!
Ship #3: After reviewing community requests, I added a few more features for the app to improve its usability! I streamlined some features to make it easier runtime and also added more helpful tools to make the application more meaningful....
|
1793958774.9119303
|
1794045174.9119303
|
|
36394
|
My own site! by @MTalha | Stardance
|
MTalha
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @MTalha | Stardance
|
1793958776.0984194
|
1794563576.0984194
|
|
24004
|
Anna's Desk by @anna1 | Stardance
|
anna1
|
1
|
18.0
|
159
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T14:25:37Z", "hours": 18.0, "multiplier": 15.91, "payout": 159, "blessing": "neutral", "text": "I made an all in one web app with mini sub apps: classes, habits, workouts, recipes, notes, and key dates! I made this to organize all my thoughts and todos in one place. It took a while for me to finalize designs because my ultimate goal was to make this as scrapbook and fun looking as possible. It was also important to make it functional across devices: phone, ipad, laptop… Overall, im super happy w/ the end result! Its functional and something I truly have started using for myself. Especially the packing list for uni is the most relevant for me right now :)", "repo": "https://github.com/dnsva/anna-s-desk", "demo": "https://dnsva.github.io/anna-s-desk/"}]...
|
[{"post_id": 45771, "ts": "202 [{"post_id": 45771, "ts": "2026-08-12T14:04:08Z", "hours": 17.5544, "text": "Currenly working on making demos for the readme. I want to record some gifs using Playwright for Python!"}]...
|
Title: Anna's Desk by @anna1 | Stardance
Devl Title: Anna's Desk by @anna1 | Stardance
Devlogs:
Currenly working on making demos for the readme. I want to record some gifs using Playwright for Python!
Ships:
I made an all in one web app with mini sub apps: classes, habits, workouts, recipes, notes, and key dates! I made this to organize all my thoughts and todos in one place. It took a while for me to finalize designs because my ultimate goal was to make this as scrapbook and fun looking as possible. It was also important to make it functional across devices: phone, ipad, laptop… Overall, im super happy w/ the end result! Its functional and something I truly have started using for myself. Especially the packing list for uni is the most relevant for me right now :)...
|
1793958777.0050662
|
1794045177.0050662
|
|
38917
|
Chammeleon-IOS by @HenryBrewer | Stardance
|
HenryBrewer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Chammeleon-IOS by @HenryBrewer | Stardance
|
1793958778.1835828
|
1794563578.1835828
|