|
5951
|
My awesome macropad! by @OmarE | Stardance
|
OmarE
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @OmarE | Stardance
|
1793299817.3902664
|
1793904617.3902664
|
|
5952
|
My awesome macropad! by @pzhuminglang | Stardance
|
pzhuminglang
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @pzhuminglang | Sta Title: My awesome macropad! by @pzhuminglang | Stardance...
|
1792680568.2300298
|
1793285368.2300298
|
|
5953
|
programming challenges by @dodge1 | Stardance
|
dodge1
|
0
|
0.42
|
0
|
[]
|
[{"post_id": 1246, "ts": "2026 [{"post_id": 1246, "ts": "2026-06-03T03:08:32Z", "hours": 0.4236, "text": "added iterative pi calculation using nilkantha’s method"}]...
|
Title: programming challenges by @dodge1 | Stardan Title: programming challenges by @dodge1 | Stardance
Devlogs:
added iterative pi calculation using nilkantha’s method...
|
1792741777.5375576
|
1793346577.5375576
|
|
5954
|
CareBridge by @WhiteDevil | Stardance
|
WhiteDevil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: CareBridge by @WhiteDevil | Stardance
|
1793249331.11844
|
1793854131.11844
|
|
5955
|
My awesome macropad! by @ismail | Stardance
|
ismail
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ismail | Stardance
|
1792694899.06752
|
1793299699.06752
|
|
5956
|
AI Chatbot by @Sushan | Stardance
|
Sushan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: AI Chatbot by @Sushan | Stardance
|
1793260306.5251122
|
1793865106.5251122
|
|
5957
|
Untitled project by @Mridul | Stardance
|
Mridul
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Mridul | Stardance
|
1793303358.6397946
|
1793908158.6397946
|
|
5958
|
My awesome macropad! by @milomilongas00 | Stardanc My awesome macropad! by @milomilongas00 | Stardance...
|
milomilongas00
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @milomilongas00 | S Title: My awesome macropad! by @milomilongas00 | Stardance...
|
1793163338.7264035
|
1793768138.7264035
|
|
5959
|
Airship CLI by @DodoSeal | Stardance
|
DodoSeal
|
1
|
7.79
|
80
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T22:36:55Z", "hours": 6.0, "multiplier": 13.49, "payout": 80, "blessing": "neutral", "text": "I made a CLI that interacts with the underlying API for Airship.gg, a gaming platform. I created this tool in search of a simple way to continue bug hunting on Airship. The CLI has a clean, user-friendly interface for selecting exactly what you need. This is my first CLI project and I am very impressed with how it has turned out. To get started, you need to install the package from NPM with “npm install -g airship-cli”, then simply run “airship” in a terminal! The interface will guide you through the Airship API in a category-based map.", "repo": "https://github.com/dodoseal/airship-cli", "demo": "https://www.npmjs.com/package/airship-cli"}]...
|
[{"post_id": 19563, "ts": "202 [{"post_id": 19563, "ts": "2026-06-30T21:48:52Z", "hours": 1.79, "text": "Devlog #6: New CLI Commands have been added: fetch-auth-token - Returns your auth token, useful for testing endpoints that haven’t been added yet. update-status-text - Allows you to update your user status, which is a removed feature that still displays in game! fetch-username-availability - Lets you look up usernames!"}, {"post_id": 17193, "ts": "2026-06-27T22:04:26Z", "hours": 0.8128, "text": "Devlog #5: I finally added a Help command, no more getting confused or lost! This was a challenging addition because I handle commands in categories, and help should be on the first list of options. Once I handled this (with a default command system), I was able to add “Back” and “Exit” commands to the UI, so no more restarting the tool because of a misclick!"}, {"post_id": 4015, "ts": "2026-06-07T05:34:13Z", "hours": 1.3769, "text": "Devlog #4: I added a new command! It allows you to either mark a game as favorite or remove your favorite. This required me to grab an authentication token from the device, which requires the Airship game to be installed and logged into. Simply pulling the app’s auth file wasn’t enough however, and I had to use local auth data to fetch an access token."}, {"post_id": 3262, "ts": "2026-06-06T03:27:23Z", "hours": 2.1006, "text": "Devlog #3: Today I did a LOT of refactoring and pushed many many bug fixes! One of the major updates is organizing the commands into categories based on their API. User data is under “Users”, game data is under “Games”, etc… I also made a new command yay! This command fetches the user’s profile picture and returns the CDN reference to it."}, {"post_id": 2250, "ts": "2026-06-04T17:19:02Z", "hours": 1.1067, "text": "Devlog #2: I cleaned up the data logging so you can choose between the most important data or all of it! The UX has been improved and errors are now nicely displayed to the user."}, {"post_id": 2208, "ts": "2026-06-04T16:13:46Z", "hours": 0.5814, "text": "Devlog #1: A while ago I became very invested in a gaming platform called Airship.gg. Almost everything is open source and I thought it would be fun to interact with its API. Currently you can fetch information about published games and active users on the platform. I hope to map the entire API with this CLI tool."}]...
|
Title: Airship CLI by @DodoSeal | Stardance
Devlo Title: Airship CLI by @DodoSeal | Stardance
Devlogs:
Devlog #1: A while ago I became very invested in a gaming platform called Airship.gg. Almost everything is open source and I thought it would be fun to interact with its API. Currently you can fetch information about published games and active users on the platform. I hope to map the entire API with this CLI tool.
Devlog #2: I cleaned up the data logging so you can choose between the most important data or all of it! The UX has been improved and errors are now nicely displayed to the user.
Devlog #3: Today I did a LOT of refactoring and pushed many many bug fixes! One of the major updates is organizing the commands into categories based on their API. User data is under “Users”, game data is under “Games”, etc… I also made a new command yay! This command fetches the user’s profile picture and returns the CDN reference to it.
Devlog #4: I added a new command! It allows you to either mark a game as favorite or remove your favorite. This required me to grab an authentication token from the device, which requires the Airship game to be installed and logged into. Simply pulling the app’s auth file wasn’t enough however, and I had to use local auth data to fetch an access token.
Devlog #5: I finally added a Help command, no more getting confused or lost! This was a challenging addition because I handle commands in categories, and help should be on the first list of options. Once I handled this (with a default command system), I was able to add “Back” and “Exit” commands to the UI, so no more restarting the tool because of a misclick!
Devlog #6: New CLI Commands have been added: fetch-auth-token - Returns your auth token, useful for testing endpoints that haven’t been added yet. update-status-text - Allows you to update your user status, which is a removed feature that still displays in game! fetch-username-availability - Lets you look up usernames!
Ships:
I made a CLI that interacts with the underlying API for Airship.gg, a gaming platform. I created this tool in search of a simple way to continue bug hunting on Airship. The CLI has a clean, user-friendly interface for selecting exactly what you need. This is my first CLI project and I am very impressed with how it has turned out. To get started, you need to install the package from NPM with “npm install -g airship-cli”, then simply run “airship” in a terminal! The interface will guide you through the Airship API in a category-based map....
|
1793274569.7736764
|
1793360969.7736764
|
|
5960
|
CompCopter by @TotallyNotIsaac | Stardance
|
TotallyNotIsaac
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: CompCopter by @TotallyNotIsaac | Stardance
|
1792680854.35224
|
1793285654.35224
|
|
5961
|
Untitled by @devovo | Stardance
|
devovo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @devovo | Stardance
|
1792738293.8253317
|
1793343093.8253317
|
|
5962
|
Insert Coin by @hamdaraksa | Stardance
|
hamdaraksa
|
1
|
25.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T23:28:54Z", "hours": 25.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created an arcade game that runs in the taskbar so it can be played flexibly.", "repo": "https://github.com/kyubiner/Insert-Coin", "demo": "https://drive.google.com/drive/folders/14mZBPSmJ7eGYQSYK2bIwrfAscWfY0NeD?usp=sharing"}]...
|
[{"post_id": 75038, "ts": "202 [{"post_id": 75038, "ts": "2026-09-28T23:17:30Z", "hours": 7.3944, "text": "My game is ready for now and can be installed from Google Drive :)"}, {"post_id": 73604, "ts": "2026-09-25T13:47:33Z", "hours": 8.2683, "text": "I’m creating various things here, such as a background for my game and a circle… It’s going to get even more interesting, and I can’t wait to try out the ship for the first time."}, {"post_id": 71051, "ts": "2026-09-20T07:46:05Z", "hours": 3.0236, "text": "Alright, so I’ve finished creating the first mini-game for my arcade game, GitHub Striker . The concept is similar to Blocky Breaker , but the levels are based on your GitHub contribution activity the more active you are, the easier the levels are to complete. And my next goal is to polish this mini-game."}, {"post_id": 70911, "ts": "2026-09-20T00:37:22Z", "hours": 6.5983, "text": "I’m making a block-breaker arcade game, but I’m thinking about making it more interesting hopefully, I can get it done in time."}]...
|
Title: Insert Coin by @hamdaraksa | Stardance
Dev Title: Insert Coin by @hamdaraksa | Stardance
Devlogs:
I’m making a block-breaker arcade game, but I’m thinking about making it more interesting hopefully, I can get it done in time.
Alright, so I’ve finished creating the first mini-game for my arcade game, GitHub Striker . The concept is similar to Blocky Breaker , but the levels are based on your GitHub contribution activity the more active you are, the easier the levels are to complete. And my next goal is to polish this mini-game.
I’m creating various things here, such as a background for my game and a circle… It’s going to get even more interesting, and I can’t wait to try out the ship for the first time.
My game is ready for now and can be installed from Google Drive :)
Ships:
I created an arcade game that runs in the taskbar so it can be played flexibly....
|
1793148716.8134832
|
1793235116.8134832
|
|
5963
|
Custom Mouse by @neoskimmer | Stardance
|
neoskimmer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Custom Mouse by @neoskimmer | Stardance
|
1792774187.7129729
|
1793378987.7129729
|
|
5964
|
Untitled by @seestar | Stardance
|
seestar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @seestar | Stardance
|
1793321287.0619247
|
1793926087.0619247
|
|
5965
|
playlore.app by @mattliepins | Stardance
|
mattliepins
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: playlore.app by @mattliepins | Stardance
|
1792795747.4351249
|
1793400547.4351249
|
|
5966
|
text based thing by @HighLatency | Stardance
|
HighLatency
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: text based thing by @HighLatency | Stardanc Title: text based thing by @HighLatency | Stardance...
|
1792774499.0662403
|
1793379299.0662403
|
|
5967
|
My awesome macropad! by @WhiteDevil | Stardance
|
WhiteDevil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @WhiteDevil | Stard Title: My awesome macropad! by @WhiteDevil | Stardance...
|
1793195761.8365626
|
1793800561.8365626
|
|
5968
|
My awesome macropad! by @m3dh4nsh | Stardance
|
m3dh4nsh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @m3dh4nsh | Stardan Title: My awesome macropad! by @m3dh4nsh | Stardance...
|
1793184845.46045
|
1793789645.46045
|
|
5969
|
My first slack bot! by @m3dh4nsh | Stardance
|
m3dh4nsh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @m3dh4nsh | Stardanc Title: My first slack bot! by @m3dh4nsh | Stardance...
|
1793195606.5951562
|
1793800406.5951562
|
|
5970
|
Untitled project by @juicetin_kim | Stardance
|
juicetin_kim
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @juicetin_kim | Stardan Title: Untitled project by @juicetin_kim | Stardance...
|
1793195387.1683795
|
1793800187.1683795
|
|
5971
|
My first slack bot! by @nihal_krishna_p | Stardanc My first slack bot! by @nihal_krishna_p | Stardance...
|
nihal_krishna_p
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @nihal_krishna_p | S Title: My first slack bot! by @nihal_krishna_p | Stardance...
|
1793325201.165808
|
1793930001.165808
|
|
5972
|
BURGER by @bujjikai | Stardance
|
bujjikai
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: BURGER by @bujjikai | Stardance
|
1793152529.116191
|
1793757329.116191
|
|
5973
|
Cyberdeck by @ | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Cyberdeck by @ | Stardance
|
1792749243.6895456
|
1793354043.6895456
|
|
5974
|
Gait measurement device by @hushedxir | Stardance
|
hushedxir
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Gait measurement device by @hushedxir | Sta Title: Gait measurement device by @hushedxir | Stardance...
|
1793137870.2446923
|
1793742670.2446923
|
|
5975
|
My awesome macropad! by @henryb | Stardance
|
henryb
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @henryb | Stardance
|
1792741670.008238
|
1793346470.008238
|
|
5976
|
My first slack bot! by @Riri | Stardance
|
Riri
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Riri | Stardance
|
1793282222.763624
|
1793887022.763624
|
|
5977
|
A Discord Pokédex by @cwjackson992 | Stardance
|
cwjackson992
|
0
|
8.49
|
0
|
[]
|
[{"post_id": 14462, "ts": "202 [{"post_id": 14462, "ts": "2026-06-23T16:19:09Z", "hours": 0.8333, "text": "I have started work to make my life a little easier. I am working to implement a web scraper that will take the information from the pages to fill in the pokedex information. Currently I’m working through debugging and figuring out what prints what. Hopefully once I have formatted one entry correctly I can just change the link and the information provided will be correct. Currently I’m just working to learn if this will be true or not."}, {"post_id": 13807, "ts": "2026-06-22T17:02:18Z", "hours": 1.3297, "text": "A 1/15th of The Way There. With the completion of caterpie I have completed all the information I want to include for the first ten Pokemon."}, {"post_id": 11378, "ts": "2026-06-18T16:53:12Z", "hours": 1.8497, "text": "Through one of the Most Famous I have completed Charizard and his many forms and appearances."}, {"post_id": 10757, "ts": "2026-06-17T17:26:40Z", "hours": 1.1142, "text": "The First Three are Complete! I have added everything I planned on adding to the first three pokemon of the dex. Those being the Bulbasaur line. I even added info on the mega form. My plan will be to continue to follow the same format for at lease the original 151 pokemon."}, {"post_id": 10068, "ts": "2026-06-16T17:26:22Z", "hours": 0.8514, "text": "Upgrading the Information Provided by The Pokedex I have added new information options available to the individual to ask for upon selecting a pokemon. The new information I have added is moves, breeding, training, and location. The new information does not appear all at once, it must be requested before it can be seen. Currently the additions are only implemented on Bulbasaur but soon all the information will be added to later Pokemon."}, {"post_id": 8356, "ts": "2026-06-13T21:51:17Z", "hours": 1.3244, "text": "Completed the First Three Pokemon of Generation 1. I have completed the code to upload the information of Bulbasaur, Ivysaur, and Venusaur. Professor Oak (the bot) will now give information on those three pokemon. The goal now will be to repeat this action to complete at least the original 151 pokemon/"}, {"post_id": 7021, "ts": "2026-06-11T19:35:00Z", "hours": 0.8111, "text": "Attempting to Run My First Command. I have everything about coded but have come across the problem of my Client term not being defined."}, {"post_id": 6634, "ts": "2026-06-11T03:52:15Z", "hours": 0.3767, "text": "My First Shot of a Discord Bot! I have just completed the initial code required for my bot to function. With a little help from Google and YouTube my bot now runs from the terminal."}]...
|
Title: A Discord Pokédex by @cwjackson992 | Starda Title: A Discord Pokédex by @cwjackson992 | Stardance
Devlogs:
My First Shot of a Discord Bot! I have just completed the initial code required for my bot to function. With a little help from Google and YouTube my bot now runs from the terminal.
Attempting to Run My First Command. I have everything about coded but have come across the problem of my Client term not being defined.
Completed the First Three Pokemon of Generation 1. I have completed the code to upload the information of Bulbasaur, Ivysaur, and Venusaur. Professor Oak (the bot) will now give information on those three pokemon. The goal now will be to repeat this action to complete at least the original 151 pokemon/
Upgrading the Information Provided by The Pokedex I have added new information options available to the individual to ask for upon selecting a pokemon. The new information I have added is moves, breeding, training, and location. The new information does not appear all at once, it must be requested before it can be seen. Currently the additions are only implemented on Bulbasaur but soon all the information will be added to later Pokemon.
The First Three are Complete! I have added everything I planned on adding to the first three pokemon of the dex. Those being the Bulbasaur line. I even added info on the mega form. My plan will be to continue to follow the same format for at lease the original 151 pokemon.
Through one of the Most Famous I have completed Charizard and his many forms and appearances.
A 1/15th of The Way There. With the completion of caterpie I have completed all the information I want to include for the first ten Pokemon.
I have started work to make my life a little easier. I am working to implement a web scraper that will take the information from the pages to fill in the pokedex information. Currently I’m working through debugging and figuring out what prints what. Hopefully once I have formatted one entry correctly I can just change the link and the information provided will be correct. Currently I’m just working to learn if this will be true or not....
|
1793174051.0024204
|
1793778851.0024204
|
|
5978
|
My first slack bot! by @Bundun445 | Stardance
|
Bundun445
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Bundun445 | Stardan Title: My first slack bot! by @Bundun445 | Stardance...
|
1792666202.4209461
|
1793271002.4209461
|
|
5979
|
My first slack bot! by @cwjackson992 | Stardance
|
cwjackson992
|
0
|
1.04
|
0
|
[]
|
[{"post_id": 2379, "ts": "2026 [{"post_id": 2379, "ts": "2026-06-04T20:41:22Z", "hours": 1.0433, "text": "My First Slack Bot The bot works part of the time. It works doing basic commands and whatnot. The issues arrive when I attempt to run it 24/7 as I have never used Nest before and am very unfamiliar with coding ."}]...
|
Title: My first slack bot! by @cwjackson992 | Star Title: My first slack bot! by @cwjackson992 | Stardance
Devlogs:
My First Slack Bot The bot works part of the time. It works doing basic commands and whatnot. The issues arrive when I attempt to run it 24/7 as I have never used Nest before and am very unfamiliar with coding ....
|
1792688134.451898
|
1793292934.451898
|
|
5980
|
My awesome macropad! by @Zayn | Stardance
|
Zayn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Zayn | Stardance
|
1792680469.8201835
|
1793285269.8201835
|
|
5981
|
My awesome macropad! by @Jon | Stardance
|
Jon
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Jon | Stardance
|
1793321708.4407463
|
1793926508.4407463
|
|
5982
|
Apparition Creatives by @Samuel-Dingle | Stardance
|
Samuel-Dingle
|
0
|
1.09
|
0
|
[]
|
[{"post_id": 1792, "ts": "2026 [{"post_id": 1792, "ts": "2026-06-04T00:15:17Z", "hours": 1.095, "text": "I added the top bar to my website and added some nice gradients to the button. Next step will be to finish the main webpage and add some more information."}]...
|
Title: Apparition Creatives by @Samuel-Dingle | St Title: Apparition Creatives by @Samuel-Dingle | Stardance
Devlogs:
I added the top bar to my website and added some nice gradients to the button. Next step will be to finish the main webpage and add some more information....
|
1792666238.8444917
|
1793271038.8444917
|
|
5983
|
Astro Tasks by @3ni8ma_rush | Stardance
|
3ni8ma_rush
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T13:59:39Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? A Python CLI tool called astro that acts as a developer pre-flight checklist. Run astro check and it shows your GitHub notifications/open PRs, Hackatime/WakaTime coding stats from the past 7 days, and health of your local git repos (dirty branches, unpushed commits) — all in one terminal view. What was challenging? Integrating three independent data sources (GitHub CLI, WakaTime API, local git repos) into a single cohesive CLI Handling the GitHub CLI’s requirement for a git context when listing PRs Keeping the package lean using only stdlib urllib instead of heavier dependencies like requests Making cross-platform colored output work reliably via colorama What are you proud of? Clean, modular architecture — each concern lives in its own module (github_check.py, hackatime_check.py, repo_check.py, config_check.py) Published on PyPI (pip install astro-tasks) with a proper console entry point ASCII-colored output with consistent [+] / [!] / [x] / [*] markers that work everywhere, including CI How to test it: pip install astro-tasks Prerequisites: gh CLI authenticated, ~/.wakatime.cfg with api_key/api_url astro check # Full dashboard astro check –json # JSON output astro scan # Local repo health only astro log # Coding stats only astro config # Show current config Note: There are currently no automated tests — testing is manual via the commands above.", "repo": "https://github.com/3ni8ma/astro-tasks", "demo": "https://pypi.org/project/astro-tasks/"}]...
|
[{"post_id": 14633, "ts": "202 [{"post_id": 14633, "ts": "2026-06-23T20:16:27Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14614, "ts": "2026-06-23T19:46:31Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14603, "ts": "2026-06-23T19:30:25Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14591, "ts": "2026-06-23T19:14:19Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14563, "ts": "2026-06-23T18:46:46Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14548, "ts": "2026-06-23T18:17:12Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14539, "ts": "2026-06-23T18:00:29Z", "hours": 0.0, "text": "Pipeline sync 18:00 UTC — astro-tasks Frictionless goal"}, {"post_id": 14524, "ts": "2026-06-23T17:44:29Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14499, "ts": "2026-06-23T17:16:24Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14481, "ts": "2026-06-23T16:46:40Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14467, "ts": "2026-06-23T16:30:19Z", "hours": 0.0, "text": "Pipeline sync 16:30 UTC — astro-tasks Frictionless goal"}, {"post_id": 14457, "ts": "2026-06-23T16:14:31Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14446, "ts": "2026-06-23T15:58:53Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14413, "ts": "2026-06-23T15:16:43Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14405, "ts": "2026-06-23T15:00:36Z", "hours": 0.0, "text": "Pipeline sync 15:00 UTC — astro-tasks Frictionless goal"}, {"post_id": 14394, "ts": "2026-06-23T14:44:34Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14382, "ts": "2026-06-23T14:27:19Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14372, "ts": "2026-06-23T14:11:11Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14361, "ts": "2026-06-23T13:55:06Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14349, "ts": "2026-06-23T13:31:15Z", "hours": 2.0, "text": "Pipeline sync 13:31 UTC — astro-tasks Frictionless goal"}, {"post_id": 14217, "ts": "2026-06-23T07:00:23Z", "hours": 0.0, "text": "Pipeline sync 07:00 UTC — astro-tasks Frictionless goal"}, {"post_id": 14214, "ts": "2026-06-23T06:44:20Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14202, "ts": "2026-06-23T06:16:34Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14195, "ts": "2026-06-23T06:00:21Z", "hours": 0.0, "text": "Pipeline sync 06:00 UTC — astro-tasks Frictionless goal"}, {"post_id": 14188, "ts": "2026-06-23T05:44:25Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14182, "ts": "2026-06-23T05:27:22Z", "hours": 0.0, "text": "Astro-tasks coding session — pipeline heartbeat daemon"}, {"post_id": 14168, "ts": "2026-06-23T04:55:51Z", "hours": 0.0, "text": "Captured 15m+ astro-tasks coding session via pipeline"}, {"post_id": 14161, "ts": "2026-06-23T04:35:50Z", "hours": 0.0, "text": "Devlog claiming 15m+ of coding time for astro-tasks Frictionless goal"}, {"post_id": 14156, "ts": "2026-06-23T04:20:07Z", "hours": 0.0, "text": "Pipeline sync 04:20 UTC — astro-tasks Frictionless goal (5h min)"}, {"post_id": 14148, "ts": "2026-06-23T04:02:40Z", "hours": 0.0, "text": "Pipeline auto-devlog 04:02 UTC — astro-tasks progress logged"}, {"post_id": 14124, "ts": "2026-06-23T03:10:13Z", "hours": 0.0, "text": "Just finished up GitHub README with Demo!"}]...
|
Title: Astro Tasks by @3ni8ma_rush | Stardance
De Title: Astro Tasks by @3ni8ma_rush | Stardance
Devlogs:
Just finished up GitHub README with Demo!
Pipeline auto-devlog 04:02 UTC — astro-tasks progress logged
Pipeline sync 04:20 UTC — astro-tasks Frictionless goal (5h min)
Devlog claiming 15m+ of coding time for astro-tasks Frictionless goal
Captured 15m+ astro-tasks coding session via pipeline
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Pipeline sync 06:00 UTC — astro-tasks Frictionless goal
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Pipeline sync 07:00 UTC — astro-tasks Frictionless goal
Pipeline sync 13:31 UTC — astro-tasks Frictionless goal
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Pipeline sync 15:00 UTC — astro-tasks Frictionless goal
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Pipeline sync 16:30 UTC — astro-tasks Frictionless goal
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Pipeline sync 18:00 UTC — astro-tasks Frictionless goal
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Astro-tasks coding session — pipeline heartbeat daemon
Ships:
What did you make? A Python CLI tool called astro that acts as a developer pre-flight checklist. Run astro check and it shows your GitHub notifications/open PRs, Hackatime/WakaTime coding stats from the past 7 days, and health of your local git repos (dirty branches, unpushed commits) — all in one terminal view. What was challenging? Integrating three independent data sources (GitHub CLI, WakaTime API, local git repos) into a single cohesive CLI Handling the GitHub CLI’s requirement for a git context when listing PRs Keeping the package lean using only stdlib urllib instead of heavier dependencies like requests Making cross-platform colored output work reliably via colorama What are you proud of? Clean, modular architecture — each concern lives in its own module (github_check.py, hackatime_check.py, repo_check.py, config_check.py) Published on PyPI (pip install astro-tasks) with a proper console entry point ASCII-colored output with consistent [+] / [!] / [x] / [*] markers that work everywhere, including CI How to test it: pip install astro-tasks Prerequisites: gh CLI authenticated, ~/.wakatime.cfg with api_key/api_url astro check # Full dashboard astro check –json # JSON output astro scan # Local repo health only astro log # Coding stats only astro config # Show current config Note: There are currently no automated tests — testing is manual via the commands above....
|
1792882037.6463373
|
1793746037.6463373
|
|
5984
|
My first slack bot! by @fayrouzzz108 | Stardance
|
fayrouzzz108
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @fayrouzzz108 | Star Title: My first slack bot! by @fayrouzzz108 | Stardance...
|
1792770507.0570579
|
1793375307.0570579
|
|
5985
|
My first slack bot! by @tylerama321 | Stardance
|
tylerama321
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @tylerama321 | Stard Title: My first slack bot! by @tylerama321 | Stardance...
|
1792716619.5018082
|
1793321419.5018082
|
|
5986
|
The new by @Ruth | Stardance
|
Ruth
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: The new by @Ruth | Stardance
|
1792745634.8397508
|
1793350434.8397508
|
|
5987
|
My awesome macropad! by @arii | Stardance
|
arii
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @arii | Stardance
|
1792734622.4273906
|
1793339422.4273906
|
|
5988
|
Untitled by @m3dh4nsh | Stardance
|
m3dh4nsh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @m3dh4nsh | Stardance
|
1792806724.818496
|
1793411524.818496
|
|
5989
|
Test 0001 by @Nafi | Stardance
|
Nafi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Test 0001 by @Nafi | Stardance
|
1793285516.6245377
|
1793890316.6245377
|
|
5990
|
My awesome macropad! by @jamie | Stardance
|
jamie
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @jamie | Stardance
|
1793188266.8976202
|
1793793066.8976202
|
|
5991
|
LED Pride Flag by @ThatFairyFijia | Stardance
|
ThatFairyFijia
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: LED Pride Flag by @ThatFairyFijia | Stardan Title: LED Pride Flag by @ThatFairyFijia | Stardance...
|
1792662538.4219937
|
1793267338.4219937
|
|
5992
|
Website by @Soujanya | Stardance
|
Soujanya
|
0
|
1.75
|
0
|
[]
|
[{"post_id": 58154, "ts": "202 [{"post_id": 58154, "ts": "2026-08-30T14:44:38Z", "hours": 1.7542, "text": "Today I finished the basic boilerplate for Mr. Chemist, a chemistry-themed website focused on making the Periodic Table easier and more interesting to learn.I set up the initial project structure and built the foundation for the website. The main goal is to keep the interface clean and simple while still giving it a proper chemistry-inspired feel.The next step is to start building the actual Periodic Table experience, including element information, categories, atomic numbers, symbols, and interactive features for learning.For now, the foundation is ready. The chemistry comes next."}]...
|
Title: Website by @Soujanya | Stardance
Devlogs:
Title: Website by @Soujanya | Stardance
Devlogs:
Today I finished the basic boilerplate for Mr. Chemist, a chemistry-themed website focused on making the Periodic Table easier and more interesting to learn.I set up the initial project structure and built the foundation for the website. The main goal is to keep the interface clean and simple while still giving it a proper chemistry-inspired feel.The next step is to start building the actual Periodic Table experience, including element information, categories, atomic numbers, symbols, and interactive features for learning.For now, the foundation is ready. The chemistry comes next....
|
1793181020.416195
|
1793785820.416195
|
|
5993
|
Untitled by @jamie | Stardance
|
jamie
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @jamie | Stardance
|
1793314254.1898668
|
1793919054.1898668
|
|
5994
|
Untitled by @jamie | Stardance
|
jamie
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @jamie | Stardance
|
1792810088.3298817
|
1793414888.3298817
|
|
5995
|
Untitled project by @Rohan_S | Stardance
|
Rohan_S
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Rohan_S | Stardance
|
1792623309.616692
|
1793228109.616692
|
|
5996
|
Auto Updater by @Afaeid | Stardance
|
Afaeid
|
1
|
31.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T11:09:26Z", "hours": 31.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a npm tool that automatically updates another directory live time while editing a certain directory. The most challenging thing was version update of NodeJS, packages like path have some minor changes what rose a lot of errors. I resolved a real world problem. Now I can continue my tasks easily on SPCK editor without manually copying and pasting the files. This is really a great charm for me. People need to know Eye sight Basics of bash Basics of internet web browsing NodeJS installed machine or capability to install NodeJS npm basic commands Ability to understand the README.md file on Github", "repo": "https://github.com/afaeid/Auto-Updater", "demo": "https://www.npmjs.com/package/@afaeid/auto-updater"}]...
|
[{"post_id": 6776, "ts": "2026 [{"post_id": 6776, "ts": "2026-06-11T10:56:03Z", "hours": 5.5158, "text": "Finally, ready to be shipped!! Added clear README.md and implemented proper safe exit and error handling."}, {"post_id": 5797, "ts": "2026-06-09T18:34:56Z", "hours": 0.625, "text": "After watching the Shipping Guide, I have decided to rewrite the README.md file to make it more clear. Next, I will implement safe exit configuration. 😀😀"}, {"post_id": 5759, "ts": "2026-06-09T17:37:22Z", "hours": 0.4597, "text": "Eventually, I finished the project, solving some minor bugs. Now the package is available on NPM. Have a try!"}, {"post_id": 5617, "ts": "2026-06-09T14:12:23Z", "hours": 0.6686, "text": "After all, it is about to finish Check it on GitHub."}, {"post_id": 4987, "ts": "2026-06-08T17:11:32Z", "hours": 23.77, "text": "After working for hours , eventually, it’s almost completed. Now, only the Readme file is yet to ready."}]...
|
Title: Auto Updater by @Afaeid | Stardance
Devlog Title: Auto Updater by @Afaeid | Stardance
Devlogs:
After working for hours , eventually, it’s almost completed. Now, only the Readme file is yet to ready.
After all, it is about to finish Check it on GitHub.
Eventually, I finished the project, solving some minor bugs. Now the package is available on NPM. Have a try!
After watching the Shipping Guide, I have decided to rewrite the README.md file to make it more clear. Next, I will implement safe exit configuration. 😀😀
Finally, ready to be shipped!! Added clear README.md and implemented proper safe exit and error handling.
Ships:
This is a npm tool that automatically updates another directory live time while editing a certain directory. The most challenging thing was version update of NodeJS, packages like path have some minor changes what rose a lot of errors. I resolved a real world problem. Now I can continue my tasks easily on SPCK editor without manually copying and pasting the files. This is really a great charm for me. People need to know Eye sight Basics of bash Basics of internet web browsing NodeJS installed machine or capability to install NodeJS npm basic commands Ability to understand the README.md file on Github...
|
1793299789.364274
|
1793386189.364274
|
|
5997
|
My first slack bot! by @sylviaincake | Stardance
|
sylviaincake
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @sylviaincake | Star Title: My first slack bot! by @sylviaincake | Stardance...
|
1792702203.3500457
|
1793307003.3500457
|
|
5998
|
My awesome macropad! by @Ethanjon | Stardance
|
Ethanjon
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Ethanjon | Stardan Title: My awesome macropad! by @Ethanjon | Stardance...
|
1792630126.834868
|
1793234926.834868
|
|
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”!...
|
1793310872.6685164
|
1793397272.6685164
|
|
6000
|
My awesome macropad! by @Keny | Stardance
|
Keny
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Keny | Stardance
|
1792655435.2881393
|
1793260235.2881393
|