|
35039
|
HexKeyboard by @HexFud | Stardance
|
HexFud
|
0
|
25.21
|
0
|
[]
|
[{"post_id": 31884, "ts": "202 [{"post_id": 31884, "ts": "2026-07-20T17:09:58Z", "hours": 5.2881, "text": "Devlog #06 Improved PCB shceme and 3d model"}, {"post_id": 31347, "ts": "2026-07-19T17:46:00Z", "hours": 6.4672, "text": "Devlog #05 New discovery ! The PCB 3x3 keys matrix doesn’t work….. But i managed to solve this problem, simply i didn’t fully understand the concept of a matrix but now the cables and diodes are correctly placed. I am also fixing the wiring on the scheme because i am starting to hallucinate over this mass of cables"}, {"post_id": 30947, "ts": "2026-07-18T23:16:01Z", "hours": 2.9642, "text": "Devlog #04 I am now designing the shell, with a bit of struggle. Now it is only a grey box but i am planning to improve the model in the future"}, {"post_id": 30759, "ts": "2026-07-18T16:22:21Z", "hours": 3.0003, "text": "Devlog #03 I created a new design for my PCB. Checked all the connections and checking the correct sizes for the submission"}, {"post_id": 30652, "ts": "2026-07-18T12:14:32Z", "hours": 5.6214, "text": "Devlog #02 Finally after various hours of work I Successfully finalized the keyboard matrix wiring, correctly integrating diodes with each switch to prevent ghosting LED Implementation with SK6812MINI-E LEDs. Fixed footprint alignment issues by standardizing grid settings and using precise coordinate positioning, ensuring all switch-to-LED layouts are perfectly centered. Cleaned up the project structure by assigning individual symbols for both switches and LEDs in the schematic."}, {"post_id": 28820, "ts": "2026-07-15T10:05:32Z", "hours": 1.6169, "text": "Devlog #01 starting to create the external shell, after small adjustments it should fit. When i will be done with this i will check every tollerance"}, {"post_id": 28390, "ts": "2026-07-14T16:54:12Z", "hours": 0.2503, "text": "Devlog #00 Finally designed the PCB after 2 long hours understanding the software and its functions. The next steps will be testing and my favourite 3D designing !"}]...
|
Title: HexKeyboard by @HexFud | Stardance
Devlogs Title: HexKeyboard by @HexFud | Stardance
Devlogs:
Devlog #00 Finally designed the PCB after 2 long hours understanding the software and its functions. The next steps will be testing and my favourite 3D designing !
Devlog #01 starting to create the external shell, after small adjustments it should fit. When i will be done with this i will check every tollerance
Devlog #02 Finally after various hours of work I Successfully finalized the keyboard matrix wiring, correctly integrating diodes with each switch to prevent ghosting LED Implementation with SK6812MINI-E LEDs. Fixed footprint alignment issues by standardizing grid settings and using precise coordinate positioning, ensuring all switch-to-LED layouts are perfectly centered. Cleaned up the project structure by assigning individual symbols for both switches and LEDs in the schematic.
Devlog #03 I created a new design for my PCB. Checked all the connections and checking the correct sizes for the submission
Devlog #04 I am now designing the shell, with a bit of struggle. Now it is only a grey box but i am planning to improve the model in the future
Devlog #05 New discovery ! The PCB 3x3 keys matrix doesn’t work….. But i managed to solve this problem, simply i didn’t fully understand the concept of a matrix but now the cables and diodes are correctly placed. I am also fixing the wiring on the scheme because i am starting to hallucinate over this mass of cables
Devlog #06 Improved PCB shceme and 3d model...
|
1793983790.3405507
|
1794588590.3405507
|
|
23611
|
Untitled by @Lucifer | Stardance
|
Lucifer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Lucifer | Stardance
|
1793983789.4747
|
1794588589.4747
|
|
35307
|
Spotrol by @HTaamas | Stardance
|
HTaamas
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Spotrol by @HTaamas | Stardance
|
1793983788.5955057
|
1794588588.5955057
|
|
12000
|
Mini ADS-B Receiver by @mooncheeeese | Stardance
|
mooncheeeese
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Mini ADS-B Receiver by @mooncheeeese | Star Title: Mini ADS-B Receiver by @mooncheeeese | Stardance...
|
1793983787.7187436
|
1794588587.7187436
|
|
1973
|
Fight, Beginner Game Making Project by @Sunny | St Fight, Beginner Game Making Project by @Sunny | Stardance...
|
Sunny
|
1
|
10.0
|
29
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T23:00:30Z", "hours": 10.0, "multiplier": 2.98, "payout": 29, "blessing": "neutral", "text": "Following Brackeys Godot tutorial, I developed a 2D platformer. As my first project with the Godot engine, the experience was a significant learning curve. The difficulty stemmed primarily from minor errors, such as script indentation or simple typos, which proved unexpectedly time-consuming to troubleshoot. While I am not particularly satisfied with this initial attempt, I have already begun work on a second game and aim to produce a much higher quality result.", "repo": "https://github.com/KirkSunny/Learning-Beginner-Game", "demo": "https://sunnykirk.itch.io/fight"}]...
|
[{"post_id": 3703, "ts": "2026 [{"post_id": 3703, "ts": "2026-06-06T19:12:38Z", "hours": 9.885, "text": "Added Maacks Game Template"}]...
|
Title: Fight, Beginner Game Making Project by @Sun Title: Fight, Beginner Game Making Project by @Sunny | Stardance
Devlogs:
Added Maacks Game Template
Ships:
Following Brackeys Godot tutorial, I developed a 2D platformer. As my first project with the Godot engine, the experience was a significant learning curve. The difficulty stemmed primarily from minor errors, such as script indentation or simple typos, which proved unexpectedly time-consuming to troubleshoot. While I am not particularly satisfied with this initial attempt, I have already begun work on a second game and aim to produce a much higher quality result....
|
1793983786.6130598
|
1794070186.6130598
|
|
15416
|
My very own WebOS by @mriganka_singhal | Stardance
|
mriganka_singhal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @mriganka_singhal | St Title: My very own WebOS by @mriganka_singhal | Stardance...
|
1793983785.726991
|
1794588585.726991
|
|
4641
|
My awesome macropad! by @mihranrazaa | Stardance
|
mihranrazaa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @mihranrazaa | Star Title: My awesome macropad! by @mihranrazaa | Stardance...
|
1793983784.7880197
|
1794588584.7880197
|
|
38228
|
My very own WebOS by @proffesionalIT | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @proffesionalIT | Star Title: My very own WebOS by @proffesionalIT | Stardance...
|
1793983783.8595557
|
1794588583.8595557
|
|
33155
|
FRC ROBOT by @evina | Stardance
|
evina
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: FRC ROBOT by @evina | Stardance
|
1793983780.2571487
|
1794588580.2571487
|
|
23266
|
My awesome macropad! by @Kaylinn | Stardance
|
Kaylinn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Kaylinn | Stardanc Title: My awesome macropad! by @Kaylinn | Stardance...
|
1793983779.379104
|
1794588579.379104
|
|
25611
|
My very own WebOS by @gyp | Stardance
|
gyp
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @gyp | Stardance
|
1793983778.4882252
|
1794588578.4882252
|
|
21821
|
My awesome macropad! by @seyda_h | Stardance
|
seyda_h
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @seyda_h | Stardanc Title: My awesome macropad! by @seyda_h | Stardance...
|
1793983777.5817552
|
1794588577.5817552
|
|
38987
|
Untitled project by @Poterbocker | Stardance
|
Poterbocker
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Poterbocker | Stardanc Title: Untitled project by @Poterbocker | Stardance...
|
1793983776.7004697
|
1794588576.7004697
|
|
20520
|
droid checker by @Droidmoney | Stardance
|
Droidmoney
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: droid checker by @Droidmoney | Stardance
|
1793983775.793591
|
1794588575.793591
|
|
454
|
Untitled by @dhuhaanesh | Stardance
|
dhuhaanesh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @dhuhaanesh | Stardance
|
1793983774.8951724
|
1794588574.8951724
|
|
13958
|
My awesome macropad! by @tarunk | Stardance
|
tarunk
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tarunk | Stardance
|
1793983773.9891064
|
1794588573.9891064
|
|
18074
|
Untitled project by @rakshansenthil10 | Stardance
|
rakshansenthil10
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @rakshansenthil10 | Sta Title: Untitled project by @rakshansenthil10 | Stardance...
|
1793983773.1206038
|
1794588573.1206038
|
|
39962
|
My own site! by @jaefermuhamed | Stardance
|
jaefermuhamed
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @jaefermuhamed | Stardance
|
1793983772.2289057
|
1794588572.2289057
|
|
14344
|
ESP32 Lego train controller module by @ABalinko | ESP32 Lego train controller module by @ABalinko | Stardance...
|
ABalinko
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ESP32 Lego train controller module by @ABal Title: ESP32 Lego train controller module by @ABalinko | Stardance...
|
1793983771.3286438
|
1794588571.3286438
|
|
857
|
Untitled by @SGAGOATED | Stardance
|
SGAGOATED
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @SGAGOATED | Stardance
|
1793983770.1821287
|
1794588570.1821287
|
|
4901
|
Echo by @Atom | Stardance
|
Atom
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Echo by @Atom | Stardance
|
1793983769.294364
|
1794588569.294364
|
|
7002
|
Untitled project by @omarmium | Stardance
|
omarmium
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @omarmium | Stardance
|
1793983768.400359
|
1794588568.400359
|
|
23135
|
Basic Hackpad by @Ponboyerson | Stardance
|
Ponboyerson
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Basic Hackpad by @Ponboyerson | Stardance
|
1793983767.471165
|
1794588567.471165
|
|
14300
|
Nema 17 powered Robot Arm by @Browny_Curry | Stard Nema 17 powered Robot Arm by @Browny_Curry | Stardance...
|
Browny_Curry
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Nema 17 powered Robot Arm by @Browny_Curry Title: Nema 17 powered Robot Arm by @Browny_Curry | Stardance...
|
1793983766.6057842
|
1794588566.6057842
|
|
2866
|
My awesome macropad! by @MU44DH2012 | Stardance
|
MU44DH2012
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @MU44DH2012 | Stard Title: My awesome macropad! by @MU44DH2012 | Stardance...
|
1793983765.7323027
|
1794588565.7323027
|
|
32542
|
WarioWare Game by @Bendanny12 | Stardance
|
Bendanny12
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WarioWare Game by @Bendanny12 | Stardance
|
1793983764.8084953
|
1794588564.8084953
|
|
31643
|
WarioWare Game by @jalen | Stardance
|
jalen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WarioWare Game by @jalen | Stardance
|
1793983763.8940418
|
1794588563.8940418
|
|
23517
|
cupboard design by @Jay_D | Stardance
|
Jay_D
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T17:53:31Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a design of a miniature cupboard. later there will be more complex projects but this is my firsy", "repo": "https://github.com/jdinventor7/3D-printed-cupboard-for-Stardance-hack-club", "demo": ""}]...
|
[{"post_id": 13149, "ts": "202 [{"post_id": 13149, "ts": "2026-06-21T14:55:44Z", "hours": 1.1836, "text": "3D printed cupboard"}]...
|
Title: cupboard design by @Jay_D | Stardance
Devl Title: cupboard design by @Jay_D | Stardance
Devlogs:
3D printed cupboard
Ships:
I made a design of a miniature cupboard. later there will be more complex projects but this is my firsy...
|
1793983762.7679257
|
1794070162.7679257
|
|
985
|
Starventure by @averyocean65 | Stardance
|
averyocean65
|
0
|
16.81
|
0
|
[]
|
[{"post_id": 7370, "ts": "2026 [{"post_id": 7370, "ts": "2026-06-12T09:00:57Z", "hours": 1.3567, "text": "I can’t find a solution that works for me with the default Unity Rigidbody system. So I have an idea.. What if I write my own? I could write my own physics system so I can have more control over how the velocity is calculated in an object. But, then I’d also need to do my own collision system logic, so I’ve been thinking… what if I make this game with a bareknuckles engine, like raylib? It honestly feels like it might be easier for me, since it would load and run faster than Unity, use way less resources which would let me develop quicker on my laptop. One can maybe see the Unity project as a prototype. It served the purpose of showcasing that I can figure out the necessities for making a game of this caliber, and to show me how much I dislike Unity’s physics system for this sort of work, especially with how my laptop interacts with Unity. I’m gonna look into a new engine for this project. And worst case, I’ll write one myself. Maybe I’ll just write my own physics engine in Unity so I can keep the comfort features of the engine. We’ll see. Happy coding."}, {"post_id": 5167, "ts": "2026-06-08T21:00:18Z", "hours": 1.1794, "text": "Phew, this took me a while, mainly because my school laptop is slow as heck! But, hey, now you can have rotating objects! As seen here, the player stays aligned with the object until it leaves the confines of the “atmosphere” of the spaceship, where you can then see the spaceship swing around the planet in an ellipse shape as it spins! How much fun! I also fixed a fix I made for the visitor system, as well as changing the crosshair (I’ll be adding interactables soon and so I want to have different crosshairs for when you can interact with something and when you can’t). Oh, and, I fixed the realignment code for the player to snap the player to the desired gravity after the while-loop is complete. This is mainly so if I adjust the realignment speed to something ridiculous that it will still result in the correct gravity being set. Anyhow, that is all for now. Have a lovely day fellas, and I hope me being sick doesn’t interfere with the development of this too much. Tomorrow I want to add interactables and an inventory system, although I should probably focus on the player movement rewrite. I guess we’ll see! Happy coding!"}, {"post_id": 4514, "ts": "2026-06-07T21:03:32Z", "hours": 2.7433, "text": "So, I’ve been working on two very cool things for Starventure in the past few days. First off, a sprinting system! Fairly obvious, you can sprint and you can drain stamina, just like the jetpack. Easy as that! Speaking of stamina, I changed the DepletableResource script to only accept drainers, because trying to balance drainers and restorers became very confusing and inefficient when you only had two systems using the same resource, so I fixed that, yay! I have also abstracted a good chunk of the gravity/planet system, so now we can have cool things such as homogeneous gravity fields! This is, as you can see, going to be used in space stations, because.. well it’d be weird if your gravity was spherical whilst you were standing on a plane, right? I’d definitely say so. So, what’s up next? Well, I do wanna work more on the player controller to fix a bug that’s been plaguing me a good deal ever since I made the player force-based, when I limit the player gravity, I also limit the fall speed and jetpack force of the player! This wouldn’t be an issue if I was using regular gravity systems, but due to the complexity of gravity that is ever-changing and affects multiple axes at times, I’ll have to think of a solution. My main idea right now is to either get rid of acceleration forces and only move the player through impulses, which means there’s no need for a speed limiter, or something else. Or calculating the actual gravity velocity at runtime and approximating the raw movement forces. Or maybe I just calculate the forces right then and there and call rb.AddForce with ForceMode.VelocityChange at each FixedUpdate call once.. … that last one seems the most doable. I’ll keep y’all in the loop. For now, I’ll work a bit on the camera rotation system, since travelling between gravity sources while your camera is rotating is… not fun. See y’all!"}, {"post_id": 2399, "ts": "2026-06-04T21:10:44Z", "hours": 3.3364, "text": "Alright, let’s do this. So, as I promised, I finally did something about the horrendous visuals of the past devlogs. Now, it’s still not the prettiest game ever, but I think the textures I got from ambientCG definitely make this more pleasing to look at! Also, I revamped the player movement and jumping… why? Because moving on moving planets didn’t work at all! So, now the player movement mainly consists of a bunch of wacky _rb.AddForce(…) calls, as well as a somewhat janky speed limiter that I definitely have to work on, or… I could call the slow falling speed a feature… let’s do that, it’s a feature of the jetpack now. Also, as I just mentioned, the jump has been replaced by a jetback! Now you can float around a planet… until your stamina (or fuel) runs out. Oh, right, that blue bar in the top left of the game view is the stamina bar, just incase you had no idea what it’s there for. So all of that definitely took me a considerable amount of time, especially since I had to wrap my mind around how I wanna handle jumping and gravity and limiting the player’s speed all at the same time. The system isn’t perfect, but, eh, screw it. Good enough. Now I will head off, talk with some friends, and maybe code more after that. But for now, I’m gonna take a break until tomorrow. Happy coding! And remember that you are all awesome!"}, {"post_id": 1703, "ts": "2026-06-03T21:20:38Z", "hours": 1.0617, "text": "Welp, this took me longer than I want to admit, but… you can finally jump between planets without your player’s view suddenly snapping and disorienting you. Now it still disorients you, but smoothly~ I’m very happy with how this is turning out and I am honestly just so glad I finally have this working, it was such a major headache. I really, really, wanted to use DOTween for this, but for the sake of me I cannot figure out how to make it work properly, actually writing this I have an idea. I’m gonna try that, but for now, I’m using a regular coroutine. Now, I’m getting bored of looking at these bland cubes, spheres and this default skybox. I wanna make it feel more like space. Time for dev art! Happy coding!"}, {"post_id": 1671, "ts": "2026-06-03T20:13:49Z", "hours": 2.2319, "text": "Alright, more stuff to showcase! This time I worked on an orbiting system, so I can make stuff spin around other stuff, how neat! I’m mainly going to be using this system for stuff like space stations, which I’ll add later on in development, or moons. Also, since I made it so the orbit ellipse is actually an ellipse! Which means I could make a full on solar system! I am planning to do that, btw, I made a whole visitor system which parents StellarObjects like the player or scrap you might drag along with you to the player they’re currently on (which is determind by if they’ve collided with the AtmosphereCollider). So, hey. Things are looking pretty good, if I do say so myself. Now, I’m gonna go fix up the system for changing the player rotation when you jump between planets. Happy coding!"}, {"post_id": 827, "ts": "2026-06-02T14:50:19Z", "hours": 3.2586, "text": "Alright! More stuff to showcase! Been doing lots of work on the player controller today, mainly trying to figure out how the heck to make it function properly. My first approach was to make a Rigidbody player controller like I did lots of times for my (failed) FPS projects. However, that resulted in my character either not moving, or slingshotting at mach 10 across space. And since it’s encouraged to post hilarious fails, here you go. First attachment is exactly that lol. Doing some research, I found that you can also move Rigidbody players via Rigidbody.MovePosition(…), so I opted for that instead. Then I added a jump, then some ground detection, and also (finally) a look controller so you can look around. Honestly, pretty proud of my work so far. Only issue is that at the very top of planets, your player gets locked into place and all they can do is spin uncontrollably. But, that’s an issue I’m going to fix soon, as well as some small visuals, like a better skybox. Also, you can hop between planets! I haven’t added camera smoothing to it yet, but it’s still super cool to do. Jumping off a planet’s atmosphere just to fly into another’s… so much fun! Maybe you’ll be able to do that with asteroids in the future or something… We’ll see! For now, thanks for reading, and happy coding!"}, {"post_id": 344, "ts": "2026-06-01T17:26:08Z", "hours": 0.4478, "text": "I added custom gravity, yay! It was honestly weirdly simple. The most complex part of it was honestly calculating the gravity vector for the rigidbody class. But now, I can have my cubes falling onto a planet, or even cruising through zero G! This is such a small thing, but it’s so exciting for me. Time to work on the player controller!"}, {"post_id": 226, "ts": "2026-06-01T10:34:39Z", "hours": 0.8183, "text": "Ok, I’ve been working on getting the StellarRigidbodies to detect when they enter a planet. For that I made a brand new AtmosphereCollider class, as well as a new tag, just so thinks set themselves up automatically. Now I just need to calculate the gravity vector and somehow apply it on the rigidbody and we should have (very basic) planet gravity working! Yay! Thanks for reading, and happy coding!"}, {"post_id": 217, "ts": "2026-06-01T09:36:53Z", "hours": 0.3786, "text": "Hello there! I’ve just started work on a project I’ve been meaning to work on for a long time… Starventure! Starventure is going to be a survival-sandbox game where you can explore procedurally generated space, like in No Man’s Sky! You’ll have to fly down to new planets to keep yourself alive, whilst also building settlements in the orbits of planets. Or at least, that’s the hope! Right now I’ve got a simple visualizer and outline for the PlanetGravity class working, soon this class will be used by StellarRigidbodies to figure out what kind of gravity should be applied to a physics object. Let’s hope this goes well, and happy coding! (also happy pride month!)"}]...
|
Title: Starventure by @averyocean65 | Stardance
D Title: Starventure by @averyocean65 | Stardance
Devlogs:
Hello there! I’ve just started work on a project I’ve been meaning to work on for a long time… Starventure! Starventure is going to be a survival-sandbox game where you can explore procedurally generated space, like in No Man’s Sky! You’ll have to fly down to new planets to keep yourself alive, whilst also building settlements in the orbits of planets. Or at least, that’s the hope! Right now I’ve got a simple visualizer and outline for the PlanetGravity class working, soon this class will be used by StellarRigidbodies to figure out what kind of gravity should be applied to a physics object. Let’s hope this goes well, and happy coding! (also happy pride month!)
Ok, I’ve been working on getting the StellarRigidbodies to detect when they enter a planet. For that I made a brand new AtmosphereCollider class, as well as a new tag, just so thinks set themselves up automatically. Now I just need to calculate the gravity vector and somehow apply it on the rigidbody and we should have (very basic) planet gravity working! Yay! Thanks for reading, and happy coding!
I added custom gravity, yay! It was honestly weirdly simple. The most complex part of it was honestly calculating the gravity vector for the rigidbody class. But now, I can have my cubes falling onto a planet, or even cruising through zero G! This is such a small thing, but it’s so exciting for me. Time to work on the player controller!
Alright! More stuff to showcase! Been doing lots of work on the player controller today, mainly trying to figure out how the heck to make it function properly. My first approach was to make a Rigidbody player controller like I did lots of times for my (failed) FPS projects. However, that resulted in my character either not moving, or slingshotting at mach 10 across space. And since it’s encouraged to post hilarious fails, here you go. First attachment is exactly that lol. Doing some research, I found that you can also move Rigidbody players via Rigidbody.MovePosition(…), so I opted for that instead. Then I added a jump, then some ground detection, and also (finally) a look controller so you can look around. Honestly, pretty proud of my work so far. Only issue is that at the very top of planets, your player gets locked into place and all they can do is spin uncontrollably. But, that’s an issue I’m going to fix soon, as well as some small visuals, like a better skybox. Also, you can hop between planets! I haven’t added camera smoothing to it yet, but it’s still super cool to do. Jumping off a planet’s atmosphere just to fly into another’s… so much fun! Maybe you’ll be able to do that with asteroids in the future or something… We’ll see! For now, thanks for reading, and happy coding!
Alright, more stuff to showcase! This time I worked on an orbiting system, so I can make stuff spin around other stuff, how neat! I’m mainly going to be using this system for stuff like space stations, which I’ll add later on in development, or moons. Also, since I made it so the orbit ellipse is actually an ellipse! Which means I could make a full on solar system! I am planning to do that, btw, I made a whole visitor system which parents StellarObjects like the player or scrap you might drag along with you to the player they’re currently on (which is determind by if they’ve collided with the AtmosphereCollider). So, hey. Things are looking pretty good, if I do say so myself. Now, I’m gonna go fix up the system for changing the player rotation when you jump between planets. Happy coding!
Welp, this took me longer than I want to admit, but… you can finally jump between planets without your player’s view suddenly snapping and disorienting you. Now it still disorients you, but smoothly~ I’m very happy with how this is turning out and I am honestly just so glad I finally have this working, it was such a major headache. I really, really, wanted to use DOTween for this, but for the sake of me I cannot figure out how to make it work properly, actually writing this I have an idea. I’m gonna try that, but for now, I’m using a regular coroutine. Now, I’m getting bored of looking at these bland cubes, spheres and this default skybox. I wanna make it feel more like space. Time for dev art! Happy coding!
Alright, let’s do this. So, as I promised, I finally did something about the horrendous visuals of the past devlogs. Now, it’s still not the prettiest game ever, but I think the textures I got from ambientCG definitely make this more pleasing to look at! Also, I revamped the player movement and jumping… why? Because moving on moving planets didn’t work at all! So, now the player movement mainly consists of a bunch of wacky _rb.AddForce(…) calls, as well as a somewhat janky speed limiter that I definitely have to work on, or… I could call the slow falling speed a feature… let’s do that, it’s a feature of the jetpack now. Also, as I just mentioned, the jump has been replaced by a jetback! Now you can float around a planet… until your stamina (or fuel) runs out. Oh, right, that blue bar in the top left of the game view is the stamina bar, just incase you had no idea what it’s there for. So all of that definitely took me a considerable amount of time, especially since I had to wrap my mind around how I wanna handle jumping and gravity and limiting the player’s speed all at the same time. The system isn’t perfect, but, eh, screw it. Good enough. Now I will head off, talk with some friends, and maybe code more after that. But for now, I’m gonna take a break until tomorrow. Happy coding! And remember that you are all awesome!
So, I’ve been working on two very cool things for Starventure in the past few days. First off, a sprinting system! Fairly obvious, you can sprint and you can drain stamina, just like the jetpack. Easy as that! Speaking of stamina, I changed the DepletableResource script to only accept drainers, because trying to balance drainers and restorers became very confusing and inefficient when you only had two systems using the same resource, so I fixed that, yay! I have also abstracted a good chunk of the gravity/planet system, so now we can have cool things such as homogeneous gravity fields! This is, as you can see, going to be used in space stations, because.. well it’d be weird if your gravity was spherical whilst you were standing on a plane, right? I’d definitely say so. So, what’s up next? Well, I do wanna work more on the player controller to fix a bug that’s been plaguing me a good deal ever since I made the player force-based, when I limit the player gravity, I also limit the fall speed and jetpack force of the player! This wouldn’t be an issue if I was using regular gravity systems, but due to the complexity of gravity that is ever-changing and affects multiple axes at times, I’ll have to think of a solution. My main idea right now is to either get rid of acceleration forces and only move the player through impulses, which means there’s no need for a speed limiter, or something else. Or calculating the actual gravity velocity at runtime and approximating the raw movement forces. Or maybe I just calculate the forces right then and there and call rb.AddForce with ForceMode.VelocityChange at each FixedUpdate call once.. … that last one seems the most doable. I’ll keep y’all in the loop. For now, I’ll work a bit on the camera rotation system, since travelling between gravity sources while your camera is rotating is… not fun. See y’all!
Phew, this took me a while, mainly because my school laptop is slow as heck! But, hey, now you can have rotating objects! As seen here, the player stays aligned with the object until it leaves the confines of the “atmosphere” of the spaceship, where you can then see the spaceship swing around the planet in an ellipse shape as it spins! How much fun! I also fixed a fix I made for the visitor system, as well as changing the crosshair (I’ll be adding interactables soon and so I want to have different crosshairs for when you can interact with something and when you can’t). Oh, and, I fixed the realignment code for the player to snap the player to the desired gravity after the while-loop is complete. This is mainly so if I adjust the realignment speed to something ridiculous that it will still result in the correct gravity being set. Anyhow, that is all for now. Have a lovely day fellas, and I hope me being sick doesn’t interfere with the development of this too much. Tomorrow I want to add interactables and an inventory system, although I should probably focus on the player movement rewrite. I guess we’ll see! Happy coding!
I can’t find a solution that works for me with the default Unity Rigidbody system. So I have an idea.. What if I write my own? I could write my own physics system so I can have more control over how the velocity is calculated in an object. But, then I’d also need to do my own collision system logic, so I’ve been thinking… what if I make this game with a bareknuckles engine, like raylib? It honestly feels like it might be easier for me, since it would load and run faster than Unity, use way less resources which would let me develop quicker on my laptop. One can maybe see the Unity project as a prototype. It served the purpose of showcasing that I can figure out the necessities for making a game of this caliber, and to show me how much I dislike Unity’s physics system for this sort of work, especially with how my laptop interacts with Unity. I’m gonna look into a new engine for this project. And worst case, I’ll write one myself. Maybe I’ll just write my own physics engine in Unity so I can keep the comfort features of the engine. We’ll see. Happy coding....
|
1793983761.466839
|
1794588561.466839
|
|
69155
|
Dreamland by @luxi | Stardance
|
luxi
|
1
|
35.39
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-31T14:57:17Z", "hours": 31.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a virtualized geometry voxel engine, it stores the rendering data as a list of voxels which dynamically generates the quads needed for rendering at https://jankysoftware.org/blueprint.html?id=voxel It uses compute shaders for rendering a.k.a a software renderer I’ve added some basic rigid bodies but they are incomplete. It uses GPU meshing but generates terrain on the CPU. I tried to finish the meshing by the end of stardance but couldn’t so progressive generation isn’t complete but it is what it is. (I attached an older screenshot)", "repo": "https://github.com/nixuntris/dreamland", "demo": "https://github.com/nixuntris/dreamland/releases"}]...
|
[{"post_id": 86509, "ts": "202 [{"post_id": 86509, "ts": "2026-11-03T09:41:40Z", "hours": 4.3922, "text": "Reference renderer and end of stardance. I’ve started implementing a reference renderer using raytracing and an octree for ray traversal. Also printah"}, {"post_id": 85575, "ts": "2026-10-31T14:53:45Z", "hours": 7.4761, "text": "Stardance is ending… but not this project. I am continuing work on it and devlogs will be on terra. As new features are in development still this ship isn’t a final one but a forced one :/ I thought i could get it done in the meantime but I didn’t. This one features GPU meshing completed but with bugs, and not a fully optimized version, no structures or editing as well… so I hope you give me some leniency on the rating"}, {"post_id": 82301, "ts": "2026-10-24T14:40:31Z", "hours": 2.5853, "text": "Grass blades now spawn and work with the progressive terrain generation"}, {"post_id": 82033, "ts": "2026-10-23T15:01:10Z", "hours": 7.1756, "text": "I am continuing work on gpu meshing and just in general world creation. I improved the mesher by adding full LoD support, and I started a gpu memory allocator. I store the state of each chunk column. So it allowed me to have this progressive mesh generator because I also have made the mesher use batches instead(Which was difficult to add). The blogs are gonna be much more sparse because for me to have something to blog about I need to do a lot of work as all the low hanging fruits were already picked"}, {"post_id": 80715, "ts": "2026-10-18T16:22:51Z", "hours": 8.2228, "text": "I’ve implemented the first version of GPU meshing and meshlet generation. It’s about 20 times faster than what my CPU can do (I have an rx 9070 and a 5950x) Also I don’t need to upload all the data so it’s even faster there (it was also quite slow to do) Of course, we are comparing an algorithm I tinkered and worked on for months to the GPU version which I just finished, so it’s completely unfair, as the CPU also can utilize more tricks with chunk generation skipping etc… using data that the GPU currently doesn’t yet have"}, {"post_id": 79166, "ts": "2026-10-12T21:05:54Z", "hours": 5.0619, "text": "I am continuing work on my main project, it’s a voxel engine utilizing virtualized geometry and splatting. It’s software rasterized but uses hardware rasterization in some cases. I’ve implemented clouds using raymarching and secondary lights. Currently the light is accelerated using only chunks. Nothing fancy yet but it’s a start"}]...
|
Title: Dreamland by @luxi | Stardance
Devlogs:
I Title: Dreamland by @luxi | Stardance
Devlogs:
I am continuing work on my main project, it’s a voxel engine utilizing virtualized geometry and splatting. It’s software rasterized but uses hardware rasterization in some cases. I’ve implemented clouds using raymarching and secondary lights. Currently the light is accelerated using only chunks. Nothing fancy yet but it’s a start
I’ve implemented the first version of GPU meshing and meshlet generation. It’s about 20 times faster than what my CPU can do (I have an rx 9070 and a 5950x) Also I don’t need to upload all the data so it’s even faster there (it was also quite slow to do) Of course, we are comparing an algorithm I tinkered and worked on for months to the GPU version which I just finished, so it’s completely unfair, as the CPU also can utilize more tricks with chunk generation skipping etc… using data that the GPU currently doesn’t yet have
I am continuing work on gpu meshing and just in general world creation. I improved the mesher by adding full LoD support, and I started a gpu memory allocator. I store the state of each chunk column. So it allowed me to have this progressive mesh generator because I also have made the mesher use batches instead(Which was difficult to add). The blogs are gonna be much more sparse because for me to have something to blog about I need to do a lot of work as all the low hanging fruits were already picked
Grass blades now spawn and work with the progressive terrain generation
Stardance is ending… but not this project. I am continuing work on it and devlogs will be on terra. As new features are in development still this ship isn’t a final one but a forced one :/ I thought i could get it done in the meantime but I didn’t. This one features GPU meshing completed but with bugs, and not a fully optimized version, no structures or editing as well… so I hope you give me some leniency on the rating
Reference renderer and end of stardance. I’ve started implementing a reference renderer using raytracing and an octree for ray traversal. Also printah
Ships:
This is a virtualized geometry voxel engine, it stores the rendering data as a list of voxels which dynamically generates the quads needed for rendering at https://jankysoftware.org/blueprint.html?id=voxel It uses compute shaders for rendering a.k.a a software renderer I’ve added some basic rigid bodies but they are incomplete. It uses GPU meshing but generates terrain on the CPU. I tried to finish the meshing by the end of stardance but couldn’t so progressive generation isn’t complete but it is what it is. (I attached an older screenshot)...
|
1793983760.2598205
|
1794070160.2598205
|
|
18942
|
My very own WebOS by @Soham3 | Stardance
|
Soham3
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Soham3 | Stardance
|
1793983759.3859048
|
1794588559.3859048
|
|
17523
|
My awesome macropad! by @Adeep | Stardance
|
Adeep
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Adeep | Stardance
|
1793983758.4622476
|
1794588558.4622476
|
|
29034
|
NautlisOS by @MrChompDev | Stardance
|
MrChompDev
|
0
|
0.84
|
0
|
[]
|
[{"post_id": 19840, "ts": "202 [{"post_id": 19840, "ts": "2026-07-01T07:30:08Z", "hours": 0.8422, "text": "This is my web based OS that has working browser and the user can log in with their passwords."}]...
|
Title: NautlisOS by @MrChompDev | Stardance
Devlo Title: NautlisOS by @MrChompDev | Stardance
Devlogs:
This is my web based OS that has working browser and the user can log in with their passwords....
|
1793983757.546397
|
1794588557.546397
|
|
38515
|
edgewalker by @ccyaliyahh | Stardance
|
ccyaliyahh
|
0
|
0.99
|
0
|
[]
|
[{"post_id": 34992, "ts": "202 [{"post_id": 34992, "ts": "2026-07-26T04:16:43Z", "hours": 0.9917, "text": "i have finished creating some basic platforms and just started a tiny bit of the start screen. to be completely honest, i’m kind of lost. why is godot so complicated lol?? :["}]...
|
Title: edgewalker by @ccyaliyahh | Stardance
Devl Title: edgewalker by @ccyaliyahh | Stardance
Devlogs:
i have finished creating some basic platforms and just started a tiny bit of the start screen. to be completely honest, i’m kind of lost. why is godot so complicated lol?? :[...
|
1793983756.628279
|
1794588556.628279
|
|
5014
|
My awesome macropad! by @FixCeylinn | Stardance
|
FixCeylinn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @FixCeylinn | Stard Title: My awesome macropad! by @FixCeylinn | Stardance...
|
1793983755.7510653
|
1794588555.7510653
|
|
27629
|
My awesome macropad! by @Athira | Stardance
|
Athira
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Athira | Stardance
|
1793983754.8508103
|
1794588554.8508103
|
|
21932
|
Robot arm by @lavra | Stardance
|
lavra
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Robot arm by @lavra | Stardance
|
1793983753.640872
|
1794588553.640872
|
|
11319
|
My awesome macropad! by @StarDancer | Stardance
|
StarDancer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @StarDancer | Stard Title: My awesome macropad! by @StarDancer | Stardance...
|
1793983752.4743996
|
1794588552.4743996
|
|
8687
|
Chronovisor by @greywolfcode | Stardance
|
greywolfcode
|
0
|
19.97
|
0
|
[]
|
[{"post_id": 23739, "ts": "202 [{"post_id": 23739, "ts": "2026-07-06T21:12:11Z", "hours": 2.1297, "text": "Extracting Archives Previously, I was planning to load the each archive into memory and process it there, but I have since realised that this is not a great option; Most of the archive is taken up with files other than the main message files (i.e. images), and most of those files will not need to be loaded into memory, as they will not be shown on screen. The down side is of course that this trades ram for storage, but that seems like an okay tradeoff. A fairly large archive I am testing with is only about 1.5 GB. It may be worth adding an in-memory only option later, however. Part 1: Splitting the current function The first thing I did was split the current function I had to load and process the archives into one for processing (which is now incomplete), and another to extract them. Based on the archive library’s docs, it was very simple to convert the in-memory code to extraction code. Part 2: Foldering At this point, the extraction code extracted just fine, but it recreated the folder structure from the zip archive, when all I wanted was the “Google Chat” folder. I decided to give each new loaded archive its own folder, numbered based on when it was added. (The archives do have a user number inside, but finding it would involve reading through the archive while it was in memory, and it didn’t appear to have any benefit.) This is the point where I got stuck for a while; I was attempting to get the number of folders in the directory, and the asynchronous function for getting that number never returned. I spent a while messing with print statements and try/catch statements trying to find a solution. Eventually, I found a synchronous version that solved the problem, as I am not trying to run this async, but I am still not sure what the real problem was. Either way, it is now extracting successfully. I need to make a note to look into this further. Part 3: Screenshot In writing this devlog, I really wasn’t sure what to put as a screenshot; nothing about the Ui has changed. Eventually I settled on showing the output save directory. to demonstrate how it properly extracts to a new folder. Part 4: Time I’m honestly not sure exactly what went on with he time on this devlog. When I started working on extraction, there were 10-15 minutes (it has been a while since I looked at the exact number) already listed‚ but i couldn’t’ figure out what I had been working on; I ended up reverting those changes and starting over. After that I got sick and went to a Bible school, so it has been a while since I made any meaningful progress. I am fairly certain that the time on this devlog is too high, but I am not exactly sure why (maybe the time I spent trying to work when I wasn’t feeling well?). Either way, my apologies, and I’m hoping to get this project back on track in the next devlog."}, {"post_id": 7703, "ts": "2026-06-12T21:16:38Z", "hours": 2.3119, "text": "Making Exporting Functional This will be the final session (for now) on the archive generator. There are still plenty of bugs, but after this session, it is at the point where it is actually functional, so I merged the generator into the main branch. According to GitHub, this is a Python project now. Part 1: object Message has no attribute “person” Most of the time in this session was spent trying to fix this attribute error. This is where using textual makes debugging slightly more difficult, as there is no terminal to print to. There is a debug terminal that can be attached, but it still is more complicated. I tried to make Labels pop up with debug information, but the never appeared or caused more errors. Part 2: Logging I got so frustrated with the attribute error that I added logging to the entire application. I started to write my own logging script, but then learned that Python comes with a logging library. I initalised it to use all logging level, although I only use Debug and Info. This helped fix a few other bugs, such as not actually writing messages to the output (once the attribute error was fixed). I used logging to print all the vars in the messages being processed; from this I found that none of the instance variables existed. Part 3: The solution I turned to Google to try to fix my problem. After Googling attribute errors, I saw a suggestion that passing the class, not an initalised instance, could be the cause. As it turns out, when adding a new message to the messages list, I had capitalised the “M”, adding the object not the instance. I spent quite a lot of time for a single character mistake. I’m glad I found it, but it took a frustratingly long time to find for how simple it was. Finished? The archive generator is not done. There are still bugs, it hasn’t been stress tested, the UI looks bad, and only basic messages can be created. But it is functional enough so that I can work on the actual application for the time being."}, {"post_id": 7144, "ts": "2026-06-11T22:41:40Z", "hours": 0.9989, "text": "Producing Output Zips It is about time to wrap up the archive generator, so it is time to actually generate archives. The basic steps are as follow: Parse the Archives Write the archives to the zip file. Obviously the basics steps are not that complicated; Parsing the archives in the complicated part… Part 1: Parsing Dates I wrote a quick datetime parsing tool for converting to/from strings. The chat archives have a fairly standard format for dates, so it was pretty easy to implement. The only really weird thing is there is a single narrow no-break space character ( U+202F ) for some reason. All other spaces are normal spaces. Part 2: Parsing Archives parsing archives is split into creating group_info.json and creating messages.json. group_info.json contains the details for every person in the group. This includes their name, email, and if they are Human or a Bot. messages.json contains the data for every messages. For each message, there is a json object detailing who created the message (name, email, and user type), and further data of when it was created, the message text, and some ID values. Message IDs Each message in the main group gets its own topic ID; messages in threads use the topic ID of the message the thread is linked to. The message’s own ID is created using the Group ID, the Topic ID, and an ID unique to the message (if it is a top level message, this is the same as the topic ID). #Part 4: Writing to Archives This is a fairly simple step; the most interesting part is generating the archive name. I based it on the actual exported zip names by making the name chronovisor-generator_takeout- + the time it was exported."}, {"post_id": 7003, "ts": "2026-06-11T19:10:00Z", "hours": 0.5283, "text": "Message Adding Menu In this session, I added the menu for adding messages. This went surprisingly smoothly; I had to learn how to use the Select widget, but most of the other parts of the UI I had already used, or could piece together from other menus. The biggest UI section, the data and time editing, can simply be pulled from the group editing menus. Overall, this session went smoothly, and I was able to focus on how to do make person selection work. Part 1: Person Selection Each message obviously needs a person who sent it; for this I use a Select widget, which is essentially a drop down menu. After my previous problems with passing the wrong type into a field, I wasn’t exactly sure how to make the selection box work; I really wanted to pass Person objects in, as it would remove needing to use a person’s name as a key to try to find the right Person object afterwords. I tried it and… it totally worked. After overriding the str method to return the person’s name and email, the Select widget was functional. Sometimes it is nice when code just works."}, {"post_id": 6614, "ts": "2026-06-11T03:02:06Z", "hours": 1.7028, "text": "Group Editing I was going to start doing messages in this session, and realised that there was an important element that I was missing: group settings. This is important for one sort of sneaky reason: message history is dated. At the beginning of chat history, there is a small informational message that says when the chat was created, and then all messages must come afterwards. Without defining a set start time, there would be no way to validate the dates set when new messages are added. To go along with this, I also added the ability to set the name for spaces. I am also storing if the archive is a DM or Space in Archive objects so I know what fields to ignore when saving occurs. Part 1: Date and Time Entry Date and time entry is split into a box for each Month, Day, Year, Hour, Minute, Second. Each of these has a corresponding label to detail what each field is for. All of these are arranged in a Horizontal container so that they line up. I also experimented with data validation; I at first started to right my own validation classes, then realised that textual has a built in validator for numbers. There are a few potential bugs, the biggest is that days are not validated based on the selected month, so entering dates like February 31st is possible. Also, a year that is too late causes an error, it may be something to do with python’s datetime, but it isn’t a priority to experiment with at the moment. Part 2: Name Entry The type (DM or Space) is passed to the container; this is used to enable or disable editing the group. The was I have set this up, the name editing is below the save button name, but I really am trying to get features in and not waste my time on UI for the moment. It works, and for now that is what matters. And speaking of the Save button… Part 3: The Save Button The Save button is fairly simple; while editing, values are stored locally in the container. When the save button is pressed, these values are actually written to the correct archive. Part 4: Silly Mistakes I don’t know what I was thinking today; I made a bunch of silly mistakes. The worst was trying to pass an integer where a string was required. I was setting up the base for the date & time inputs, and as I was thinking about time, so I just tried to input numbers. I got back an error about translation; it took a bit to figure out what was causing the error."}, {"post_id": 6008, "ts": "2026-06-10T02:17:02Z", "hours": 2.0028, "text": "People Editing! In this session, I implemented the menus for adding, removing, and editing people from a DM or Space. I decided to make the editing menus popup menus to avoid having to redo the sidebar with more menu switches. To make the popups work better, I separated the styling for popups into their own tcss file from the licence popup styles. Part 1: Editing Buttons The first order of business was to add the buttons for adding, editing, and removing people. They are setup so that the first person cannot be edited or removed, as they are the main user in all DMs and Spaces. A maximum number of people is passed to the people editing widget- two people for DMs, and 400 people for Spaces. 400 is the limit for personal use, and I don’t think any more than that is really required. Part 2: Adding People The people adding popup has two labels, one for the name and one for the email. The default values are generated based on the number of items so there are hopefully no duplicates. The UI design has each input labelled, and buttons to cancel or save the new person. Designing this was really interesting, as I found that nesting containers using their constructor, not a with statement, allows event bindings to bind correctly to the main container. This nested structure is surprisingly quite a bit like the Flutter child/children structure. Horizontal( Label(\"Name: \"), Input(placeholder=self._name, id = \"name\") ), In order to make the table reload, I just switch back to the menu with a switch command; this works, although that fact that there is no default menu so it returns to the void menu means it isn’t a perfect solution. Part 3: Removing People This was fairly simple; the index for the person is passed into the constructor, so the person’s name can be referenced in the confirmation message. An option to remove the person or cancel is provided. Part 4: Editing People This popup is in part a modification of adding people and removing people. The person’s index is passed into the constructor so they can be found, and text boxes are provided to modify the person’s name. Part 5: Adding people to Spaces I was originally going to stop at adding people to DMs, but I thought that the larger number of people in Spaces would make a better demo. I unfortunately hadn’t actually made it easy to add this to spaces; I just forgot I would need to make this work for the separate Spaces and DMs. Making this separate is required as I store DMs and Spaces in separate dictionaries, and the command to return to the correct menu needs to be different for spaces and menus. To fix this, I pass a type to the constructor, which is used to determine which dictionary to use, and which call to make when closing the popup"}, {"post_id": 5822, "ts": "2026-06-09T19:14:03Z", "hours": 0.9486, "text": "Adding the People Viewer The purpose of this session was to add a way to view the people currently in the Space/DM. Part 1: Person Storage Up to this point, there was no way to actually store the created people. To fix this, I created a Person class, a simple object to store the name and email. I then added a list to the Archive class to store the people. Part 2: Dynamically Adding Widgets I am using a more complicated system than with User Creation to dynamically switch what you can edit; I am hoping that this will give me more control, and hopefully make it easier to make the UI look good. The new method is to dynamically add a container with the right widgets inside when a button is pressed. To this end, I created a class based on the VerticalScrollBar to control the person editing. I didn’t fully understand how to dynamically add widgets at first; my first idea was to have a instance variable containing a container that would be yielded in the compose method; I could then update the variable to update the UI. As it turns out, this is not how texual works; I did try a bunch of methods to refresh the screen, but then I learned that you can call a mount method to add new widgets dynamically. Part 3: The DataTable The final step to getting this to work was to add a DataTable. I originally tried to generate the table in the compose method, but I switched to generating it upon creation of the container, as that appears to be the intended way to do it. I am a bit disappointed that the data table is rendered far to the right; Another UI detail for later (actually for later this time) I guess."}, {"post_id": 5155, "ts": "2026-06-08T20:47:57Z", "hours": 0.8292, "text": "Adding Licence Information The main feature of this session was to add a popup box bound to “l” that displays the licence info. I opted to use the short licence info text that was designed to be at the top of source files, as I won’t have a popup on startup, and having multiple commands is not very user friendly. To go along with another bound command, I added the Footer widget to all menus, as it lists avaliabel commands. I also added licence comments to the top of my source files, including the dart files on the main branch. The Licence Box The texutal docs explain that the ModalScreen class can be used as the base of a popup message. Some tcss is used to centre and align everything; this took multiple attempts to figure out where in the container hierarchy to put the align properties. You can see that the button on the bottom is still not centred, but after failing for a bit, I decided that it looks fine. Another UI element to revisit later? Binding the Box I bound the box to “l”, as it makes sense for “licence”. i spent a little bit trying to figure out why the hotkey didn’t do anyhting; turns out it was a typo. It appears textual does not throw an error if you bind a function that does not exist to a key, maybe because you pass a string to it not ana actual function. Another feature I added was to make “l” close the popup box; whatever screen is on top takes priority."}, {"post_id": 5049, "ts": "2026-06-08T18:26:12Z", "hours": 0.87, "text": "DM Creation Menu Base It is time to start on the menus for actually creating archives. Spaces and DMs have the same basic elements, so I am planning to create a few custom widgets that I can reuse for both of them. I decided that I would start with creating the DM creation, as DMs are a bit simpler than spaces. Hub Menu The first thing I created was a hub menu that will be used to create new DMs, Spaces, or Export the archive. It is fairly similar to the Main Menu, except that I used tcss instead of a container to centre the buttons. i think that this makes the code cleaner, and makes more sense with how textual works. I had a small problem where nothing was happening after I added content-align to my tcss file for the Hub Menu; as it turns out I needed normal align to align buttons. DM Creation Menu This menu has a basic docked sidebar just like the User Creation Menu. I am hoping that the plan of using single widgets that “plug in” will prevent UI issues like the user Creation Menu has. ID and Archive Handling I added a scripts folder with two small scripts: id_handeler to create the IDs for each message archive archive_handeling for classes to store archive, and, in the future, handle exporting The ID handler contains a single Enum with values for DMs and Spaces. It also has a single static function to create a custom ID using Python’s uuid and base64 libraries, adding the correct DM or Space value based on the passed type. The archive handler currently contains two stub classes, one for storing archives, and another for storing messages. As more features are added, these classes will grow as well."}, {"post_id": 4669, "ts": "2026-06-08T02:10:48Z", "hours": 0.8422, "text": "Attempting to fix layout issues In my last devlog, I created the Create User Menu, and stated that I wasn’t a fan of how the UI looked, but would work on it after the rest of the app was done. Then I thought I knew how to fix it, so I spent some time working on the UI. I also added a text label for the input box, and docked the sidebar on the left side so other widgets won’t affect it. Attempt 1 My idea was to take advantage of Python’s multiple inheritance and add the Horizontal container as a parent class; this would allow the Screen class to still be used for rendering, but everything would be aligned horizontally. This worked okay; it looked much like the attached screenshot. Unfortunate, the input was pushed over to the right. Attempt 2 I didn’t like having everything pushed over to the right, so I thought that “maybe I can wrap the label and input in a Vertical container to align the label and input box; maybe that would allow them to move over and align with the docked sidebar. While the input and label did line up, it had two problems: The input and label were still pushed over on the right side Wrapping with a Vertical container is done with the Python “with” statement. This makes the Vertical widget capture all the events the input boxes generate Attempt 3 Next I tried to use the grid layout. I have used the grid layout in Python Tkinter, so thought that it might be the way to go here. Using textual tcss, I setup a grid with one row and two columns, and didn’t dock the sidebar on the left. I attempted to make one column fill more of the screen than the other with grid-columns: 1fr 2fr; , unfortunately this didn’t work; this maybe could be a problem with how I read the docs; but I thought I understood how this works. They have an example of how to use the grid layout after all. Conclusion At this point, I have spent 49 minutes failing to make the layout look better. I was feeling frustrated, and realised that I was wasting my time. My goal is to make a Google Chat archive time machine in Dart Flutter, this is only a side part to make it easier to use and demonstrate. I fixed it up so it works, it is functional, and I am going to leave it. For real this time. Once the app is functional I might have a better idea of how to use textual to make a good UI, but my main focus should be making the main viewer."}, {"post_id": 3946, "ts": "2026-06-07T02:22:49Z", "hours": 0.8039, "text": "Add Create User Menu UI I added all the required elements for the CreateUsemenu, the menu for creating the “user” who owns the chats in the archive. The menu has: A side bar that contains buttons for selecting to edit the email or name, or selecting to create the user A input box for the actual editing ContentSwitcher I spent most of my time on using a ContentSwitcher to switch which editor can be used based on which button was clicked. I completely missed how their demonstration worked the first time I tried to implement it in my app. Input Boxes My second problem was in saving the input boxes’ values so they can be used later. I was reading the API and completely missed how you were supposed to implement the on_input_changed method. They listed the variables (and their types) which were available when receiving the input. i thought that I had to create a method in my class with those inputs, then got very confused why I got so many argument errors. It turns out that you use event: Input.Changed parameter just like the button. Organisation The organisation is not entirely how I would like; the input widget is at the bottom not next to the buttons. I tried to wrap them in a Horizontal container, but this messed up using the self parameter. I might come back to this later after the rest of this app is done."}, {"post_id": 3895, "ts": "2026-06-07T00:06:50Z", "hours": 1.2328, "text": "Starting the Archive Generator I started making an application for generating archives that will be able to be used with the main app. This solves two problems: I will want to show the app working further into development without showing my personal chats It will allow people who don’t use Google Chat to test the app Design I am using the textual library for Python to create this helper app. I am using Python not Dart as I am faster with it, and the main focus of this project should be a Dart app. I am using textual not just a simple console app because I saw textual and thought it looked like a really cool library Progress In this session I made the first two menus- the main menu and the create player menu. I was doing some experimenting with how I wanted to design the app, and eventually settled on separate Screens for each menu. When implementing the Screens, however, I didn’t fully understand the api, and couldn’t figure out why my buttons were not rendering. It turned out, I just had to install and switch to the screen, not just push to it or switch to it."}, {"post_id": 3768, "ts": "2026-06-06T20:19:58Z", "hours": 1.1275, "text": "Setting up basic GUI I made a mistake in my initial plan for this project. I wanted to get all the data loading parts done first as I have done json handling in other languages. This would have worked were I familiar with flutter. However, as I am still very new to flutter, I have been spending time trying to figure out how to process the data so it can easily be converted to flutter GUI; I am not sure what tools I have available as I just don’t have a lot of experience. Therefore, I decided I need to work on the UI along with the data processing. I created an app bar that moves the upload button onto it with an IconButton, and I am using the resizable_widget library to create the three panel structure of Google Chat."}, {"post_id": 3570, "ts": "2026-06-06T15:51:32Z", "hours": 1.2675, "text": "Load archive from flutter app In this session, I finished the basic button UI to trigger loading the archive. The first thing I did was to setup a MVVM structure for the app. I chose this as the flutter tutorial uses it for http requests, and I figured that file io posed a similar problem. I first tried to use async/await to prevent the UI from freezing while it loads the quite large zip file; I spent quite a while messing with Future, async, and await trying to get it to work. After my attempts failed, I turned to research, and learned that I actually needed to use compute to run the file processing in a background thread. this works quite well, as is demonstrated in the attached video. I also uploaded the Google Sans and Robot fonts to the project, selecting Google Sans as the default font. I want the project to look a bit like Google Chat in the end, so Google fonts are necessary"}, {"post_id": 3233, "ts": "2026-06-06T01:58:41Z", "hours": 0.7061, "text": "Linking archive loading to GUI I first setup the archive_handeler package to be importable. I made a mistake and accidentally setup the package imports in the chronovisor folder, not in archive_handeler. It was fortunately not a difficult fix, but it makes the git history a bit of a mess. After fixing the import, I added file_picker as a dependency, and added a basic button to use to create a file picker popup and linked the popup with the function to load the selected archive. This involved reading the file_picker docs; fortunately, the picker selection works on the web, as I am currently testing the app in a web environment."}, {"post_id": 3042, "ts": "2026-06-05T22:56:01Z", "hours": 1.3586, "text": "Finish basic archive parsing I finished the basic parsing of archives to retrieve the chat archives. Using the archive library, the archive is loaded, the entries in the Google Chat folder are located, and then they are split into each separate chat. I struggled a lot trying to figure out the most efficient way to sort the files. Each file has a name that includes the entire path inside, and I needed to extract the files from the folder for each specific space/dm, separate the two data json files from other file data, and wrap the data and files in a MessageGroup object. My problem was that the easiest way to get all the files is to use an enhanced for loop, which makes it hard to sort out the files they way I set up the object. Eventually, I settled on storing the files for each dm or space in a List, which could be looped through later; I want to get the program up and running, and it can be optimised later. I also spent a lot of time seeing what methods I had, especially on the ArchiveFile class that the extracted files are stored in, and just looking up APIs as I am new to Dart. At the moment there is not much to see here, as i am doing the basic message parsing before starting the actual gui app."}, {"post_id": 2914, "ts": "2026-06-05T20:22:10Z", "hours": 0.3117, "text": "Setup Chronovisor project I setup the basic project structure; I have a folder for the flutter app, and one for the package to handle all the archive details. This did not take that long, so I also prepared the archive_handeling package to have archive as a dependency, and setup basic loading of a zip file. Note: the time for this devlog is too high; I didn’t see the project show up of Hackatime at first, and so spent some time messing with the files trying to get it to show up, which inflated the time quite a bit. Oops."}]...
|
Title: Chronovisor by @greywolfcode | Stardance
D Title: Chronovisor by @greywolfcode | Stardance
Devlogs:
Setup Chronovisor project I setup the basic project structure; I have a folder for the flutter app, and one for the package to handle all the archive details. This did not take that long, so I also prepared the archive_handeling package to have archive as a dependency, and setup basic loading of a zip file. Note: the time for this devlog is too high; I didn’t see the project show up of Hackatime at first, and so spent some time messing with the files trying to get it to show up, which inflated the time quite a bit. Oops.
Finish basic archive parsing I finished the basic parsing of archives to retrieve the chat archives. Using the archive library, the archive is loaded, the entries in the Google Chat folder are located, and then they are split into each separate chat. I struggled a lot trying to figure out the most efficient way to sort the files. Each file has a name that includes the entire path inside, and I needed to extract the files from the folder for each specific space/dm, separate the two data json files from other file data, and wrap the data and files in a MessageGroup object. My problem was that the easiest way to get all the files is to use an enhanced for loop, which makes it hard to sort out the files they way I set up the object. Eventually, I settled on storing the files for each dm or space in a List, which could be looped through later; I want to get the program up and running, and it can be optimised later. I also spent a lot of time seeing what methods I had, especially on the ArchiveFile class that the extracted files are stored in, and just looking up APIs as I am new to Dart. At the moment there is not much to see here, as i am doing the basic message parsing before starting the actual gui app.
Linking archive loading to GUI I first setup the archive_handeler package to be importable. I made a mistake and accidentally setup the package imports in the chronovisor folder, not in archive_handeler. It was fortunately not a difficult fix, but it makes the git history a bit of a mess. After fixing the import, I added file_picker as a dependency, and added a basic button to use to create a file picker popup and linked the popup with the function to load the selected archive. This involved reading the file_picker docs; fortunately, the picker selection works on the web, as I am currently testing the app in a web environment.
Load archive from flutter app In this session, I finished the basic button UI to trigger loading the archive. The first thing I did was to setup a MVVM structure for the app. I chose this as the flutter tutorial uses it for http requests, and I figured that file io posed a similar problem. I first tried to use async/await to prevent the UI from freezing while it loads the quite large zip file; I spent quite a while messing with Future, async, and await trying to get it to work. After my attempts failed, I turned to research, and learned that I actually needed to use compute to run the file processing in a background thread. this works quite well, as is demonstrated in the attached video. I also uploaded the Google Sans and Robot fonts to the project, selecting Google Sans as the default font. I want the project to look a bit like Google Chat in the end, so Google fonts are necessary
Setting up basic GUI I made a mistake in my initial plan for this project. I wanted to get all the data loading parts done first as I have done json handling in other languages. This would have worked were I familiar with flutter. However, as I am still very new to flutter, I have been spending time trying to figure out how to process the data so it can easily be converted to flutter GUI; I am not sure what tools I have available as I just don’t have a lot of experience. Therefore, I decided I need to work on the UI along with the data processing. I created an app bar that moves the upload button onto it with an IconButton, and I am using the resizable_widget library to create the three panel structure of Google Chat.
Starting the Archive Generator I started making an application for generating archives that will be able to be used with the main app. This solves two problems: I will want to show the app working further into development without showing my personal chats It will allow people who don’t use Google Chat to test the app Design I am using the textual library for Python to create this helper app. I am using Python not Dart as I am faster with it, and the main focus of this project should be a Dart app. I am using textual not just a simple console app because I saw textual and thought it looked like a really cool library Progress In this session I made the first two menus- the main menu and the create player menu. I was doing some experimenting with how I wanted to design the app, and eventually settled on separate Screens for each menu. When implementing the Screens, however, I didn’t fully understand the api, and couldn’t figure out why my buttons were not rendering. It turned out, I just had to install and switch to the screen, not just push to it or switch to it.
Add Create User Menu UI I added all the required elements for the CreateUsemenu, the menu for creating the “user” who owns the chats in the archive. The menu has: A side bar that contains buttons for selecting to edit the email or name, or selecting to create the user A input box for the actual editing ContentSwitcher I spent most of my time on using a ContentSwitcher to switch which editor can be used based on which button was clicked. I completely missed how their demonstration worked the first time I tried to implement it in my app. Input Boxes My second problem was in saving the input boxes’ values so they can be used later. I was reading the API and completely missed how you were supposed to implement the on_input_changed method. They listed the variables (and their types) which were available when receiving the input. i thought that I had to create a method in my class with those inputs, then got very confused why I got so many argument errors. It turns out that you use event: Input.Changed parameter just like the button. Organisation The organisation is not entirely how I would like; the input widget is at the bottom not next to the buttons. I tried to wrap them in a Horizontal container, but this messed up using the self parameter. I might come back to this later after the rest of this app is done.
Attempting to fix layout issues In my last devlog, I created the Create User Menu, and stated that I wasn’t a fan of how the UI looked, but would work on it after the rest of the app was done. Then I thought I knew how to fix it, so I spent some time working on the UI. I also added a text label for the input box, and docked the sidebar on the left side so other widgets won’t affect it. Attempt 1 My idea was to take advantage of Python’s multiple inheritance and add the Horizontal container as a parent class; this would allow the Screen class to still be used for rendering, but everything would be aligned horizontally. This worked okay; it looked much like the attached screenshot. Unfortunate, the input was pushed over to the right. Attempt 2 I didn’t like having everything pushed over to the right, so I thought that “maybe I can wrap the label and input in a Vertical container to align the label and input box; maybe that would allow them to move over and align with the docked sidebar. While the input and label did line up, it had two problems: The input and label were still pushed over on the right side Wrapping with a Vertical container is done with the Python “with” statement. This makes the Vertical widget capture all the events the input boxes generate Attempt 3 Next I tried to use the grid layout. I have used the grid layout in Python Tkinter, so thought that it might be the way to go here. Using textual tcss, I setup a grid with one row and two columns, and didn’t dock the sidebar on the left. I attempted to make one column fill more of the screen than the other with grid-columns: 1fr 2fr; , unfortunately this didn’t work; this maybe could be a problem with how I read the docs; but I thought I understood how this works. They have an example of how to use the grid layout after all. Conclusion At this point, I have spent 49 minutes failing to make the layout look better. I was feeling frustrated, and realised that I was wasting my time. My goal is to make a Google Chat archive time machine in Dart Flutter, this is only a side part to make it easier to use and demonstrate. I fixed it up so it works, it is functional, and I am going to leave it. For real this time. Once the app is functional I might have a better idea of how to use textual to make a good UI, but my main focus should be making the main viewer.
DM Creation Menu Base It is time to start on the menus for actually creating archives. Spaces and DMs have the same basic elements, so I am planning to create a few custom widgets that I can reuse for both of them. I decided that I would start with creating the DM creation, as DMs are a bit simpler than spaces. Hub Menu The first thing I created was a hub menu that will be used to create new DMs, Spaces, or Export the archive. It is fairly similar to the Main Menu, except that I used tcss instead of a container to centre the buttons. i think that this makes the code cleaner, and makes more sense with how textual works. I had a small problem where nothing was happening after I added content-align to my tcss file for the Hub Menu; as it turns out I needed normal align to align buttons. DM Creation Menu This menu has a basic docked sidebar just like the User Creation Menu. I am hoping that the plan of using single widgets that “plug in” will prevent UI issues like the user Creation Menu has. ID and Archive Handling I added a scripts folder with two small scripts: id_handeler to create the IDs for each message archive archive_handeling for classes to store archive, and, in the future, handle exporting The ID handler contains a single Enum with values for DMs and Spaces. It also has a single static function to create a custom ID using Python’s uuid and base64 libraries, adding the correct DM or Space value based on the passed type. The archive handler currently contains two stub classes, one for storing archives, and another for storing messages. As more features are added, these classes will grow as well.
Adding Licence Information The main feature of this session was to add a popup box bound to “l” that displays the licence info. I opted to use the short licence info text that was designed to be at the top of source files, as I won’t have a popup on startup, and having multiple commands is not very user friendly. To go along with another bound command, I added the Footer widget to all menus, as it lists avaliabel commands. I also added licence comments to the top of my source files, including the dart files on the main branch. The Licence Box The texutal docs explain that the ModalScreen class can be used as the base of a popup message. Some tcss is used to centre and align everything; this took multiple attempts to figure out where in the container hierarchy to put the align properties. You can see that the button on the bottom is still not centred, but after failing for a bit, I decided that it looks fine. Another UI element to revisit later? Binding the Box I bound the box to “l”, as it makes sense for “licence”. i spent a little bit trying to figure out why the hotkey didn’t do anyhting; turns out it was a typo. It appears textual does not throw an error if you bind a function that does not exist to a key, maybe because you pass a string to it not ana actual function. Another feature I added was to make “l” close the popup box; whatever screen is on top takes priority.
Adding the People Viewer The purpose of this session was to add a way to view the people currently in the Space/DM. Part 1: Person Storage Up to this point, there was no way to actually store the created people. To fix this, I created a Person class, a simple object to store the name and email. I then added a list to the Archive class to store the people. Part 2: Dynamically Adding Widgets I am using a more complicated system than with User Creation to dynamically switch what you can edit; I am hoping that this will give me more control, and hopefully make it easier to make the UI look good. The new method is to dynamically add a container with the right widgets inside when a button is pressed. To this end, I created a class based on the VerticalScrollBar to control the person editing. I didn’t fully understand how to dynamically add widgets at first; my first idea was to have a instance variable containing a container that would be yielded in the compose method; I could then update the variable to update the UI. As it turns out, this is not how texual works; I did try a bunch of methods to refresh the screen, but then I learned that you can call a mount method to add new widgets dynamically. Part 3: The DataTable The final step to getting this to work was to add a DataTable. I originally tried to generate the table in the compose method, but I switched to generating it upon creation of the container, as that appears to be the intended way to do it. I am a bit disappointed that the data table is rendered far to the right; Another UI detail for later (actually for later this time) I guess.
People Editing! In this session, I implemented the menus for adding, removing, and editing people from a DM or Space. I decided to make the editing menus popup menus to avoid having to redo the sidebar with more menu switches. To make the popups work better, I separated the styling for popups into their own tcss file from the licence popup styles. Part 1: Editing Buttons The first order of business was to add the buttons for adding, editing, and removing people. They are setup so that the first person cannot be edited or removed, as they are the main user in all DMs and Spaces. A maximum number of people is passed to the people editing widget- two people for DMs, and 400 people for Spaces. 400 is the limit for personal use, and I don’t think any more than that is really required. Part 2: Adding People The people adding popup has two labels, one for the name and one for the email. The default values are generated based on the number of items so there are hopefully no duplicates. The UI design has each input labelled, and buttons to cancel or save the new person. Designing this was really interesting, as I found that nesting containers using their constructor, not a with statement, allows event bindings to bind correctly to the main container. This nested structure is surprisingly quite a bit like the Flutter child/children structure. Horizontal( Label("Name: "), Input(placeholder=self._name, id = "name") ), In order to make the table reload, I just switch back to the menu with a switch command; this works, although that fact that there is no default menu so it returns to the void menu means it isn’t a perfect solution. Part 3: Removing People This was fairly simple; the index for the person is passed into the constructor, so the person’s name can be referenced in the confirmation message. An option to remove the person or cancel is provided. Part 4: Editing People This popup is in part a modification of adding people and removing people. The person’s index is passed into the constructor so they can be found, and text boxes are provided to modify the person’s name. Part 5: Adding people to Spaces I was originally going to stop at adding people to DMs, but I thought that the larger number of people in Spaces would make a better demo. I unfortunately hadn’t actually made it easy to add this to spaces; I just forgot I would need to make this work for the separate Spaces and DMs. Making this separate is required as I store DMs and Spaces in separate dictionaries, and the command to return to the correct menu needs to be different for spaces and menus. To fix this, I pass a type to the constructor, which is used to determine which dictionary to use, and which call to make when closing the popup
Group Editing I was going to start doing messages in this session, and realised that there was an important element that I was missing: group settings. This is important for one sort of sneaky reason: message history is dated. At the beginning of chat history, there is a small informational message that says when the chat was created, and then all messages must come afterwards. Without defining a set start time, there would be no way to validate the dates set when new messages are added. To go along with this, I also added the ability to set the name for spaces. I am also storing if the archive is a DM or Space in Archive objects so I know what fields to ignore when saving occurs. Part 1: Date and Time Entry Date and time entry is split into a box for each Month, Day, Year, Hour, Minute, Second. Each of these has a corresponding label to detail what each field is for. All of these are arranged in a Horizontal container so that they line up. I also experimented with data validation; I at first started to right my own validation classes, then realised that textual has a built in validator for numbers. There are a few potential bugs, the biggest is that days are not validated based on the selected month, so entering dates like February 31st is possible. Also, a year that is too late causes an error, it may be something to do with python’s datetime, but it isn’t a priority to experiment with at the moment. Part 2: Name Entry The type (DM or Space) is passed to the container; this is used to enable or disable editing the group. The was I have set this up, the name editing is below the save button name, but I really am trying to get features in and not waste my time on UI for the moment. It works, and for now that is what matters. And speaking of the Save button… Part 3: The Save Button The Save button is fairly simple; while editing, values are stored locally in the container. When the save button is pressed, these values are actually written to the correct archive. Part 4: Silly Mistakes I don’t know what I was thinking today; I made a bunch of silly mistakes. The worst was trying to pass an integer where a string was required. I was setting up the base for the date & time inputs, and as I was thinking about time, so I just tried to input numbers. I got back an error about translation; it took a bit to figure out what was causing the error.
Message Adding Menu In this session, I added the menu for adding messages. This went surprisingly smoothly; I had to learn how to use the Select widget, but most of the other parts of the UI I had already used, or could piece together from other menus. The biggest UI section, the data and time editing, can simply be pulled from the group editing menus. Overall, this session went smoothly, and I was able to focus on how to do make person selection work. Part 1: Person Selection Each message obviously needs a person who sent it; for this I use a Select widget, which is essentially a drop down menu. After my previous problems with passing the wrong type into a field, I wasn’t exactly sure how to make the selection box work; I really wanted to pass Person objects in, as it would remove needing to use a person’s name as a key to try to find the right Person object afterwords. I tried it and… it totally worked. After overriding the str method to return the person’s name and email, the Select widget was functional. Sometimes it is nice when code just works.
Producing Output Zips It is about time to wrap up the archive generator, so it is time to actually generate archives. The basic steps are as follow: Parse the Archives Write the archives to the zip file. Obviously the basics steps are not that complicated; Parsing the archives in the complicated part… Part 1: Parsing Dates I wrote a quick datetime parsing tool for converting to/from strings. The chat archives have a fairly standard format for dates, so it was pretty easy to implement. The only really weird thing is there is a single narrow no-break space character ( U+202F ) for some reason. All other spaces are normal spaces. Part 2: Parsing Archives parsing archives is split into creating group_info.json and creating messages.json. group_info.json contains the details for every person in the group. This includes their name, email, and if they are Human or a Bot. messages.json contains the data for every messages. For each message, there is a json object detailing who created the message (name, email, and user type), and further data of when it was created, the message text, and some ID values. Message IDs Each message in the main group gets its own topic ID; messages in threads use the topic ID of the message the thread is linked to. The message’s own ID is created using the Group ID, the Topic ID, and an ID unique to the message (if it is a top level message, this is the same as the topic ID). #Part 4: Writing to Archives This is a fairly simple step; the most interesting part is generating the archive name. I based it on the actual exported zip names by making the name chronovisor-generator_takeout- + the time it was exported.
Making Exporting Functional This will be the final session (for now) on the archive generator. There are still plenty of bugs, but after this session, it is at the point where it is actually functional, so I merged the generator into the main branch. According to GitHub, this is a Python project now. Part 1: object Message has no attribute “person” Most of the time in this session was spent trying to fix this attribute error. This is where using textual makes debugging slightly more difficult, as there is no terminal to print to. There is a debug terminal that can be attached, but it still is more complicated. I tried to make Labels pop up with debug information, but the never appeared or caused more errors. Part 2: Logging I got so frustrated with the attribute error that I added logging to the entire application. I started to write my own logging script, but then learned that Python comes with a logging library. I initalised it to use all logging level, although I only use Debug and Info. This helped fix a few other bugs, such as not actually writing messages to the output (once the attribute error was fixed). I used logging to print all the vars in the messages being processed; from this I found that none of the instance variables existed. Part 3: The solution I turned to Google to try to fix my problem. After Googling attribute errors, I saw a suggestion that passing the class, not an initalised instance, could be the cause. As it turns out, when adding a new message to the messages list, I had capitalised the “M”, adding the object not the instance. I spent quite a lot of time for a single character mistake. I’m glad I found it, but it took a frustratingly long time to find for how simple it was. Finished? The archive generator is not done. There are still bugs, it hasn’t been stress tested, the UI looks bad, and only basic messages can be created. But it is functional enough so that I can work on the actual application for the time being.
Extracting Archives Previously, I was planning to load the each archive into memory and process it there, but I have since realised that this is not a great option; Most of the archive is taken up with files other than the main message files (i.e. images), and most of those files will not need to be loaded into memory, as they will not be shown on screen. The down side is of course that this trades ram for storage, but that seems like an okay tradeoff. A fairly large archive I am testing with is only about 1.5 GB. It may be worth adding an in-memory only option later, however. Part 1: Splitting the current function The first thing I did was split the current function I had to load and process the archives into one for processing (which is now incomplete), and another to extract them. Based on the archive library’s docs, it was very simple to convert the in-memory code to extraction code. Part 2: Foldering At this point, the extraction code extracted just fine, but it recreated the folder structure from the zip archive, when all I wanted was the “Google Chat” folder. I decided to give each new loaded archive its own folder, numbered based on when it was added. (The archives do have a user number inside, but finding it would involve reading through the archive while it was in memory, and it didn’t appear to have any benefit.) This is the point where I got stuck for a while; I was attempting to get the number of folders in the directory, and the asynchronous function for getting that number never returned. I spent a while messing with print statements and try/catch statements trying to find a solution. Eventually, I found a synchronous version that solved the problem, as I am not trying to run this async, but I am still not sure what the real problem was. Either way, it is now extracting successfully. I need to make a note to look into this further. Part 3: Screenshot In writing this devlog, I really wasn’t sure what to put as a screenshot; nothing about the Ui has changed. Eventually I settled on showing the output save directory. to demonstrate how it properly extracts to a new folder. Part 4: Time I’m honestly not sure exactly what went on with he time on this devlog. When I started working on extraction, there were 10-15 minutes (it has been a while since I looked at the exact number) already listed‚ but i couldn’t’ figure out what I had been working on; I ended up reverting those changes and starting over. After that I got sick and went to a Bible school, so it has been a while since I made any meaningful progress. I am fairly certain that the time on this devlog is too high, but I am not exactly sure why (maybe the time I spent trying to work when I wasn’t feeling well?). Either way, my apologies, and I’m hoping to get this project back on track in the next devlog....
|
1793983751.1315517
|
1794588551.1315517
|
|
3119
|
My awesome macropad! by @kobyc | Stardance
|
kobyc
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @kobyc | Stardance
|
1793983747.5246553
|
1794588547.5246553
|
|
30506
|
Video Editing Based Macropad by @namish-dour-ig | Video Editing Based Macropad by @namish-dour-ig | Stardance...
|
namish-dour-ig
|
0
|
0.32
|
0
|
[]
|
[{"post_id": 22235, "ts": "202 [{"post_id": 22235, "ts": "2026-07-04T16:27:28Z", "hours": 0.3169, "text": "video editing about to be 10x faster now"}]...
|
Title: Video Editing Based Macropad by @namish-dou Title: Video Editing Based Macropad by @namish-dour-ig | Stardance
Devlogs:
video editing about to be 10x faster now...
|
1793983746.6143978
|
1794588546.6143978
|
|
35194
|
Frictionless by @mohamad_m_ghaben | Stardance
|
mohamad_m_ghaben
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @mohamad_m_ghaben | Stardan Title: Frictionless by @mohamad_m_ghaben | Stardance...
|
1793983745.7053144
|
1794588545.7053144
|
|
61382
|
Tectonic by @Thepigcat | Stardance
|
Thepigcat
|
1
|
56.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-31T21:52:01Z", "hours": 56.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 2D Game engine/framework in C with the goal of making multiplayer game development easier and more accessible. I was able to put much of the basic infrastructure and game development tools in place, but many more difficult design decisions will have to be made before its reasonably sized and enjoyable to use. I was still able to build a working example game using the technology tho! Hope you enjoy :3", "repo": "https://github.com/Thepigcat76/tectonic-engine", "demo": "https://github.com/Thepigcat76/tectonic-engine/releases/tag/Initial-Release"}]...
|
[{"post_id": 85410, "ts": "202 [{"post_id": 85410, "ts": "2026-10-31T08:59:37Z", "hours": 8.8183, "text": "2D-Game-Engine Devlog #8 FINISHING STRETCH So much polishing and syncing between server and client 😭 Movement and entities now all sync seamlessly tho 🎉"}, {"post_id": 82610, "ts": "2026-10-25T12:43:07Z", "hours": 6.7342, "text": "2D-Game-Engine Declog #7 MULTIPLAYER! Since the last devlog i mainly worked on actually implementing a working multiplayer demo and fixing all the issue i ran into along the way! Entities and their components are being synced, the server is responsible for creating players… However, the server is currently not in control of movement, crate placement and collisions which is why those things can’t be synced at the moment. So that’s probably gonna be the last few things I’m gonna work on before shipping :3"}, {"post_id": 80225, "ts": "2026-10-16T19:49:27Z", "hours": 6.0731, "text": "#2D-Game-Engine Devlog #6 Finishing networking Most of the time on this devlog was spent working on finishing networking. I was mainly fixing the packet system which had some issues due to the way the packet header and packet queue were implemented. But as you can see, now people are able to join the server! Next, I’m gonna finally finish the ui and then work on the main remaining features, mostly relating to assets and textures in particular."}, {"post_id": 79305, "ts": "2026-10-13T13:15:21Z", "hours": 6.3128, "text": "2D-Game-Engine Devlog #5 Cameras 📷 Added the ability to use different cameras for specific render operations. Cameras can be applied and un-applied using regular render commands, making them very usable. Render-Layers ⛰️ Added render layers, so objects get rendered before/behind the player. Still has issues with the x coordinate lol. UI Added some rudimentary ui elements like labels and buttons. The ui is direct mode so its pretty much just drop in lol. I also added nine-slice scaling so ui elements can be scaled nicely. Next, I’m gonna implement collisions and some more ui functionality."}, {"post_id": 78132, "ts": "2026-10-09T17:53:18Z", "hours": 5.1611, "text": "2D-Game-Engine Devlog #4 This is another boring internal devlog without flashy things lol. This time I implemented better file paths as well as data saving/loading . Better Filepaths Added a function to tectonic underlying library to resolve file paths. This should help with providing file paths. Also improved the memory situation for asset manager data. Data Saving and Loading The most exciting part of this devlog is probably the api for loading and saving data that uses a json-like object format. The format supports integers, strings, lists and compound objects (as im writing this im realizing, that i should probably also add support for floats lol). Yea all in all, not that exciting even tho it took a ridiculous amount of time to get everything to work. Next, I’m gonna work on a small ui abstraction and then probably start polishing the engine to build a simple game with it and ship it."}, {"post_id": 75879, "ts": "2026-10-01T13:38:39Z", "hours": 5.3967, "text": "2D-Engine Devlog #3 Toml Resource Files 💾 I spent most of the last 5 hours getting the c toml library i’ve been using to work in my engine. This involved extending the library to support printing toml files, so they can be generated in code ^_^ This is particularly useful for replacing corrupt files and auto-generating files like settings and keybinds… Recursive parsing for nested toml tables 🔁 Since seperating keys in toml with dots means creating a table (this feature is awesome and annoying at the same time 😭 ), i had to find a way to parse nested tables. I did this using recursion and have used it in both the language file loader and the keybinds loader so far! I also had to figure out a way to parse tables that are part of a nested table for some cases. I did that with a check that looks ahead at the next table’s values and ensures that they are also tables. More asset loading 🖼️ Finally got around to implementing more of the Asset Loader . It now supports shaders (which were a bit tricky due to consisting of fragment and vertex shaders). I also added loading for sounds 🎶"}, {"post_id": 74443, "ts": "2026-09-27T11:57:48Z", "hours": 5.3139, "text": "Devlog #2 - Implementing more core systems Finished packet sending and receiving This should hopefully be the last piece of packet infrastructure required for the engine. It was mainly about encoding and decoding the packets properly, managing the sub processes and handling the shared resources. Implemented text rendering Next, I implemented the render command for drawing text to the screen. Like all rendering actions, the text drawing is stored as a command in an array that keeps the order and then applied at the end of the current game loop iteration. It supports custom font sizes and colors, but I still have to add support for custom fonts in the future. Implemented keyboard and mouse input and keymaps After text rendering i added events for keyboard and mouse input. This only handles the keys/mouse buttons being pressed and released. For checking if the key or button is held down, one can simply use a function. On top of that i also added keymaps that allow for easy keybinds with default keys, selecting keys or mouse buttons for an action, reseting and saving to a toml file. Started working on a Language Manager While adding names to the keymap, I realised that a proper engine should also supply a system for easily translating text. So I started adding a very basic translation manager that allows you to set a default locale and then load language files, change the current language… However both the translation manager and the keymap can not be saved to a config/resource file at the moment. That’s why I am probably gonna have to extend the toml library I used in a previous project to support all those things. Alr, see you next time :3"}, {"post_id": 72811, "ts": "2026-09-23T19:36:20Z", "hours": 3.4864, "text": "Devlog #1 - Multithreading shenanigans Reworking the packets Since the initial system for network packets was quite unintuitive and not very portable due to relying heavily on macros, I decided to try and simplify this system. I started by moving packet decoding to the main thread. This means that the packet receiver thread now pushes the raw bytebuf to the packet (data) queue and the main thread decodes then packet right before the user handles it. This way, we can avoid enforcing thread safety for decode context data. Improving thread handling Next up, I rewrote the client thread system to be state-driven, just like the server. That way i can easily handle connecting to a server, disconnecting and stopping the client. Also had to fix a bug where the thread handler wouldn’t pass the engine as an argument to the thread. Next up Tomorrow im gonna implement more of the actual packet encoding/decoding/handling, so i can actually make my example game playable Oh btw, i made this little player dude for my example game lol. I should probably implement input, so that he can move around and isn’t just stuck in one place."}, {"post_id": 72289, "ts": "2026-09-22T16:21:48Z", "hours": 8.7617, "text": "Initial Devlog - Setting up basic infrastructure I started this project off, by writing a lot of the api and basic stuff like a backend system and implementation in raylib along with some basic assets and events. The premise I wanted to create an engine that is extremely simple to use and that allows you to create multiplayer games in a systems language like C without you having to touch stuff like threads and socket libraries. Since its supposed to be a full on game engine, it should also be able to handle things like assets, events and rendering cleanly, out of the box. The networking approach While making the game multiplayer is optional, it is recommended to implement the game with separate client and server processes, to cleanly handle game logic and support future multiplayer. The client and server process use separate engine data but do share a backend (In the future, the backend might be subject to splitting or at least ifdef guarding so you dont have to compile libraries like raylib on the server). The main game logic, depending on your implementation can be shared obviously. Communication between sides happens using packets. When creating a packet one can either automatically serialize the packet struct by describing its layout or provide custom functions for encoding and decoding the data. Implementing the game The actual game logic is mostly up to the user, whether you use an ECS, a more traditional entity approach or something completely different does not matter. To interact between the described processes, the user has to implement handling for packets in their game loop on both the server and the client. Next up Im probably gonna start working on actually being able to start and connect to servers. This will probably also involve major changes to my sockets library. After that I want to focus on more game engine related things like assets and texture tiling, music, sound and a bunch more."}]...
|
Title: Tectonic by @Thepigcat | Stardance
Devlogs Title: Tectonic by @Thepigcat | Stardance
Devlogs:
Initial Devlog - Setting up basic infrastructure I started this project off, by writing a lot of the api and basic stuff like a backend system and implementation in raylib along with some basic assets and events. The premise I wanted to create an engine that is extremely simple to use and that allows you to create multiplayer games in a systems language like C without you having to touch stuff like threads and socket libraries. Since its supposed to be a full on game engine, it should also be able to handle things like assets, events and rendering cleanly, out of the box. The networking approach While making the game multiplayer is optional, it is recommended to implement the game with separate client and server processes, to cleanly handle game logic and support future multiplayer. The client and server process use separate engine data but do share a backend (In the future, the backend might be subject to splitting or at least ifdef guarding so you dont have to compile libraries like raylib on the server). The main game logic, depending on your implementation can be shared obviously. Communication between sides happens using packets. When creating a packet one can either automatically serialize the packet struct by describing its layout or provide custom functions for encoding and decoding the data. Implementing the game The actual game logic is mostly up to the user, whether you use an ECS, a more traditional entity approach or something completely different does not matter. To interact between the described processes, the user has to implement handling for packets in their game loop on both the server and the client. Next up Im probably gonna start working on actually being able to start and connect to servers. This will probably also involve major changes to my sockets library. After that I want to focus on more game engine related things like assets and texture tiling, music, sound and a bunch more.
Devlog #1 - Multithreading shenanigans Reworking the packets Since the initial system for network packets was quite unintuitive and not very portable due to relying heavily on macros, I decided to try and simplify this system. I started by moving packet decoding to the main thread. This means that the packet receiver thread now pushes the raw bytebuf to the packet (data) queue and the main thread decodes then packet right before the user handles it. This way, we can avoid enforcing thread safety for decode context data. Improving thread handling Next up, I rewrote the client thread system to be state-driven, just like the server. That way i can easily handle connecting to a server, disconnecting and stopping the client. Also had to fix a bug where the thread handler wouldn’t pass the engine as an argument to the thread. Next up Tomorrow im gonna implement more of the actual packet encoding/decoding/handling, so i can actually make my example game playable Oh btw, i made this little player dude for my example game lol. I should probably implement input, so that he can move around and isn’t just stuck in one place.
Devlog #2 - Implementing more core systems Finished packet sending and receiving This should hopefully be the last piece of packet infrastructure required for the engine. It was mainly about encoding and decoding the packets properly, managing the sub processes and handling the shared resources. Implemented text rendering Next, I implemented the render command for drawing text to the screen. Like all rendering actions, the text drawing is stored as a command in an array that keeps the order and then applied at the end of the current game loop iteration. It supports custom font sizes and colors, but I still have to add support for custom fonts in the future. Implemented keyboard and mouse input and keymaps After text rendering i added events for keyboard and mouse input. This only handles the keys/mouse buttons being pressed and released. For checking if the key or button is held down, one can simply use a function. On top of that i also added keymaps that allow for easy keybinds with default keys, selecting keys or mouse buttons for an action, reseting and saving to a toml file. Started working on a Language Manager While adding names to the keymap, I realised that a proper engine should also supply a system for easily translating text. So I started adding a very basic translation manager that allows you to set a default locale and then load language files, change the current language… However both the translation manager and the keymap can not be saved to a config/resource file at the moment. That’s why I am probably gonna have to extend the toml library I used in a previous project to support all those things. Alr, see you next time :3
2D-Engine Devlog #3 Toml Resource Files 💾 I spent most of the last 5 hours getting the c toml library i’ve been using to work in my engine. This involved extending the library to support printing toml files, so they can be generated in code ^_^ This is particularly useful for replacing corrupt files and auto-generating files like settings and keybinds… Recursive parsing for nested toml tables 🔁 Since seperating keys in toml with dots means creating a table (this feature is awesome and annoying at the same time 😭 ), i had to find a way to parse nested tables. I did this using recursion and have used it in both the language file loader and the keybinds loader so far! I also had to figure out a way to parse tables that are part of a nested table for some cases. I did that with a check that looks ahead at the next table’s values and ensures that they are also tables. More asset loading 🖼️ Finally got around to implementing more of the Asset Loader . It now supports shaders (which were a bit tricky due to consisting of fragment and vertex shaders). I also added loading for sounds 🎶
2D-Game-Engine Devlog #4 This is another boring internal devlog without flashy things lol. This time I implemented better file paths as well as data saving/loading . Better Filepaths Added a function to tectonic underlying library to resolve file paths. This should help with providing file paths. Also improved the memory situation for asset manager data. Data Saving and Loading The most exciting part of this devlog is probably the api for loading and saving data that uses a json-like object format. The format supports integers, strings, lists and compound objects (as im writing this im realizing, that i should probably also add support for floats lol). Yea all in all, not that exciting even tho it took a ridiculous amount of time to get everything to work. Next, I’m gonna work on a small ui abstraction and then probably start polishing the engine to build a simple game with it and ship it.
2D-Game-Engine Devlog #5 Cameras 📷 Added the ability to use different cameras for specific render operations. Cameras can be applied and un-applied using regular render commands, making them very usable. Render-Layers ⛰️ Added render layers, so objects get rendered before/behind the player. Still has issues with the x coordinate lol. UI Added some rudimentary ui elements like labels and buttons. The ui is direct mode so its pretty much just drop in lol. I also added nine-slice scaling so ui elements can be scaled nicely. Next, I’m gonna implement collisions and some more ui functionality.
#2D-Game-Engine Devlog #6 Finishing networking Most of the time on this devlog was spent working on finishing networking. I was mainly fixing the packet system which had some issues due to the way the packet header and packet queue were implemented. But as you can see, now people are able to join the server! Next, I’m gonna finally finish the ui and then work on the main remaining features, mostly relating to assets and textures in particular.
2D-Game-Engine Declog #7 MULTIPLAYER! Since the last devlog i mainly worked on actually implementing a working multiplayer demo and fixing all the issue i ran into along the way! Entities and their components are being synced, the server is responsible for creating players… However, the server is currently not in control of movement, crate placement and collisions which is why those things can’t be synced at the moment. So that’s probably gonna be the last few things I’m gonna work on before shipping :3
2D-Game-Engine Devlog #8 FINISHING STRETCH So much polishing and syncing between server and client 😭 Movement and entities now all sync seamlessly tho 🎉
Ships:
I made a 2D Game engine/framework in C with the goal of making multiplayer game development easier and more accessible. I was able to put much of the basic infrastructure and game development tools in place, but many more difficult design decisions will have to be made before its reasonably sized and enjoyable to use. I was still able to build a working example game using the technology tho! Hope you enjoy :3...
|
1793983744.4982886
|
1794070144.4982886
|
|
36493
|
MESH AI by @joyshahriar | Stardance
|
joyshahriar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: MESH AI by @joyshahriar | Stardance
|
1793983743.5958772
|
1794588543.5958772
|
|
28267
|
NovaTab by @Greg_ios | Stardance
|
Greg_ios
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T11:52:08Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A modern and customizable browser start page designed to make every new tab useful. NovaTab combines search, productivity tools, weather updates, quick links, and a clean interface into one dashboard. Features: Smart search bar Weather widget To-do list Quick access shortcuts Modern responsive design Customizable dashboard Built with HTML, CSS, and JavaScript.", "repo": "https://github.com/travletothefurureprogramming/NovaTab", "demo": "https://travletothefurureprogramming.github.io/NovaTab/"}]...
|
[{"post_id": 19132, "ts": "202 [{"post_id": 19132, "ts": "2026-06-30T11:41:22Z", "hours": 0.2931, "text": "NovaTab – Devlog #6 This update focuses on deployment and project documentation improvements. New Changes Project successfully deployed using GitHub Pages Live version is now publicly accessible online Created a clean and structured README.md file Improved project presentation and documentation clarity Improvements Better project visibility with live hosting More professional repository structure Clear usage instructions and feature overview in README Notes NovaTab is now fully accessible as a web app and properly documented for users and contributors."}, {"post_id": 19122, "ts": "2026-06-30T11:20:25Z", "hours": 0.5708, "text": "NovaTab – Devlog #5 Refactored and expanded NovaTab into a more structured productivity dashboard. New Features Added To-Do system with localStorage (create, toggle, delete tasks) Added Calendar widget with monthly navigation and current day highlight Refactoring / Structure Split project into separate files: index.html styles/style.css scripts/app.js Cleaner separation of UI, logic, and styling Improvements Better project organization and scalability Improved layout consistency Persistent state for links and tasks via localStorage Smoother widget interaction (search, calendar, to-do)"}, {"post_id": 19097, "ts": "2026-06-30T10:03:56Z", "hours": 0.7972, "text": "NovaTab – Devlog #4 Added customizable Quick Links powered by localStorage. New Features Added custom quick links section Users can add their own links directly from the UI Links are saved with localStorage and persist between sessions Right-click to remove saved links Added show/hide panel for managing links Improvements Improved bottom navigation layout Added weather API error handling Cleaned up UI interactions and styling Next Steps To-do list with localStorage Light/Dark theme toggle Better weather icons and location display Settings panel"}, {"post_id": 18499, "ts": "2026-06-29T17:46:23Z", "hours": 0.4436, "text": "NovaTab – Devlog #3 Improved NovaTab into a more functional productivity dashboard. New features Added real-time weather using Open-Meteo API Integrated browser geolocation for automatic location detection Expanded command system with shortcuts: /git GitHub search /ytb YouTube search /r Reddit search /chat OpenAI chat shortcut /mail Gmail access Improved overall UX flow for faster search interactions Improvements Cleaner UI spacing and structure Better input handling (Enter key support) More consistent command behavior across features Next steps Add quick links section Improve weather widget UI (icons + styling) Add local storage for personalization Add theme (dark/light toggle)"}, {"post_id": 18471, "ts": "2026-06-29T17:11:33Z", "hours": 0.3136, "text": "NovaTab – Devlog #2 Improved the overall design and user experience of NovaTab. Changes Added a modern dark gradient background Redesigned the search bar with a glass-like style Improved spacing and typography Added smooth hover and focus animations Refined the clock and date display Next Quick links To-do list Weather widget"}, {"post_id": 18454, "ts": "2026-06-29T16:51:20Z", "hours": 0.3253, "text": "NovaTab – Devlog #1 Started building NovaTab, a custom new tab page for productivity. Done so far: Basic layout with HTML/CSS/JS Centered UI with Flexbox Live clock and date using JavaScript Date Working search bar with Google redirect Enter key support for search Next steps: Add quick links Improve UI (dark mode / styling) Add to-do list (localStorage) Weather API integration"}]...
|
Title: NovaTab by @Greg_ios | Stardance
Devlogs:
Title: NovaTab by @Greg_ios | Stardance
Devlogs:
NovaTab – Devlog #1 Started building NovaTab, a custom new tab page for productivity. Done so far: Basic layout with HTML/CSS/JS Centered UI with Flexbox Live clock and date using JavaScript Date Working search bar with Google redirect Enter key support for search Next steps: Add quick links Improve UI (dark mode / styling) Add to-do list (localStorage) Weather API integration
NovaTab – Devlog #2 Improved the overall design and user experience of NovaTab. Changes Added a modern dark gradient background Redesigned the search bar with a glass-like style Improved spacing and typography Added smooth hover and focus animations Refined the clock and date display Next Quick links To-do list Weather widget
NovaTab – Devlog #3 Improved NovaTab into a more functional productivity dashboard. New features Added real-time weather using Open-Meteo API Integrated browser geolocation for automatic location detection Expanded command system with shortcuts: /git GitHub search /ytb YouTube search /r Reddit search /chat OpenAI chat shortcut /mail Gmail access Improved overall UX flow for faster search interactions Improvements Cleaner UI spacing and structure Better input handling (Enter key support) More consistent command behavior across features Next steps Add quick links section Improve weather widget UI (icons + styling) Add local storage for personalization Add theme (dark/light toggle)
NovaTab – Devlog #4 Added customizable Quick Links powered by localStorage. New Features Added custom quick links section Users can add their own links directly from the UI Links are saved with localStorage and persist between sessions Right-click to remove saved links Added show/hide panel for managing links Improvements Improved bottom navigation layout Added weather API error handling Cleaned up UI interactions and styling Next Steps To-do list with localStorage Light/Dark theme toggle Better weather icons and location display Settings panel
NovaTab – Devlog #5 Refactored and expanded NovaTab into a more structured productivity dashboard. New Features Added To-Do system with localStorage (create, toggle, delete tasks) Added Calendar widget with monthly navigation and current day highlight Refactoring / Structure Split project into separate files: index.html styles/style.css scripts/app.js Cleaner separation of UI, logic, and styling Improvements Better project organization and scalability Improved layout consistency Persistent state for links and tasks via localStorage Smoother widget interaction (search, calendar, to-do)
NovaTab – Devlog #6 This update focuses on deployment and project documentation improvements. New Changes Project successfully deployed using GitHub Pages Live version is now publicly accessible online Created a clean and structured README.md file Improved project presentation and documentation clarity Improvements Better project visibility with live hosting More professional repository structure Clear usage instructions and feature overview in README Notes NovaTab is now fully accessible as a web app and properly documented for users and contributors.
Ships:
A modern and customizable browser start page designed to make every new tab useful. NovaTab combines search, productivity tools, weather updates, quick links, and a clean interface into one dashboard. Features: Smart search bar Weather widget To-do list Quick access shortcuts Modern responsive design Customizable dashboard Built with HTML, CSS, and JavaScript....
|
1793983742.3525887
|
1794070142.3525887
|
|
11274
|
Untitled by @julian_arenfors | Stardance
|
julian_arenfors
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @julian_arenfors | Stardance
|
1793983741.4647868
|
1794588541.4647868
|
|
7110
|
Thumnial by @mujtaba_muneer | Stardance
|
mujtaba_muneer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Thumnial by @mujtaba_muneer | Stardance
|
1793983740.5745115
|
1794588540.5745115
|
|
17594
|
OpenRover by @JacobK | Stardance
|
JacobK
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: OpenRover by @JacobK | Stardance
|
1793983739.6742103
|
1794588539.6742103
|
|
25554
|
Frictionless by @shamiksha | Stardance
|
shamiksha
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @shamiksha | Stardance
|
1793983738.7853374
|
1794588538.7853374
|
|
43899
|
8 bit working computer using 6502 by @COF10 | Star 8 bit working computer using 6502 by @COF10 | Stardance...
|
COF10
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 8 bit working computer using 6502 by @COF10 Title: 8 bit working computer using 6502 by @COF10 | Stardance...
|
1793983737.9071436
|
1794588537.9071436
|