|
70495
|
Haven Nottingham Badge by @Choc0latesauce | Starda Haven Nottingham Badge by @Choc0latesauce | Stardance...
|
Choc0latesauce
|
0
|
4.86
|
0
|
[]
|
[{"post_id": 81472, "ts": "202 [{"post_id": 81472, "ts": "2026-10-21T12:04:21Z", "hours": 1.8522, "text": "I’ve now defined all of the dimensions for the PCB and have started on the silkscreen art. I want to make the badge fun to wear and recognisable while also having room to display the sponsors, the front side will be dedicated to this with the back side dedicated to how to actually use the badge. Having lots of fun, the creativity is really flowing lol"}, {"post_id": 81445, "ts": "2026-10-21T09:45:20Z", "hours": 2.7042, "text": "I have now moved entirely into my own design, it uses the power generated from your phones NFC coil to power and update the E-ink display. As E-ink displays don’t require power to hold an image this negates the need for a battery making the badge much cheaper to produce and infinitely lighter. I’m very happy with my progress so far as this is a completely custom design! Moving onto the PCB design next."}, {"post_id": 81033, "ts": "2026-10-19T16:55:18Z", "hours": 0.3042, "text": "I’m the POC for Haven Nottingham which is being sponsored by JLCPCB. I thought I’d design some interesting badges for the attendees, tbh I don’t really know what I want them to look like at the moment or the features. Am taking inspiration from this badge at the moment though! https://oshwlab.com/notaroomba/dreamcard"}]...
|
Title: Haven Nottingham Badge by @Choc0latesauce | Title: Haven Nottingham Badge by @Choc0latesauce | Stardance
Devlogs:
I’m the POC for Haven Nottingham which is being sponsored by JLCPCB. I thought I’d design some interesting badges for the attendees, tbh I don’t really know what I want them to look like at the moment or the features. Am taking inspiration from this badge at the moment though! https://oshwlab.com/notaroomba/dreamcard
I have now moved entirely into my own design, it uses the power generated from your phones NFC coil to power and update the E-ink display. As E-ink displays don’t require power to hold an image this negates the need for a battery making the badge much cheaper to produce and infinitely lighter. I’m very happy with my progress so far as this is a completely custom design! Moving onto the PCB design next.
I’ve now defined all of the dimensions for the PCB and have started on the silkscreen art. I want to make the badge fun to wear and recognisable while also having room to display the sponsors, the front side will be dedicated to this with the back side dedicated to how to actually use the badge. Having lots of fun, the creativity is really flowing lol...
|
1793022461.3527505
|
1793627261.3527505
|
|
13934
|
My first slack bot! by @Saifan | Stardance
|
Saifan
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T13:59:15Z", "hours": 1.0, "multiplier": 1.01, "payout": 1, "blessing": "neutral", "text": "i created a slack bot named “KOT” having kings theme/behaviour for more info check my github repo plzz", "repo": "https://github.com/Saifan86/SlackBot-Kot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BAHTBN3U1?_gl=1*5vnct3*_gcl_au*MTYzNjg1MDQxLjE3ODE0NDI3MTI."}]...
|
[{"post_id": 8147, "ts": "2026 [{"post_id": 8147, "ts": "2026-06-13T16:15:52Z", "hours": 1.1336, "text": "slackBot"}]...
|
Title: My first slack bot! by @Saifan | Stardance
Title: My first slack bot! by @Saifan | Stardance
Devlogs:
slackBot
Ships:
i created a slack bot named “KOT” having kings theme/behaviour for more info check my github repo plzz...
|
1793094520.8205733
|
1793180920.8205733
|
|
20724
|
CRM by @F3rro_32 | Stardance
|
F3rro_32
|
1
|
124.74
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-14T16:34:42Z", "hours": 115.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "CRM An open-source CRM for Italian small businesses: contacts, companies, leads, quotes, orders, invoices with VAT, tickets, email campaigns, NPS surveys, reports and a customer portal. It started as a way to manage clients for a friend’s startup and became a working and valuable project. TRY IT (no install) https://crm.alessio.hackclub.app email: [email protected] password: HackClub-Demo-2026! The demo has full access and realistic fake data, so feel free to click everything, create, edit and delete. The data resets occasionally. Outgoing email is switched off on the demo. HEADS UP: the interface is in Italian. Use the translate widget in the corner of the app (or your browser’s translator) to read it in English. Real i18n is on my roadmap, sorry! WHAT TO LOOK AT A quote with line items, discounts and VAT by rate, and the “Print PDF” button. PDFs come from HTML templates you can edit, with a live preview on your last real document. A customer accepting a quote from a signed link, without an account. Full-text search across every module (PostgreSQL). Italian e-invoicing: it builds the FatturaPA XML and validates it against the official government XSD before saving. Invoices lock once sent to the SDI. The MCP server: an AI assistant can use the CRM through an API key, with seven generic tools that work on all 34 modules and respect permissions. 2FA (TOTP) with recovery codes, secrets encrypted at rest, installable PWA. HOW IT WORKS There is no “contacts” or “companies” table. One generic Record entity stores its fields in a jsonb column, and an ObjectType + FieldDef describe each module (39 field types). Adding a module is a configuration record, not a migration or a new controller. Permissions are checked per module and action at runtime. You can have more info in the README, so please check it. I hope you appreciate this project :)", "repo": "https://github.com/AlessioFerrari8/crm", "demo": "https://crm.alessio.hackclub.app"}]...
|
[{"post_id": 81469, "ts": "202 [{"post_id": 81469, "ts": "2026-10-21T11:47:01Z", "hours": 9.7417, "text": "Hey guys, what’s up? I’m finally in the last phase of getting my driving license, so that’s taking up some of my time too. The CRM is now online at crm.alessio.hackclub.app . The VPS has very little RAM, so I build the Docker images locally and transfer them to the server using docker save over SSH. It’s not the fanciest deployment process, but it works with the resources I have, so I’ll stick to it for now. One of the main things I worked on was the customer portal . The backend from last week finally has a frontend: customers can log in, see their tickets and documents, open requests, reply to messages, download PDFs and accept quotes. I also made sure that internal notes stay internal. Notes now have a Visible to customer checkbox, which is disabled by default. The portal only shows notes explicitly marked as visible, so there’s less risk of accidentally exposing something that should stay private. Another feature I added is Google Calendar import . It’s read-only for now, so the CRM can import events without modifying anything in your Google account. Events are created through the same service as normal CRM records, meaning workflows and the audit log still work as expected. Sync runs every 15 minutes, and if something goes wrong with an account, it won’t stop the others from syncing. I also started replacing the Google Translate workaround with proper internationalization (i18n). The translation system is in place, including support for parameters and locale-aware dates and numbers. The dictionary is type-checked, too, so missing English translations can be caught at compile time. There’s still a lot of work here: around 1,200 strings need to be translated by hand. It’s not the most exciting task, but I’d rather have proper translations than rely on Google Translate forever. Obviously that’s my opionion. I also started working on public registration, but it’s not ready yet. There’s one important limitation: the CRM currently has a single shared workspace, so everyone who registers would see the same data. Registration will stay disabled unless explicitly enabled until I decide how to handle that properly. That’s because the idea is to have 1 single DB for each workspace, since the CRM should be self-hosted. There’s still work to do, but the CRM is getting closer to the version I wanted to ship. See you in the next devlog!"}, {"post_id": 79560, "ts": "2026-10-14T16:31:36Z", "hours": 2.4331, "text": "Hey guys, how’s going? This will be a short devlog, and it’s the one before the shipping. I decided to ship the CRM, even if it’s not completely finished. That’s because I still have to do lots of things, but now I have a working product, so, since the changes I have to make are complementary. Unfortunately, I have a big issue: the whole interface is in Italian. The app is made for Italian small businesses (FatturaPA, VAT, SDI…), but if you come from Stardance you can’t read a single menu. Real i18n is still on my list and it is a big job, so for now I added the Google Translate widget in the corner of the app. If your browser is in English it starts translating by itself, otherwise you pick English from the selector. It’s not pretty, but it makes the demo usable today instead of “someday”. I had to widen the CSP in nginx for it, and I loaded the script as an external file so I didn’t need a second hash. I also fixed the README and cleaned the repo. Now everything should work fine, or at least let’s hope so. I hope you enjoy the product."}, {"post_id": 78818, "ts": "2026-10-11T17:58:49Z", "hours": 8.3728, "text": "Hey guys, how’s everythings going? I’m doing pretty well. As always I have lots of things to do, but I still have plenty of time for coding. School is demanding, and preparing for my driving license is also tough, but I’m managing everything little by little. Last time I ended up with an app that wouldn’t even start. Luckily, I fixed all those errors, and all 258 tests are now green and passing on the PostgreSQL db. After that, I added new features. First of all I worked on NPS surveys and quote acceptance. Customers can now receive surveys and answer them through a public link. They can also accept quotes directly from a link, without needing an account. I also made sure these features work with the existing workflows, so automations can still do their job properly. Another interesting addition is the MCP server. AI agents can now interact with the CRM through an API key. Instead of creating a separate set of tools for every module, I went with seven generic tools that can work across all 34 modules. This should make it easier for AI models to understand which actions they can perform, while keeping the CRM’s existing permissions and security rules in place. I also improved search quite a bit. Before, it mostly looked at record titles. Now it uses PostgreSQL full-text search to find relevant information inside the actual record data and rank the results. The audit history is also much easier to read, with related record IDs replaced by their actual titles. I worked on a couple of smaller but important things, too. The trash can now properly handle related files and records when permanently deleting something, while protecting fiscal documents that must be kept for ten years. Finally, I started working on the customer portal. It now has its own backend authentication and permission system, separate from the employee login. Customers will only be able to access records they’re actually allowed to see. The backend is ready, but I still need to connect the frontend pages and routes. There’s still quite a bit to do, but I’m getting closer to the first complete version of the CRM. See you in the next devlog!"}, {"post_id": 77578, "ts": "2026-10-07T15:01:58Z", "hours": 9.0769, "text": "Hey guys, how’s going? I have plenty of things to do, but coding is still one of my favorite activities, so I always try to save some time for it.This time I worked again on FatturaPA, which is the Italian electronic invoice.What I did, is that now, first of all, the CRM can now generate the FatturaPa XML directly from an invoice and validate it against the official XSD, before saving it. I also added the whole invoice lifecycle, from draft, to setn, delivered, accepted or rejected. The CRM can read the recepits from the SDI and show ufseful information when something goes wrong.Another important change is that invoices now become locked once they’re sent to the SDI. If something needs to be changed, the correct way is to create a credit note instead. This is much efficient in my opinion.I also started working on the SDI integration itself. For now there’s only a manual transport, but the system is built so that adding an actual provider later shouldn’t require changing the rest of the CRM. I did it this way, so I can decide which provider use, and not have to change everything.Besides invoicing, I added time tracking. You can start a timer from the top bar and see your hours directly on records. Timers also automatically close after a maximum amount of time, so nobody ends up with a 80-hour ticket because they forgot to stop it.Finally, I worked on email campaigns. You can create a campaign from a saved filter, send emails through a queue and manage unsubscribes. I also added some protections against things like open redirects and accidental unsubscribes.And now, the honest part: before writing this devlog, I ran the tests and guess what, the app didn’t even start.I used claude for debugging, cause I wans’t finding the error. Silly me, it was just a typo."}, {"post_id": 75572, "ts": "2026-09-30T13:58:27Z", "hours": 10.0467, "text": "Hey guys, how’s everything going? I’m alright. I’m so glad hackclub postponed the end of stardance, I have still another month to 1. finish this project 2. do other projects I had on my mind for such a long time. Before doing this devlog, I had to use claude to debug my work, because I had some errors I didn’t understand (I was using a class created for a test in the normal “code”), so bad :( and also other small issues. Lately I worked on one of the most significat features for me, which is 2FA . As my network teacher says \"zero trust, because the world is a place full of bastards\" . 2FA is one of the techniques I use to follow this approach. Basically, now you can press “Enable” in your preferences, scan the QR code with any authenticator app (f.e google), or just type the secret by hand, because half the people can’t frame a QR code at the first time, lol. You also have to confirm with a code. At login, if 2FA is on, there’s a second step for the six digits. You also get ten recovery codes that you can copy or download, shown only once. Turning it off asks for your password, so a stolen open session can’t remove this precaution. You’re probably wondering: are the secrets encrypted? Yes, they are. I mostly use AES-GCM, because it’s pretty simple, but also secure, so it’s the better compromise. The TOTP secret and the mailbox passwords are stored encrypted with AES-GCM. The key lives in an env variable, not in the db, so a database dump alone isn’t enough to generate codes or read someone’s email. I also turned the crm in a PWA . You can install it on your phone or desktop, it has its own icon and window, and when I deploy a new verion, it tells you to reload, instead of silently serving you the old one from cache (it also checks every 6 hours, maybe I’m gonna change it to 10, idk, for the tab you leave open for days) Like in every other devlog, I made some tests and updated the docs. The report engine now has tests against a real Postgres started in docker, and the repo finally has a real README (it’s not finished, just with some basic information, claude, thanks for the suggestion of making it). Oh, I nearly forgot. I also worked on emails. Now I’m currently working on the Italian electronic invoice, which is called FatturaPA. The crm builds the XML from an invoice, and the first test I wrote checks it against the official government XSD: if it doesn’t pass, it isn’t saved. I think I’m gonna study a bit of english / american law, to allow people out of Italy to use this app as well. I hope you like my product, see you soon"}, {"post_id": 71912, "ts": "2026-09-21T19:15:14Z", "hours": 9.0044, "text": "Hey guys, how have you been doing lately? I’m alright. I’m still getting my driver license, so I don’t have much time to code. Last devlog was all about the PDF engine on the backend, and I closed it saying that the UI was next. Here it is: Print button : I added a print button Print PDF on quotes, orders, delivery notes and invoices. The file is downloaded with the document number as its name, so you get for example 2025-47.pdf and not just document.pdf Template editor : I also added to settings a new tab called “Print”. On the left there’s the list of templates, on the right the HTML, the page size and the margin. The preview renders the last real document of that module instead of a fake one, so what you can see is exactly what your customer receives. The default templates can’t be edited you duplicate them: the seeder rewrites them at every boot, so any change would silently disapper on the next restart. I preferred to say it in the interface rather than let someoune lose an afternoon of work. Company data : The company settings now hold also the legal name, VAT number, tax code, address and contact line. That’s what the PDF header prints, and without them the header comes out empty. VAT that adds up to the cent The header discount is spread across the VAT rates and every share gets rounded, so the sum of the shares could end up one or two cents away from the total. On a quote nobody would ever notice. On an electronic invoice it’s rejection 00423. Now the rounding leftover goes on the last rate, so taxable + VAT = total, always. Tests on a real db : The report engine builds SQL at runtime, and mocking a database proves nothing, so its tests now start a throwaway Postgres in Docker and run against it: filters, grouping, ordering and counting. Two bugs closed : Merging two records didn’t look at the bin, so a deleted record could be merged into a live one. And editing a saved report answered 405, because the frontend was sending PUT to an endpoint that only has POST. Right now I’m working on the 2FA (for those who don’t know, the 2 factor auth). I’m writing the TOTP myself instead of pulling in a library: it’s an HMAC-SHA1 of the 30 second counter, and the six digits come out of the dynamic truncation described in the RFC. The secret is encrypted in the database with AES-GCM, because someone who can read the db must not be able to generate the codes, otherwise a second factor is just a second password. There are ten recovery codes, stored hashed and usable once each, and the last accepted counter is saved, so the same code can’t be replayed during its 30 seconds. The tests are the official RFC 6238 vectors: a TOTP written at home always “works” until you compare it with a real auth app, and at that point it’s too late to find out. Two things I know are missing: the second factor has no interface yet, there’s no page to scan the QR code from, and the mailbox that turns incoming emails into tickets is only half written. See you soon, the end of this project is near."}, {"post_id": 67216, "ts": "2026-09-13T08:29:02Z", "hours": 8.6217, "text": "Hey guys, how’s it going? I hope you’re all doing well. School started here in Italy, so I have less time compared to August. I also have to get my driver’s license, so I’m studying for that too. Unfortunately, coding isn’t the first thing I do every day anymore. I’m still working on the PDF generator. Last time I mentioned that relation fields were showing raw IDs and that document totals weren’t formatted properly. I fixed both of those, but I’ll get back to them later. About the PDF The template is HTML, and it lives in the DB. I didn’t hardcode the layout in Java. I created a PdfTemplate entity that stores the HTML, page size and margins. There is one default template for each document type: quote, order, delivery note and invoice. Thymeleaf fills the template with the document data, and OpenHTMLToPDF + PDFBox generate the PDF. Since the HTML is provided by the user, I also had to think about security. A template could try to load something like file:///etc/passwd or access an internal URL. Because of this, external protocols are disabled and only data: URIs are allowed. Page sizes are also checked against a whitelist. I also had to deal with the fact that HTML isn’t always valid XML. OpenHTMLToPDF expects XML, so I use jsoup to normalize the HTML first. Otherwise, perfectly normal HTML can cause a SAXParseException . And finally, fonts have to be embedded in the PDF. Without including DejaVu Sans in the jar, the PDF doesn’t render correctly. VAT summary I also worked on the VAT summary. Lines are grouped by VAT rate, shipping is added to the highest rate, and the document discount is distributed across the rates instead of being applied at the end. VAT is then calculated on the discounted amounts, so everything adds up correctly: taxable + VAT = total This actually fixed a bug where VAT was calculated before applying the document discount. It wasn’t very obvious until I started testing it with real numbers. Three endpoints The PDF system now has three endpoints: print a document preview a template print a batch For the preview, instead of creating a fake document, I use the last real document of that module. This way there is only one PDF generation system to maintain. The batch endpoint combines multiple documents into one PDF, while checking permissions for every document. A few other fixes The two ugly things from last time are also gone. Relation titles are now resolved by a shared backend service, so instead of UUIDs you see things like the company name. The same service is used by the lists, detail pages and PDFs. Amounts in the PDF are also formatted using the user’s preferences. I also added tags to the record lists. Tags are resolved in bulk instead of doing a permission check for every single row, which makes a big difference on larger lists. The backend part is basically done for this cycle. The print button and template editor are already written, but they’re not wired up yet. Right now I’m still using the API to test the generator. So, UI is next. See you in the next devlog!"}, {"post_id": 63513, "ts": "2026-09-07T12:44:46Z", "hours": 6.7903, "text": "Hey guys, how’s going? Soon school is going to start for me, but luckily it’s my last year in high school, so I’m really happy about this. Lately I had much time to code, so I continued working on this project. Last devlog was all backend; I said the engine was there and the screens weren’t. This time it’s quite the opposite. I didn’t really touch the backend, I spent the last 5-6 hours writing the frontend. Here’s the details of what I did: Document lines the grid is finally in the record detail. You can add lines, set quantity, price, discount and VAT, additionaly with the subtotal / VAT / total block, that updates while you type. When you save, the whole set of lines is sent at once. Tags I added the tag picker on the record detail, so you can attach and remove tags from a record as you wish. I also made the page that shows every record with a given tag, from all the modules together. Duplicates The duplicate finder now has its own screen: you choose a module, you get the pairs it thinks are duplicates, and the you see the two records side by side and pick field by field which value to keep before merging them. Reports There’s a page to build a report with a wizard (rows, columns, metrics, filters) and a preview that shows you the result before saving it. Dashboard widgets This is the main thing of this cycle. I wrote all six widget types, which are: - KPI tile - split KPI tile - chart - table - pivot - record list A widget is just a saved report query plus the type of rendering you want, so it runs on the report engine. Dashboards with tabs You can create a dashboard, add tabs to it and put widgets inside, so you can keep for example sales and support separated from each other. Sidebar and topbar The sidebar now has the routes for all the new pages, and the topbar has a quick-create button to make a record from anywhere without opening its module first. Two things are still not nice and I’m aware: in some places the relation fields show the raw id instead of the name of the record, and the totals of the document lines are not formatted with the user preferences yet, so you read 9054.00 instead of 9.054,00 EUR. Both are small and both are on the list to be improved. Now I’m working on the PDF generator See you, I hope you enjoy this project"}, {"post_id": 59674, "ts": "2026-09-01T16:28:33Z", "hours": 8.095, "text": "Hey guys, how it’s going? These days I’ve got quite a lot of work to do, since we’re in the middle of harvest season here in Italy, so I don’t have much time to work on the project. Unfortunately, today it rains, so I’m home, and I can spend some time on the PC. Lately I’ve been working a lot on the backend. The first two things I did are documents and document numbering : I created the model for document rows ( DocumentLine ), with its engine to calculate totals, including subtotals, discounts and VAT. I also added unit tests for the calculator. I also implemented automatic document numbering, so documents like quotes, invoices and tickets are automatically assigned a number when they’re created. Then I worked on quote revisions, with a new QuoteRevisionService to keep track of different versions of the same quote. Another thing I started working on is document conversion. The idea is to be able to convert a quote into an invoice, but this part is still a work in progress. I also spent quite a bit of time on reports and dashboards: added the Report model and the ReportEngine / ’ReportService` added default reports through a ReportSeeder created the Dashboard model, with tabs and widgets added the related controllers, services and repositories On the frontend side I’ve scaffolded the pieces for dashboards and widgets — the widgets/ and dashboard-tabs/ components exist and the dashboard and report services are written — but the components themselves are still empty shells. The data layer is ready, the screens aren’t written yet. That’s what I’ll pick up next. Another big thing I worked on is tags and data quality. I added the tag model and APIs, together with the services and repositories. I also started working on a duplicate finder and record merging system, so duplicate contacts/companies can be detected and merged instead of leaving messy data around. For PostgreSQL, I also enabled pg_trgm to improve fuzzy searches for duplicate detection. Finally, I added user preferences for number and date formats, including a live preview so users can immediately see how their chosen formats will look in the app. I’ve also added icons for the new modules. As you can probably tell, this was a very backend-heavy cycle. Almost everything I built this time: document lines, numbering, quote revisions, reports, dashboards, tags and duplicate detection lives in the models and the services, and the UI for most of it isn’t there yet. So this time there isn’t much to show in screenshots: the engine is in place, the screens come next. I’d rather get the model right first and build the interface on top of something solid than the other way around. Hopefully I’ll be able to find some more time to work on it after harvest, so see you in a while."}, {"post_id": 45652, "ts": "2026-08-12T09:05:39Z", "hours": 4.9961, "text": "Hey guys, back on this project. Last time I said the next round was going to be document lines, my quote was “the only part of this CRM that doesn’t fit the dynamic JSON engine”. That’s what this round was, plus the report engine on top of it. Document Lines : One single table for all four documents: quote, sales order, delivery note, invoice. The line is exactly the samein all of them, the only thing that changes is the document holding it, and a document here is just a Record like any other, so there’s no type constraint on the line at all. A line can be a product line, a free text line (no amounts, just something to say in the middle of the document) or a subtotal. Two things get copied at save time: the description and the vat percentage. The math is its own class, DocumentLineCalculator, and it’s the one piece of this project I wanted testable completely on its own, because it’s the only place where a wrong rounding produces a wrong tax document. The order is fixed: gross = quantity × unit price discount = a percentage of the gross, or a flat amount net = gross - discount, rounded to 2 decimals here vat = net × rate, rounded line total = net + vat Rounding happens after the discount and after the vat, never on the unit price: round the unit price and the error gets multiplied by the quantity. Rounding mode is HALF_UP, which is the commercial rounding used here, not HALF_EVEN. And a flat discount bigger than the line itself gets clamped instead of producing a negative amount, since that’s a typo 100% of the time. Lines are always saved all together. The endpoint is a PUT that replaces the whole set. It deletes and rewrites instead of diffing row by row, because a document has a few dozen lines at most and the diff would cost more code than it’s worth. The reason for this rule is the totals: they depend on every line, so a partial save would leave the header and the lines disagreeing, even if only for a moment. The totals (subtotal, vatTotal, total) get written back into the document’s own JSON, plus the header level discount and shipping cost. They live there so they can be list columns you filter and sort on, which is the whole point of having them. Now I’m working on the dashboard graphs, widget and this kind of things.I hope you like the project. I’m sorry if I don’t have any screenshot of the working website, it’s because I focused only on the backend, the frontend of this part still needs to be written."}, {"post_id": 42597, "ts": "2026-08-07T12:41:14Z", "hours": 6.4236, "text": "Hey guys, still on this project. This round was all about the stuff that sits on top of the modules, instead of new modules. Per-user formatting preferences . There’s a new “My preferences” page in the user menu. Every user picks how they want to see numbers and dates: thousands separator, decimal separator, currency (any ISO code, the symbol gets resolved automatically), how many decimals, whether the symbol goes before or after the number, and whether to cut trailing zeros. Same thing for the date format. There’s a live preview box that updates while you touch the selects, so you see 1.234,50 € turn into $ 1,234.5 as you change this. The setting applies everywhere, lists, record details and so on. Tags . These are cross-module, which is the whole point; a tag can sit on a lead and on a ticket. There are two kinds: shared ones, visible to the whole workspace, and private ones, which only you see. Each one has a color. You can attach and detach them from any record, and there’s a “all records with this tag” view that goes across modules, filtered by your permissions, so if you can see tickets but not opportunities, you only get the tickets.I did not build this as a field type, even though I already have a TAGS one. That one belongs to a single ObjectType with its own fixed options, so it gives you neither the shared catalog nor the cross-module search. Duplicate merge . You pick a module and it gives you back the candidate pairs, ranked by how similar their titles are (there’s a threshold you can move, default 0.6). Then you get the two records side by side and choose, field by field, which value survives. When you confirm: the winner keeps everything you picked, every relation that pointed at the loser now points at the winner, ids of the loser mentioned inside other records get rewritten too, including the ones stored in lists, notes and tags move over (and if the winner already had that tag, the duplicate link is dropped), the loser goes to the trash, not deleted. A wrong merge has to be recoverable, and I already have a bin, so I used it. Document numbering . Documents now number themselves. It’s configurable per module: prefix, whether to include the year, padding, separator. Right now it’s on for three of them: - quotes → 2025-47 - invoices → FT2025-0001 - tickets → TT643 The counter is per module and per year, and it’s locked while it’s being read, so two people creating a quote at the same time can’t get the same number. If you type a number by hand, yours wins, that matters when you’re entering an old document with its original number. On top of that, quotes have revisions. Revising 2025-13 gives you 2025-13_2 , a brand new document that links back to its parent, while the parent moves to the “revised” stage. And you can revise a revision, so 2025-13_2_2 works too, the counter is progressive per parent, not global, which took a bit more care than I expected. Next up is the big one: document lines. Quote → order → delivery note → invoice, with quantities, discounts and VAT per line. It’s the only part of this CRM that doesn’t fit the dynamic JSON engine everything else is built on, so it gets its own real tables. See ya in the next devlog, I hope you like the project. P.S. you’ll see the tag in the next devlog, I still have to implement the frontend"}, {"post_id": 40187, "ts": "2026-08-03T16:19:02Z", "hours": 5.575, "text": "Hey guys, I’m still working on this project, cause there are lots of things to do.Lately I focused on improving and adding things to the ObjectTypes. As you can see in the two images of the sidebar, I added like 10 fields. Among them, the most important are goals , basically contains the possibility of creating a goal, setting an owner, which is responsible for this goal (clearly depends on the situation), the actual goal and the period. Along with that you can set a metric, so if the goal is revenue , opportunities , leads , custom project_task , basically it contains the instruction for each member, on a certain project service_contract , the support, it contains the subject, the company which is referred to, start and end date, the actual status, so active , expiring , expired , terminated , hours spent and so on. Along with these and the other I didn’t cite here, I added 3 object for the sales, where this two are the most important: The first one is the supplier , it contains all the specs, so name, vat, email, phone, website, address, and eventual notes. The second one, the most important, is sales_order , which contains the subject, the number of the order, a relation with the company, and a relation with the contact, a relation with the quote (I don’t know if it’s right, in italian it’s called preventivo), the possibility of setting a status, so created , confirmed , shipped , closed , cancelled , the order date, a relation with the payment Method object, and all the financial part, so the subtotal, with maybe the discount, vat, the total and the infos for the shipping, billing and shipping address. I hope to finish this project asap, since it’s taking me so looong.See ya in the next devlogs"}, {"post_id": 38868, "ts": "2026-08-01T13:05:15Z", "hours": 5.2586, "text": "Hey guys, I have stopped this project for a bit, but here I am again. I’m currently improving the CRM, mostly the security, which, for me, is one of the most important parts, and adding functionalities. Lately I focused on the mails. I added my smtp server, and in the backend, I managed all mails. Here is an example, with the invitation email. It’s in italian, but don’t worry, basically it invites you to the CRM, and then you can create your own account, with password. As you can see in the third screenshot, I can manage the invitation link, whether I want to invite an admin, or a simple employee."}, {"post_id": 26409, "ts": "2026-07-11T05:54:20Z", "hours": 10.4239, "text": "Hey guys, this week was also about making the CRM feel more complete. Alongside several new features, I also spent a good amount of time improving security and fixing one particularly deceptive bug. First of all, I added a new global Calendar page that shows every record with a date in one monthly view. Events, tasks, reminders and subscription renewals are all displayed together, each with its own color. Before this, the calendar only existed inside each record type, so there wasn’t a way to see everything happening at once. I also integrated Cal.com. The booking page can now be embedded directly inside the CRM, and when someone books a meeting, a webhook automatically creates an Event record. If the meeting is rescheduled, the existing record is updated instead of creating a duplicate, and if it’s cancelled, the event is removed. To keep the integration secure, the webhook signature is verified using the raw request body instead of reserializing the JSON. I spent some time looking at features from Pipedrive, HubSpot and Attio, then implemented a few that I really liked. The Kanban board now shows the total value of each column, making it easy to see how much every stage of the pipeline is worth. I also added rotting, which highlights cards that haven’t been updated for more than two weeks so forgotten leads are easier to spot. Another big addition is public forms. Every record type can now expose a public form that can be shared with a link or embedded into any website. When someone submits it, a new record is created automatically and any related workflows are triggered. The feature also includes a honeypot for bots and per-IP rate limiting. Finally, I added a Trash Bin, allowing users to restore accidentally deleted records with a single click. I also added the ability to assign an owner directly from the record page. Passwords now follow the same rules everywhere in the application: at least 8 characters one uppercase letter one lowercase letter one number one special character. The backend enforces the policy, while the frontend shows a live checklist as the user types. I also added a Change Password page. When a password is changed, every other active session is logged out while the current one stays active. At one point login stopped working and always returned “Invalid credentials”. It turned out the password wasn’t the problem at all, the backend was stuck in a crash loop. A new database column was added as “not null” without a default value, so Hibernate couldn’t apply the change to an existing table. The application never finished starting, and the frontend showed a generic login error. I fixed the database manually, added a default value to the migration, and made a note for the future: every new “not null” column should always have a default value. After adding all these features, I went through another security pass. The rate limiter now also protects password changes and the Cal.com webhook. I also added a scheduled cleanup job that removes old expired sessions from the database. Finally, I configured proper security headers, including a CSP. Public forms can still be embedded on external websites, while the rest of the CRM remains protected from being embedded elsewhere. Stay tuned, cause I still have lots to do :)"}, {"post_id": 14329, "ts": "2026-06-23T12:44:44Z", "hours": 5.6103, "text": "I continued working on this wonderful project. The first thing I implemented was the sidebar, designed as a reusable component. You can expand and collapse it to switch between icons only and icons with text. I also added a top bar, which contains the company name (top left), a search bar that will allow users to scan the entire database and quickly find what they’re looking for. I also added translations (2 languages for now), light and dark mode, notifications, and a profile section with the user’s name. Additionally, I implemented a simple dashboard with fake data to start shaping the overall user experience. Stay tuned."}, {"post_id": 13650, "ts": "2026-06-22T12:28:12Z", "hours": 8.3619, "text": "Still working on my project. It’s been really tough so far, I’m still on the backend, which is very hard. I feel lucky to have AI helping me; it would be really difficult without it. Honestly, it’s hard even with AI, so I lean on it a lot. I don’t think using AI is a negative: as long as you understand the code it writes and can modify, fix, and improve it, you’re fine. On the backend I’m currently working on the engine underneath, mainly the database relations. For example, the record table stores its fields generically (as JSON), so users can define whatever fields they want. The catch is that validating the data is on me, since the fields are dynamic, the database can’t enforce their shape, so it all has to be checked in code, mostly in the frontend. I’ve also started on the frontend: first by dockerizing it, then by adding the login form that exercises my backend."}, {"post_id": 11904, "ts": "2026-06-19T12:16:33Z", "hours": 5.9808, "text": "Started working on a very big project, called CRM. I hope you know what a CRM is, but for who doesn’t, a crm is basically an app, or maybe a dashboard, used by companies to keep track of their clients, employees and all this kind of things. It helps growing a company, with integrated tickets and so on. This app will be built in the following tech stack: Angular for the frontend, with daisyUI and tailwindCSS as graphical libraries Java Spring for the backend, able to manage correctly users, types and endpoints. I chose this over nestJS with prisma, because I want to have more control on the db. db, I have still to choose what I want and should use, because now I’m focusing on other things, like JWT auth, creation of users and entities and so on. My idea is to use this as a base, and then for maybe companies who needs it, I could like improve this, add requested features, and optimize everything. My current situation: I started the angular project, but I still have to install all libraries and update determined packages I created backend, and I’m currently focusing on auth (as you can see from the pic), with jwt sessions, users, entities, permissions and this kind of things. db, still in progress The application will be dockerized for best practice."}]...
|
Title: CRM by @F3rro_32 | Stardance
Devlogs:
Star Title: CRM by @F3rro_32 | Stardance
Devlogs:
Started working on a very big project, called CRM. I hope you know what a CRM is, but for who doesn’t, a crm is basically an app, or maybe a dashboard, used by companies to keep track of their clients, employees and all this kind of things. It helps growing a company, with integrated tickets and so on. This app will be built in the following tech stack: Angular for the frontend, with daisyUI and tailwindCSS as graphical libraries Java Spring for the backend, able to manage correctly users, types and endpoints. I chose this over nestJS with prisma, because I want to have more control on the db. db, I have still to choose what I want and should use, because now I’m focusing on other things, like JWT auth, creation of users and entities and so on. My idea is to use this as a base, and then for maybe companies who needs it, I could like improve this, add requested features, and optimize everything. My current situation: I started the angular project, but I still have to install all libraries and update determined packages I created backend, and I’m currently focusing on auth (as you can see from the pic), with jwt sessions, users, entities, permissions and this kind of things. db, still in progress The application will be dockerized for best practice.
Still working on my project. It’s been really tough so far, I’m still on the backend, which is very hard. I feel lucky to have AI helping me; it would be really difficult without it. Honestly, it’s hard even with AI, so I lean on it a lot. I don’t think using AI is a negative: as long as you understand the code it writes and can modify, fix, and improve it, you’re fine. On the backend I’m currently working on the engine underneath, mainly the database relations. For example, the record table stores its fields generically (as JSON), so users can define whatever fields they want. The catch is that validating the data is on me, since the fields are dynamic, the database can’t enforce their shape, so it all has to be checked in code, mostly in the frontend. I’ve also started on the frontend: first by dockerizing it, then by adding the login form that exercises my backend.
I continued working on this wonderful project. The first thing I implemented was the sidebar, designed as a reusable component. You can expand and collapse it to switch between icons only and icons with text. I also added a top bar, which contains the company name (top left), a search bar that will allow users to scan the entire database and quickly find what they’re looking for. I also added translations (2 languages for now), light and dark mode, notifications, and a profile section with the user’s name. Additionally, I implemented a simple dashboard with fake data to start shaping the overall user experience. Stay tuned.
Hey guys, this week was also about making the CRM feel more complete. Alongside several new features, I also spent a good amount of time improving security and fixing one particularly deceptive bug. First of all, I added a new global Calendar page that shows every record with a date in one monthly view. Events, tasks, reminders and subscription renewals are all displayed together, each with its own color. Before this, the calendar only existed inside each record type, so there wasn’t a way to see everything happening at once. I also integrated Cal.com. The booking page can now be embedded directly inside the CRM, and when someone books a meeting, a webhook automatically creates an Event record. If the meeting is rescheduled, the existing record is updated instead of creating a duplicate, and if it’s cancelled, the event is removed. To keep the integration secure, the webhook signature is verified using the raw request body instead of reserializing the JSON. I spent some time looking at features from Pipedrive, HubSpot and Attio, then implemented a few that I really liked. The Kanban board now shows the total value of each column, making it easy to see how much every stage of the pipeline is worth. I also added rotting, which highlights cards that haven’t been updated for more than two weeks so forgotten leads are easier to spot. Another big addition is public forms. Every record type can now expose a public form that can be shared with a link or embedded into any website. When someone submits it, a new record is created automatically and any related workflows are triggered. The feature also includes a honeypot for bots and per-IP rate limiting. Finally, I added a Trash Bin, allowing users to restore accidentally deleted records with a single click. I also added the ability to assign an owner directly from the record page. Passwords now follow the same rules everywhere in the application: at least 8 characters one uppercase letter one lowercase letter one number one special character. The backend enforces the policy, while the frontend shows a live checklist as the user types. I also added a Change Password page. When a password is changed, every other active session is logged out while the current one stays active. At one point login stopped working and always returned “Invalid credentials”. It turned out the password wasn’t the problem at all, the backend was stuck in a crash loop. A new database column was added as “not null” without a default value, so Hibernate couldn’t apply the change to an existing table. The application never finished starting, and the frontend showed a generic login error. I fixed the database manually, added a default value to the migration, and made a note for the future: every new “not null” column should always have a default value. After adding all these features, I went through another security pass. The rate limiter now also protects password changes and the Cal.com webhook. I also added a scheduled cleanup job that removes old expired sessions from the database. Finally, I configured proper security headers, including a CSP. Public forms can still be embedded on external websites, while the rest of the CRM remains protected from being embedded elsewhere. Stay tuned, cause I still have lots to do :)
Hey guys, I have stopped this project for a bit, but here I am again. I’m currently improving the CRM, mostly the security, which, for me, is one of the most important parts, and adding functionalities. Lately I focused on the mails. I added my smtp server, and in the backend, I managed all mails. Here is an example, with the invitation email. It’s in italian, but don’t worry, basically it invites you to the CRM, and then you can create your own account, with password. As you can see in the third screenshot, I can manage the invitation link, whether I want to invite an admin, or a simple employee.
Hey guys, I’m still working on this project, cause there are lots of things to do.Lately I focused on improving and adding things to the ObjectTypes. As you can see in the two images of the sidebar, I added like 10 fields. Among them, the most important are goals , basically contains the possibility of creating a goal, setting an owner, which is responsible for this goal (clearly depends on the situation), the actual goal and the period. Along with that you can set a metric, so if the goal is revenue , opportunities , leads , custom project_task , basically it contains the instruction for each member, on a certain project service_contract , the support, it contains the subject, the company which is referred to, start and end date, the actual status, so active , expiring , expired , terminated , hours spent and so on. Along with these and the other I didn’t cite here, I added 3 object for the sales, where this two are the most important: The first one is the supplier , it contains all the specs, so name, vat, email, phone, website, address, and eventual notes. The second one, the most important, is sales_order , which contains the subject, the number of the order, a relation with the company, and a relation with the contact, a relation with the quote (I don’t know if it’s right, in italian it’s called preventivo), the possibility of setting a status, so created , confirmed , shipped , closed , cancelled , the order date, a relation with the payment Method object, and all the financial part, so the subtotal, with maybe the discount, vat, the total and the infos for the shipping, billing and shipping address. I hope to finish this project asap, since it’s taking me so looong.See ya in the next devlogs
Hey guys, still on this project. This round was all about the stuff that sits on top of the modules, instead of new modules. Per-user formatting preferences . There’s a new “My preferences” page in the user menu. Every user picks how they want to see numbers and dates: thousands separator, decimal separator, currency (any ISO code, the symbol gets resolved automatically), how many decimals, whether the symbol goes before or after the number, and whether to cut trailing zeros. Same thing for the date format. There’s a live preview box that updates while you touch the selects, so you see 1.234,50 € turn into $ 1,234.5 as you change this. The setting applies everywhere, lists, record details and so on. Tags . These are cross-module, which is the whole point; a tag can sit on a lead and on a ticket. There are two kinds: shared ones, visible to the whole workspace, and private ones, which only you see. Each one has a color. You can attach and detach them from any record, and there’s a “all records with this tag” view that goes across modules, filtered by your permissions, so if you can see tickets but not opportunities, you only get the tickets.I did not build this as a field type, even though I already have a TAGS one. That one belongs to a single ObjectType with its own fixed options, so it gives you neither the shared catalog nor the cross-module search. Duplicate merge . You pick a module and it gives you back the candidate pairs, ranked by how similar their titles are (there’s a threshold you can move, default 0.6). Then you get the two records side by side and choose, field by field, which value survives. When you confirm: the winner keeps everything you picked, every relation that pointed at the loser now points at the winner, ids of the loser mentioned inside other records get rewritten too, including the ones stored in lists, notes and tags move over (and if the winner already had that tag, the duplicate link is dropped), the loser goes to the trash, not deleted. A wrong merge has to be recoverable, and I already have a bin, so I used it. Document numbering . Documents now number themselves. It’s configurable per module: prefix, whether to include the year, padding, separator. Right now it’s on for three of them: - quotes → 2025-47 - invoices → FT2025-0001 - tickets → TT643 The counter is per module and per year, and it’s locked while it’s being read, so two people creating a quote at the same time can’t get the same number. If you type a number by hand, yours wins, that matters when you’re entering an old document with its original number. On top of that, quotes have revisions. Revising 2025-13 gives you 2025-13_2 , a brand new document that links back to its parent, while the parent moves to the “revised” stage. And you can revise a revision, so 2025-13_2_2 works too, the counter is progressive per parent, not global, which took a bit more care than I expected. Next up is the big one: document lines. Quote → order → delivery note → invoice, with quantities, discounts and VAT per line. It’s the only part of this CRM that doesn’t fit the dynamic JSON engine everything else is built on, so it gets its own real tables. See ya in the next devlog, I hope you like the project. P.S. you’ll see the tag in the next devlog, I still have to implement the frontend
Hey guys, back on this project. Last time I said the next round was going to be document lines, my quote was “the only part of this CRM that doesn’t fit the dynamic JSON engine”. That’s what this round was, plus the report engine on top of it. Document Lines : One single table for all four documents: quote, sales order, delivery note, invoice. The line is exactly the samein all of them, the only thing that changes is the document holding it, and a document here is just a Record like any other, so there’s no type constraint on the line at all. A line can be a product line, a free text line (no amounts, just something to say in the middle of the document) or a subtotal. Two things get copied at save time: the description and the vat percentage. The math is its own class, DocumentLineCalculator, and it’s the one piece of this project I wanted testable completely on its own, because it’s the only place where a wrong rounding produces a wrong tax document. The order is fixed: gross = quantity × unit price discount = a percentage of the gross, or a flat amount net = gross - discount, rounded to 2 decimals here vat = net × rate, rounded line total = net + vat Rounding happens after the discount and after the vat, never on the unit price: round the unit price and the error gets multiplied by the quantity. Rounding mode is HALF_UP, which is the commercial rounding used here, not HALF_EVEN. And a flat discount bigger than the line itself gets clamped instead of producing a negative amount, since that’s a typo 100% of the time. Lines are always saved all together. The endpoint is a PUT that replaces the whole set. It deletes and rewrites instead of diffing row by row, because a document has a few dozen lines at most and the diff would cost more code than it’s worth. The reason for this rule is the totals: they depend on every line, so a partial save would leave the header and the lines disagreeing, even if only for a moment. The totals (subtotal, vatTotal, total) get written back into the document’s own JSON, plus the header level discount and shipping cost. They live there so they can be list columns you filter and sort on, which is the whole point of having them. Now I’m working on the dashboard graphs, widget and this kind of things.I hope you like the project. I’m sorry if I don’t have any screenshot of the working website, it’s because I focused only on the backend, the frontend of this part still needs to be written.
Hey guys, how it’s going? These days I’ve got quite a lot of work to do, since we’re in the middle of harvest season here in Italy, so I don’t have much time to work on the project. Unfortunately, today it rains, so I’m home, and I can spend some time on the PC. Lately I’ve been working a lot on the backend. The first two things I did are documents and document numbering : I created the model for document rows ( DocumentLine ), with its engine to calculate totals, including subtotals, discounts and VAT. I also added unit tests for the calculator. I also implemented automatic document numbering, so documents like quotes, invoices and tickets are automatically assigned a number when they’re created. Then I worked on quote revisions, with a new QuoteRevisionService to keep track of different versions of the same quote. Another thing I started working on is document conversion. The idea is to be able to convert a quote into an invoice, but this part is still a work in progress. I also spent quite a bit of time on reports and dashboards: added the Report model and the ReportEngine / ’ReportService` added default reports through a ReportSeeder created the Dashboard model, with tabs and widgets added the related controllers, services and repositories On the frontend side I’ve scaffolded the pieces for dashboards and widgets — the widgets/ and dashboard-tabs/ components exist and the dashboard and report services are written — but the components themselves are still empty shells. The data layer is ready, the screens aren’t written yet. That’s what I’ll pick up next. Another big thing I worked on is tags and data quality. I added the tag model and APIs, together with the services and repositories. I also started working on a duplicate finder and record merging system, so duplicate contacts/companies can be detected and merged instead of leaving messy data around. For PostgreSQL, I also enabled pg_trgm to improve fuzzy searches for duplicate detection. Finally, I added user preferences for number and date formats, including a live preview so users can immediately see how their chosen formats will look in the app. I’ve also added icons for the new modules. As you can probably tell, this was a very backend-heavy cycle. Almost everything I built this time: document lines, numbering, quote revisions, reports, dashboards, tags and duplicate detection lives in the models and the services, and the UI for most of it isn’t there yet. So this time there isn’t much to show in screenshots: the engine is in place, the screens come next. I’d rather get the model right first and build the interface on top of something solid than the other way around. Hopefully I’ll be able to find some more time to work on it after harvest, so see you in a while.
Hey guys, how’s going? Soon school is going to start for me, but luckily it’s my last year in high school, so I’m really happy about this. Lately I had much time to code, so I continued working on this project. Last devlog was all backend; I said the engine was there and the screens weren’t. This time it’s quite the opposite. I didn’t really touch the backend, I spent the last 5-6 hours writing the frontend. Here’s the details of what I did: Document lines the grid is finally in the record detail. You can add lines, set quantity, price, discount and VAT, additionaly with the subtotal / VAT / total block, that updates while you type. When you save, the whole set of lines is sent at once. Tags I added the tag picker on the record detail, so you can attach and remove tags from a record as you wish. I also made the page that shows every record with a given tag, from all the modules together. Duplicates The duplicate finder now has its own screen: you choose a module, you get the pairs it thinks are duplicates, and the you see the two records side by side and pick field by field which value to keep before merging them. Reports There’s a page to build a report with a wizard (rows, columns, metrics, filters) and a preview that shows you the result before saving it. Dashboard widgets This is the main thing of this cycle. I wrote all six widget types, which are: - KPI tile - split KPI tile - chart - table - pivot - record list A widget is just a saved report query plus the type of rendering you want, so it runs on the report engine. Dashboards with tabs You can create a dashboard, add tabs to it and put widgets inside, so you can keep for example sales and support separated from each other. Sidebar and topbar The sidebar now has the routes for all the new pages, and the topbar has a quick-create button to make a record from anywhere without opening its module first. Two things are still not nice and I’m aware: in some places the relation fields show the raw id instead of the name of the record, and the totals of the document lines are not formatted with the user preferences yet, so you read 9054.00 instead of 9.054,00 EUR. Both are small and both are on the list to be improved. Now I’m working on the PDF generator See you, I hope you enjoy this project
Hey guys, how’s it going? I hope you’re all doing well. School started here in Italy, so I have less time compared to August. I also have to get my driver’s license, so I’m studying for that too. Unfortunately, coding isn’t the first thing I do every day anymore. I’m still working on the PDF generator. Last time I mentioned that relation fields were showing raw IDs and that document totals weren’t formatted properly. I fixed both of those, but I’ll get back to them later. About the PDF The template is HTML, and it lives in the DB. I didn’t hardcode the layout in Java. I created a PdfTemplate entity that stores the HTML, page size and margins. There is one default template for each document type: quote, order, delivery note and invoice. Thymeleaf fills the template with the document data, and OpenHTMLToPDF + PDFBox generate the PDF. Since the HTML is provided by the user, I also had to think about security. A template could try to load something like file:///etc/passwd or access an internal URL. Because of this, external protocols are disabled and only data: URIs are allowed. Page sizes are also checked against a whitelist. I also had to deal with the fact that HTML isn’t always valid XML. OpenHTMLToPDF expects XML, so I use jsoup to normalize the HTML first. Otherwise, perfectly normal HTML can cause a SAXParseException . And finally, fonts have to be embedded in the PDF. Without including DejaVu Sans in the jar, the PDF doesn’t render correctly. VAT summary I also worked on the VAT summary. Lines are grouped by VAT rate, shipping is added to the highest rate, and the document discount is distributed across the rates instead of being applied at the end. VAT is then calculated on the discounted amounts, so everything adds up correctly: taxable + VAT = total This actually fixed a bug where VAT was calculated before applying the document discount. It wasn’t very obvious until I started testing it with real numbers. Three endpoints The PDF system now has three endpoints: print a document preview a template print a batch For the preview, instead of creating a fake document, I use the last real document of that module. This way there is only one PDF generation system to maintain. The batch endpoint combines multiple documents into one PDF, while checking permissions for every document. A few other fixes The two ugly things from last time are also gone. Relation titles are now resolved by a shared backend service, so instead of UUIDs you see things like the company name. The same service is used by the lists, detail pages and PDFs. Amounts in the PDF are also formatted using the user’s preferences. I also added tags to the record lists. Tags are resolved in bulk instead of doing a permission check for every single row, which makes a big difference on larger lists. The backend part is basically done for this cycle. The print button and template editor are already written, but they’re not wired up yet. Right now I’m still using the API to test the generator. So, UI is next. See you in the next devlog!
Hey guys, how have you been doing lately? I’m alright. I’m still getting my driver license, so I don’t have much time to code. Last devlog was all about the PDF engine on the backend, and I closed it saying that the UI was next. Here it is: Print button : I added a print button Print PDF on quotes, orders, delivery notes and invoices. The file is downloaded with the document number as its name, so you get for example 2025-47.pdf and not just document.pdf Template editor : I also added to settings a new tab called “Print”. On the left there’s the list of templates, on the right the HTML, the page size and the margin. The preview renders the last real document of that module instead of a fake one, so what you can see is exactly what your customer receives. The default templates can’t be edited you duplicate them: the seeder rewrites them at every boot, so any change would silently disapper on the next restart. I preferred to say it in the interface rather than let someoune lose an afternoon of work. Company data : The company settings now hold also the legal name, VAT number, tax code, address and contact line. That’s what the PDF header prints, and without them the header comes out empty. VAT that adds up to the cent The header discount is spread across the VAT rates and every share gets rounded, so the sum of the shares could end up one or two cents away from the total. On a quote nobody would ever notice. On an electronic invoice it’s rejection 00423. Now the rounding leftover goes on the last rate, so taxable + VAT = total, always. Tests on a real db : The report engine builds SQL at runtime, and mocking a database proves nothing, so its tests now start a throwaway Postgres in Docker and run against it: filters, grouping, ordering and counting. Two bugs closed : Merging two records didn’t look at the bin, so a deleted record could be merged into a live one. And editing a saved report answered 405, because the frontend was sending PUT to an endpoint that only has POST. Right now I’m working on the 2FA (for those who don’t know, the 2 factor auth). I’m writing the TOTP myself instead of pulling in a library: it’s an HMAC-SHA1 of the 30 second counter, and the six digits come out of the dynamic truncation described in the RFC. The secret is encrypted in the database with AES-GCM, because someone who can read the db must not be able to generate the codes, otherwise a second factor is just a second password. There are ten recovery codes, stored hashed and usable once each, and the last accepted counter is saved, so the same code can’t be replayed during its 30 seconds. The tests are the official RFC 6238 vectors: a TOTP written at home always “works” until you compare it with a real auth app, and at that point it’s too late to find out. Two things I know are missing: the second factor has no interface yet, there’s no page to scan the QR code from, and the mailbox that turns incoming emails into tickets is only half written. See you soon, the end of this project is near.
Hey guys, how’s everything going? I’m alright. I’m so glad hackclub postponed the end of stardance, I have still another month to 1. finish this project 2. do other projects I had on my mind for such a long time. Before doing this devlog, I had to use claude to debug my work, because I had some errors I didn’t understand (I was using a class created for a test in the normal “code”), so bad :( and also other small issues. Lately I worked on one of the most significat features for me, which is 2FA . As my network teacher says "zero trust, because the world is a place full of bastards" . 2FA is one of the techniques I use to follow this approach. Basically, now you can press “Enable” in your preferences, scan the QR code with any authenticator app (f.e google), or just type the secret by hand, because half the people can’t frame a QR code at the first time, lol. You also have to confirm with a code. At login, if 2FA is on, there’s a second step for the six digits. You also get ten recovery codes that you can copy or download, shown only once. Turning it off asks for your password, so a stolen open session can’t remove this precaution. You’re probably wondering: are the secrets encrypted? Yes, they are. I mostly use AES-GCM, because it’s pretty simple, but also secure, so it’s the better compromise. The TOTP secret and the mailbox passwords are stored encrypted with AES-GCM. The key lives in an env variable, not in the db, so a database dump alone isn’t enough to generate codes or read someone’s email. I also turned the crm in a PWA . You can install it on your phone or desktop, it has its own icon and window, and when I deploy a new verion, it tells you to reload, instead of silently serving you the old one from cache (it also checks every 6 hours, maybe I’m gonna change it to 10, idk, for the tab you leave open for days) Like in every other devlog, I made some tests and updated the docs. The report engine now has tests against a real Postgres started in docker, and the repo finally has a real README (it’s not finished, just with some basic information, claude, thanks for the suggestion of making it). Oh, I nearly forgot. I also worked on emails. Now I’m currently working on the Italian electronic invoice, which is called FatturaPA. The crm builds the XML from an invoice, and the first test I wrote checks it against the official government XSD: if it doesn’t pass, it isn’t saved. I think I’m gonna study a bit of english / american law, to allow people out of Italy to use this app as well. I hope you like my product, see you soon
Hey guys, how’s going? I have plenty of things to do, but coding is still one of my favorite activities, so I always try to save some time for it.This time I worked again on FatturaPA, which is the Italian electronic invoice.What I did, is that now, first of all, the CRM can now generate the FatturaPa XML directly from an invoice and validate it against the official XSD, before saving it. I also added the whole invoice lifecycle, from draft, to setn, delivered, accepted or rejected. The CRM can read the recepits from the SDI and show ufseful information when something goes wrong.Another important change is that invoices now become locked once they’re sent to the SDI. If something needs to be changed, the correct way is to create a credit note instead. This is much efficient in my opinion.I also started working on the SDI integration itself. For now there’s only a manual transport, but the system is built so that adding an actual provider later shouldn’t require changing the rest of the CRM. I did it this way, so I can decide which provider use, and not have to change everything.Besides invoicing, I added time tracking. You can start a timer from the top bar and see your hours directly on records. Timers also automatically close after a maximum amount of time, so nobody ends up with a 80-hour ticket because they forgot to stop it.Finally, I worked on email campaigns. You can create a campaign from a saved filter, send emails through a queue and manage unsubscribes. I also added some protections against things like open redirects and accidental unsubscribes.And now, the honest part: before writing this devlog, I ran the tests and guess what, the app didn’t even start.I used claude for debugging, cause I wans’t finding the error. Silly me, it was just a typo.
Hey guys, how’s everythings going? I’m doing pretty well. As always I have lots of things to do, but I still have plenty of time for coding. School is demanding, and preparing for my driving license is also tough, but I’m managing everything little by little. Last time I ended up with an app that wouldn’t even start. Luckily, I fixed all those errors, and all 258 tests are now green and passing on the PostgreSQL db. After that, I added new features. First of all I worked on NPS surveys and quote acceptance. Customers can now receive surveys and answer them through a public link. They can also accept quotes directly from a link, without needing an account. I also made sure these features work with the existing workflows, so automations can still do their job properly. Another interesting addition is the MCP server. AI agents can now interact with the CRM through an API key. Instead of creating a separate set of tools for every module, I went with seven generic tools that can work across all 34 modules. This should make it easier for AI models to understand which actions they can perform, while keeping the CRM’s existing permissions and security rules in place. I also improved search quite a bit. Before, it mostly looked at record titles. Now it uses PostgreSQL full-text search to find relevant information inside the actual record data and rank the results. The audit history is also much easier to read, with related record IDs replaced by their actual titles. I worked on a couple of smaller but important things, too. The trash can now properly handle related files and records when permanently deleting something, while protecting fiscal documents that must be kept for ten years. Finally, I started working on the customer portal. It now has its own backend authentication and permission system, separate from the employee login. Customers will only be able to access records they’re actually allowed to see. The backend is ready, but I still need to connect the frontend pages and routes. There’s still quite a bit to do, but I’m getting closer to the first complete version of the CRM. See you in the next devlog!
Hey guys, how’s going? This will be a short devlog, and it’s the one before the shipping. I decided to ship the CRM, even if it’s not completely finished. That’s because I still have to do lots of things, but now I have a working product, so, since the changes I have to make are complementary. Unfortunately, I have a big issue: the whole interface is in Italian. The app is made for Italian small businesses (FatturaPA, VAT, SDI…), but if you come from Stardance you can’t read a single menu. Real i18n is still on my list and it is a big job, so for now I added the Google Translate widget in the corner of the app. If your browser is in English it starts translating by itself, otherwise you pick English from the selector. It’s not pretty, but it makes the demo usable today instead of “someday”. I had to widen the CSP in nginx for it, and I loaded the script as an external file so I didn’t need a second hash. I also fixed the README and cleaned the repo. Now everything should work fine, or at least let’s hope so. I hope you enjoy the product.
Hey guys, what’s up? I’m finally in the last phase of getting my driving license, so that’s taking up some of my time too. The CRM is now online at crm.alessio.hackclub.app . The VPS has very little RAM, so I build the Docker images locally and transfer them to the server using docker save over SSH. It’s not the fanciest deployment process, but it works with the resources I have, so I’ll stick to it for now. One of the main things I worked on was the customer portal . The backend from last week finally has a frontend: customers can log in, see their tickets and documents, open requests, reply to messages, download PDFs and accept quotes. I also made sure that internal notes stay internal. Notes now have a Visible to customer checkbox, which is disabled by default. The portal only shows notes explicitly marked as visible, so there’s less risk of accidentally exposing something that should stay private. Another feature I added is Google Calendar import . It’s read-only for now, so the CRM can import events without modifying anything in your Google account. Events are created through the same service as normal CRM records, meaning workflows and the audit log still work as expected. Sync runs every 15 minutes, and if something goes wrong with an account, it won’t stop the others from syncing. I also started replacing the Google Translate workaround with proper internationalization (i18n). The translation system is in place, including support for parameters and locale-aware dates and numbers. The dictionary is type-checked, too, so missing English translations can be caught at compile time. There’s still a lot of work here: around 1,200 strings need to be translated by hand. It’s not the most exciting task, but I’d rather have proper translations than rely on Google Translate forever. Obviously that’s my opionion. I also started working on public registration, but it’s not ready yet. There’s one important limitation: the CRM currently has a single shared workspace, so everyone who registers would see the same data. Registration will stay disabled unless explicitly enabled until I decide how to handle that properly. That’s because the idea is to have 1 single DB for each workspace, since the CRM should be self-hosted. There’s still work to do, but the CRM is getting closer to the version I wanted to ship. See you in the next devlog!
Ships:
CRM An open-source CRM for Italian small businesses: contacts, companies, leads, quotes, orders, invoices with VAT, tickets, email campaigns, NPS surveys, reports and a customer portal. It started as a way to manage clients for a friend’s startup and became a working and valuable project. TRY IT (no install) https://crm.alessio.hackclub.app email: [email protected] password: HackClub-Demo-2026! The demo has full access and realistic fake data, so feel free to click everything, create, edit and delete. The data resets occasionally. Outgoing email is switched off on the demo. HEADS UP: the interface is in Italian. Use the translate widget in the corner of the app (or your browser’s translator) to read it in English. Real i18n is on my roadmap, sorry! WHAT TO LOOK AT A quote with line items, discounts and VAT by rate, and the “Print PDF” button. PDFs come from HTML templates you can edit, with a live preview on your last real document. A customer accepting a quote from a signed link, without an account. Full-text search across every module (PostgreSQL). Italian e-invoicing: it builds the FatturaPA XML and validates it against the official government XSD before saving. Invoices lock once sent to the SDI. The MCP server: an AI assistant can use the CRM through an API key, with seven generic tools that work on all 34 modules and respect permissions. 2FA (TOTP) with recovery codes, secrets encrypted at rest, installable PWA. HOW IT WORKS There is no “contacts” or “companies” table. One generic Record entity stores its fields in a jsonb column, and an ObjectType + FieldDef describe each module (39 field types). Adding a module is a configuration record, not a migration or a new controller. Permissions are checked per module and action at runtime. You can have more info in the README, so please check it. I hope you appreciate this project :)...
|
1793199114.023006
|
1793285514.023006
|
|
65217
|
AmateurFriction by @amateur_tech_guy | Stardance
|
amateur_tech_guy
|
0
|
24.01
|
0
|
[]
|
[{"post_id": 81466, "ts": "202 [{"post_id": 81466, "ts": "2026-10-21T11:24:35Z", "hours": 3.3531, "text": "final devlog: happy to announce this project is done! i submitted it to phantom so i will not be submitting it to stardance."}, {"post_id": 78178, "ts": "2026-10-09T21:39:31Z", "hours": 4.5606, "text": "devlog #2: been working on the header, the form and the help page, anyways theres a bit more to fix like making the form look good and the help button and then i can finally move on to the final step, making the AI responsive"}, {"post_id": 73945, "ts": "2026-09-26T11:54:15Z", "hours": 16.095, "text": "devlog #1: been so busy lately, first devlog in a long long time anyways i started small i wish i could do more to make it look better but unfortunately i lack time:( how yall been tho?"}]...
|
Title: AmateurFriction by @amateur_tech_guy | Star Title: AmateurFriction by @amateur_tech_guy | Stardance
Devlogs:
devlog #1: been so busy lately, first devlog in a long long time anyways i started small i wish i could do more to make it look better but unfortunately i lack time:( how yall been tho?
devlog #2: been working on the header, the form and the help page, anyways theres a bit more to fix like making the form look good and the help button and then i can finally move on to the final step, making the AI responsive
final devlog: happy to announce this project is done! i submitted it to phantom so i will not be submitting it to stardance....
|
1793084117.7690842
|
1793688917.7690842
|
|
17432
|
Sleepy OS by @sriyank | Stardance
|
sriyank
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:28:49Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a os that is personalized to me i chose a hobby that i like to do sleeping and based the theme of that, as you can see i have also used js for the logic behind the dragging of the windows and pictures thank you.", "repo": "https://github.com/SasukeUchiha12309876/Sleepy-OS", "demo": "https://sleepy-os.vercel.app/"}]...
|
[{"post_id": 8146, "ts": "2026 [{"post_id": 8146, "ts": "2026-06-13T16:15:35Z", "hours": 0.5328, "text": "i believe that i am done i dont think i will go all out for this project though i will slowly gget into the flow but for now i will submit what i habve the update i made today is a dragable window and closable windo of a picture"}, {"post_id": 7869, "ts": "2026-06-13T03:52:03Z", "hours": 0.9389, "text": "Now i made some good progress with a app and a taskbar"}, {"post_id": 7689, "ts": "2026-06-12T20:51:11Z", "hours": 0.4464, "text": "Right now i just finished on the background for the os now i am going to start on the taskbar"}]...
|
Title: Sleepy OS by @sriyank | Stardance
Devlogs: Title: Sleepy OS by @sriyank | Stardance
Devlogs:
Right now i just finished on the background for the os now i am going to start on the taskbar
Now i made some good progress with a app and a taskbar
i believe that i am done i dont think i will go all out for this project though i will slowly gget into the flow but for now i will submit what i habve the update i made today is a dragable window and closable windo of a picture
Ships:
I created a os that is personalized to me i chose a hobby that i like to do sleeping and based the theme of that, as you can see i have also used js for the logic behind the dragging of the windows and pictures thank you....
|
1793119892.291011
|
1793206292.291011
|
|
70156
|
Skywards Journey by @yoru_ayan | Stardance
|
yoru_ayan
|
1
|
17.12
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T18:08:19Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hey Guys this Skywards Journey is finally completed. You can play this game either on your Windows or browser from Itch.io. In this game you can controll the player with your AWD keys or left, rigth arrow key and space bar. This have animated Player with IDLE,RUN and JUMP animation. All the Assets and code netly present in the github repo you can take a look there. This Project take little bit longer but the project is shiped with quality. The design take the long. The Background Art and character Desgin is done by KricoTheOG and the forground and character animation and titles are done by me. This Game build in the GODOT software.", "repo": "https://github.com/aniway89/StarGame", "demo": "https://yoruayan.itch.io/skywards"}]...
|
[{"post_id": 81451, "ts": "202 [{"post_id": 81451, "ts": "2026-10-21T10:30:17Z", "hours": 1.1247, "text": "Made in hand drawn version of the whole game."}, {"post_id": 80456, "ts": "2026-10-17T18:01:06Z", "hours": 0.8622, "text": "Yo Guys finally I complete this minigame. here look at this you can play it in windows and in browser with these keys > AWD, left arrow, right arrow , space bar for the movements. I have add the player animation and all the files are cleanly organised inthe repo plus all the code written cleanly with comments. take a look"}, {"post_id": 80403, "ts": "2026-10-17T15:20:20Z", "hours": 0.4442, "text": "After lots of debugging and designing the assets for this and animating character final the game is almost complete. Big thanks to my frind @KricoTheOG for helping in backgroundand character design."}, {"post_id": 80321, "ts": "2026-10-17T09:08:34Z", "hours": 14.5167, "text": "Rush Game development is crazy guys. I start making this and forget everything even pushing the code on git for stright 5 hr. But it almost done."}]...
|
Title: Skywards Journey by @yoru_ayan | Stardance
Title: Skywards Journey by @yoru_ayan | Stardance
Devlogs:
Rush Game development is crazy guys. I start making this and forget everything even pushing the code on git for stright 5 hr. But it almost done.
After lots of debugging and designing the assets for this and animating character final the game is almost complete. Big thanks to my frind @KricoTheOG for helping in backgroundand character design.
Yo Guys finally I complete this minigame. here look at this you can play it in windows and in browser with these keys > AWD, left arrow, right arrow , space bar for the movements. I have add the player animation and all the files are cleanly organised inthe repo plus all the code written cleanly with comments. take a look
Made in hand drawn version of the whole game.
Ships:
Hey Guys this Skywards Journey is finally completed. You can play this game either on your Windows or browser from Itch.io. In this game you can controll the player with your AWD keys or left, rigth arrow key and space bar. This have animated Player with IDLE,RUN and JUMP animation. All the Assets and code netly present in the github repo you can take a look there. This Project take little bit longer but the project is shiped with quality. The design take the long. The Background Art and character Desgin is done by KricoTheOG and the forground and character animation and titles are done by me. This Game build in the GODOT software....
|
1793199166.604778
|
1793285566.604778
|
|
68313
|
MacOS but on web by @pmandal7355 | Stardance
|
pmandal7355
|
1
|
8.03
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-09T19:30:01Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made the copy /inspirational macos like web os and created majority of function and really like to share this, as my first web os using electron , i recommend download electron, zustand and", "repo": "https://github.com/itsprantik/MacOS/", "demo": "https://macosproject.vercel.app/"}]...
|
[{"post_id": 81450, "ts": "202 [{"post_id": 81450, "ts": "2026-10-21T10:28:15Z", "hours": 1.0317, "text": "made the readme again as stated by reviewers the readme is seemed to be ai"}, {"post_id": 78025, "ts": "2026-10-09T07:27:20Z", "hours": 0.8658, "text": "made the calendar app and made bugs fix and new css for safari and made about mac section"}, {"post_id": 77875, "ts": "2026-10-08T17:02:43Z", "hours": 2.4664, "text": "made the browser and news app and darkmode , calculator, clock app and switched to electron for browser dependencies as google Programmable Search Engine opens in new window which ruins the os , there is still some bugs on the safari app and layout bugs which will be fixed"}, {"post_id": 77791, "ts": "2026-10-08T09:17:40Z", "hours": 1.0428, "text": "made the widgets draggable and user friendly adeed a terminal with git controls and settings page with working brightness control , sound and finder . the project will be completed within 1 to 2 days"}, {"post_id": 77767, "ts": "2026-10-08T06:18:34Z", "hours": 0.8544, "text": "made the desktop and the task bar with icons , now only the music player is made and the control centre the widgets are non movable and non removable, need to be fixed"}, {"post_id": 77609, "ts": "2026-10-07T16:41:15Z", "hours": 1.0089, "text": "made the full bottloading screen and the login page , it doesnt nedd password to keep it available for everyone"}, {"post_id": 77530, "ts": "2026-10-07T10:53:55Z", "hours": 0.3783, "text": "current made some parts of boot loading screen, will de adding a few desktop appearanace"}]...
|
Title: MacOS but on web by @pmandal7355 | Stardanc Title: MacOS but on web by @pmandal7355 | Stardance
Devlogs:
current made some parts of boot loading screen, will de adding a few desktop appearanace
made the full bottloading screen and the login page , it doesnt nedd password to keep it available for everyone
made the desktop and the task bar with icons , now only the music player is made and the control centre the widgets are non movable and non removable, need to be fixed
made the widgets draggable and user friendly adeed a terminal with git controls and settings page with working brightness control , sound and finder . the project will be completed within 1 to 2 days
made the browser and news app and darkmode , calculator, clock app and switched to electron for browser dependencies as google Programmable Search Engine opens in new window which ruins the os , there is still some bugs on the safari app and layout bugs which will be fixed
made the calendar app and made bugs fix and new css for safari and made about mac section
made the readme again as stated by reviewers the readme is seemed to be ai
Ships:
i made the copy /inspirational macos like web os and created majority of function and really like to share this, as my first web os using electron , i recommend download electron, zustand and...
|
1793065793.8486593
|
1793152193.8486593
|
|
69950
|
Snowglobe by @Charlotte14 | Stardance
|
Charlotte14
|
0
|
2.11
|
0
|
[]
|
[{"post_id": 81448, "ts": "202 [{"post_id": 81448, "ts": "2026-10-21T10:03:23Z", "hours": 2.1133, "text": "Small project, so I finished it in one go. It was based on a tutorial provided by hack club Athena."}]...
|
Title: Snowglobe by @Charlotte14 | Stardance
Devl Title: Snowglobe by @Charlotte14 | Stardance
Devlogs:
Small project, so I finished it in one go. It was based on a tutorial provided by hack club Athena....
|
1792957868.4508622
|
1793562668.4508622
|
|
61389
|
FrictionHub by @Dev_L_K | Stardance
|
Dev_L_K
|
6
|
34.0
|
302
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T09:31:41Z", "hours": 6.0, "multiplier": 9.66, "payout": 62, "blessing": "neutral", "text": "FrictionHub FrictionHub is a small collection of Quality of Life improving miniweb tools made with html css and js only. Added PWA setup to the website Go to https://frictionhub.devlkakkoth.me In the browser settings click Addto homescreen Then click Install . the PWA will be installed to your home screen Features CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code World Clock Check and analyse the world time and time differnce between zones. Typing speed checker Measure your word per minute using this sub app. Typing is a big support to devlopers. Daily Planner Helpful to those who dont memorize important things. mark as completed when each plan is done Please read my recent Devlog my this ship was completely gone! Due to many reasons I have explained them in my devlogs please read that. While working with the world clock sub app I even lost all my 45 min code and I had to rewrite it. I am being honest that I hasn’t tried to fraud hackatime. I am completely proud of me that since my last ship i am here after long days before cause I was very busy in improving my js and logics. You can see the difference I have made in my js since last ship Thank you. Thsi one is the same copy of my README.md And I have made some changes here.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 2, "ts": "2026-10-10T16:54:12Z", "hours": 6.0, "multiplier": 10.96, "payout": 63, "blessing": "neutral", "text": "FrictionHub This is a multifunctional web app. Which has many differt purpose tools that can improve the QOL It has a newly added PWA setup. Go to FrictionHub Go to browser options and click on Add to Homescreen In the pop up click Install to install the PWA to your home screen. Works on both Laptops and mobile phones Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code. If u find this helpful please give better ratings. Thankyou for rating my project.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 3, "ts": "2026-10-08T10:16:22Z", "hours": 4.0, "multiplier": 15.51, "payout": 56, "blessing": "neutral", "text": "FrictionHub This is a small web app made by me to reduce our digital friction. It contains many tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 4, "ts": "2026-09-27T01:39:34Z", "hours": 1.0, "multiplier": 4.25, "payout": 4, "blessing": "neutral", "text": "FrictionHub A multifunctional web app with many utitility tools. Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 5, "ts": "2026-09-26T01:32:25Z", "hours": 8.0, "multiplier": 12.36, "payout": 97, "blessing": "neutral", "text": "FrictionHub A multimedia web app with many QOL improving tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning.(Uses external js) text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. None of ur data never leaves your browser", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 6, "ts": "2026-09-13T11:04:47Z", "hours": 9.0, "multiplier": 4.31, "payout": 20, "blessing": "neutral", "text": "Friction Hub A collection of light weight web tools that can improve the QOL. It has 5 sub apps. None of your data entered here never leaves your device Storage - local storage Pdf generaton gode was a little hard to understand. Others were quite simple. It will help u improve your digital life. No direct use of ai just used ai to rectify errors and understanding ideologies.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}]...
|
[{"post_id": 81439, "ts": "202 [{"post_id": 81439, "ts": "2026-10-21T09:19:34Z", "hours": 2.3631, "text": "Hey all I have completed the work for the next ship. I wants some stardust now so I am gonna ship it now. New feature Daily planner You can add tasks and plan your day. And when each task is completed mark it as complete. i didnt used the exact same css. This time I decided to include more and write my self. if u notice the changes in the js of my first ship and the new one Yay! I have made a large improvement in my js i am very proud of it. Until my last ship i targeted to improve js. So I didn’t get time to code efficiently I am very proud of my improvement in js. Plss rate my project"}, {"post_id": 81180, "ts": "2026-10-20T06:19:27Z", "hours": 1.9072, "text": "Devlog after a long time I am back with my Devlog Now I have created a new sub app to frictionHub It’s is Typing Speed Checker If u just check the js it was quite too hard to figure out the logics. So I had to redo the same code by fixing errors(logical). Butit is one of the best html apps I have made. Html and css was very simple but the js was just harder than I have ever experienced. If u guys wants to try it out Plss check here https://FrictionHub.devlkakkoth.me/typing"}, {"post_id": 80426, "ts": "2026-10-17T16:31:40Z", "hours": 2.1608, "text": "Guys I am back with coding again I am back all I have added a new sub app world clock First of all I am being honest to all the Stardance reviewers. Reviewers might seem my project code time as inflated because. My sister just deleted all my code and clicked save. I lost all and i had to rewrite the codes again. So please don’t ban me as spamming hackatime. I am coding in my mobile phone I don’t have a laptop. So I can’t do undo plss this is a request. I am coding through termux along with code-server World clock It is a small mini app withalmost 15+ timezones to track current time. If u are offline u can use pwa."}, {"post_id": 78371, "ts": "2026-10-10T16:17:40Z", "hours": 1.3331, "text": "Devlog Added new app CSS Gradient Generator Uses simple js logics Select Degree ,2 colors and type and it will generate the gradient Instantly copy the code Live at Click me"}, {"post_id": 78334, "ts": "2026-10-10T14:01:19Z", "hours": 1.8939, "text": "Devlog FrictionHub I now worked mainly on my new sub app dictionary. It uses public dictionary APIs to get data Writing the code was much harder. I neededto use ai to format them correctly and to find my errors. It is currently live on Click Me"}, {"post_id": 78266, "ts": "2026-10-10T06:47:13Z", "hours": 1.8833, "text": "Devlog FrictionHub Now I have added a new app called pomodaro timer it helps to focus complete take breaks and achieve your goals. Huge update Added PWA support to the website Click add to home screen from your browser to add as PWA I am sorry because I used dir GitHub to add pwa code and its code was written with help of AI. The icon was generated by me using inshot. Ai not used Check here Click me"}, {"post_id": 78123, "ts": "2026-10-09T17:04:30Z", "hours": 0.5994, "text": "Devlog Updated home screen Now it has 4 sections Text tools Dev tools everyday utilities discover Check it out Click here"}, {"post_id": 77792, "ts": "2026-10-08T09:18:02Z", "hours": 1.2572, "text": "Devlog RecipeHub Powered by TheMealDb includes many recipes from all over the world. A simple project Live at Click here"}, {"post_id": 76720, "ts": "2026-10-04T12:31:07Z", "hours": 0.9842, "text": "Devlog FrictionHub Added new sub app Book Finder Search and find details of millions of books Works using openlibrary api. Live at https://frictionhub.devlkakkoth.me/Book"}, {"post_id": 76660, "ts": "2026-10-04T09:16:15Z", "hours": 1.3586, "text": "Devlog FrictionHub After a long time I started working New app - Base64 converter Features encode an decode images and texts to base 64 helpful for coder"}, {"post_id": 74242, "ts": "2026-09-27T01:35:23Z", "hours": 1.0253, "text": "Devlog FrictionHub Added Code formatter app. Format and clean codes html css and js and python supported Live at https://frictionhub.devlkakkoth.me/code"}, {"post_id": 73801, "ts": "2026-09-26T01:26:42Z", "hours": 0.9319, "text": "Devlog Added color converter convert colors to hex RGB and hsl Updated readme.md Live at https://frictionhub.devlkakkoth.me/color"}, {"post_id": 73790, "ts": "2026-09-26T00:20:05Z", "hours": 0.7061, "text": "Devlog FrictionHub Find and replace Find and replace texts in a large paragraph Live at https://frictionhub.devlkakkoth.me/replace"}, {"post_id": 73673, "ts": "2026-09-25T17:23:56Z", "hours": 0.8936, "text": "Devlog FrictionHub Added currency exchanger sub app uses frankfurter api to get realtime currency exchange rates. Live at https://frictionhub.devlkakkoth.me/currency"}, {"post_id": 73629, "ts": "2026-09-25T15:17:15Z", "hours": 1.2483, "text": "Devlog FrictionHub Weather dashboard Check weather and forecasts of any place using the open meteo api Added clock too Live at https://frictionhub.devlkakkoth.me/weather"}, {"post_id": 73384, "ts": "2026-09-25T01:30:46Z", "hours": 0.8211, "text": "Devlog FrictionHub JSON Formatter Format and minify json codes Added copy feature Live at https://frictionhub.devlkakkoth.me/jsonformatter"}, {"post_id": 73357, "ts": "2026-09-24T23:59:56Z", "hours": 0.5275, "text": "Devlog FrictionHub URL cleaner Remove tracking parameters and other unwanted datas from urls. Added load demo Live at https://frictionhub.devlkakkoth.me/urlcleaner"}, {"post_id": 73238, "ts": "2026-09-24T17:13:04Z", "hours": 0.6617, "text": "DevLog FrictionHub New app added Qr code generator uses simple qr code js library to generate QR code and download it as png. check live at https://frictionhub.devlkakkoth.me/qrcode"}, {"post_id": 72928, "ts": "2026-09-24T01:49:53Z", "hours": 1.4289, "text": "Devlog FrictionHub After a long time I started coding again on friction Hub Now I have added text difference finder sub app You can easily find text difference quick and fast jst pure js logics. Check here https://frictionhub.devlkakkoth.me/textdiff"}, {"post_id": 67741, "ts": "2026-09-13T23:45:05Z", "hours": 0.5972, "text": "Devlog FrictionHub Made some changes in the css and rewrite the complete readme correctly."}, {"post_id": 67276, "ts": "2026-09-13T10:51:10Z", "hours": 0.4733, "text": "Devlog FrictionHub Completed project Ready to ship Now live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67262, "ts": "2026-09-13T10:15:23Z", "hours": 1.3436, "text": "Devlog 6 FrictionHub Shopping list add items to your cart and download PDFs Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67184, "ts": "2026-09-13T07:45:30Z", "hours": 1.0269, "text": "Devlog 5 FrictionHub Case Converter convert the cases of any type of texts Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67129, "ts": "2026-09-13T06:02:15Z", "hours": 1.4153, "text": "Devlog 4 FrictionHub Text cleaner convert messy texts into clean ones helps to avoid unwanted spaces duplicate lines etc Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67007, "ts": "2026-09-13T01:31:41Z", "hours": 1.4203, "text": "Devlog 3 FrictionHub Password Generator(sub app) You can generate 100% secure and unique passwords and copy them and save with no effort. Your password or any thing don’t leaves your device Used HTML CSS JS Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 66728, "ts": "2026-09-12T16:54:14Z", "hours": 1.6175, "text": "Devlog2 FrictionHub CopyBoard(sub app) A place where u can save texts and fast access and copy it Completed it’s html structure css styles and js logics it doesn’t use any external database your data never leaves the browser Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 66652, "ts": "2026-09-12T14:41:20Z", "hours": 1.7111, "text": "Devlog 1 FrictionHub Home Page added home page to the project debugged it’s errors. Try at https://frictionhub.devlkakkoth.me"}]...
|
Title: FrictionHub by @Dev_L_K | Stardance
Devlog Title: FrictionHub by @Dev_L_K | Stardance
Devlogs:
Devlog 1 FrictionHub Home Page added home page to the project debugged it’s errors. Try at https://frictionhub.devlkakkoth.me
Devlog2 FrictionHub CopyBoard(sub app) A place where u can save texts and fast access and copy it Completed it’s html structure css styles and js logics it doesn’t use any external database your data never leaves the browser Live at https://frictionhub.devlkakkoth.me
Devlog 3 FrictionHub Password Generator(sub app) You can generate 100% secure and unique passwords and copy them and save with no effort. Your password or any thing don’t leaves your device Used HTML CSS JS Live at https://frictionhub.devlkakkoth.me
Devlog 4 FrictionHub Text cleaner convert messy texts into clean ones helps to avoid unwanted spaces duplicate lines etc Live at https://frictionhub.devlkakkoth.me
Devlog 5 FrictionHub Case Converter convert the cases of any type of texts Live at https://frictionhub.devlkakkoth.me
Devlog 6 FrictionHub Shopping list add items to your cart and download PDFs Live at https://frictionhub.devlkakkoth.me
Devlog FrictionHub Completed project Ready to ship Now live at https://frictionhub.devlkakkoth.me
Devlog FrictionHub Made some changes in the css and rewrite the complete readme correctly.
Devlog FrictionHub After a long time I started coding again on friction Hub Now I have added text difference finder sub app You can easily find text difference quick and fast jst pure js logics. Check here https://frictionhub.devlkakkoth.me/textdiff
DevLog FrictionHub New app added Qr code generator uses simple qr code js library to generate QR code and download it as png. check live at https://frictionhub.devlkakkoth.me/qrcode
Devlog FrictionHub URL cleaner Remove tracking parameters and other unwanted datas from urls. Added load demo Live at https://frictionhub.devlkakkoth.me/urlcleaner
Devlog FrictionHub JSON Formatter Format and minify json codes Added copy feature Live at https://frictionhub.devlkakkoth.me/jsonformatter
Devlog FrictionHub Weather dashboard Check weather and forecasts of any place using the open meteo api Added clock too Live at https://frictionhub.devlkakkoth.me/weather
Devlog FrictionHub Added currency exchanger sub app uses frankfurter api to get realtime currency exchange rates. Live at https://frictionhub.devlkakkoth.me/currency
Devlog FrictionHub Find and replace Find and replace texts in a large paragraph Live at https://frictionhub.devlkakkoth.me/replace
Devlog Added color converter convert colors to hex RGB and hsl Updated readme.md Live at https://frictionhub.devlkakkoth.me/color
Devlog FrictionHub Added Code formatter app. Format and clean codes html css and js and python supported Live at https://frictionhub.devlkakkoth.me/code
Devlog FrictionHub After a long time I started working New app - Base64 converter Features encode an decode images and texts to base 64 helpful for coder
Devlog FrictionHub Added new sub app Book Finder Search and find details of millions of books Works using openlibrary api. Live at https://frictionhub.devlkakkoth.me/Book
Devlog RecipeHub Powered by TheMealDb includes many recipes from all over the world. A simple project Live at Click here
Devlog Updated home screen Now it has 4 sections Text tools Dev tools everyday utilities discover Check it out Click here
Devlog FrictionHub Now I have added a new app called pomodaro timer it helps to focus complete take breaks and achieve your goals. Huge update Added PWA support to the website Click add to home screen from your browser to add as PWA I am sorry because I used dir GitHub to add pwa code and its code was written with help of AI. The icon was generated by me using inshot. Ai not used Check here Click me
Devlog FrictionHub I now worked mainly on my new sub app dictionary. It uses public dictionary APIs to get data Writing the code was much harder. I neededto use ai to format them correctly and to find my errors. It is currently live on Click Me
Devlog Added new app CSS Gradient Generator Uses simple js logics Select Degree ,2 colors and type and it will generate the gradient Instantly copy the code Live at Click me
Guys I am back with coding again I am back all I have added a new sub app world clock First of all I am being honest to all the Stardance reviewers. Reviewers might seem my project code time as inflated because. My sister just deleted all my code and clicked save. I lost all and i had to rewrite the codes again. So please don’t ban me as spamming hackatime. I am coding in my mobile phone I don’t have a laptop. So I can’t do undo plss this is a request. I am coding through termux along with code-server World clock It is a small mini app withalmost 15+ timezones to track current time. If u are offline u can use pwa.
Devlog after a long time I am back with my Devlog Now I have created a new sub app to frictionHub It’s is Typing Speed Checker If u just check the js it was quite too hard to figure out the logics. So I had to redo the same code by fixing errors(logical). Butit is one of the best html apps I have made. Html and css was very simple but the js was just harder than I have ever experienced. If u guys wants to try it out Plss check here https://FrictionHub.devlkakkoth.me/typing
Hey all I have completed the work for the next ship. I wants some stardust now so I am gonna ship it now. New feature Daily planner You can add tasks and plan your day. And when each task is completed mark it as complete. i didnt used the exact same css. This time I decided to include more and write my self. if u notice the changes in the js of my first ship and the new one Yay! I have made a large improvement in my js i am very proud of it. Until my last ship i targeted to improve js. So I didn’t get time to code efficiently I am very proud of my improvement in js. Plss rate my project
Ships:
Friction Hub A collection of light weight web tools that can improve the QOL. It has 5 sub apps. None of your data entered here never leaves your device Storage - local storage Pdf generaton gode was a little hard to understand. Others were quite simple. It will help u improve your digital life. No direct use of ai just used ai to rectify errors and understanding ideologies.
FrictionHub A multimedia web app with many QOL improving tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning.(Uses external js) text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. None of ur data never leaves your browser
FrictionHub A multifunctional web app with many utitility tools. Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat.
FrictionHub This is a small web app made by me to reduce our digital friction. It contains many tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items
FrictionHub This is a multifunctional web app. Which has many differt purpose tools that can improve the QOL It has a newly added PWA setup. Go to FrictionHub Go to browser options and click on Add to Homescreen In the pop up click Install to install the PWA to your home screen. Works on both Laptops and mobile phones Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code. If u find this helpful please give better ratings. Thankyou for rating my project.
FrictionHub FrictionHub is a small collection of Quality of Life improving miniweb tools made with html css and js only. Added PWA setup to the website Go to https://frictionhub.devlkakkoth.me In the browser settings click Addto homescreen Then click Install . the PWA will be installed to your home screen Features CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code World Clock Check and analyse the world time and time differnce between zones. Typing speed checker Measure your word per minute using this sub app. Typing is a big support to devlopers. Daily Planner Helpful to those who dont memorize important things. mark as completed when each plan is done Please read my recent Devlog my this ship was completely gone! Due to many reasons I have explained them in my devlogs please read that. While working with the world clock sub app I even lost all my 45 min code and I had to rewrite it. I am being honest that I hasn’t tried to fraud hackatime. I am completely proud of me that since my last ship i am here after long days before cause I was very busy in improving my js and logics. You can see the difference I have made in my js since last ship Thank you. Thsi one is the same copy of my README.md And I have made some changes here....
|
1793209716.6191618
|
1793296116.6191618
|
|
70759
|
Betterlectio by @JohannesNeighbourhood | Stardance
|
JohannesNeighbourhood
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T08:45:30Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I worked on a small part of a big project, that was based on a previous project of mine and @jonbng . A big part was understanding the codebase and the systems already setup.", "repo": "https://github.com/jonbng/betterlectio-android/", "demo": "https://betterlectio.dk/"}]...
|
[{"post_id": 81434, "ts": "202 [{"post_id": 81434, "ts": "2026-10-21T08:40:21Z", "hours": 2.5947, "text": "Worked on the admin dashboard, added several features including growth and a SoMe Insight!"}]...
|
Title: Betterlectio by @JohannesNeighbourhood | St Title: Betterlectio by @JohannesNeighbourhood | Stardance
Devlogs:
Worked on the admin dashboard, added several features including growth and a SoMe Insight!
Ships:
I worked on a small part of a big project, that was based on a previous project of mine and @jonbng . A big part was understanding the codebase and the systems already setup....
|
1793156008.3876185
|
1793242408.3876185
|
|
70755
|
BetterW4 by @JohannesNeighbourhood | Stardance
|
JohannesNeighbourhood
|
0
|
13.29
|
0
|
[]
|
[{"post_id": 81433, "ts": "202 [{"post_id": 81433, "ts": "2026-10-21T08:33:12Z", "hours": 13.2872, "text": "Made the app, uploaded it to the app store and distributed it to the 84 students who use IOS!"}]...
|
Title: BetterW4 by @JohannesNeighbourhood | Starda Title: BetterW4 by @JohannesNeighbourhood | Stardance
Devlogs:
Made the app, uploaded it to the app store and distributed it to the 84 students who use IOS!...
|
1792572454.686937
|
1793177254.686937
|
|
33317
|
Geometry Manipulation Engine by @Lolo_berk | Stard Geometry Manipulation Engine by @Lolo_berk | Stardance...
|
Lolo_berk
|
0
|
12.53
|
0
|
[]
|
[{"post_id": 81428, "ts": "202 [{"post_id": 81428, "ts": "2026-10-21T07:42:31Z", "hours": 4.5975, "text": "Okay so within the past 4-ish days, I have added many new features! I coded the rendering and click behavior for the circle, triangle, and rectangle tools. Also, I’m using SVG to render my shapes. —————————————————————————––––––––––––––––––————One of the things I enjoyed most about coding the tools is actually the mathematical components I implemented. I had JavaScript calculate distance between points, slope along lines, side lengths and area for triangles and rectangles (later polygons), and I had it calculate radii + area for circles. I had a little fun with this since I got to use familiar equations we actually use in class such as area formulas like Heron’s formula for SSS triangles, slope formula, and used PI for circle area and circumference. ——————————————————————————————————————–—–Along with this though, there was definitely A LOT of debugging. After I coded each tool, I tested it and had to work around the click behavior failing to recognize the unique ID’s, and the SVG not rendering correctly. At one point my file was overwrote somehow and the only reason I was able to recover all my code from my triangle and rectangle tools was because of my web browser’s console tab. —————————————————————————————————————–––Anyway, I’m so excited to keep adding more visual tools to this and make the design come to life at the end! Oh and I also included a video below of me testing out the new tools."}, {"post_id": 79742, "ts": "2026-10-15T08:27:54Z", "hours": 1.5, "text": "Okay I updated the point tool in the engine and added my first line tool feature. Now selected points appear orange and larger, while previously made points remain blue and smaller. Along with this, I added the first version of the line tool feature where a segment can be made between 2 existing points that recognizes the unique endpoint IDs. More features and add-ons for the tools later this week!"}, {"post_id": 79471, "ts": "2026-10-14T05:23:59Z", "hours": 1.2653, "text": "Little mini update for today, this is a mockup design I made using Canva to model what I hope the final look for the geometry engine will look like! I did do some coding on it today however, it was more updating and debugging. I haven’t added any new focuses like transformations and interactive features for any of the shapes quite yet. I will get to that tomorrow. Let me know what you think of the mockup design tho!"}, {"post_id": 79243, "ts": "2026-10-13T05:48:15Z", "hours": 3.1419, "text": "Hi! There have been many changes since my last devlog of this project. I had a lot of trouble with the correct Pygame installation version syncing with my Python code, and I wanted to tweak parts of my code anyway, so I decided to restart and switch back to previous languages I had already worked with. That being CSS, HTML, and JavaScript. ————————————————————————————————————— This time instead of trying to render the entire engine at once (and in a single coding file), I made a list of things to focus on creating first that I’ll gradually edit and go back to update; also to ensure that the engine is actually interactive and working as I go. My focuses currently are: [Points, Lines, Circles, Rectangles, Triangles, Polygons, Transformations, Intersections, Distances + Angles (later), Coordinate plane, and Camera movement / zoom which will be later.]———————————————————————————————————–– Today I was able to successfully code the coordinate plane + window, top-bar and toolbar, selection types and a selection status below the toolbar, and interactive features with points. The status tool shows the point you made and its coordinates as well! It took a while for me to get the x and y axes to show up in the proper orientation, as well as the selection status tool to work, but I was able to debug both! I then spent some time in Canva designing a mock-up of what I want the final website to look like. It’s not much yet, but I’d say it’s definitely a big improvement from my last coding project!"}, {"post_id": 25768, "ts": "2026-07-10T06:59:34Z", "hours": 2.0239, "text": "Hi, for my second coding project I’ve decided to create a Geometry Manipulation Engine where you can create shapes and polygons and view them in 3D; and see the math behind each. —————————————————————————————————————————–So far, I’ve created the 2D sketch plane, which doesn’t look like much yet, but I’ll keep posting updates. Recently I added the camera, renderer, and loop the scene on top of the code for the basic shapes. ——————————————————————————————————————————I’m not sure yet if this will closely resemble an engine like GeoGebra, or a CAD design software, but my goal is to code a little geometry building space with simple mathematics behind it (angles, arc lengths, side lengths). I’m very excited to see what this project will look like finished! :))"}]...
|
Title: Geometry Manipulation Engine by @Lolo_berk Title: Geometry Manipulation Engine by @Lolo_berk | Stardance
Devlogs:
Hi, for my second coding project I’ve decided to create a Geometry Manipulation Engine where you can create shapes and polygons and view them in 3D; and see the math behind each. —————————————————————————————————————————–So far, I’ve created the 2D sketch plane, which doesn’t look like much yet, but I’ll keep posting updates. Recently I added the camera, renderer, and loop the scene on top of the code for the basic shapes. ——————————————————————————————————————————I’m not sure yet if this will closely resemble an engine like GeoGebra, or a CAD design software, but my goal is to code a little geometry building space with simple mathematics behind it (angles, arc lengths, side lengths). I’m very excited to see what this project will look like finished! :))
Hi! There have been many changes since my last devlog of this project. I had a lot of trouble with the correct Pygame installation version syncing with my Python code, and I wanted to tweak parts of my code anyway, so I decided to restart and switch back to previous languages I had already worked with. That being CSS, HTML, and JavaScript. ————————————————————————————————————— This time instead of trying to render the entire engine at once (and in a single coding file), I made a list of things to focus on creating first that I’ll gradually edit and go back to update; also to ensure that the engine is actually interactive and working as I go. My focuses currently are: [Points, Lines, Circles, Rectangles, Triangles, Polygons, Transformations, Intersections, Distances + Angles (later), Coordinate plane, and Camera movement / zoom which will be later.]———————————————————————————————————–– Today I was able to successfully code the coordinate plane + window, top-bar and toolbar, selection types and a selection status below the toolbar, and interactive features with points. The status tool shows the point you made and its coordinates as well! It took a while for me to get the x and y axes to show up in the proper orientation, as well as the selection status tool to work, but I was able to debug both! I then spent some time in Canva designing a mock-up of what I want the final website to look like. It’s not much yet, but I’d say it’s definitely a big improvement from my last coding project!
Little mini update for today, this is a mockup design I made using Canva to model what I hope the final look for the geometry engine will look like! I did do some coding on it today however, it was more updating and debugging. I haven’t added any new focuses like transformations and interactive features for any of the shapes quite yet. I will get to that tomorrow. Let me know what you think of the mockup design tho!
Okay I updated the point tool in the engine and added my first line tool feature. Now selected points appear orange and larger, while previously made points remain blue and smaller. Along with this, I added the first version of the line tool feature where a segment can be made between 2 existing points that recognizes the unique endpoint IDs. More features and add-ons for the tools later this week!
Okay so within the past 4-ish days, I have added many new features! I coded the rendering and click behavior for the circle, triangle, and rectangle tools. Also, I’m using SVG to render my shapes. —————————————————————————––––––––––––––––––————One of the things I enjoyed most about coding the tools is actually the mathematical components I implemented. I had JavaScript calculate distance between points, slope along lines, side lengths and area for triangles and rectangles (later polygons), and I had it calculate radii + area for circles. I had a little fun with this since I got to use familiar equations we actually use in class such as area formulas like Heron’s formula for SSS triangles, slope formula, and used PI for circle area and circumference. ——————————————————————————————————————–—–Along with this though, there was definitely A LOT of debugging. After I coded each tool, I tested it and had to work around the click behavior failing to recognize the unique ID’s, and the SVG not rendering correctly. At one point my file was overwrote somehow and the only reason I was able to recover all my code from my triangle and rectangle tools was because of my web browser’s console tab. —————————————————————————————————————–––Anyway, I’m so excited to keep adding more visual tools to this and make the design come to life at the end! Oh and I also included a video below of me testing out the new tools....
|
1792777798.8445408
|
1793382598.8445408
|
|
54044
|
Snap2Study by @akyadav | Stardance
|
akyadav
|
1
|
21.63
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T05:50:47Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Snap2Study, an AI-powered study tool that lets students gets answers to question by just clicking a picture of it rather than searching it on the internet. The most challenging parts in the projects were to build the AI analysis pipeline and security and authentication system for users. I’m proud that i built a fully working production-deployed product and helped students to remove the stressful part of searching answers to questions on the internet. To test Snap2Study: 1.Open snap2study.vercel.app 2.Create and verify account by using email and entering the OTP. 3.After log in, upload a picture of the question. 4.And view the AI-generated analysis of the question. 5.Open profile/history to see previously analyzed questions and its complete result and other points. And that’s all, you are done", "repo": "https://github.com/adityayadav0002/snap2study", "demo": "https://snap2study.vercel.app/"}]...
|
[{"post_id": 81426, "ts": "202 [{"post_id": 81426, "ts": "2026-10-21T07:12:55Z", "hours": 4.3436, "text": "Fixed Some minor bugs in the code."}, {"post_id": 59725, "ts": "2026-09-01T17:29:54Z", "hours": 5.2894, "text": "Devlog - 6 Rewrote the Entire Codebase of Snap2Study due to some reasons."}, {"post_id": 58671, "ts": "2026-08-31T05:37:57Z", "hours": 2.2697, "text": "Devlog - 5 Implemented full authentication/security system. Added email OTP signup/login. Added secure sessions, logout & auth state. Added question history storage & search. Added previous-result viewing."}, {"post_id": 58138, "ts": "2026-08-30T14:26:30Z", "hours": 3.9194, "text": "Devlog - 4 Launched to Production Mobile & desktop testing completed Fixed major issues Next Step: Database & authentication setup, Email OTP authentication, profiles, sessions, and question history only."}, {"post_id": 57260, "ts": "2026-08-29T11:27:15Z", "hours": 2.3711, "text": "Devlog - 3 Now i have finished major part, fixing major and multiple bugs. Completed results page, added perfect frontend display of answers, and fixed major turbopack build error."}, {"post_id": 56495, "ts": "2026-08-28T09:03:48Z", "hours": 2.7569, "text": "Snap2Study - Devlog #2 In the last update i have added UI. But now i have added AI analysis pipeline into it and basically an mvp is ready of it. However had to handle many errors while doing this but managed it to do. Next step is to add more features to it and fix major things.*"}, {"post_id": 55694, "ts": "2026-08-27T17:39:06Z", "hours": 1.1403, "text": "Devlog #1 I have started building Snap2Study, a simple platform that turns questions into a smoother study experience. Currently i have built UI, preview. This is just beginning. Soon I will add more features to it."}]...
|
Title: Snap2Study by @akyadav | Stardance
Devlogs Title: Snap2Study by @akyadav | Stardance
Devlogs:
Devlog #1 I have started building Snap2Study, a simple platform that turns questions into a smoother study experience. Currently i have built UI, preview. This is just beginning. Soon I will add more features to it.
Snap2Study - Devlog #2 In the last update i have added UI. But now i have added AI analysis pipeline into it and basically an mvp is ready of it. However had to handle many errors while doing this but managed it to do. Next step is to add more features to it and fix major things.*
Devlog - 3 Now i have finished major part, fixing major and multiple bugs. Completed results page, added perfect frontend display of answers, and fixed major turbopack build error.
Devlog - 4 Launched to Production Mobile & desktop testing completed Fixed major issues Next Step: Database & authentication setup, Email OTP authentication, profiles, sessions, and question history only.
Devlog - 5 Implemented full authentication/security system. Added email OTP signup/login. Added secure sessions, logout & auth state. Added question history storage & search. Added previous-result viewing.
Devlog - 6 Rewrote the Entire Codebase of Snap2Study due to some reasons.
Fixed Some minor bugs in the code.
Ships:
I built Snap2Study, an AI-powered study tool that lets students gets answers to question by just clicking a picture of it rather than searching it on the internet. The most challenging parts in the projects were to build the AI analysis pipeline and security and authentication system for users. I’m proud that i built a fully working production-deployed product and helped students to remove the stressful part of searching answers to questions on the internet. To test Snap2Study: 1.Open snap2study.vercel.app 2.Create and verify account by using email and entering the OTP. 3.After log in, upload a picture of the question. 4.And view the AI-generated analysis of the question. 5.Open profile/history to see previously analyzed questions and its complete result and other points. And that’s all, you are done...
|
1793134245.5361595
|
1793220645.5361595
|
|
69806
|
Synth by @Himikle09 | Stardance
|
Himikle09
|
0
|
10.99
|
0
|
[]
|
[{"post_id": 81425, "ts": "202 [{"post_id": 81425, "ts": "2026-10-21T07:10:58Z", "hours": 4.1392, "text": "Completed pcb for the synth!"}, {"post_id": 81253, "ts": "2026-10-20T14:05:10Z", "hours": 4.0839, "text": "Further PCB/schematic designing. Footprints uploaded and now I just need to rearrange for the final PCB layout."}, {"post_id": 79842, "ts": "2026-10-15T16:26:15Z", "hours": 1.4472, "text": "making it physically. testing and looking for improvements."}, {"post_id": 79762, "ts": "2026-10-15T09:23:40Z", "hours": 1.3172, "text": "Planning Circuitry layout"}]...
|
Title: Synth by @Himikle09 | Stardance
Devlogs:
P Title: Synth by @Himikle09 | Stardance
Devlogs:
Planning Circuitry layout
making it physically. testing and looking for improvements.
Further PCB/schematic designing. Footprints uploaded and now I just need to rearrange for the final PCB layout.
Completed pcb for the synth!...
|
1792860474.9082906
|
1793465274.9082906
|
|
4712
|
VaultForge Crypto Wallet by @professional_toad | S VaultForge Crypto Wallet by @professional_toad | Stardance...
|
professional_toad
|
1
|
119.12
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T16:59:27Z", "hours": 26.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Fully functional, multi-chain (Bitcoin, EVM, and Solana support with more on the way) wallet. To test this project, please go to the GitHub repository linked to the project.", "repo": "https://github.com/kunningKing11/vaultforge", "demo": "https://github.com/kunningKing11/vaultforge/releases"}]...
|
[{"post_id": 81422, "ts": "202 [{"post_id": 81422, "ts": "2026-10-21T07:03:36Z", "hours": 0.7881, "text": "Devlog 31 - swapping support for Solana! (partially) there’s now swapping support for solana, at least for DEX aggregators like LI.FI or Relay. i still need to figure out native solana DEX swapping on platforms like Jupiter…"}, {"post_id": 81198, "ts": "2026-10-20T08:10:50Z", "hours": 3.2675, "text": "Devlog 30 - support for swapping (finally!) this took so long!!! i thought i would be done last friday but ig that was overly optimistic… there are still some small things i will fix/improve to make the experience a bit smoother in the coming days. Implementation so i added uniswap support for all supported evm chains; however only for same-chain transactions and only through one pool. this is suboptimal so i want to add cross-chain support and through multiple pools maybe in the future. to make it possible to do cross-chain swaps, i added Relay support (it’s an aggregator) were solvers compete to give a quote. the issue with this is that they charge quite a fee and so i really want to just use uniswap where possible. what’s next better uniswap integration (as mentioned above), plus support for solana potentially jupiter support (it’s a solana DEX) as it has really good rates and high liquidity."}, {"post_id": 80081, "ts": "2026-10-16T05:40:57Z", "hours": 1.2094, "text": "Devlog 29 - more coin icons! specifically for AAVE, Chainlink (LINK), and Uniswap (UNI)."}, {"post_id": 79643, "ts": "2026-10-14T20:01:16Z", "hours": 1.4264, "text": "Devlog 28 - coin icons! it finally looks sooo professional now… just look at those icons! they will also appear in the send and transfer (soon to be swap!) tabs over the coming days. uniswap dex integration is still the top priority though. 🫡 before there weren’t any (they were just grey) and every wallet has them so i made it better ig"}, {"post_id": 79385, "ts": "2026-10-13T19:20:45Z", "hours": 3.1186, "text": "Devlog 27 - CCTP support is here… in like 30 minutes hang tight, it’s coming soon 🚀 i attached some proof , you guys can check out the transaction here more info on this tomorrow after v0.5.0 comes out with the CCTP support. you haven’t seen nothing yet, uniswap support coming next; stay tuned! probably coming in the next week or so…"}, {"post_id": 79016, "ts": "2026-10-12T11:14:38Z", "hours": 2.2986, "text": "Devlog 26 unfortunately, it’s taking longer than i would like to add the swapping and CCTP functionality. i would say i’m about 80% there, but there are quite a few things that i have to think about and as such, i think i will get it working by tomorrow (tuesday). stay tuned! 👀"}, {"post_id": 77760, "ts": "2026-10-08T05:56:13Z", "hours": 2.3114, "text": "Devlog 25 - some progress on the swapping i haven’t had much time in the last few days but i managed to do a big refactor to make the code more modular and cleaner. this is needed so that i can do more complex transactions instead of just basic transfers. i haven’t pushed it to main or committed it yet but it’s basically done. in terms of when CCTP support will ship, I think it will be by the end of sunday."}, {"post_id": 76737, "ts": "2026-10-04T13:27:58Z", "hours": 2.095, "text": "Devlog 24 - adding support for swapping after absolutely grinding on the support for swapping for the past week, here are some updates: 12 commits coming to main soon, about half bug fixes 4/10 things completed that i think are required for adding swapping support (more info below) i’ve also decided on a rough implementation order of swapping-related functionality: CCTP v2 transfers (basically moving USDC stablecoins across chains) Uniswap DEX (the biggest Decentrallized EXchange) Jupiter DEX ( the biggest dex on Solana) NEAR Intents (a cross-chain DEX) LI.FI aggregator (basically tells the walet the best market rates) i know this is kind of an ambitious timeline but i think i can pull it all off before the end of stardance on the 31st of october 🤞. i think i will manage to get CCTP transfers working by friday or sunday, depending on how much time i have."}, {"post_id": 74986, "ts": "2026-09-28T19:35:45Z", "hours": 1.4533, "text": "Devlog 23 15 new commits pushed to main ! still cooking on the integrated swapping support… sorry this is a short devlog; i’m more focused on the coding rn and will post when i’ve done something more substantial."}, {"post_id": 74352, "ts": "2026-09-27T06:58:05Z", "hours": 2.1792, "text": "Devlog 22 since the deadline for stardance has been extended by one month, i decided to keep going and make VaultForge as good as possible over the coming weeks. here’s a quick overview of what i will focus on next: actual swapping, and integration with multiple DEXes (think Jupiter, NEAR Intents, Uniswap, etc.) a better activity view token and chain icons! makes it much easier to differentiate between assets general performance and UI improvements with these new features, especially the integrated swapping, my wallet is finally going to be on par (mostly) with established wallets such as metamask. i’ve already got like 10+ commits since the last release that i will merge to main branch soon…"}, {"post_id": 73472, "ts": "2026-09-25T06:06:46Z", "hours": 1.0978, "text": "Devlog 21 as promised, VaultForge v0.4.0 is out! this brings huge changes to wallet unlock speed, adds ripple support, adds BIP-84 addresses, and loads more. here is the link to the release page if you want to check it out. some interesting stats: there was an increase of >6,000 lines of code which is a more than 50% increase since v0.3.0 . 132 commits since last release. this is probably going to be my second-to-last devlog as i really want to hit the 100-hour mark."}, {"post_id": 72818, "ts": "2026-09-23T20:02:48Z", "hours": 7.05, "text": "Devlog 20 so i finally added ripple support… and migrated everything to React for a much better, cleaner UI. and as always, i am late again. i actually could have finished on friday but i had other things to do (like homework) and i also wanted to migrate to react as well since I decided this will be my last release before the end of stardance, so i really want to add everything i can. this is because after stardance i will take a break of a few months on this project and then come back with a different hack club ysws challenge. the react migration was so big that i decided to use AI this time: the finished App.tsx file containing the react code is over 3090 lines of code (proof is the 2nd attached image)! that’s the largest code file i have ever worked on. since this is a huge change to the ui, i decided to create some before and after comparisons below. anyways, i decided to share some design decisions relating to the migration to react. i knew react was a big framework so it would add a few MB to the app’s file size (about 1-2 MB as of my recent testing) but the app itself is tiny anyway - not even 30 MB - so i thought it was really worth it. it gives you design consistency, more so than tailwindcss, which i needed since the more fun part for me was working on the backend and not the frontend (the user-facing part of the application). plus, the guys who work at coinbase (shoutout to them) made a goated plugin/theme/whatever you call it for react which makes my app have the default coinbase theme that i can tweak (i made the font monospace) which is alone like 70% of the stuff needed for the migration. i promise i will release v0.4.0 tomorrow…"}, {"post_id": 68207, "ts": "2026-09-14T18:12:58Z", "hours": 0.5819, "text": "Devlog 19 still cooking on the ripple support… i think i will be done by friday."}, {"post_id": 66040, "ts": "2026-09-11T16:23:03Z", "hours": 0.4975, "text": "Devlog 18 i finished all the perf improvements! there was one that i left out though bc it probably wouldn’t have helped much in terms of performance and would have been a pain to implement. i am FINALLY going to move on to ripple support for the next few days…"}, {"post_id": 65508, "ts": "2026-09-10T18:18:14Z", "hours": 0.7617, "text": "Devlog 17 perf improvement #3 done! 🎊 now refreshes are fully concurrent, w/ a limit of 4 requests at a time to avoid rate limiting. i haven’t fully tetsed it yet but it feels noticeably faster (like 25-35% faster) until the updated prices & balances are shown. plus, I kind of finished the settings stuff so i’ll be working on ripple support ig…"}, {"post_id": 64935, "ts": "2026-09-09T17:38:35Z", "hours": 2.8842, "text": "Devlog 16 sorry guys, i’m kind of late on this one tbh: I said that I would have the settings improvements, ripple support and all that ready by like monday but clearly nothing has happened since like the weekend. i have decided to delay the timleine by about a week as after some careful consideration I found it was wayyy too aggressive and my fingers can’t keep up with the typing speed i would need for that :) i seriously have no idae whatsoever why I thought it was possible to add that many features in such a short space of time. I know it kind of is but I have school now which means i have much less time for this with homework and studying and stuff. however, today I decided to lock in and actually do this and so I can assure you that i am hard at work doing the settings stuff rn and ripple support is absolutely coming right after that this next release really is going to be a big one… p.s. i attached a screenshot of some of the new commits i worked on (more are coming soon)"}, {"post_id": 62021, "ts": "2026-09-05T07:16:08Z", "hours": 1.6236, "text": "Devlog #15 Since the last devlog, I’ve worked on some more boring stuff: Tauri cleanup and desktop-specific improvements. I moved the application setup and command registration from src-tauri/src/main.rs into a new src-tauri/src/lib.rs . This keeps the entry point organized and follows Tauri’s recommended structure, while main.rs now only launches the library. I also replaced the browser clipboard API with Tauri’s native clipboard manager plugin. Copy buttons now use the desktop clipboard integration. Finally, VaultForge now enforces a single-instance window. If the app is launched while another instance is already open, the new launch focuses the existing main window instead of opening a second copy, which is far more desirable of a behaviour imo as it lets a user find a window without inadvertently opening even more. Plus some more random stuff: I now sign off all my commits As of today (4th of September), I also sign all my commits with a PGP key to verify all commits are made on my laptop and not by someone who hacked my GitHub account or smth - this is definitely overkill but why not Next, I’m continuing the settings improvements before moving on to Ripple support. P.S. I also randomly moved to Neovim as it looks much better than VS Code."}, {"post_id": 61004, "ts": "2026-09-03T18:18:49Z", "hours": 1.7533, "text": "Devlog #14 Not very much since last time; just some refactors and small improvements throughout. You can kind of tell by all the fix/chore/docs changes… btw improved settings is in the works - I think I’ll do some more progress over the next two days, then some actual chain support for Ripple. I’ve decided that I will release v0.4.0 before adding basic Zcash support as it’s been basically a month since last release and I don’t want to keep you guys waiting for those of you who want to download the binaries directly w/o building. Quick summary Now –> ~5 September: settings improvements 5 September –> 7 September: Ripple support 7/8 September: release of VaultForge v0.4.0"}, {"post_id": 59639, "ts": "2026-09-01T15:39:50Z", "hours": 3.5681, "text": "Devlog #13 I finally added different currencies ! Before, all prices were displayed in USD and now they can display in any of the below currencies: USD ($) EUR (€) GBP (£) JPY (¥) Shoutout to the fantastic API I used for this! Previously, I fetched CoinGecko pricing data which came in USD but I needed to convert this data into whatever currency the user chose so I had to find an API. However, there really weren’t any good forex APIs that were free with no rate limits when I searched for one so I turned to ChatGPT to find one and find one it did. This API gives daily central bank rates and even has data going back to 1948 on 201 currencies which is more than enough for this project. I also added the second performance improvement : caching the HTTP request client object to avoid having to recreate it on every API request. As of rn the project roadmap for the near future is this: Finish perf improvements Add basic Ripple (XRP) transaction support Maybe add transparent <=> transparent pool transaction support for Zcash (ZEC) Release VaultForge v0.5.0"}, {"post_id": 58117, "ts": "2026-08-30T13:52:54Z", "hours": 5.2722, "text": "Devlog #12 Quite a bit more to report this time! Since last devlog, I’ve mostly been working on improving actual wallet functionality, fixing some smaller UI issues, and looking into performance. Recent changes Below is a quick summary of what I’ve been working on since the last devlog: Full TRC-20 token support is here! 🎊 Tron is no longer limited to just native TRX transfers, and the token validation/network logic has been updated to support TRC-20 tokens as well. Significantly improved Bitcoin support by adding proper BIP84 account discovery . VaultForge now scans both receive and change addresses, tracks which UTXOs belong to which derived addresses, signs each input with the correct derived key, and refreshes discovery before sending. Anecdote: I use Brave Wallet which did the receive and change addresses thing so my funds didn’t show up in previous versions of VaultForge. However, as of this update, I now am. Wallet unlocking now feels much faster ! Cached balances/prices are shown immediately while fresh data refreshes in the background. Improved asset cards so they show which network an asset belongs to . Assets worth less than $1 are now hidden from the portfolio/assets view unless VaultForge does not have price data for them. Fixed a few UI issues, including dashboard scrolling, refresh errors, escaping asset data (aka preventing XSS) , and copying the currently selected wallet address. Converted the remaining .js config files to TypeScript because apparently I cannot resist refactoring things even when it makes no difference whatsoever. For the first time in this series of devlogs, I’m linking the changes to relevant commits on GitHub wherever possible so you can have a look. Performance improvements I also found a few ways to reduce VaultForge’s roughly 10s full refresh time: Cached unlock (mentioned above): perceived unlock time is now closer to ~1–3s, although balances/prices can still take around the same amount of time to fully refresh in the background. Reuse HTTP clients: should save roughly ~0.2-1.5s by reusing connections. Concurrent provider calls: likely the biggest improvement, potentially bringing a ~10s refresh down to ~3–5s. Refresh prices separately: could make fresh balances appear another ~0.5–2s sooner. Derive Argon2 once: should save roughly a few hundred ms to ~1s on cold unlocks. The above estimated perf improvements are obviously quite variable and depend on a multitude of factors (+ I got ChatGPT to analyze my current code to make an estimate because how else would I do it), but there is definitely still a lot of low-hanging fruit here. Upcoming features Actual settings are still the elephant in the room 😭, so I definitely need to get around to those but since I think this may need a big PR a bit like the previous style improvements, I think I will do this after v0.4.0 (so therefore for v0.5.0 ). Ripple (XRP) support (at least for native token transfers), planned for v0.4.0 . Zcash (ZEC) support: I’ve got a feeling this one will take quite some time so at most I will implement transparent <=> transparent transactions before next release but will have to see. The remaining performance improvements mentioned above."}, {"post_id": 55009, "ts": "2026-08-26T13:12:12Z", "hours": 8.6272, "text": "Devlog #11 What a MASSIVE PR and it’s finally merged ! Hooray! That was the biggest PR I’ve ever created by a big margin. Now I can finally start work on actual features like more support for different blockchains, address types, random extra features that certain chains have… the list goes on. I already have a personal list of 25 different blockchains that I want to add support for, most of which aren’t in the project roadmap simply for the reason that it would make the file overly long and hard to read. * sigh * that will take a long time Not to underestimate what I added with the PR, though - I didn’t spend like 15 hours and do 48 commits for nothing: inside the PR I added Onboarding! 🎊 Lots of (at least in the future) common settings will be selected here to set up your wallet. You can already import an existing wallet or generate a new one (both accept 12, 15, 18, 21, and 24-word recovery phrases) and set an auto-lock timeout and select networks you want or don’t want. Finally, there is also the option to select a theme if you want. New and more prominent splash screen when loading the application. The application itself is super fast so it takes barely any time but to make it look cooler I’ve set a minimum time to display it for to 650 ms. Icons throughout the application to make it look better. Let you copy addresses in the sidebar with one click and list all enabled addresses, not just Ethereum. Squashed some more small UI bugs, especially relating to scrolling in different parts of the application. Although slightly unrelated to the theme of the PR, MUCH better refresh logic and handling. It now respects network selection choices (like the ones you want or don’t want that you selected during onboarding) and tells you exactly which network’s RPC request encountered errors. Perhaps ironically, this was literally the reason I fixed an issue with the Solana RPC. Before this update, it never actually refreshed the balance correctly so it wasn’t working. However, after this change, I was able to identify that the issue was not on my end (yay!) but was actually PublicNode ’s (the RPC I’m using for the majority of chains in this project for consistency, apart from Monad and now Solana) as I assumed it could fetch the user’s token accounts but it couldn’t so I had to switch to using the official Solana RPC which fixed the issue. For anyone who got lost somewhere in the previous paragraph, an RPC is a service that allows you to query data about the state of the blockchain (where crypto transactions are stored) so you can use it to see how much crypto you are holding. Token accounts are basically a weird quirk of Solana where your main account is used to hold Solana which links to associated token accounts (ATAs) , which each hold one token other than Solana. This is by far not a complete list but rather a list of the highlights of this PR; if you want to look at all the changes, please feel free to visit the page linked at the top of this devlog. That said, after this big change, I did say last devlog that I would be getting ready to release version v0.4.0 of this application which is exactly what I will do after adding Tron token support! Quick reminder, after v0.4.0 I am planning to add Ripple (XRP) support, preliminary (meaning like non-shielded probably) support for Zcash and revamp the settings page like I did to the onboarding in this PR. Further out, I will probably focus some more on the in-application swaps to aggregate data from major DEXs (decentralized exchanges) to get the best rates, matching other major wallets w/ more chain support, which would make my wallet actually competitive. 🤞"}, {"post_id": 50515, "ts": "2026-08-19T18:16:53Z", "hours": 6.2019, "text": "Devlog #10 I’m close to finishing the theme improvements (I would say I’m about 90% there) and am doing some general bug fixes and QoL improvements. As such, there isn’t much to log rn except for a few small new features & improvements: Show/hide password button on recovery phrase and password Loads of bug fixes, e.g., inconsistent password strength progress bar on onboarding, preventing the user from typing the Enter key when entering a seed phrase to import, text overflow, etc. Some dependency version bumps If you want to see my progress on this PR (there are already like 30 commits in it - it’s a pretty big PR!), you can do so here . What’s coming next Some final finishing touches on the PR and then I will merge it to main so that it will be in the next release Support for Tron token transfers Support for Ripple The release of VaultForge v0.4.0 either before or after adding support for Ripple transactions A revamp of the settings tab (currently it doesn’t do anything) Support for Zcash"}, {"post_id": 45175, "ts": "2026-08-11T14:25:55Z", "hours": 6.7719, "text": "Devlog #9 Not much to report but I’m still working on improving the theme and the wider interface. You can see my progress here . Recent changes Below is a quick summary of what I’ve been working on since last devlog: Improved fonts ( Tektur for headings, Manrope for body text, and Ubuntu Mono for monospace text) Updated some text across different views for consistency Improved the look and feel of onboarding Added wallet setup flow to onboarding so you can now quickly import or generate a wallet with different seed length options (12, 15, 18, 21, and 24-word seed phrases are all supported now) Theme selection (in onboarding) between four different themes - I know these look a bit AI-generated rn (they are; it would have been frustrating to write out three new themes) but I will make them look a bit better in the future Auto-lock! 🎊 Now, you can easily set an auto-lock option in the onboarding or have none at all Upcoming features I think the elephant in the elephant in the room rn is actual settings which I will be working on over the next few days as currently there are no settings in the literal settings page!"}, {"post_id": 40732, "ts": "2026-08-04T13:27:44Z", "hours": 10.4086, "text": "Devlog #8 That took a lot of time! Over the past two weeks, I have done quite a bit of bug fixing and stopping undesired behaviour, including fixing weird sideways scrolling behaviour on the dashboard portfolio and creating custom scrollbars for less janky behaviour fixing the left sidebar’s contents overflowing vertically when the window height was decreased too much (it now lets you scroll if there is not enough space to fully display its contents) stopping zooming with Ctrl + ... or with trackpad gestures completely fix portfolio allocation percentage bars stuck at zero in the dashboard Along with this, I have done quite some improvement on the CI (especially the release.yaml workflow and pre-commit checks) and some refactoring, including using Lefthook npm install , bun install , Oxlint, Oxfmt validation, TypeScript typechecking, cargo check , and package.json package-lock.json bun.lock src-tauri/Cargo.lock are automatically staged on every commit. The npm install , bun install , and automatic lockfile staging is to ensure consistency between npm and Bun so that both can be used in development and testing. The other checks are for checking (or at least trying to; there could always be edge cases that aren’t covered) that no invalid code gets committed. There is also a maximum commit message subject length (72 characters) and the same for each line of the commit message body to ensure that commit messages stay readable. cargo test , and rust-analyzer analysis on every push to GitHub, since every commit runs the other checks anyway and uncommitted code can’t be pushed refactoring the previously monolithic TypeScript file that contained multiple pages so that each page now gets its own file inside of src/views/ significantly improving release.yaml (the app release workflow for GitHub) so that it now adds a commit count since the last release adds a line count statistic and the change in lines since the previous release allows for release comments and highlights written by me adds a link that links to a GitHub page of all the commits made between the release and the previous one (it already/before this change had all the new commits listed in the release notes with a link to each one) unifying networks.json (the file that contains all the relevant chain information for the TypeScript frontend) with all the scattered equivalent information in the Rust backend; now, the backend references the networks.json file instead Also, you are now able to test out all of these changes as I have just released v0.3.0 of VaultForge! Unfortunately, I haven’t yet worked on any of the theme changes but these are top priority for the next release… As a recap, here are the things that I will be working on for the next release, in order of priority: Updated theme Full Tron support (not just native token sends) Ripple (XRP) support Miscellaneous bug fixes and new features"}, {"post_id": 29564, "ts": "2026-07-16T16:15:34Z", "hours": 7.8725, "text": "Devlog #7 Unfortunately, since I am on holiday, I was not able to complete everything that I wanted to do by the end of last week. However, I was definitely able to make some progress: Progress Tron (TRX) support is here! 🎊 (albeit only native Tron sends are currently supported) some refactoring happened What’s next As I promised last week (but did not manage to complete), I was going to completely redesign the UI to make it more user-friendly and usable and have less of an AI-generated feel. This is because when I initially started this project, I used AI to create a demo app (without any of the signing logic), just to get a sort of structure to build on and add functionality to. However, I have changed pretty much every part of it so far apart from the theme which is why I am going to work on it now/this week. Icons for different currencies and across the application for easily recognisable features Support for Ripple (XRP)"}, {"post_id": 25341, "ts": "2026-07-09T16:00:38Z", "hours": 8.0019, "text": "Devlog #6 Progress Not much to announce rn but so far (since last week/log), I have refactored the code a bit bumped some dependencies made a cool new banner for the project (you can see it on this project’s banner) started work on improving the theme/look of the app fixed some minor issues and bugs, such as EVM nonce processing used the latest nonce from a confirmed block, ignoring the fact that the user may have been fast enough to send two transactions with the same nonce, which would guarantee that at least one transaction will fail BTC preview balance displayed to the user before approving a transaction did not take into account the unspent UTXOs in the calculation Not too exciting but this lays the groundwork for what is to come. 👇🏼 What’s next I will try to add this before the end of this week: a full redesign of the theme full Tron (TRX) support"}, {"post_id": 18461, "ts": "2026-06-29T16:57:39Z", "hours": 1.5761, "text": "Devlog #5 Solana support is here!"}, {"post_id": 17931, "ts": "2026-06-28T21:30:30Z", "hours": 9.9086, "text": "Devlog #4 Support for Solana coming soon, stay tuned! 👀 Since last devlog, I refactored the code a bit and split up all the TypeScript frontend and Rust backend logic into self-contained files, each for a clear purpose. Now, it’s much easier to read and understand the codebase."}, {"post_id": 13869, "ts": "2026-06-22T18:44:00Z", "hours": 1.0944, "text": "Devlog #3 The GitHub repository is public!"}, {"post_id": 13552, "ts": "2026-06-22T05:53:33Z", "hours": 9.5006, "text": "Devlog #2 I added loads of stuff! As promised: CoinGecko pricing data integrated Integrated RPC Progress on the actual transactions (implemented for EVM only so far and I am still working on it) Hardened security: Added a CSP (content security policy) to stop XSS (cross-site scripting) Hardened address validation, including EVM EIP-55 checksum validation Added a “remove wallet data” button Added zeroization for mnemonic/key/salt on lock and clear Coming soon/roadmap: Full support for BTC, EVM, SOL, and TRX chain transfers Actual cross-chain swaps via NEAR Intents Public GitHub repository (the repo hasn’t been made public yet as it’s still not fully working) Full support for more chains, including (but not limited to): Ripple (XRP) Hyperliquid (HYPE) - support for trading perps (perpetuals) Injective (INJ) Algorand (ALGO) Zcash (ZEC) - support transparent AND shielded addresses Monero (XMR) - alternative to Zcash Support for the Open Wallet Standard Native DeFi support: Native Aerodrome Finance LPing (liquidity providing) Native Aave lending (hopefully) Filecoin storage integration so you can easily store, download, and access files stored on Filecoin (hopefully) Integration with Tor for anonymity"}, {"post_id": 6061, "ts": "2026-06-10T05:49:45Z", "hours": 4.1822, "text": "Devlog #1 Just finished the basic UI; more coming soon… Current features already include: Argon2 password hashing to secure wallet Import a wallet seed phrase RPC connection to see how much crypto you’re holding QR code to get people to send stuff to you with a fault tolerance selector, e.g., smaller QR code for 7% data recovery, 25%, 30%, etc. Coming soon: GitHub repository for the project Coming soon: CoinGecko pricing data so you can see how much your crypto is worth Coming soon: actual transactions Coming soon: compatibility with Open Wallet Standard"}]...
|
Title: VaultForge Crypto Wallet by @professional_t Title: VaultForge Crypto Wallet by @professional_toad | Stardance
Devlogs:
Devlog #1 Just finished the basic UI; more coming soon… Current features already include: Argon2 password hashing to secure wallet Import a wallet seed phrase RPC connection to see how much crypto you’re holding QR code to get people to send stuff to you with a fault tolerance selector, e.g., smaller QR code for 7% data recovery, 25%, 30%, etc. Coming soon: GitHub repository for the project Coming soon: CoinGecko pricing data so you can see how much your crypto is worth Coming soon: actual transactions Coming soon: compatibility with Open Wallet Standard
Devlog #2 I added loads of stuff! As promised: CoinGecko pricing data integrated Integrated RPC Progress on the actual transactions (implemented for EVM only so far and I am still working on it) Hardened security: Added a CSP (content security policy) to stop XSS (cross-site scripting) Hardened address validation, including EVM EIP-55 checksum validation Added a “remove wallet data” button Added zeroization for mnemonic/key/salt on lock and clear Coming soon/roadmap: Full support for BTC, EVM, SOL, and TRX chain transfers Actual cross-chain swaps via NEAR Intents Public GitHub repository (the repo hasn’t been made public yet as it’s still not fully working) Full support for more chains, including (but not limited to): Ripple (XRP) Hyperliquid (HYPE) - support for trading perps (perpetuals) Injective (INJ) Algorand (ALGO) Zcash (ZEC) - support transparent AND shielded addresses Monero (XMR) - alternative to Zcash Support for the Open Wallet Standard Native DeFi support: Native Aerodrome Finance LPing (liquidity providing) Native Aave lending (hopefully) Filecoin storage integration so you can easily store, download, and access files stored on Filecoin (hopefully) Integration with Tor for anonymity
Devlog #3 The GitHub repository is public!
Devlog #4 Support for Solana coming soon, stay tuned! 👀 Since last devlog, I refactored the code a bit and split up all the TypeScript frontend and Rust backend logic into self-contained files, each for a clear purpose. Now, it’s much easier to read and understand the codebase.
Devlog #5 Solana support is here!
Devlog #6 Progress Not much to announce rn but so far (since last week/log), I have refactored the code a bit bumped some dependencies made a cool new banner for the project (you can see it on this project’s banner) started work on improving the theme/look of the app fixed some minor issues and bugs, such as EVM nonce processing used the latest nonce from a confirmed block, ignoring the fact that the user may have been fast enough to send two transactions with the same nonce, which would guarantee that at least one transaction will fail BTC preview balance displayed to the user before approving a transaction did not take into account the unspent UTXOs in the calculation Not too exciting but this lays the groundwork for what is to come. 👇🏼 What’s next I will try to add this before the end of this week: a full redesign of the theme full Tron (TRX) support
Devlog #7 Unfortunately, since I am on holiday, I was not able to complete everything that I wanted to do by the end of last week. However, I was definitely able to make some progress: Progress Tron (TRX) support is here! 🎊 (albeit only native Tron sends are currently supported) some refactoring happened What’s next As I promised last week (but did not manage to complete), I was going to completely redesign the UI to make it more user-friendly and usable and have less of an AI-generated feel. This is because when I initially started this project, I used AI to create a demo app (without any of the signing logic), just to get a sort of structure to build on and add functionality to. However, I have changed pretty much every part of it so far apart from the theme which is why I am going to work on it now/this week. Icons for different currencies and across the application for easily recognisable features Support for Ripple (XRP)
Devlog #8 That took a lot of time! Over the past two weeks, I have done quite a bit of bug fixing and stopping undesired behaviour, including fixing weird sideways scrolling behaviour on the dashboard portfolio and creating custom scrollbars for less janky behaviour fixing the left sidebar’s contents overflowing vertically when the window height was decreased too much (it now lets you scroll if there is not enough space to fully display its contents) stopping zooming with Ctrl + ... or with trackpad gestures completely fix portfolio allocation percentage bars stuck at zero in the dashboard Along with this, I have done quite some improvement on the CI (especially the release.yaml workflow and pre-commit checks) and some refactoring, including using Lefthook npm install , bun install , Oxlint, Oxfmt validation, TypeScript typechecking, cargo check , and package.json package-lock.json bun.lock src-tauri/Cargo.lock are automatically staged on every commit. The npm install , bun install , and automatic lockfile staging is to ensure consistency between npm and Bun so that both can be used in development and testing. The other checks are for checking (or at least trying to; there could always be edge cases that aren’t covered) that no invalid code gets committed. There is also a maximum commit message subject length (72 characters) and the same for each line of the commit message body to ensure that commit messages stay readable. cargo test , and rust-analyzer analysis on every push to GitHub, since every commit runs the other checks anyway and uncommitted code can’t be pushed refactoring the previously monolithic TypeScript file that contained multiple pages so that each page now gets its own file inside of src/views/ significantly improving release.yaml (the app release workflow for GitHub) so that it now adds a commit count since the last release adds a line count statistic and the change in lines since the previous release allows for release comments and highlights written by me adds a link that links to a GitHub page of all the commits made between the release and the previous one (it already/before this change had all the new commits listed in the release notes with a link to each one) unifying networks.json (the file that contains all the relevant chain information for the TypeScript frontend) with all the scattered equivalent information in the Rust backend; now, the backend references the networks.json file instead Also, you are now able to test out all of these changes as I have just released v0.3.0 of VaultForge! Unfortunately, I haven’t yet worked on any of the theme changes but these are top priority for the next release… As a recap, here are the things that I will be working on for the next release, in order of priority: Updated theme Full Tron support (not just native token sends) Ripple (XRP) support Miscellaneous bug fixes and new features
Devlog #9 Not much to report but I’m still working on improving the theme and the wider interface. You can see my progress here . Recent changes Below is a quick summary of what I’ve been working on since last devlog: Improved fonts ( Tektur for headings, Manrope for body text, and Ubuntu Mono for monospace text) Updated some text across different views for consistency Improved the look and feel of onboarding Added wallet setup flow to onboarding so you can now quickly import or generate a wallet with different seed length options (12, 15, 18, 21, and 24-word seed phrases are all supported now) Theme selection (in onboarding) between four different themes - I know these look a bit AI-generated rn (they are; it would have been frustrating to write out three new themes) but I will make them look a bit better in the future Auto-lock! 🎊 Now, you can easily set an auto-lock option in the onboarding or have none at all Upcoming features I think the elephant in the elephant in the room rn is actual settings which I will be working on over the next few days as currently there are no settings in the literal settings page!
Devlog #10 I’m close to finishing the theme improvements (I would say I’m about 90% there) and am doing some general bug fixes and QoL improvements. As such, there isn’t much to log rn except for a few small new features & improvements: Show/hide password button on recovery phrase and password Loads of bug fixes, e.g., inconsistent password strength progress bar on onboarding, preventing the user from typing the Enter key when entering a seed phrase to import, text overflow, etc. Some dependency version bumps If you want to see my progress on this PR (there are already like 30 commits in it - it’s a pretty big PR!), you can do so here . What’s coming next Some final finishing touches on the PR and then I will merge it to main so that it will be in the next release Support for Tron token transfers Support for Ripple The release of VaultForge v0.4.0 either before or after adding support for Ripple transactions A revamp of the settings tab (currently it doesn’t do anything) Support for Zcash
Devlog #11 What a MASSIVE PR and it’s finally merged ! Hooray! That was the biggest PR I’ve ever created by a big margin. Now I can finally start work on actual features like more support for different blockchains, address types, random extra features that certain chains have… the list goes on. I already have a personal list of 25 different blockchains that I want to add support for, most of which aren’t in the project roadmap simply for the reason that it would make the file overly long and hard to read. * sigh * that will take a long time Not to underestimate what I added with the PR, though - I didn’t spend like 15 hours and do 48 commits for nothing: inside the PR I added Onboarding! 🎊 Lots of (at least in the future) common settings will be selected here to set up your wallet. You can already import an existing wallet or generate a new one (both accept 12, 15, 18, 21, and 24-word recovery phrases) and set an auto-lock timeout and select networks you want or don’t want. Finally, there is also the option to select a theme if you want. New and more prominent splash screen when loading the application. The application itself is super fast so it takes barely any time but to make it look cooler I’ve set a minimum time to display it for to 650 ms. Icons throughout the application to make it look better. Let you copy addresses in the sidebar with one click and list all enabled addresses, not just Ethereum. Squashed some more small UI bugs, especially relating to scrolling in different parts of the application. Although slightly unrelated to the theme of the PR, MUCH better refresh logic and handling. It now respects network selection choices (like the ones you want or don’t want that you selected during onboarding) and tells you exactly which network’s RPC request encountered errors. Perhaps ironically, this was literally the reason I fixed an issue with the Solana RPC. Before this update, it never actually refreshed the balance correctly so it wasn’t working. However, after this change, I was able to identify that the issue was not on my end (yay!) but was actually PublicNode ’s (the RPC I’m using for the majority of chains in this project for consistency, apart from Monad and now Solana) as I assumed it could fetch the user’s token accounts but it couldn’t so I had to switch to using the official Solana RPC which fixed the issue. For anyone who got lost somewhere in the previous paragraph, an RPC is a service that allows you to query data about the state of the blockchain (where crypto transactions are stored) so you can use it to see how much crypto you are holding. Token accounts are basically a weird quirk of Solana where your main account is used to hold Solana which links to associated token accounts (ATAs) , which each hold one token other than Solana. This is by far not a complete list but rather a list of the highlights of this PR; if you want to look at all the changes, please feel free to visit the page linked at the top of this devlog. That said, after this big change, I did say last devlog that I would be getting ready to release version v0.4.0 of this application which is exactly what I will do after adding Tron token support! Quick reminder, after v0.4.0 I am planning to add Ripple (XRP) support, preliminary (meaning like non-shielded probably) support for Zcash and revamp the settings page like I did to the onboarding in this PR. Further out, I will probably focus some more on the in-application swaps to aggregate data from major DEXs (decentralized exchanges) to get the best rates, matching other major wallets w/ more chain support, which would make my wallet actually competitive. 🤞
Devlog #12 Quite a bit more to report this time! Since last devlog, I’ve mostly been working on improving actual wallet functionality, fixing some smaller UI issues, and looking into performance. Recent changes Below is a quick summary of what I’ve been working on since the last devlog: Full TRC-20 token support is here! 🎊 Tron is no longer limited to just native TRX transfers, and the token validation/network logic has been updated to support TRC-20 tokens as well. Significantly improved Bitcoin support by adding proper BIP84 account discovery . VaultForge now scans both receive and change addresses, tracks which UTXOs belong to which derived addresses, signs each input with the correct derived key, and refreshes discovery before sending. Anecdote: I use Brave Wallet which did the receive and change addresses thing so my funds didn’t show up in previous versions of VaultForge. However, as of this update, I now am. Wallet unlocking now feels much faster ! Cached balances/prices are shown immediately while fresh data refreshes in the background. Improved asset cards so they show which network an asset belongs to . Assets worth less than $1 are now hidden from the portfolio/assets view unless VaultForge does not have price data for them. Fixed a few UI issues, including dashboard scrolling, refresh errors, escaping asset data (aka preventing XSS) , and copying the currently selected wallet address. Converted the remaining .js config files to TypeScript because apparently I cannot resist refactoring things even when it makes no difference whatsoever. For the first time in this series of devlogs, I’m linking the changes to relevant commits on GitHub wherever possible so you can have a look. Performance improvements I also found a few ways to reduce VaultForge’s roughly 10s full refresh time: Cached unlock (mentioned above): perceived unlock time is now closer to ~1–3s, although balances/prices can still take around the same amount of time to fully refresh in the background. Reuse HTTP clients: should save roughly ~0.2-1.5s by reusing connections. Concurrent provider calls: likely the biggest improvement, potentially bringing a ~10s refresh down to ~3–5s. Refresh prices separately: could make fresh balances appear another ~0.5–2s sooner. Derive Argon2 once: should save roughly a few hundred ms to ~1s on cold unlocks. The above estimated perf improvements are obviously quite variable and depend on a multitude of factors (+ I got ChatGPT to analyze my current code to make an estimate because how else would I do it), but there is definitely still a lot of low-hanging fruit here. Upcoming features Actual settings are still the elephant in the room 😭, so I definitely need to get around to those but since I think this may need a big PR a bit like the previous style improvements, I think I will do this after v0.4.0 (so therefore for v0.5.0 ). Ripple (XRP) support (at least for native token transfers), planned for v0.4.0 . Zcash (ZEC) support: I’ve got a feeling this one will take quite some time so at most I will implement transparent <=> transparent transactions before next release but will have to see. The remaining performance improvements mentioned above.
Devlog #13 I finally added different currencies ! Before, all prices were displayed in USD and now they can display in any of the below currencies: USD ($) EUR (€) GBP (£) JPY (¥) Shoutout to the fantastic API I used for this! Previously, I fetched CoinGecko pricing data which came in USD but I needed to convert this data into whatever currency the user chose so I had to find an API. However, there really weren’t any good forex APIs that were free with no rate limits when I searched for one so I turned to ChatGPT to find one and find one it did. This API gives daily central bank rates and even has data going back to 1948 on 201 currencies which is more than enough for this project. I also added the second performance improvement : caching the HTTP request client object to avoid having to recreate it on every API request. As of rn the project roadmap for the near future is this: Finish perf improvements Add basic Ripple (XRP) transaction support Maybe add transparent <=> transparent pool transaction support for Zcash (ZEC) Release VaultForge v0.5.0
Devlog #14 Not very much since last time; just some refactors and small improvements throughout. You can kind of tell by all the fix/chore/docs changes… btw improved settings is in the works - I think I’ll do some more progress over the next two days, then some actual chain support for Ripple. I’ve decided that I will release v0.4.0 before adding basic Zcash support as it’s been basically a month since last release and I don’t want to keep you guys waiting for those of you who want to download the binaries directly w/o building. Quick summary Now –> ~5 September: settings improvements 5 September –> 7 September: Ripple support 7/8 September: release of VaultForge v0.4.0
Devlog #15 Since the last devlog, I’ve worked on some more boring stuff: Tauri cleanup and desktop-specific improvements. I moved the application setup and command registration from src-tauri/src/main.rs into a new src-tauri/src/lib.rs . This keeps the entry point organized and follows Tauri’s recommended structure, while main.rs now only launches the library. I also replaced the browser clipboard API with Tauri’s native clipboard manager plugin. Copy buttons now use the desktop clipboard integration. Finally, VaultForge now enforces a single-instance window. If the app is launched while another instance is already open, the new launch focuses the existing main window instead of opening a second copy, which is far more desirable of a behaviour imo as it lets a user find a window without inadvertently opening even more. Plus some more random stuff: I now sign off all my commits As of today (4th of September), I also sign all my commits with a PGP key to verify all commits are made on my laptop and not by someone who hacked my GitHub account or smth - this is definitely overkill but why not Next, I’m continuing the settings improvements before moving on to Ripple support. P.S. I also randomly moved to Neovim as it looks much better than VS Code.
Devlog 16 sorry guys, i’m kind of late on this one tbh: I said that I would have the settings improvements, ripple support and all that ready by like monday but clearly nothing has happened since like the weekend. i have decided to delay the timleine by about a week as after some careful consideration I found it was wayyy too aggressive and my fingers can’t keep up with the typing speed i would need for that :) i seriously have no idae whatsoever why I thought it was possible to add that many features in such a short space of time. I know it kind of is but I have school now which means i have much less time for this with homework and studying and stuff. however, today I decided to lock in and actually do this and so I can assure you that i am hard at work doing the settings stuff rn and ripple support is absolutely coming right after that this next release really is going to be a big one… p.s. i attached a screenshot of some of the new commits i worked on (more are coming soon)
Devlog 17 perf improvement #3 done! 🎊 now refreshes are fully concurrent, w/ a limit of 4 requests at a time to avoid rate limiting. i haven’t fully tetsed it yet but it feels noticeably faster (like 25-35% faster) until the updated prices & balances are shown. plus, I kind of finished the settings stuff so i’ll be working on ripple support ig…
Devlog 18 i finished all the perf improvements! there was one that i left out though bc it probably wouldn’t have helped much in terms of performance and would have been a pain to implement. i am FINALLY going to move on to ripple support for the next few days…
Devlog 19 still cooking on the ripple support… i think i will be done by friday.
Devlog 20 so i finally added ripple support… and migrated everything to React for a much better, cleaner UI. and as always, i am late again. i actually could have finished on friday but i had other things to do (like homework) and i also wanted to migrate to react as well since I decided this will be my last release before the end of stardance, so i really want to add everything i can. this is because after stardance i will take a break of a few months on this project and then come back with a different hack club ysws challenge. the react migration was so big that i decided to use AI this time: the finished App.tsx file containing the react code is over 3090 lines of code (proof is the 2nd attached image)! that’s the largest code file i have ever worked on. since this is a huge change to the ui, i decided to create some before and after comparisons below. anyways, i decided to share some design decisions relating to the migration to react. i knew react was a big framework so it would add a few MB to the app’s file size (about 1-2 MB as of my recent testing) but the app itself is tiny anyway - not even 30 MB - so i thought it was really worth it. it gives you design consistency, more so than tailwindcss, which i needed since the more fun part for me was working on the backend and not the frontend (the user-facing part of the application). plus, the guys who work at coinbase (shoutout to them) made a goated plugin/theme/whatever you call it for react which makes my app have the default coinbase theme that i can tweak (i made the font monospace) which is alone like 70% of the stuff needed for the migration. i promise i will release v0.4.0 tomorrow…
Devlog 21 as promised, VaultForge v0.4.0 is out! this brings huge changes to wallet unlock speed, adds ripple support, adds BIP-84 addresses, and loads more. here is the link to the release page if you want to check it out. some interesting stats: there was an increase of >6,000 lines of code which is a more than 50% increase since v0.3.0 . 132 commits since last release. this is probably going to be my second-to-last devlog as i really want to hit the 100-hour mark.
Devlog 22 since the deadline for stardance has been extended by one month, i decided to keep going and make VaultForge as good as possible over the coming weeks. here’s a quick overview of what i will focus on next: actual swapping, and integration with multiple DEXes (think Jupiter, NEAR Intents, Uniswap, etc.) a better activity view token and chain icons! makes it much easier to differentiate between assets general performance and UI improvements with these new features, especially the integrated swapping, my wallet is finally going to be on par (mostly) with established wallets such as metamask. i’ve already got like 10+ commits since the last release that i will merge to main branch soon…
Devlog 23 15 new commits pushed to main ! still cooking on the integrated swapping support… sorry this is a short devlog; i’m more focused on the coding rn and will post when i’ve done something more substantial.
Devlog 24 - adding support for swapping after absolutely grinding on the support for swapping for the past week, here are some updates: 12 commits coming to main soon, about half bug fixes 4/10 things completed that i think are required for adding swapping support (more info below) i’ve also decided on a rough implementation order of swapping-related functionality: CCTP v2 transfers (basically moving USDC stablecoins across chains) Uniswap DEX (the biggest Decentrallized EXchange) Jupiter DEX ( the biggest dex on Solana) NEAR Intents (a cross-chain DEX) LI.FI aggregator (basically tells the walet the best market rates) i know this is kind of an ambitious timeline but i think i can pull it all off before the end of stardance on the 31st of october 🤞. i think i will manage to get CCTP transfers working by friday or sunday, depending on how much time i have.
Devlog 25 - some progress on the swapping i haven’t had much time in the last few days but i managed to do a big refactor to make the code more modular and cleaner. this is needed so that i can do more complex transactions instead of just basic transfers. i haven’t pushed it to main or committed it yet but it’s basically done. in terms of when CCTP support will ship, I think it will be by the end of sunday.
Devlog 26 unfortunately, it’s taking longer than i would like to add the swapping and CCTP functionality. i would say i’m about 80% there, but there are quite a few things that i have to think about and as such, i think i will get it working by tomorrow (tuesday). stay tuned! 👀
Devlog 27 - CCTP support is here… in like 30 minutes hang tight, it’s coming soon 🚀 i attached some proof , you guys can check out the transaction here more info on this tomorrow after v0.5.0 comes out with the CCTP support. you haven’t seen nothing yet, uniswap support coming next; stay tuned! probably coming in the next week or so…
Devlog 28 - coin icons! it finally looks sooo professional now… just look at those icons! they will also appear in the send and transfer (soon to be swap!) tabs over the coming days. uniswap dex integration is still the top priority though. 🫡 before there weren’t any (they were just grey) and every wallet has them so i made it better ig
Devlog 29 - more coin icons! specifically for AAVE, Chainlink (LINK), and Uniswap (UNI).
Devlog 30 - support for swapping (finally!) this took so long!!! i thought i would be done last friday but ig that was overly optimistic… there are still some small things i will fix/improve to make the experience a bit smoother in the coming days. Implementation so i added uniswap support for all supported evm chains; however only for same-chain transactions and only through one pool. this is suboptimal so i want to add cross-chain support and through multiple pools maybe in the future. to make it possible to do cross-chain swaps, i added Relay support (it’s an aggregator) were solvers compete to give a quote. the issue with this is that they charge quite a fee and so i really want to just use uniswap where possible. what’s next better uniswap integration (as mentioned above), plus support for solana potentially jupiter support (it’s a solana DEX) as it has really good rates and high liquidity.
Devlog 31 - swapping support for Solana! (partially) there’s now swapping support for solana, at least for DEX aggregators like LI.FI or Relay. i still need to figure out native solana DEX swapping on platforms like Jupiter…
Ships:
Fully functional, multi-chain (Bitcoin, EVM, and Solana support with more on the way) wallet. To test this project, please go to the GitHub repository linked to the project....
|
1793134081.928117
|
1793220481.928117
|
|
3134
|
AV Media Booking System by @rachell_aristo | Stard AV Media Booking System by @rachell_aristo | Stardance...
|
rachell_aristo
|
0
|
78.75
|
0
|
[]
|
[{"post_id": 81415, "ts": "202 [{"post_id": 81415, "ts": "2026-10-21T06:29:38Z", "hours": 6.6819, "text": "Added an equipment check out system that allows the media technician to check out a loan by typing in the barcodes of specific assets. Checks if scanned asset exists in catalog Checks if the same assets are scanned > once Checks if a scanned asset is not requested in this loan And then saves the scanned barcodes to db. to do: add error handling for this + add barcode scanner with cam function"}, {"post_id": 80887, "ts": "2026-10-19T05:22:58Z", "hours": 1.2214, "text": "Added/changed all email templates into HTML to allow more formatting options in the future"}, {"post_id": 76966, "ts": "2026-10-05T07:15:47Z", "hours": 1.9156, "text": "Added variables to approve emails (with Jinja) so it’s dynamic Also added a few util functions for converting int ids to the string value (for equipment ids, studio space ids, timeslot ids etc) I wonder if there is a built in method for doing this with sql alchemy?"}, {"post_id": 71065, "ts": "2026-09-20T08:06:15Z", "hours": 0.9994, "text": "Added fully booked (depending on avalibility from selected date) + not avali for year group messages"}, {"post_id": 71020, "ts": "2026-09-20T06:51:57Z", "hours": 8.2517, "text": "I added an equipment item column to the equipment bookings table so that admin can also filter search by equipment :) Also added error handling for Flask Mail functions + updating loan status to db, which sends an appropriate message to admin about whether data was updated, email was sent etc."}, {"post_id": 70474, "ts": "2026-09-19T08:08:45Z", "hours": 5.9058, "text": "Added functionality for studio booking table - modals, action buttons etc. Also added filters to all tables. This sounds simple cuz previously all worked on equipment table, but was actually a mess to refactor because now there’s equipment bookings and studio bookings not just one type 🫠"}, {"post_id": 68636, "ts": "2026-09-15T13:22:08Z", "hours": 7.0539, "text": "omg SO MANY UPDATES!! >:) Updated the equipment booking system to dynamically update quantity counts depending on the date range selected by user (JS fetch) My app now sends AUTO EMAILS WHATTT with Flask Mail. Legit so cool :)) When admin changes a booking, eg by approving/cancelling, it will trigger an email to the user Added a filter system to bookings table! Can filter by searching a value in any column"}, {"post_id": 67984, "ts": "2026-09-14T09:54:57Z", "hours": 6.0844, "text": "Added accept/reject/cancel button functions to admin page + table of bookings with color coded status. Clicking on rows brings up a modal with more info + action buttons"}, {"post_id": 67211, "ts": "2026-09-13T08:17:54Z", "hours": 4.5839, "text": "Added verification for equipment booking: equipment must be allowed for the user’s year group, user must not have overdue loans and each loan has a limit for # of items loaned per equipmen type Basic table record display for all bookings on admin_home.html Updated CSS color scheme to fit school colors + unrounded elements (cuz I think the round UI design is over hyped) + made records more space efficent AI use: used Gemini to help update CSS"}, {"post_id": 66564, "ts": "2026-09-12T12:22:51Z", "hours": 2.1478, "text": "Fixed a really serious problem I didn’t spot previously where the equipment loan record getting saved to db wasn’t saving the quantity properly when u book >1 of each equipment type…simply forgot to iterate through the quantity list I had made 🫠 Also added to student_home page so that equipment bookings also get shown :)"}, {"post_id": 66329, "ts": "2026-09-12T03:08:07Z", "hours": 5.2681, "text": "Finally have a working equipment booking page and system! Figuering out how to select the data of equipment type and quantity and send to py was low key a nightmare…"}, {"post_id": 63527, "ts": "2026-09-07T13:12:08Z", "hours": 1.1408, "text": "Basic tab system for sorting the equipment cards based on category :)"}, {"post_id": 63488, "ts": "2026-09-07T11:28:33Z", "hours": 4.1219, "text": "Created a CSV parser with pandas (first time using!) which I can incorperate into the admin interface later on. Sorted out a lot of logicial tough questions such as how do you iterate through a 2D array to create records?"}, {"post_id": 62852, "ts": "2026-09-06T11:53:40Z", "hours": 2.3272, "text": "Changed html + js so that the studio booking page allows for div cards w/ photos for each studio space instead of a boring form like structure (css not fixed yet!)"}, {"post_id": 62606, "ts": "2026-09-06T02:26:32Z", "hours": 5.0053, "text": "Added comments to all my code + implemented Flask-Login. POV u came back to coding after like a month and realized you don’t understand what you wrote…comments for future me now. As for Flask-login, I implemented it cuz it makes sense to use it instead of manualy building login functions (in screenshot - goodbye manual login functions woop)"}, {"post_id": 35684, "ts": "2026-07-27T08:55:43Z", "hours": 11.0956, "text": "Finally have a functioning studio booking system with an HTML form that submits data to my mySQL db (form has frontend + backend validation too)!! Also created a student_home.html page, linked it to successful booking page. asked AI for tempoary functional css styling so that my page is easier to read (will change css to something less AI later on!) Stuff I’ve learned for the first time to use: Flatpickr date picker understanding how blueprints & routes work HTML templates and Jinja2 syntax Querying from database with sqlalchemy select"}, {"post_id": 14074, "ts": "2026-06-23T01:52:11Z", "hours": 2.5953, "text": "Added Google OAuth login!"}, {"post_id": 6664, "ts": "2026-06-11T05:21:49Z", "hours": 2.3544, "text": "Created database tables with SQLAlchemy for the first time"}]...
|
Title: AV Media Booking System by @rachell_aristo Title: AV Media Booking System by @rachell_aristo | Stardance
Devlogs:
Created database tables with SQLAlchemy for the first time
Added Google OAuth login!
Finally have a functioning studio booking system with an HTML form that submits data to my mySQL db (form has frontend + backend validation too)!! Also created a student_home.html page, linked it to successful booking page. asked AI for tempoary functional css styling so that my page is easier to read (will change css to something less AI later on!) Stuff I’ve learned for the first time to use: Flatpickr date picker understanding how blueprints & routes work HTML templates and Jinja2 syntax Querying from database with sqlalchemy select
Added comments to all my code + implemented Flask-Login. POV u came back to coding after like a month and realized you don’t understand what you wrote…comments for future me now. As for Flask-login, I implemented it cuz it makes sense to use it instead of manualy building login functions (in screenshot - goodbye manual login functions woop)
Changed html + js so that the studio booking page allows for div cards w/ photos for each studio space instead of a boring form like structure (css not fixed yet!)
Created a CSV parser with pandas (first time using!) which I can incorperate into the admin interface later on. Sorted out a lot of logicial tough questions such as how do you iterate through a 2D array to create records?
Basic tab system for sorting the equipment cards based on category :)
Finally have a working equipment booking page and system! Figuering out how to select the data of equipment type and quantity and send to py was low key a nightmare…
Fixed a really serious problem I didn’t spot previously where the equipment loan record getting saved to db wasn’t saving the quantity properly when u book >1 of each equipment type…simply forgot to iterate through the quantity list I had made 🫠 Also added to student_home page so that equipment bookings also get shown :)
Added verification for equipment booking: equipment must be allowed for the user’s year group, user must not have overdue loans and each loan has a limit for # of items loaned per equipmen type Basic table record display for all bookings on admin_home.html Updated CSS color scheme to fit school colors + unrounded elements (cuz I think the round UI design is over hyped) + made records more space efficent AI use: used Gemini to help update CSS
Added accept/reject/cancel button functions to admin page + table of bookings with color coded status. Clicking on rows brings up a modal with more info + action buttons
omg SO MANY UPDATES!! >:) Updated the equipment booking system to dynamically update quantity counts depending on the date range selected by user (JS fetch) My app now sends AUTO EMAILS WHATTT with Flask Mail. Legit so cool :)) When admin changes a booking, eg by approving/cancelling, it will trigger an email to the user Added a filter system to bookings table! Can filter by searching a value in any column
Added functionality for studio booking table - modals, action buttons etc. Also added filters to all tables. This sounds simple cuz previously all worked on equipment table, but was actually a mess to refactor because now there’s equipment bookings and studio bookings not just one type 🫠
I added an equipment item column to the equipment bookings table so that admin can also filter search by equipment :) Also added error handling for Flask Mail functions + updating loan status to db, which sends an appropriate message to admin about whether data was updated, email was sent etc.
Added fully booked (depending on avalibility from selected date) + not avali for year group messages
Added variables to approve emails (with Jinja) so it’s dynamic Also added a few util functions for converting int ids to the string value (for equipment ids, studio space ids, timeslot ids etc) I wonder if there is a built in method for doing this with sql alchemy?
Added/changed all email templates into HTML to allow more formatting options in the future
Added an equipment check out system that allows the media technician to check out a loan by typing in the barcodes of specific assets. Checks if scanned asset exists in catalog Checks if the same assets are scanned > once Checks if a scanned asset is not requested in this loan And then saves the scanned barcodes to db. to do: add error handling for this + add barcode scanner with cam function...
|
1792587171.3745627
|
1793191971.3745627
|
|
70585
|
Turbo OS by @preethambollineni2013 | Stardance
|
preethambollineni2013
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-22T02:30:31Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an Web OS called Turbo Os . You can visit the web to see it. It has a browser in it which uses Wikipedia to work.", "repo": "https://github.com/preethambollineni2013/Turbo_OS", "demo": "https://preethambollineni2013.github.io/Turbo_OS"}]...
|
[{"post_id": 81414, "ts": "202 [{"post_id": 81414, "ts": "2026-10-21T06:18:43Z", "hours": 0.4503, "text": "Completed CSS doing work on Java Script"}, {"post_id": 81188, "ts": "2026-10-20T07:22:06Z", "hours": 0.355, "text": "Just created HTML. Still doing work on CSS and JS"}]...
|
Title: Turbo OS by @preethambollineni2013 | Starda Title: Turbo OS by @preethambollineni2013 | Stardance
Devlogs:
Just created HTML. Still doing work on CSS and JS
Completed CSS doing work on Java Script
Ships:
I made an Web OS called Turbo Os . You can visit the web to see it. It has a browser in it which uses Wikipedia to work....
|
1793130910.8465219
|
1793217310.8465219
|
|
5414
|
Penumbra by @NellowTCS | Stardance
|
NellowTCS
|
0
|
26.21
|
0
|
[]
|
[{"post_id": 81410, "ts": "202 [{"post_id": 81410, "ts": "2026-10-21T05:19:48Z", "hours": 2.3336, "text": "SO GUESS WHAT I made a PR to big Slint itself!!!! https://github.com/slint-ui/slint/pull/14292 Basically… the markdown editor that Penumbra uses… is bad cause it’s a block style editor, which itself is hard to implement, and it’s not designed for markdown WYSIWYG. Double whammy Solution? Uhhh use cosmic-text and MAKE IT MYSELF BABYEEEEE In all seriousness tho, COSMIC text is so peak, truly universe-breaking. Well what’s the PR then? “This PR lets a FocusScope act as an input method (IME) client. That way, custom editing surfaces like rich text editors or code editors drawn with custom code can get composition events directly.” Aka, I stabilized an internal API and exposed it so that Penumbra can get a really cool editor."}, {"post_id": 77678, "ts": "2026-10-07T20:22:32Z", "hours": 0.4192, "text": "Engine improvements ughhhhhhh i spent hours making “spikes” (is that what they’re called?) and it wasn’t counted cause slint live preview/editor = not hackatime-d sighhhh Oh well btw, hi, sorry for the random 1 month ish gap I come back, better at Slint, and with fresh motivation. okay so august 30 was my last commit and it is now october. in my defense i did not touch this once in that whole time which is either very bad or very healthy idk. but something clicked today and i opened it back up and immediately went “ew who wrote this” (me. it was me.) cough cough better engine so the editor had this whole situation in doc.rs where Document::new would parse the markdown into an ast, and then i had this convert_blocks function that walked through the blocks AND a second function called find_block_range that literally scanned the source bytes by hand looking for double newlines to guess where each block started and ended. like manually. byte by byte. offset += whatever. i genuinely cannot believe past me looked at that and went yeah ship it the thing is the parser already KNOWS where every block is. it has the offsets. it was just throwing them away and then i was reconstructing them with a worse, slower, buggier version downstream. so i added parse_blocks_offsets to the markdown parser so it just hands back (block, range) and now doc.rs is like. map over them, pull the range straight off, extract spans, collect. that’s it. find_block_range is gone. convert_blocks is gone. good riddance :3 also killed the edita-core dependency because it turns out i wasn’t actually using it for anything, it was just sitting in the Cargo.toml being decorative net result is like 1290 lines deleted vs 793 added which is my favorite kind of commit. deleting code that you wrote and were briefly proud of is so good for the soul hahaaaaa anyway the engine is better now (cough cough not)"}, {"post_id": 58558, "ts": "2026-08-31T00:22:35Z", "hours": 0.5133, "text": "Component library + live typing preview two things this commit first I pulled all the Slint components out of penumbra-ui into their own crate, penumbra-component. it’s a pure-markup library, no Rust logic, just .slint files: the Theme, all the block components (ProseBlock, HeadingBlock, QuoteBlock, CodeBlock, TableBlock, FootnoteBlock, HtmlBlock), the CanvasSurface, the TopBar, and PillButton (which used to be NewNotePill but I generalized it so it takes a text prop instead of hardcoding “New note”). there’s an index.slint that re-exports everything and now the app imports from @penumbra-component/index.slint like a real library. also why I did this: the live preview. I set up a slint library path in build.rs (and a .vscode/settings.json so the preview resolves @penumbra-component ), which means I can open any single component file and preview it in isolation instead of booting the whole app. given that basically all my UI work these days IS sitting in the preview nudging things, having the components be individually previewable is a massive quality-of-life win. also just cleaner, the editor-panel.slint used to have all seven block components copy-pasted inline at the top, like 200 lines of it, and now it just imports them. the VMs (BlockVM, NoteCardVM) moved to a data.slint too so the struct definitions aren’t tangled with the theme. second thing, and this is the fun one live preview while you type. before, the active block was just a raw text field, you’d type # Heading and see # Heading , and only once you clicked away did it render. now as you type, a little preview well under the input shows what the block WOULD render as, live. type # and it previews as a heading, type > and it’s a quote, type - and it’s a list. there’s a whole set of live_ functions (live_kind_name, live_display_text, live_heading_level, estimate_live_height) that route the currently-typed text through the same display logic the inactive blocks use, so you get instant feedback on your markdown without committing it. But it’s broken and weird and not working (see previous image) gosh might take a break from this and think about how to structure it again, Je n’aime pas ce désordre"}, {"post_id": 58501, "ts": "2026-08-30T22:41:02Z", "hours": 0.4378, "text": "Better editor the editor got a real display layer, and honestly most of the actual work here happened in the Slint live preview, just tweaking things until they looked right, so the hours logged don’t reflect it. same story for the last few commits, tbh, a lot of “sit in the preview and nudge” that Hackatime doesn’t see. oh well. anyway the thing that makes an editor feel like an editor is that the active block shows raw markdown but every other block renders nicely, and the piece that does that rendering is the new display module. it turns each block into the text you actually want to see. lists keep their markers because those go through the real markdown renderer. and tables, tables actually render as an aligned grid now, padded columns and a --- separator row, which looks so much better. there’s also scroll targeting given the active block, it works out where to scroll the editor so that block is comfortably in view. first block sits at zero, later blocks scroll proportionally, long bodies don’t leave you editing something off the bottom of the screen. wrote a chunk of tests for all of this the map got a zoom-to-card thing too click into a note and the camera zooms so the card fills the viewport width it’s great that’s what i wanted since the beginning tbh like that animation played in my head"}, {"post_id": 58472, "ts": "2026-08-30T21:47:00Z", "hours": 0.6044, "text": "Implement platform-specific modules approach like Saikuro okay so the ui/penumbra-ui/src/lib.rs had gotten GROSS. it was this soup of #[cfg(not(target_family = \"wasm\"))] and #[cfg(target_family = \"wasm\")] blocks sitting right next to each other, two versions of half the functions, the SharedState struct declared twice, the boot path forked inline. every time I added a thing I had to add it twice with the right cfg gate and it was exactly the kind of mess I swore off on day one. so I stole the pattern from Saikuro a platform module. now there’s src/platform/mod.rs that declares the shared interface, plus platform/native/mod.rs and platform/wasm/mod.rs behind one cfg switch at the top. the rest of the app just calls into platform:: and doesn’t care which one it got. all the two-versions-of-everything nonsense is now contained in exactly two files that never both compile at once, and lib.rs reads like a single coherent app again instead of a choose-your-own-adventure. it’s so much cleaner. while I was in the editor I also killed a dumb duplication: penumbra-editor had its OWN BlockKind enum that was just a lossy copy of the one in penumbra-markdown, with a whole block_kind() function to convert between them. why. they’re the same concept. so now the editor re-exports markdown’s BlockKind and clones it straight through, and that whole translation layer is gone."}, {"post_id": 57850, "ts": "2026-08-30T04:54:28Z", "hours": 0.5797, "text": "Broken but a working ish editor!!! you can WRITE in it now. like actually type words into a note and have them save. it’s janky but it works and I’m hyped. How the editor is block-based, which was the whole gamble. instead of one big textarea, a note is parsed into blocks (paragraphs, headings, code fences, etc) and you edit one block at a time. the active block shows its raw markdown so you can mess with the syntax, everything else renders. new session.rs in penumbra-editor holds all of it: EditorSession owns the list of BlockEdits, tracks which one’s active, and each block has a mode, Prose (renders as markdown, Enter splits into a new block), Heading (single line, Enter drops the tail into a paragraph below), and Raw (code, Enter is a literal newline). splitting a block at the cursor, merging, undo/redo with a 64-deep snapshot history. it’s a real little document editor. uhhh is it good? no! the commit message says “broken” and I mean it. the split logic has edge cases, the cursor does weird things, switching blocks is finicky. but you can open a note, type, and it round-trips to the markdown file on disk, which is the bar I set and it clears it. barely. hehe. yeah state is hard to make the editor and the layout worker both able to touch the graph, Universe’s graph is now an Arc<Mutex>. graph() hands back a guard, graph_handle() hands back the Arc for things that want to hold their own lock. had to sprinkle lock_graph() everywhere but it’s the honest cost of sharing state between the UI thread and the physics thread. oop forgot about this also implicit links persist now! the auto-associated links used to evaporate on restart because only explicit wikilinks got rebuilt from the files. now they save to their own file and get restored on open (skipping any whose notes are gone). so the constellations you didn’t draw by hand survive a relaunch too. eeh and the TODO… got GUTTED. so much got checked off I almost don’t believe it. Slint UI: done. map canvas v1 with pan/zoom/grid/edges/culling: done. spring animation so cards drift to their spots instead of teleporting: done. local neighborhood layout: done. pinned notes as fixed stars (pin via right-drag, right-tap to unpin, and left-dragging one nudges it back toward its pin): done. positions cached with throttled save + save-on-exit: done. physics running off the UI thread on the tokio runtime so the map doesn’t stutter while it’s solving: done. that whole “Slint” section of the roadmap is basically green now. new-note-pill.slint got added too, a little floating “new note” thing that’s partially broken. broken editor, but a broken editor that WORKS, which three months ago I could not have said about any part of the UI. we’re so back :3"}, {"post_id": 57602, "ts": "2026-08-29T20:07:38Z", "hours": 1.21, "text": "neighborhood steps actually mean something now so way back, I wrote step_neighborhood as a function that… just called step() . full graph. every time. with a little // Note: functionally equivalent to step() comment that was basically an “it’s fineeee” for now. it’s been sitting there mocking me… for months (no joke i had it at #1 on the mental todo after deleting Dioxus) not anymore! it does the real thing now. when you nudge one note, only the notes within ~400px of it recompute. everything past that radius stays frozen and acts as an anchor so the local cluster settles against the rest of the map instead of the whole universe re-jiggling every frame. this is the “atomic graph updates” idea from the original plan thing, finally real: touch one note, its neighborhood adjusts, the far-off constellations don’t even notice. Efficiency to make that not-slow I built a spatial hash. uniform grid, bucket nodes by cell, “give me everything within radius R” only checks the overlapping cells instead of all N nodes. the CPU layout uses it for the localized force pass (repulsion from local neighbors, springs to actual link partners even if they’re outside the neighborhood, gravity), and I also went back and ripped the O(n²) all-pairs loop out of the regular collision resolver and put it on the spatial hash too. that one was quietly quadratic this whole time and would’ve melted at a couple thousand notes. rebuild the hash each pass so pushed nodes land in their new cells. much better. Collisions? the collision resolver got a neighborhood-scoped twin as well, so a local step also only de-overlaps locally. nodes inside the neighborhood push each other apart normally; a node that’s an anchor outside it doesn’t move, so the inside node just gets shoved twice as hard away from it. felt like the right call. PERSISTENCE?! also taught storage about pins, separate workspace.pins.json file (refactored the workspace/pins file openers to share a state_file helper), and note cards carry a pinned flag now. Oh lines and there’s a whole new map module in the UI crate that generates the actual SVG-ish path strings: bezier edges between linked cards in screen coordinates, viewport culling so off-screen edges don’t get drawn, selected-neighborhood highlighting (the selected note’s edges render in the “selected” layer, everything else in “base”), and a grid path that anchors to the camera and clamps its own density so zooming way out doesn’t try to draw ten thousand grid lines. the map handling a lot of notes without choking was the thing I was VERY, VERY worried about. Not as much of a problem as I thought! :D"}, {"post_id": 55387, "ts": "2026-08-27T05:58:52Z", "hours": 0.3494, "text": "the map is alive You might wonder, why is bro devlogging so often? Wellll, i had this whole plan i wrote down a bit ago to commit when so that it’s not a 10000 line commit ( shudders in that happening before ) but I severely overestimated how long these things would take Most of the time not logged was testing, sigh i wish i could devlog that lolll hehe okay so the notes actually live on a map now. like they have positions, computed by the real layout engine, and you can drag the whole thing around and zoom. it’s a canvas!! a real one!! what and how so on boot (native), it spins up the LayoutEngine, drops every note in as a node, restores their saved positions if there are any, feeds in the links, and runs the layout to settle everything. then it builds two things for the UI: note cards (with x/y from the layout) and edges (lines between linked notes, computed from the endpoint positions). both get shoved into Slint models and the map renders them. add a new note and it gets added to the layout, re-stepped, and the cards + edges refresh. positions save back to storage when you close the app. the map-canvas. slint got the fun part: pan and zoom. a TouchArea catches pointer down/move to drag the camera around, scroll wheel zooms between 10% and 500%, and every card positions itself as (card.x - camera) * zoom. threw in viewport culling too so cards way off-screen just don’t render (visible: only if it’s within ~200px of the edges). and a little “N notes | zoom: X%” readout in the corner because I like knowing things. (it’s broken like most of this, we ignore that for now, polishing is later) my foolishness the whole thing is cfg-split for wasm because the GPU layout engine isn’t wired up on the browser side yet, so wasm gets a fallback that just lists the cards without real positions for now. desktop gets the full living map, browser gets the placeholder, both compile, nobody’s angry. (the wasm map is a TODO-shaped hole but it’s an silly one.) also had to expose universe.storage() so the UI can reach load_positions/save_positions, and added a small EdgeVM struct to carry line endpoints into Slint."}, {"post_id": 55282, "ts": "2026-08-27T00:34:04Z", "hours": 1.04, "text": "lock in (the UI exists now. for real this time.) hehe okay. LOCK IN. this is the one where Penumbra stops being a really nice backend with no face and becomes an actual app you can look at. Slint UI, real components, and I wrote my own text editor because of course I did.so the editor. new crate, penumbra-editor. I could’ve just shoved a <textarea> equivalent in and called it a day but nooo, I wanted a proper block-based editor like the good note apps have. so it’s a document model made of blocks, each block has styled spans, and you edit it through commands: InsertText, DeleteRange, SplitBlock, MergeBlocks, SetMark, MoveCursor. every command goes through a Journal that’s just a command list + a pointer, which means undo/redo falls out for free (truncate on new push, walk the pointer back and forth). there’s a cursor/selection model and a view_model that snapshots the doc into something the UI can render without touching the guts. it’s BROKEN AND WEIRD NOW BUT IT’LL GET BETTER I PROMISE the layout engine grew a CPU brain. it was originally GPU-only via that vibe-graph-layout-gpu crate, which is great until you’re in an environment with no WebGPU (like… a lot of places, including some wasm setups) and then it just returns zero displacement and everything sits in a sad pile. so now there’s cpu.rs, my own Barnes-Hut quadtree force layout in plain Rust, and the engine tries GPU first and falls back to CPU when there’s no backend or the GPU step fails. no more “works on my machine with a discrete GPU only.” graceful degradation, hehe. and then the actual Slint UI which is the thing. it’s great. it’s split into real components now: theme.slint for the tokens, top-bar.slint, map-canvas.slint for the graph, note-card.slint for the cards, editor-panel.slint for writing. app.slint wires it together. this is the part that broke my brain in Dioxus for literal months and in Slint it’s just… a file with a live preview and it looks how I tell it to. I keep waiting for the catch. haven’t hit it yet tests too NO JINXING ME (please) I don’t want to jinx it but. this feels like the first time Penumbra is actually the thing I pictured back in that architecture-day devlog. backend I’m proud of, a UI that doesn’t fight me, my own editor, works on GPU or CPU, desktop or browser. I locked in :3"}, {"post_id": 54855, "ts": "2026-08-26T01:08:02Z", "hours": 0.5314, "text": "working wasm version and candle it runs in the browser now!! like, actually. wasm target, Slint rendering to a canvas, the whole thing. I’ve been dreading the wasm build this whole project and it just… went. mostly. the big win here is model caching, because downloading a ~130MB embedding model every single page load is obviously insane. so there’s a model_cache module now that’s the same two functions (get/put) with two backends behind cfg: native writes the bytes to a temp dir, wasm shoves them into the browser’s Cache API. first launch downloads and stashes, every launch after just pulls from cache. same idea as before but now it works on both sides. to make that clean I split CandleEmbedder::load() into two pieces: from_bytes() that takes raw model/config/tokenizer bytes and builds the thing, and load() (native only) that downloads then calls from_bytes. so the wasm path can grab bytes from cache (or fetch them itself) and hand them straight to from_bytes without the reqwest download dance. Candle running on CPU in wasm, no GPU, producing the same 384-dim vectors. genuinely did not expect that to just work. the wasm caching code is… a lot of JsFuture and dyn_into and web_sys ceremony. open the cache, build a Request, match it, pull the arraybuffer, convert to a Uint8Array, to_vec. and the put side builds a fake 200 Response with the bytes as the body and stuffs it in. it’s verbose but it’s the standard, nothing clever. the UI crate is a cdylib now (plus rlib) so it can compile to wasm, tokio features got split per-target (no rt-multi-thread in the browser, obviously), and there’s a tiny index.html that just imports the generated js and calls init(). Slint paints onto a <canvas id=\"canvas\"> also wrote an inference benchmark test… all you need to know so yeah. desktop AND browser, same codebase, real ML embeddings on both. the “true cross-platformity” thing from the very first devlog is… actually real now? that rule I set on day one about no #[cfg] in the interfaces paid off HARD here, the only cfgs are tucked inside the cache and download internals where they belong."}, {"post_id": 54829, "ts": "2026-08-25T23:56:18Z", "hours": 0.775, "text": "Vault mode (aka I made it Obsidian now, basically) okay this is a big (foundational) one so up until now Penumbra stored notes as a big pile of JSON blobs plus a graph.json that held all the links. which works but it’s… a black box? you can’t open your notes in anything else, the links live in a separate file, it’s very “my app owns your data.” and that bugged me. so now it’s a vault with markdown files. one .md per note, filename = title, YAML frontmatter for the id/timestamps/tags/pinned/archived, and the body is just… markdown. you could point Obsidian at the folder and it’d basically work. that’s the goal. well. the other way around but still :P Also, links aren’t stored anymore, they’re derived. [[wikilinks]] in the body get resolved against filenames at scan time and become the explicit edges in the graph. no more graph.json. the files ARE the source of truth, and if the app crashes mid-write the next scan just repairs everything. I like that a lot. it means if you go edit a file in some other editor and add a [[link]] , Penumbra picks it up next time it scans. and then I fell down the rename rabbit hole. because if filename = title, renaming a note means renaming the file AND rewriting every [[old title]] across the whole vault to [[new title]] . so propagate_rename walks every note that linked to the old title and rewrites it. and the rewriter is suuuuuuper careful: it skips inline code, fenced code blocks, indented code, handles [[Old|alias]] , matches case-insensitively but keeps whatever case you typed. wikilinks inside `code` should NOT get rewritten and now they don’t, and I have a test that proves it (with the same link four times in different contexts, only the live one changes). very satisfying. filenames can have slashes and colons and emoji and whatever, so there’s a sanitizer that strips the illegal stuff, collapses whitespace, caps length, falls back to “Untitled” if you somehow title a note with just dots. and if two notes want the same filename you get “Same Name” and “Same Name 2” like every sane file manager. oh and frontmatter tags vs inline tags are kept separate on purpose. if you wrote #tag in the body, that stays inline, it doesn’t get hoisted up into the YAML just because Penumbra touched the file. only frontmatter tags round-trip through YAML. respecting the user’s file, basically. the parser also got some unicode love while I was in there. tags can be #Ünïcodé now and nested like #projects/penumbra , and the whole split_text_for_custom walk steps by char instead of byte so it stops potentially panicking on multi-byte stuff. should’ve been like that from the start but oh well. on the UI side: there’s a folder picker now! rfd native dialog, “Choose your Penumbra vault”, and it remembers your choice in a config file so it doesn’t nag you every launch. also reads a PENUMBRA_VAULT env var if you want to override. getting the macOS dialog to behave was its own thing because rfd has to run on the thread that owns NSApplication, so it marshals onto the Slint event loop and sends the result back over a channel. the browser build just uses OPFS for now, showDirectoryPicker slots in later (TODO left in the code, future me’s problem). wrote a whole pile of tests for all of it too, but that’s booooriinnnngggggggggggggggggg"}, {"post_id": 54252, "ts": "2026-08-25T04:29:47Z", "hours": 0.3686, "text": "Basic template so. Slint. I was gonna do the whole “design it in HTML first then port it” thing that I very wisely declared last time and then, naturally, did not do at all. instead I saw Slint had a live preview and its own markup language and yeah. here we are. and it’s actually fun?? like it has a real preview, you edit the .slint file and it just updates, no recompiling the entire universe to nudge one thing. after the Dioxus months this feels illegal. anyway before touching any actual UI I made penumbra-app, which is NOT the UI, it’s the brain. a Universe struct that holds the graph + storage + event bus and does all the note stuff: create, save, delete, restore on open, persist after every change. the whole point is it doesn’t know Slint exists. or Dioxus. or anything. it just… runs the app, and whatever draws on top pokes it and listens for events. so if I rage-quit Slint in three weeks (I won’t! probably.) the brain doesn’t care. the actual Slint crate (penumbra-ui) is barely anything yet. cargo.toml, a build.rs because Slint compiles the markup at build time, a main, one app.slint. it’s the hello-world stage. but it launches! natively! no webview! I cannot stress how nice it is to not have a webview. oh also storage stuff got nudged, everything lives under a Penumbra/ folder now instead of just yeeting files into the shared app-data dir like a menace. and added a with_dir() so tests stop writing to my real data. speaking of, wrote a pile of Universe tests: make a note, drop the whole universe, reopen from the same folder, is the note still there? yes. edit it, reopen, still edited? yes. delete it, reopen, gone? gone. persistence actually persists, turns out. months since the last commit lol. I saw the date and just sighed. but the backend was sitting there perfectly fine this whole time waiting for me to stop fighting UI frameworks, and now I’ve got a clean core library and a toolkit that doesn’t actively hate me! Gasp. good place to be back :3"}, {"post_id": 54168, "ts": "2026-08-25T01:00:31Z", "hours": 3.7617, "text": "Revert Dioxus That’s the sound of me… giving up Giving up on Dioxus cause it’s so SO difficult to use I’m using Slint now, maybe, we’ll see if i even remember what I was doing Sorry for the like bad devlog, but it needed to be done"}, {"post_id": 7671, "ts": "2026-06-12T20:22:40Z", "hours": 2.7214, "text": "the polish commit (that didn’t polish enough) okay so this commit looks massive and impressive on paper. I touched basically everything. and the code changes are real. but I need to be honest: the app still looks and feels terrible. like, genuinely bad. the UI is broken in ways that make me want to close the window and pretend I never opened it. but the changes are real so let me document them anyway. layout tuning repulsion went from 1000 to 8000, attraction from 0.01 to 0.004, ideal_length from 50 to 220. notes were clumping into an unreadable blob. the physics are better now even if you can’t tell because the rendering is fighting itself. theme overhaul flattened the entire theme system into one struct with semantic names. every hardcoded color replaced with CSS vars. dark and light themes. toggle in settings. this part actually works correctly and I’m proud of it even though nobody can see it because the layout is broken. TipTap editor replaced the textarea with TipTap via JS eval. StarterKit with bold/italic/strike/code/headings/lists. toolbar with format buttons. sends HTML back via dioxus.send(). this is genuinely nice when it works. which is actually most of the time wow. manual linking, note list, auto-linking on save, context menu, keyboard shortcuts, zoom controls, empty state all implemented. all technically functional. all look like they were designed by someone who has never seen a GUI before. (me. I’m that someone. i am not good at RSX, which is funny because it SHOULD just be a different form of HTML. you would think.) what I learned dioxus-desktop’s webview is not a browser with devtools. iterating on UI by recompiling a Rust binary every time you move a div 2 pixels is actual torture. I should have designed the UI in plain HTML first, gotten it looking right in a real browser with real devtools, and THEN ported it to rsx. I did not do that. I have been doing it backwards this entire time. smh my silly head. next step: HTML mockup first, then port. the backend is solid. the architecture is clean. the UI just needs to catch up. still broken but less broken than before. progress? maybe? onwards (to HTML mockups) :}"}, {"post_id": 7339, "ts": "2026-06-12T07:31:52Z", "hours": 1.2225, "text": "making it actually work (kind of) so remember how last commit I said “everything is broken”? I spent tonight fixing the worst of it. it’s not done but it’s a lot less broken. the big fix: drag + layout fighting the core problem was that when you drag a note, the layout engine keeps running and overwriting your drag position every 16ms. the note jitters back and forth between where you’re dragging it and where the physics wants it. fix: new SetNodePosition event. when you drag a note, the UI publishes it through the event bus. the layout worker drains these events at the top of each cycle and calls engine.set_position() before stepping. so the layout engine knows where you put the card and computes forces from there instead of fighting you. also: while any note is being dragged (tracked by dragged_set ), the layout event loop skips updating positions entirely. other notes stay still instead of jittering from stale force calculations. once you release, everything syncs up again. mouse events moved to root div pan/drag/mouseup handlers were on the canvas element, which meant releasing the mouse over a note card didn’t fire mouseup on the canvas. dragging would “stick.” moved all the move/up/leave handlers to the root div so they fire regardless of what’s under the cursor. canvas renderer simplified removed the node drawing code from WebCanvasRenderer entirely. nodes were being drawn twice: once on the canvas in Rust/web-sys, once as DOM cards in Dioxus. the canvas now only draws the dot grid and bezier edges. the DOM handles cards. no more double rendering. the inline JS RAF loop was also replaced with a standalone canvas-draw.js that gets called explicitly via window.__penumbra_draw() whenever render state changes. no more requestAnimationFrame spinning at 60fps when nothing changed. spring-animated card positions cards now spring-animate to their new positions instead of teleporting. each AnimatedCard tracks target x/y and animates via dioxus-motion springs when the target changes. so when the layout engine repositions notes, they glide smoothly. the spring from the ideas issue, basically. sidebar panels are real now the floating sidebar buttons actually do things now. four panels: Search : reactive search input that queries the hybrid search engine as you type. results show title, preview, and similarity score. click a result and the camera drifts to that note. Tags : shows all tags sorted by count. click a tag to filter the graph view to only notes with that tag. click again to clear the filter. below the tag list, shows the filtered notes. Pins : lists all pinned notes. click to pan to them. Settings : just shows note count and link count for now. placeholder. context menu on right-click right-click a note card and you get a context menu with “Open in editor,” “Pin to canvas” / “Unpin,” and “Delete note.” the pin toggle calls a new toggle_pin method on AppState that flips the meta flag, persists, and publishes an event. note cards render markdown NoteCard preview now runs through markdown_to_html() and uses dangerous_inner_html . (XSS? yes) the editor got a preview toggle button that switches between the textarea and rendered HTML. real embeddings on init switched from SimpleEmbedder to CandleEmbedder::load() at startup. downloads the real Snowflake model from HuggingFace on first launch. falls back to SimpleEmbedder if the download fails. position persistence the layout event loop now debounce-saves positions to storage every 2 seconds. on next launch, saved positions are fed into the layout engine before the first step so notes start where you left them instead of random positions. other stuff done as well but i’m eepyyyy"}, {"post_id": 7297, "ts": "2026-06-12T05:02:24Z", "hours": 3.4467, "text": "the Dioxus commit (it’s broken but it exists) okay so. it does not work properly. I want to be upfront about that. it compiles, it launches, things appear on screen, but the interaction is janky, the canvas rendering fights with the DOM cards, and the layout worker doesn’t sync positions correctly yet. it’s a WIP commit and I’m committing it anyway because there’s genuinely a lot of infrastructure here and I don’t want to lose it. three new crates penumbra-theme : dark and light themes defined as Rust structs. colors, radii, glass blur config. to_css_vars() generates the full CSS custom properties string so the theme can be injected into the DOM at runtime. purple accent because penumbra means shadow and shadows are purple, obviously. penumbra-canvas : a GraphCanvasRenderer trait with a WebCanvasRenderer that draws to an HTML canvas via web-sys. dot grid background, bezier curve edges between nodes, rounded-rect cards with titles. plus a NullCanvasRenderer for when there’s no canvas available. the RenderState struct holds the camera, nodes, edges, and selection state. penumbra-thread : cross-platform threading. std::thread on native, wasm_thread on WASM. one #[cfg] block (the only one in the project, and it’s in a platform abstraction crate where it belongs). Worker struct with atomic cancellation flag. spawn_worker() and spawn_detached() helpers. the app Build/ui/penumbra-app/ is a full Dioxus desktop app. the component count looks scary but most of it is from the dioxus-components library (badge, button, card, dialog, dropdown menu, separator, sheet, sidebar, skeleton, tabs, tooltip). I styled them but didn’t write them. the custom ones are: NoteCard : the little frosted-glass card that represents a note on the canvas. title, preview, positioned absolutely in world coordinates. GraphCards : renders all notes as AnimatedCards inside a CSS-transformed container. each card gets a spring animation on mount via dioxus-motion so it scales in from zero. cards are draggable. FloatingSidebar : the vertical icon bar on the left. grid, search, pin, tag, settings. just state toggles for now, no panels wired up yet. TopBar : centered pill bar with the app name and search area. Fab : “New note” button in the bottom right. NoteEditor : full-screen editor view with title, body, and tags fields. auto-saves on back. the bridge bridge/mod.rs connects the UI to the backend. load_graph() and load_positions() pull from storage. restore_state() inserts everything into the graph and index. create_layout_engine() builds the GPU layout engine with all current nodes. start_layout_worker() spawns a background thread that steps the layout at 60fps, syncs node additions/removals, and publishes position updates through the event bus. sleeps longer when the layout has converged. the interaction model pan: mousedown on canvas starts tracking, mousemove applies delta to camera, mouseup stops. zoom: wheel events on canvas adjust zoom level around the cursor position. drag: mousedown on a note card captures the offset, mousemove in drag mode updates the note’s position directly. note creation: click fab -> create empty note in graph -> wait for layout engine to assign position -> camera drifts to the new note (spring animation) -> switch to editor view. this is the flow from the ideas issue. it doesn’t work smoothly yet but the state machine is there. what’s broken everything, kind of. the canvas renderer and the DOM cards are two separate rendering paths that don’t coordinate well. the layout worker publishes positions but the signals don’t always pick them up in time. the camera drift animation triggers but sometimes snaps instead of drifting. the editor saves but doesn’t trigger re-embedding. the sidebar buttons toggle state but nothing happens. it’s a prototype. sigh."}, {"post_id": 7055, "ts": "2026-06-11T20:26:26Z", "hours": 0.7372, "text": "sync conflict detection + wiremock tests two changes in one commit: the sync worker now rejects stale pushes, and the Rust sync client has a real test suite. conflict detection if the client sends a snapshotId with its push, the worker checks it against the current server snapshot. if they don’t match, someone else pushed in between, and you get a 409 back with the current server snapshot ID and a message to pull first. the snapshotId used to be passed through from the client or generated fresh. now it’s always generated server-side. the client’s snapshotId is only used for the conflict check, never as the new snapshot. small change, but it means two clients can’t accidentally create the same snapshot ID. last_sync is now a Mutex WorkerSyncProvider.last_sync went from Option<DateTime> to Mutex<Option<DateTime>> . it gets updated after both push and pull succeed. this matters because SyncProvider is behind an Arc in the real app, and last_sync needs interior mutability. also added #[serde(rename_all = \"camelCase\")] on SyncSnapshot so the JSON fields match what the worker actually sends. wiremock tests 238 lines of new tests using wiremock to mock the HTTP worker. each test spins up a local mock server, registers response expectations, and exercises the WorkerSyncProvider against it. no real network, no real worker, fully deterministic. covers: connect (200 and 500), push (returns snapshot, forwards snapshot ID, handles 500, handles 409 conflict), pull (returns notes/embeddings/positions, sends since query param), status (parses all fields), last_sync (none initially, updated after push). the with_rt() helper builds a single-threaded tokio runtime with IO enabled for each test since wiremock needs async + network. the TODO “Cloud sync” is checked off. one item left: Dioxus UI. aaaaaaaaa"}, {"post_id": 7006, "ts": "2026-06-11T19:14:21Z", "hours": 0.9681, "text": "making Candle actually WASM-compatible so remember the “no #[cfg] in cross-cutting interfaces” rule? the CandleEmbedder was breaking it. not with #[cfg] exactly, but with hf-hub, which uses filesystem APIs (dirs, mmap) that don’t exist in WASM. the model loading was desktop-only and I was pretending that was fine. it was not fine. I fixed it. hf-hub is gone replaced with reqwest. instead of hf-hub’s sync filesystem API that downloads to a local cache directory, the embedder now does raw HTTP GETs to huggingface.co/{model}/resolve/main/{file} . three downloads: model.safetensors, config.json, tokenizer.json. the bytes stay in memory, no filesystem touch. reqwest is platform-conditional in Cargo.toml: rustls on native (no OpenSSL dependency), bare defaults on wasm32 (uses browser fetch under the hood). plus getrandom with the wasm_js feature so random number generation works in WASM. two feature flags instead of one candle now just gives you the model and tokenizer types. no download capability, no reqwest. you construct a CandleEmbedder from bytes you already have. candle-load adds reqwest and the CandleEmbedder::load() method that downloads from HuggingFace. this is the one that pulls in the network stack. the split matters because the WASM build might want to load model bytes from OPFS or a bundled asset instead of downloading every time. the download path is opt-in. mmap is gone too from_mmaped_safetensors (with its unsafe block) became from_buffered_safetensors . loads from a byte vec instead of memory-mapping a file path. works everywhere. no unsafe. the vocab_size is now read from config.json instead of hardcoded to 30522. Tokenizer::from_file became Tokenizer::from_bytes . same pattern. error handling cleanup every candle operation was using ? directly, which only works if PenumbraError implements From<candle_core::Error>. it doesn’t, and it shouldn’t, because candle errors are an implementation detail. added an e_msg helper that wraps any Display into PenumbraError::Embedding, and switched every candle call to .map_err(e_msg)? . verbose but correct. ArcticEmbedXS::new and forward now return candle’s own error type instead of PenumbraError. the boundary between “candle stuff” and “penumbra stuff” is cleaner. the CandleEmbedder wrapper handles the translation. tests New candle tests behind #[cfg(feature = \"candle\")] . the trick: building a synthetic safetensors file and a minimal WordLevel tokenizer entirely in memory. no model download needed for the test suite. test_safetensors() generates fake embedding weights and encoder weights with deterministic values, writes the safetensors header manually (much better than pulling it in) (length prefix + JSON metadata + raw f32 bytes), and hands it to VarBuilder. test_tokenizer_bytes() builds a 10-word vocabulary with a Whitespace pre-tokenizer. tests cover: forward pass output shape, L2 normalization, non-zero output, embedder dimensions, embed_text roundtrip. plus one candle-load gated test that actually downloads the real model from HuggingFace (only runs when you explicitly pass --features candle-load ). the “no #[cfg] in cross-cutting interfaces” rule now holds for real. the entire embed pipeline compiles on wasm32 without conditional compilation. reqwest handles the platform difference internally. candle handles the compute. the embedder trait doesn’t know or care. Quick note, sorry about there mostly being terminal or VSCode images lol, there’s no UI to demo rn…"}, {"post_id": 6950, "ts": "2026-06-11T17:37:50Z", "hours": 0.9322, "text": "the sync backend exists now so the TODO said “Cloud sync” and I was like “how hard can it be” it was not hard actually. which is suspicious. but it works. new directory: Backend/sync-worker/ . it’s a Cloudflare Worker backed by R2 for storage. the whole sync API is three JS files and a wrangler config. the API POST /sync/push - batch upload notes, embeddings, and positions POST /sync/pull - batch download everything (or since a snapshot) GET /sync/status - storage stats (note count, bytes used, 512MB limit) POST /sync/clear - nuke everything plus individual CRUD routes for single notes, embeddings, and positions notes are JSON. embeddings are raw f32 bytes (384 * 4 = 1,536 bytes per note). positions are JSON. everything lives in R2 under a clean key scheme: notes/{id}.json , embeddings/{id}.bin , positions/{id}.json . the storage layer storage.js is the R2 abstraction. getJson, putJson, getBinary, putBinary, del, listKeys. plus a manifest system that tracks note count, last modified time, and the current snapshot ID. snapshots are versioned so the client can eventually do “pull only what changed since X” (right now it just dumps everything, but the plumbing is there). push and pull push accepts a JSON body with notes, embeddings, and positions objects. writes them all to R2, updates the manifest, creates a snapshot record, returns the snapshot ID. pull lists all note keys, fetches each note plus its embedding and position, and returns the whole bundle. embeddings get round-tripped through Float32Array so the binary format is preserved correctly. CORS is wide open ( * ) because this is a personal sync worker, not a public API. the client will be the Penumbra app running in the browser or on desktop. I’ll probably change this tho the generated types file wrangler generated a 14,000-line TypeScript declaration file for the Cloudflare runtime. I committed it because it’s how wrangler works and I don’t want to fight it. it defines the R2Bucket binding and every other Workers API type. it’s big. it’s fine. this is the first non-Rust code in the repo. feels weird. but the sync layer is inherently a server-side thing and Cloudflare Workers with R2 is genuinely the simplest way to get object storage with an HTTP API. no server to manage, no database to provision, just a bucket and some routing. Also, had to kick out usearch since it wasn’t WASM compatible now everything but Candle is WASM compatible!"}, {"post_id": 6928, "ts": "2026-06-11T16:38:23Z", "hours": 0.3536, "text": "auto-linker + TODO overhaul new crate: penumbra-auto-link . 158 lines. this is the thing that makes the canvas feel fun. the pipeline is simple: embed the note, search the vector index for neighbours, create implicit links for anything above the similarity threshold. process_note() takes a Note, embeds its text via the EmbeddingProvider, inserts the embedding into the index (so it’s immediately discoverable by future saves), searches for the top-k closest neighbours, filters by score, checks for duplicates, and creates implicit links in the graph. explicit links are never touched. I don’t mess with your links. (why does that sound funny lol) configurable: top_k (default 10), min_score (default 0.75), max_links per pass (default 5). the AutoLinker holds Arc references to the embedder, index, graph, and event bus. every new link fires a LinkAdded event so the UI can animate the card drifting to its new neighbours. the duplicate check matters. between the search returning results and the link being created, another thread could have already linked the same pair. so it locks the graph, checks if the link exists, and only creates it if it doesn’t. two process_note() calls on the same note produce links on the first call and an empty vec on the second. Some tests in auto_link_matrix.rs : creates implicit links, skips self-links, obeys score threshold, respects max_links cap, handles empty index (no candidates), no duplicate links on re-process, empty body doesn’t panic, top_k=0 returns empty. also cleaned up some stray em-dashes and arrow symbols in comments across the codebase. vscode keeps auto-correcting -- to em-dashes and -> to the arrow symbol and I keep not noticing until I read the diff. idk if it’s a bug or a feature but it’s annoying. the TODO got a real overhaul. the old flat checklist is gone. everything that’s done is removed. what’s left is organized into sections: Dioxus UI plans (spring animations, camera lerp, pinned stars, cached positions), WASM worker threading, storage and sync (Google Drive, GitHub repo, offline mode, merge strategy), and future stuff (encrypted vault). it reads like a roadmap now instead of a grocery list. eleven crates. too much? no. modularity is never “too much,” rather it’s better to be more modular than less. (unless you have something insane like a file per function)"}, {"post_id": 6912, "ts": "2026-06-11T16:12:15Z", "hours": 0.3753, "text": "GPU layout engine + collision avoidance ripped out the entire hand-rolled ForceAtlas2 + Barnes-Hut implementation and replaced it with vibe-graph-layout-gpu. (OMG i do not like that name, you could have called it anything. LITERALLY ANYTHING else) 195 lines of quadtree code: deleted. RIP. the custom ForceAccumulator, NodeState, adaptive speed calculation: all gone. replaced by a wgpu-backed force-directed layout that runs on the GPU. (no it’s not that intensive, only if you have like a million notes, and then too, we be smart and only calculate the stuff for notes you can see (animation and gamedev tip #1) rather than everything! the engine now wraps GpuLayout with lazy initialization. the GPU doesn’t spin up until the first step() call, so construction stays synchronous. if the graph changes (node added, removed, links updated), it sets a dirty flag and re-inits on the next step. pinned nodes get their positions restored after each GPU step since the GPU doesn’t know about pinning. step_neighborhood() is now just step(). with GPU acceleration the full graph is always computed, so neighborhood-only updates don’t make sense anymore. the test got rewritten to match: step_moves_unpinned_nodes instead of the old neighborhood-specific assertions. collision avoidance the GPU handles forces and attraction but it doesn’t know about card sizes. nodes are points to it. so after the GPU step runs, there’s now a CPU-side collision resolution pass that pushes apart overlapping bounding boxes. each node can have a Bounds (width, height) set by the UI. after forces are applied and pinned nodes are restored, resolve_collisions() runs up to 5 iterative passes. each pass checks every overlapping pair, computes a center-to-center separation vector, and pushes both nodes apart by half the overlap distance (clamped to 20px per pass). pinned nodes never move from collision push. the fallback for coincident centers is fun: when two nodes land on the exact same pixel, there’s no center-to-center vector to push along. so it derives a deterministic angle from the node indices using big primes as hash seeds. deterministic because the same pair should always separate in the same direction. not random because randomness in layout makes things jitter. three new tests: overlapping nodes get separated, nodes without bounds are skipped (no crash), pinned nodes stay put during collision resolution. the Cargo.lock diff (image) is… yeah. wgpu pulls in the entire graphics stack. metal, vulkan (ash), naga (oooh fun fact! this is the Hindi name for a bunch of semi-divine half-snake beings!), glow, spirv (pov you try to type spin but absolutely FAIL). the dependency tree roughly tripled. but the layout runs on the GPU now so I’m not complaining. also deleted the test_events.rs example from penumbra-markdown that I forgot to clean up last commit. oops. and also made the LayoutEngine WASM-compatible by making it async. WHOOPS"}, {"post_id": 6897, "ts": "2026-06-11T15:45:08Z", "hours": 0.4114, "text": "penumbra-markdown: the parser arc so I was supposed to work on other stuff today. I did not work on other stuff today. instead I wrote an entire markdown pipeline from scratch. parser, AST, HTML renderer, plain text extractor, streaming layer for live editing, and 639 lines of tests. because apparently “notes app needs notes parsing” was more urgent than “notes app needs to save notes.” No I did not do this in 15 minutes. I spent much more time on it. I’m just, like I said, one commit behind (no longer!!!) the custom syntax the whole point of this crate is two custom inline types that make Penumbra’s markdown different from regular markdown: NoteEmbed : [[some-note-id]] . double-bracket references to other notes on the canvas. the parser tracks bracket depth so nested brackets don’t break things. TagRef : #tag-name . inline tags. the parser distinguishes #tag from # heading by checking if there’s a space after the hash and whether the preceding character is a word boundary. these get parsed as structured AST nodes, not raw text. when the HTML renderer hits them, they become custom elements: <pe-embed data-ref=\"id\"> and <pe-tag data-name=\"name\"> . the Dioxus UI will intercept these and make them interactive (click to pan, click to filter). I know they’re technically also Obsidian things, but smh my head, I did it too the parser 612 lines wrapping pulldown-cmark. every text chunk goes through split_text_for_custom() for embed/tag extraction before hitting the inline stack. uses a frame stack with saved positions for nesting (strong, emphasis, links, etc). tables required a state machine. tight list items needed special flush handling. the usual “markdown is simple until it isn’t” experience. The image shows my excellent idea for inline stuff, as remember how println!() works with vars? Okay, no this is a pretty common thing now that I think about it… sigh. It’s the thought that counts streaming wraps mdstream for live editing. instead of re-parsing the whole document on every keystroke, it tracks which blocks changed and only re-parses those. append() , finalize() , snapshot() , reset() . the common case (typing at the end) is fast. the quadtree fix also fixed a subtle bug in Barnes-Hut. the force calculation was clamping distance AFTER the sqrt but using unclamped dist_sq in the same formula. moved the .max(1.0) to dist_sq so both values stay consistent. the old version could produce weirdly large forces for very close nodes. Yeah this is why i’m ripping it out, and replacing it tests and sanitization boring stuff, just writing the same thing with some tiny changes a lot of times ten crates now. TEN CRATES??!?!!?"}, {"post_id": 6882, "ts": "2026-06-11T15:18:05Z", "hours": 1.2269, "text": "Oh wow I locked in so remember yesterday when I said “today was all architecture, all decisions, all research”? yeah. today I wrote the architecture. all of it. 27 files. 3,795 lines added (1,900 ish is just Cargo.lock btw). one commit. I sat down to “maybe scaffold the embed crate” and then I just… didn’t stop. the hyperfixation hit and I looked up and every single crate had real code in it. not stubs. not //! penumbra-whatever . actual implementations with actual tests. let me try to explain what happened. three embedders walked into a crate (no the title is NOT a punchline to a joke, however much it sounds like one) penumbra-embed went from a one-line comment to three full embedding providers: CandleEmbedder is the real one. it loads Snowflake-Arctic-Embed-XS from HuggingFace Hub, tokenizes input, runs it through a BERT-style forward pass (word embeddings, mean pooling, linear encoder), and L2-normalizes the output into a 384-dim vector. the model weights come from safetensors via candle_nn::VarBuilder::from_mmaped_safetensors . the whole Candle pipeline is behind a feature flag so you don’t pull in the ML universe if you don’t need it. SimpleEmbedder is the clever one. it slides character trigrams across the input, hashes each one, and accumulates them into buckets across a fixed-dimension vector. then L2-normalizes. it’s deterministic, fast, needs zero ML deps, and produces embeddings where similar text actually lands in similar regions of the vector space. not semantically meaningful in the way a transformer is, but way better than random for development and testing. (You know? Well actually probably you don’t know, most people didn’t spend all of yesterday doing a bunch of NLP and ML research lollll) NullEmbedder is the lazy one. returns a zero vector. exists for when you need the trait satisfied but don’t care about the output. sometimes you just need a stub and that’s fine. (aka a lot of tests, DO NOT USE THIS anywhere else… or maybeee hehe /j) all three implement EmbeddingProvider from core. swap them at construction time. the rest of the system doesn’t know or care which one is running. (i love doing that pattern. it’s just the best. Thanks, Saikuro) the vector index penumbra-index wraps USearch with a clean VectorIndex trait: insert, remove, search, len, is_empty. the USearchIndex backend handles all the HNSW configuration. SearchHit carries a NoteId and a score. the trait exists so I can mock the index in tests without spinning up the real HNSW structure every time. (learned that lesson from Honzo’s test suite.) the graph got a cleanup penumbra-graph didn’t get new features but it got a cargo fmt . NoteId lost its redundant to_string() method because… it already derives Display . why did I write that. past me, explain yourself. what were you planning. core got an Index error variant PenumbraError::Index(String) . three lines. because the index crate needed its own error type and I wasn’t going to abuse Embedding for it. the stuff I did but still isn’t fully done the layout engine with Barnes-Hut quadtree (i tried a simpler manual implementation, but it’s icky, i’m switching to a different crate), the hybrid search engine (i should probably switch this to a usearch method or different crate idk), and the storage layer (c’est mostly bon) all got real implementations in this commit too. plus a full test suite: core_matrix.rs , embed_matrix.rs , events_matrix.rs , graph_matrix.rs , index_matrix.rs , search_matrix.rs , storage_matrix.rs . seven test files. the naming convention carries over from Honzo because it works and I’m not fixing what isn’t broken. You might notice that I’m running one commit behind lol. Welllll I am, yeah Ooops Yeahhhh devlogging after every commit is the best way to do it, but sometimes you just wanna code"}, {"post_id": 6676, "ts": "2026-06-11T05:46:06Z", "hours": 0.8864, "text": "The Architecture Day (aka 0.4h on Hackatime but like 10h in reality) So uh. Hi. New project. Today was one of those days where I didn’t really code . Like, Hackatime says 0.4 hours. ZERO POINT FOUR. That’s nothing. But here’s the thing: I spent basically the entire day thinking. Researching. Drawing arrows between boxes in my head. Googling “is candle-core wasm compat” and “best wasm compatible tokio alternative, smol or futures” and going down rabbit holes about OPFS and #[cfg] gates and whether petgraph is pure Rust (it is, thank god). And I think I came out the other side with something actually good? the architecture so Penumbra is a spatial notes app. notes live on a canvas. related notes pull toward each other. unrelated notes drift apart. the whole thing is powered by embeddings and force-directed layout and it should feel like a living map of your thoughts. and the ENTIRE thing needs to work on web AND desktop without platform #[cfg] spaghetti. that’s the rule. no #[cfg(target_arch = \"wasm32\")] in any cross-cutting interface. if I have to write #[cfg] I’ve already lost. here’s what I landed on: penumbra-core # domain types + traits. zero deps beyond serde/uuid/thiserror penumbra-events # async-channel event bus penumbra-graph # petgraph-based graph store penumbra-layout # ForceAtlas2 + Barnes-Hut penumbra-embed # Candle embedding provider penumbra-index # USearch vector index penumbra-search # hybrid search (vector + text + tags + temporal) penumbra-storage # OPFS-backed persistence penumbra-sync # cloud sync abstraction nine crates. for a notes app. am I overengineering this? maybe. do I care? absolutely not. Saikuro taught me that clean crate boundaries make everything easier later. I’d rather have nine small crates with clear jobs than one megacrate that does everything and hates me. (learned never to entangle your code from HTMLPlayer v2 (yeah that still exists, but i kinda need to press the big Archive this Repo button, I’m making a better new one) the dependency flow this is the part I’m actually proud of: everything depends on core. core depends on nothing interesting. the graph feeds into layout. embed feeds into index feeds into search. storage and sync are siblings. events is the bridge to the UI. no cycles. no tangled imports. one-directional flow. I drew this like five times on paper before I was happy with it. (I should really learn to use Mermaid for everything but my paper and pen are faster for brainstorming, sue me) the WASM thing okay so this was the big research rabbit hole. the whole point of Penumbra is true cross-platform. not “it works on desktop and we have a janky web version.” ACTUAL cross-platform. same code. same behavior. same everything. the trick is picking libraries that just… work on both targets without needing platform gates: serde/serde_json : universal. obviously. uuid with the js feature: uses js-sys getRandomValues on wasm32. no #[cfg] . chrono with wasmbind : uses js-sys Date on wasm32. no #[cfg] . futures + async-trait : universal. no runtime dependency. petgraph : pure Rust. no system deps. just works. opfs : this crate is kind of magic. tokio::fs on native, browser OPFS on wasm. one API. the whole reason I don’t need a StorageProvider trait. candle : wasm32 with SIMD backend. Snowflake-Arctic-Embed-XS quantized to GGUF. usearch : wasm32 compatible. HNSW index with add/search/remove. async-channel : universal. no runtime coupling. I am unreasonably happy about this list."}]...
|
Title: Penumbra by @NellowTCS | Stardance
Devlogs Title: Penumbra by @NellowTCS | Stardance
Devlogs:
The Architecture Day (aka 0.4h on Hackatime but like 10h in reality) So uh. Hi. New project. Today was one of those days where I didn’t really code . Like, Hackatime says 0.4 hours. ZERO POINT FOUR. That’s nothing. But here’s the thing: I spent basically the entire day thinking. Researching. Drawing arrows between boxes in my head. Googling “is candle-core wasm compat” and “best wasm compatible tokio alternative, smol or futures” and going down rabbit holes about OPFS and #[cfg] gates and whether petgraph is pure Rust (it is, thank god). And I think I came out the other side with something actually good? the architecture so Penumbra is a spatial notes app. notes live on a canvas. related notes pull toward each other. unrelated notes drift apart. the whole thing is powered by embeddings and force-directed layout and it should feel like a living map of your thoughts. and the ENTIRE thing needs to work on web AND desktop without platform #[cfg] spaghetti. that’s the rule. no #[cfg(target_arch = "wasm32")] in any cross-cutting interface. if I have to write #[cfg] I’ve already lost. here’s what I landed on: penumbra-core # domain types + traits. zero deps beyond serde/uuid/thiserror penumbra-events # async-channel event bus penumbra-graph # petgraph-based graph store penumbra-layout # ForceAtlas2 + Barnes-Hut penumbra-embed # Candle embedding provider penumbra-index # USearch vector index penumbra-search # hybrid search (vector + text + tags + temporal) penumbra-storage # OPFS-backed persistence penumbra-sync # cloud sync abstraction nine crates. for a notes app. am I overengineering this? maybe. do I care? absolutely not. Saikuro taught me that clean crate boundaries make everything easier later. I’d rather have nine small crates with clear jobs than one megacrate that does everything and hates me. (learned never to entangle your code from HTMLPlayer v2 (yeah that still exists, but i kinda need to press the big Archive this Repo button, I’m making a better new one) the dependency flow this is the part I’m actually proud of: everything depends on core. core depends on nothing interesting. the graph feeds into layout. embed feeds into index feeds into search. storage and sync are siblings. events is the bridge to the UI. no cycles. no tangled imports. one-directional flow. I drew this like five times on paper before I was happy with it. (I should really learn to use Mermaid for everything but my paper and pen are faster for brainstorming, sue me) the WASM thing okay so this was the big research rabbit hole. the whole point of Penumbra is true cross-platform. not “it works on desktop and we have a janky web version.” ACTUAL cross-platform. same code. same behavior. same everything. the trick is picking libraries that just… work on both targets without needing platform gates: serde/serde_json : universal. obviously. uuid with the js feature: uses js-sys getRandomValues on wasm32. no #[cfg] . chrono with wasmbind : uses js-sys Date on wasm32. no #[cfg] . futures + async-trait : universal. no runtime dependency. petgraph : pure Rust. no system deps. just works. opfs : this crate is kind of magic. tokio::fs on native, browser OPFS on wasm. one API. the whole reason I don’t need a StorageProvider trait. candle : wasm32 with SIMD backend. Snowflake-Arctic-Embed-XS quantized to GGUF. usearch : wasm32 compatible. HNSW index with add/search/remove. async-channel : universal. no runtime coupling. I am unreasonably happy about this list.
Oh wow I locked in so remember yesterday when I said “today was all architecture, all decisions, all research”? yeah. today I wrote the architecture. all of it. 27 files. 3,795 lines added (1,900 ish is just Cargo.lock btw). one commit. I sat down to “maybe scaffold the embed crate” and then I just… didn’t stop. the hyperfixation hit and I looked up and every single crate had real code in it. not stubs. not //! penumbra-whatever . actual implementations with actual tests. let me try to explain what happened. three embedders walked into a crate (no the title is NOT a punchline to a joke, however much it sounds like one) penumbra-embed went from a one-line comment to three full embedding providers: CandleEmbedder is the real one. it loads Snowflake-Arctic-Embed-XS from HuggingFace Hub, tokenizes input, runs it through a BERT-style forward pass (word embeddings, mean pooling, linear encoder), and L2-normalizes the output into a 384-dim vector. the model weights come from safetensors via candle_nn::VarBuilder::from_mmaped_safetensors . the whole Candle pipeline is behind a feature flag so you don’t pull in the ML universe if you don’t need it. SimpleEmbedder is the clever one. it slides character trigrams across the input, hashes each one, and accumulates them into buckets across a fixed-dimension vector. then L2-normalizes. it’s deterministic, fast, needs zero ML deps, and produces embeddings where similar text actually lands in similar regions of the vector space. not semantically meaningful in the way a transformer is, but way better than random for development and testing. (You know? Well actually probably you don’t know, most people didn’t spend all of yesterday doing a bunch of NLP and ML research lollll) NullEmbedder is the lazy one. returns a zero vector. exists for when you need the trait satisfied but don’t care about the output. sometimes you just need a stub and that’s fine. (aka a lot of tests, DO NOT USE THIS anywhere else… or maybeee hehe /j) all three implement EmbeddingProvider from core. swap them at construction time. the rest of the system doesn’t know or care which one is running. (i love doing that pattern. it’s just the best. Thanks, Saikuro) the vector index penumbra-index wraps USearch with a clean VectorIndex trait: insert, remove, search, len, is_empty. the USearchIndex backend handles all the HNSW configuration. SearchHit carries a NoteId and a score. the trait exists so I can mock the index in tests without spinning up the real HNSW structure every time. (learned that lesson from Honzo’s test suite.) the graph got a cleanup penumbra-graph didn’t get new features but it got a cargo fmt . NoteId lost its redundant to_string() method because… it already derives Display . why did I write that. past me, explain yourself. what were you planning. core got an Index error variant PenumbraError::Index(String) . three lines. because the index crate needed its own error type and I wasn’t going to abuse Embedding for it. the stuff I did but still isn’t fully done the layout engine with Barnes-Hut quadtree (i tried a simpler manual implementation, but it’s icky, i’m switching to a different crate), the hybrid search engine (i should probably switch this to a usearch method or different crate idk), and the storage layer (c’est mostly bon) all got real implementations in this commit too. plus a full test suite: core_matrix.rs , embed_matrix.rs , events_matrix.rs , graph_matrix.rs , index_matrix.rs , search_matrix.rs , storage_matrix.rs . seven test files. the naming convention carries over from Honzo because it works and I’m not fixing what isn’t broken. You might notice that I’m running one commit behind lol. Welllll I am, yeah Ooops Yeahhhh devlogging after every commit is the best way to do it, but sometimes you just wanna code
penumbra-markdown: the parser arc so I was supposed to work on other stuff today. I did not work on other stuff today. instead I wrote an entire markdown pipeline from scratch. parser, AST, HTML renderer, plain text extractor, streaming layer for live editing, and 639 lines of tests. because apparently “notes app needs notes parsing” was more urgent than “notes app needs to save notes.” No I did not do this in 15 minutes. I spent much more time on it. I’m just, like I said, one commit behind (no longer!!!) the custom syntax the whole point of this crate is two custom inline types that make Penumbra’s markdown different from regular markdown: NoteEmbed : [[some-note-id]] . double-bracket references to other notes on the canvas. the parser tracks bracket depth so nested brackets don’t break things. TagRef : #tag-name . inline tags. the parser distinguishes #tag from # heading by checking if there’s a space after the hash and whether the preceding character is a word boundary. these get parsed as structured AST nodes, not raw text. when the HTML renderer hits them, they become custom elements: <pe-embed data-ref="id"> and <pe-tag data-name="name"> . the Dioxus UI will intercept these and make them interactive (click to pan, click to filter). I know they’re technically also Obsidian things, but smh my head, I did it too the parser 612 lines wrapping pulldown-cmark. every text chunk goes through split_text_for_custom() for embed/tag extraction before hitting the inline stack. uses a frame stack with saved positions for nesting (strong, emphasis, links, etc). tables required a state machine. tight list items needed special flush handling. the usual “markdown is simple until it isn’t” experience. The image shows my excellent idea for inline stuff, as remember how println!() works with vars? Okay, no this is a pretty common thing now that I think about it… sigh. It’s the thought that counts streaming wraps mdstream for live editing. instead of re-parsing the whole document on every keystroke, it tracks which blocks changed and only re-parses those. append() , finalize() , snapshot() , reset() . the common case (typing at the end) is fast. the quadtree fix also fixed a subtle bug in Barnes-Hut. the force calculation was clamping distance AFTER the sqrt but using unclamped dist_sq in the same formula. moved the .max(1.0) to dist_sq so both values stay consistent. the old version could produce weirdly large forces for very close nodes. Yeah this is why i’m ripping it out, and replacing it tests and sanitization boring stuff, just writing the same thing with some tiny changes a lot of times ten crates now. TEN CRATES??!?!!?
GPU layout engine + collision avoidance ripped out the entire hand-rolled ForceAtlas2 + Barnes-Hut implementation and replaced it with vibe-graph-layout-gpu. (OMG i do not like that name, you could have called it anything. LITERALLY ANYTHING else) 195 lines of quadtree code: deleted. RIP. the custom ForceAccumulator, NodeState, adaptive speed calculation: all gone. replaced by a wgpu-backed force-directed layout that runs on the GPU. (no it’s not that intensive, only if you have like a million notes, and then too, we be smart and only calculate the stuff for notes you can see (animation and gamedev tip #1) rather than everything! the engine now wraps GpuLayout with lazy initialization. the GPU doesn’t spin up until the first step() call, so construction stays synchronous. if the graph changes (node added, removed, links updated), it sets a dirty flag and re-inits on the next step. pinned nodes get their positions restored after each GPU step since the GPU doesn’t know about pinning. step_neighborhood() is now just step(). with GPU acceleration the full graph is always computed, so neighborhood-only updates don’t make sense anymore. the test got rewritten to match: step_moves_unpinned_nodes instead of the old neighborhood-specific assertions. collision avoidance the GPU handles forces and attraction but it doesn’t know about card sizes. nodes are points to it. so after the GPU step runs, there’s now a CPU-side collision resolution pass that pushes apart overlapping bounding boxes. each node can have a Bounds (width, height) set by the UI. after forces are applied and pinned nodes are restored, resolve_collisions() runs up to 5 iterative passes. each pass checks every overlapping pair, computes a center-to-center separation vector, and pushes both nodes apart by half the overlap distance (clamped to 20px per pass). pinned nodes never move from collision push. the fallback for coincident centers is fun: when two nodes land on the exact same pixel, there’s no center-to-center vector to push along. so it derives a deterministic angle from the node indices using big primes as hash seeds. deterministic because the same pair should always separate in the same direction. not random because randomness in layout makes things jitter. three new tests: overlapping nodes get separated, nodes without bounds are skipped (no crash), pinned nodes stay put during collision resolution. the Cargo.lock diff (image) is… yeah. wgpu pulls in the entire graphics stack. metal, vulkan (ash), naga (oooh fun fact! this is the Hindi name for a bunch of semi-divine half-snake beings!), glow, spirv (pov you try to type spin but absolutely FAIL). the dependency tree roughly tripled. but the layout runs on the GPU now so I’m not complaining. also deleted the test_events.rs example from penumbra-markdown that I forgot to clean up last commit. oops. and also made the LayoutEngine WASM-compatible by making it async. WHOOPS
auto-linker + TODO overhaul new crate: penumbra-auto-link . 158 lines. this is the thing that makes the canvas feel fun. the pipeline is simple: embed the note, search the vector index for neighbours, create implicit links for anything above the similarity threshold. process_note() takes a Note, embeds its text via the EmbeddingProvider, inserts the embedding into the index (so it’s immediately discoverable by future saves), searches for the top-k closest neighbours, filters by score, checks for duplicates, and creates implicit links in the graph. explicit links are never touched. I don’t mess with your links. (why does that sound funny lol) configurable: top_k (default 10), min_score (default 0.75), max_links per pass (default 5). the AutoLinker holds Arc references to the embedder, index, graph, and event bus. every new link fires a LinkAdded event so the UI can animate the card drifting to its new neighbours. the duplicate check matters. between the search returning results and the link being created, another thread could have already linked the same pair. so it locks the graph, checks if the link exists, and only creates it if it doesn’t. two process_note() calls on the same note produce links on the first call and an empty vec on the second. Some tests in auto_link_matrix.rs : creates implicit links, skips self-links, obeys score threshold, respects max_links cap, handles empty index (no candidates), no duplicate links on re-process, empty body doesn’t panic, top_k=0 returns empty. also cleaned up some stray em-dashes and arrow symbols in comments across the codebase. vscode keeps auto-correcting -- to em-dashes and -> to the arrow symbol and I keep not noticing until I read the diff. idk if it’s a bug or a feature but it’s annoying. the TODO got a real overhaul. the old flat checklist is gone. everything that’s done is removed. what’s left is organized into sections: Dioxus UI plans (spring animations, camera lerp, pinned stars, cached positions), WASM worker threading, storage and sync (Google Drive, GitHub repo, offline mode, merge strategy), and future stuff (encrypted vault). it reads like a roadmap now instead of a grocery list. eleven crates. too much? no. modularity is never “too much,” rather it’s better to be more modular than less. (unless you have something insane like a file per function)
the sync backend exists now so the TODO said “Cloud sync” and I was like “how hard can it be” it was not hard actually. which is suspicious. but it works. new directory: Backend/sync-worker/ . it’s a Cloudflare Worker backed by R2 for storage. the whole sync API is three JS files and a wrangler config. the API POST /sync/push - batch upload notes, embeddings, and positions POST /sync/pull - batch download everything (or since a snapshot) GET /sync/status - storage stats (note count, bytes used, 512MB limit) POST /sync/clear - nuke everything plus individual CRUD routes for single notes, embeddings, and positions notes are JSON. embeddings are raw f32 bytes (384 * 4 = 1,536 bytes per note). positions are JSON. everything lives in R2 under a clean key scheme: notes/{id}.json , embeddings/{id}.bin , positions/{id}.json . the storage layer storage.js is the R2 abstraction. getJson, putJson, getBinary, putBinary, del, listKeys. plus a manifest system that tracks note count, last modified time, and the current snapshot ID. snapshots are versioned so the client can eventually do “pull only what changed since X” (right now it just dumps everything, but the plumbing is there). push and pull push accepts a JSON body with notes, embeddings, and positions objects. writes them all to R2, updates the manifest, creates a snapshot record, returns the snapshot ID. pull lists all note keys, fetches each note plus its embedding and position, and returns the whole bundle. embeddings get round-tripped through Float32Array so the binary format is preserved correctly. CORS is wide open ( * ) because this is a personal sync worker, not a public API. the client will be the Penumbra app running in the browser or on desktop. I’ll probably change this tho the generated types file wrangler generated a 14,000-line TypeScript declaration file for the Cloudflare runtime. I committed it because it’s how wrangler works and I don’t want to fight it. it defines the R2Bucket binding and every other Workers API type. it’s big. it’s fine. this is the first non-Rust code in the repo. feels weird. but the sync layer is inherently a server-side thing and Cloudflare Workers with R2 is genuinely the simplest way to get object storage with an HTTP API. no server to manage, no database to provision, just a bucket and some routing. Also, had to kick out usearch since it wasn’t WASM compatible now everything but Candle is WASM compatible!
making Candle actually WASM-compatible so remember the “no #[cfg] in cross-cutting interfaces” rule? the CandleEmbedder was breaking it. not with #[cfg] exactly, but with hf-hub, which uses filesystem APIs (dirs, mmap) that don’t exist in WASM. the model loading was desktop-only and I was pretending that was fine. it was not fine. I fixed it. hf-hub is gone replaced with reqwest. instead of hf-hub’s sync filesystem API that downloads to a local cache directory, the embedder now does raw HTTP GETs to huggingface.co/{model}/resolve/main/{file} . three downloads: model.safetensors, config.json, tokenizer.json. the bytes stay in memory, no filesystem touch. reqwest is platform-conditional in Cargo.toml: rustls on native (no OpenSSL dependency), bare defaults on wasm32 (uses browser fetch under the hood). plus getrandom with the wasm_js feature so random number generation works in WASM. two feature flags instead of one candle now just gives you the model and tokenizer types. no download capability, no reqwest. you construct a CandleEmbedder from bytes you already have. candle-load adds reqwest and the CandleEmbedder::load() method that downloads from HuggingFace. this is the one that pulls in the network stack. the split matters because the WASM build might want to load model bytes from OPFS or a bundled asset instead of downloading every time. the download path is opt-in. mmap is gone too from_mmaped_safetensors (with its unsafe block) became from_buffered_safetensors . loads from a byte vec instead of memory-mapping a file path. works everywhere. no unsafe. the vocab_size is now read from config.json instead of hardcoded to 30522. Tokenizer::from_file became Tokenizer::from_bytes . same pattern. error handling cleanup every candle operation was using ? directly, which only works if PenumbraError implements From<candle_core::Error>. it doesn’t, and it shouldn’t, because candle errors are an implementation detail. added an e_msg helper that wraps any Display into PenumbraError::Embedding, and switched every candle call to .map_err(e_msg)? . verbose but correct. ArcticEmbedXS::new and forward now return candle’s own error type instead of PenumbraError. the boundary between “candle stuff” and “penumbra stuff” is cleaner. the CandleEmbedder wrapper handles the translation. tests New candle tests behind #[cfg(feature = "candle")] . the trick: building a synthetic safetensors file and a minimal WordLevel tokenizer entirely in memory. no model download needed for the test suite. test_safetensors() generates fake embedding weights and encoder weights with deterministic values, writes the safetensors header manually (much better than pulling it in) (length prefix + JSON metadata + raw f32 bytes), and hands it to VarBuilder. test_tokenizer_bytes() builds a 10-word vocabulary with a Whitespace pre-tokenizer. tests cover: forward pass output shape, L2 normalization, non-zero output, embedder dimensions, embed_text roundtrip. plus one candle-load gated test that actually downloads the real model from HuggingFace (only runs when you explicitly pass --features candle-load ). the “no #[cfg] in cross-cutting interfaces” rule now holds for real. the entire embed pipeline compiles on wasm32 without conditional compilation. reqwest handles the platform difference internally. candle handles the compute. the embedder trait doesn’t know or care. Quick note, sorry about there mostly being terminal or VSCode images lol, there’s no UI to demo rn…
sync conflict detection + wiremock tests two changes in one commit: the sync worker now rejects stale pushes, and the Rust sync client has a real test suite. conflict detection if the client sends a snapshotId with its push, the worker checks it against the current server snapshot. if they don’t match, someone else pushed in between, and you get a 409 back with the current server snapshot ID and a message to pull first. the snapshotId used to be passed through from the client or generated fresh. now it’s always generated server-side. the client’s snapshotId is only used for the conflict check, never as the new snapshot. small change, but it means two clients can’t accidentally create the same snapshot ID. last_sync is now a Mutex WorkerSyncProvider.last_sync went from Option<DateTime> to Mutex<Option<DateTime>> . it gets updated after both push and pull succeed. this matters because SyncProvider is behind an Arc in the real app, and last_sync needs interior mutability. also added #[serde(rename_all = "camelCase")] on SyncSnapshot so the JSON fields match what the worker actually sends. wiremock tests 238 lines of new tests using wiremock to mock the HTTP worker. each test spins up a local mock server, registers response expectations, and exercises the WorkerSyncProvider against it. no real network, no real worker, fully deterministic. covers: connect (200 and 500), push (returns snapshot, forwards snapshot ID, handles 500, handles 409 conflict), pull (returns notes/embeddings/positions, sends since query param), status (parses all fields), last_sync (none initially, updated after push). the with_rt() helper builds a single-threaded tokio runtime with IO enabled for each test since wiremock needs async + network. the TODO “Cloud sync” is checked off. one item left: Dioxus UI. aaaaaaaaa
the Dioxus commit (it’s broken but it exists) okay so. it does not work properly. I want to be upfront about that. it compiles, it launches, things appear on screen, but the interaction is janky, the canvas rendering fights with the DOM cards, and the layout worker doesn’t sync positions correctly yet. it’s a WIP commit and I’m committing it anyway because there’s genuinely a lot of infrastructure here and I don’t want to lose it. three new crates penumbra-theme : dark and light themes defined as Rust structs. colors, radii, glass blur config. to_css_vars() generates the full CSS custom properties string so the theme can be injected into the DOM at runtime. purple accent because penumbra means shadow and shadows are purple, obviously. penumbra-canvas : a GraphCanvasRenderer trait with a WebCanvasRenderer that draws to an HTML canvas via web-sys. dot grid background, bezier curve edges between nodes, rounded-rect cards with titles. plus a NullCanvasRenderer for when there’s no canvas available. the RenderState struct holds the camera, nodes, edges, and selection state. penumbra-thread : cross-platform threading. std::thread on native, wasm_thread on WASM. one #[cfg] block (the only one in the project, and it’s in a platform abstraction crate where it belongs). Worker struct with atomic cancellation flag. spawn_worker() and spawn_detached() helpers. the app Build/ui/penumbra-app/ is a full Dioxus desktop app. the component count looks scary but most of it is from the dioxus-components library (badge, button, card, dialog, dropdown menu, separator, sheet, sidebar, skeleton, tabs, tooltip). I styled them but didn’t write them. the custom ones are: NoteCard : the little frosted-glass card that represents a note on the canvas. title, preview, positioned absolutely in world coordinates. GraphCards : renders all notes as AnimatedCards inside a CSS-transformed container. each card gets a spring animation on mount via dioxus-motion so it scales in from zero. cards are draggable. FloatingSidebar : the vertical icon bar on the left. grid, search, pin, tag, settings. just state toggles for now, no panels wired up yet. TopBar : centered pill bar with the app name and search area. Fab : “New note” button in the bottom right. NoteEditor : full-screen editor view with title, body, and tags fields. auto-saves on back. the bridge bridge/mod.rs connects the UI to the backend. load_graph() and load_positions() pull from storage. restore_state() inserts everything into the graph and index. create_layout_engine() builds the GPU layout engine with all current nodes. start_layout_worker() spawns a background thread that steps the layout at 60fps, syncs node additions/removals, and publishes position updates through the event bus. sleeps longer when the layout has converged. the interaction model pan: mousedown on canvas starts tracking, mousemove applies delta to camera, mouseup stops. zoom: wheel events on canvas adjust zoom level around the cursor position. drag: mousedown on a note card captures the offset, mousemove in drag mode updates the note’s position directly. note creation: click fab -> create empty note in graph -> wait for layout engine to assign position -> camera drifts to the new note (spring animation) -> switch to editor view. this is the flow from the ideas issue. it doesn’t work smoothly yet but the state machine is there. what’s broken everything, kind of. the canvas renderer and the DOM cards are two separate rendering paths that don’t coordinate well. the layout worker publishes positions but the signals don’t always pick them up in time. the camera drift animation triggers but sometimes snaps instead of drifting. the editor saves but doesn’t trigger re-embedding. the sidebar buttons toggle state but nothing happens. it’s a prototype. sigh.
making it actually work (kind of) so remember how last commit I said “everything is broken”? I spent tonight fixing the worst of it. it’s not done but it’s a lot less broken. the big fix: drag + layout fighting the core problem was that when you drag a note, the layout engine keeps running and overwriting your drag position every 16ms. the note jitters back and forth between where you’re dragging it and where the physics wants it. fix: new SetNodePosition event. when you drag a note, the UI publishes it through the event bus. the layout worker drains these events at the top of each cycle and calls engine.set_position() before stepping. so the layout engine knows where you put the card and computes forces from there instead of fighting you. also: while any note is being dragged (tracked by dragged_set ), the layout event loop skips updating positions entirely. other notes stay still instead of jittering from stale force calculations. once you release, everything syncs up again. mouse events moved to root div pan/drag/mouseup handlers were on the canvas element, which meant releasing the mouse over a note card didn’t fire mouseup on the canvas. dragging would “stick.” moved all the move/up/leave handlers to the root div so they fire regardless of what’s under the cursor. canvas renderer simplified removed the node drawing code from WebCanvasRenderer entirely. nodes were being drawn twice: once on the canvas in Rust/web-sys, once as DOM cards in Dioxus. the canvas now only draws the dot grid and bezier edges. the DOM handles cards. no more double rendering. the inline JS RAF loop was also replaced with a standalone canvas-draw.js that gets called explicitly via window.__penumbra_draw() whenever render state changes. no more requestAnimationFrame spinning at 60fps when nothing changed. spring-animated card positions cards now spring-animate to their new positions instead of teleporting. each AnimatedCard tracks target x/y and animates via dioxus-motion springs when the target changes. so when the layout engine repositions notes, they glide smoothly. the spring from the ideas issue, basically. sidebar panels are real now the floating sidebar buttons actually do things now. four panels: Search : reactive search input that queries the hybrid search engine as you type. results show title, preview, and similarity score. click a result and the camera drifts to that note. Tags : shows all tags sorted by count. click a tag to filter the graph view to only notes with that tag. click again to clear the filter. below the tag list, shows the filtered notes. Pins : lists all pinned notes. click to pan to them. Settings : just shows note count and link count for now. placeholder. context menu on right-click right-click a note card and you get a context menu with “Open in editor,” “Pin to canvas” / “Unpin,” and “Delete note.” the pin toggle calls a new toggle_pin method on AppState that flips the meta flag, persists, and publishes an event. note cards render markdown NoteCard preview now runs through markdown_to_html() and uses dangerous_inner_html . (XSS? yes) the editor got a preview toggle button that switches between the textarea and rendered HTML. real embeddings on init switched from SimpleEmbedder to CandleEmbedder::load() at startup. downloads the real Snowflake model from HuggingFace on first launch. falls back to SimpleEmbedder if the download fails. position persistence the layout event loop now debounce-saves positions to storage every 2 seconds. on next launch, saved positions are fed into the layout engine before the first step so notes start where you left them instead of random positions. other stuff done as well but i’m eepyyyy
the polish commit (that didn’t polish enough) okay so this commit looks massive and impressive on paper. I touched basically everything. and the code changes are real. but I need to be honest: the app still looks and feels terrible. like, genuinely bad. the UI is broken in ways that make me want to close the window and pretend I never opened it. but the changes are real so let me document them anyway. layout tuning repulsion went from 1000 to 8000, attraction from 0.01 to 0.004, ideal_length from 50 to 220. notes were clumping into an unreadable blob. the physics are better now even if you can’t tell because the rendering is fighting itself. theme overhaul flattened the entire theme system into one struct with semantic names. every hardcoded color replaced with CSS vars. dark and light themes. toggle in settings. this part actually works correctly and I’m proud of it even though nobody can see it because the layout is broken. TipTap editor replaced the textarea with TipTap via JS eval. StarterKit with bold/italic/strike/code/headings/lists. toolbar with format buttons. sends HTML back via dioxus.send(). this is genuinely nice when it works. which is actually most of the time wow. manual linking, note list, auto-linking on save, context menu, keyboard shortcuts, zoom controls, empty state all implemented. all technically functional. all look like they were designed by someone who has never seen a GUI before. (me. I’m that someone. i am not good at RSX, which is funny because it SHOULD just be a different form of HTML. you would think.) what I learned dioxus-desktop’s webview is not a browser with devtools. iterating on UI by recompiling a Rust binary every time you move a div 2 pixels is actual torture. I should have designed the UI in plain HTML first, gotten it looking right in a real browser with real devtools, and THEN ported it to rsx. I did not do that. I have been doing it backwards this entire time. smh my silly head. next step: HTML mockup first, then port. the backend is solid. the architecture is clean. the UI just needs to catch up. still broken but less broken than before. progress? maybe? onwards (to HTML mockups) :}
Revert Dioxus That’s the sound of me… giving up Giving up on Dioxus cause it’s so SO difficult to use I’m using Slint now, maybe, we’ll see if i even remember what I was doing Sorry for the like bad devlog, but it needed to be done
Basic template so. Slint. I was gonna do the whole “design it in HTML first then port it” thing that I very wisely declared last time and then, naturally, did not do at all. instead I saw Slint had a live preview and its own markup language and yeah. here we are. and it’s actually fun?? like it has a real preview, you edit the .slint file and it just updates, no recompiling the entire universe to nudge one thing. after the Dioxus months this feels illegal. anyway before touching any actual UI I made penumbra-app, which is NOT the UI, it’s the brain. a Universe struct that holds the graph + storage + event bus and does all the note stuff: create, save, delete, restore on open, persist after every change. the whole point is it doesn’t know Slint exists. or Dioxus. or anything. it just… runs the app, and whatever draws on top pokes it and listens for events. so if I rage-quit Slint in three weeks (I won’t! probably.) the brain doesn’t care. the actual Slint crate (penumbra-ui) is barely anything yet. cargo.toml, a build.rs because Slint compiles the markup at build time, a main, one app.slint. it’s the hello-world stage. but it launches! natively! no webview! I cannot stress how nice it is to not have a webview. oh also storage stuff got nudged, everything lives under a Penumbra/ folder now instead of just yeeting files into the shared app-data dir like a menace. and added a with_dir() so tests stop writing to my real data. speaking of, wrote a pile of Universe tests: make a note, drop the whole universe, reopen from the same folder, is the note still there? yes. edit it, reopen, still edited? yes. delete it, reopen, gone? gone. persistence actually persists, turns out. months since the last commit lol. I saw the date and just sighed. but the backend was sitting there perfectly fine this whole time waiting for me to stop fighting UI frameworks, and now I’ve got a clean core library and a toolkit that doesn’t actively hate me! Gasp. good place to be back :3
Vault mode (aka I made it Obsidian now, basically) okay this is a big (foundational) one so up until now Penumbra stored notes as a big pile of JSON blobs plus a graph.json that held all the links. which works but it’s… a black box? you can’t open your notes in anything else, the links live in a separate file, it’s very “my app owns your data.” and that bugged me. so now it’s a vault with markdown files. one .md per note, filename = title, YAML frontmatter for the id/timestamps/tags/pinned/archived, and the body is just… markdown. you could point Obsidian at the folder and it’d basically work. that’s the goal. well. the other way around but still :P Also, links aren’t stored anymore, they’re derived. [[wikilinks]] in the body get resolved against filenames at scan time and become the explicit edges in the graph. no more graph.json. the files ARE the source of truth, and if the app crashes mid-write the next scan just repairs everything. I like that a lot. it means if you go edit a file in some other editor and add a [[link]] , Penumbra picks it up next time it scans. and then I fell down the rename rabbit hole. because if filename = title, renaming a note means renaming the file AND rewriting every [[old title]] across the whole vault to [[new title]] . so propagate_rename walks every note that linked to the old title and rewrites it. and the rewriter is suuuuuuper careful: it skips inline code, fenced code blocks, indented code, handles [[Old|alias]] , matches case-insensitively but keeps whatever case you typed. wikilinks inside `code` should NOT get rewritten and now they don’t, and I have a test that proves it (with the same link four times in different contexts, only the live one changes). very satisfying. filenames can have slashes and colons and emoji and whatever, so there’s a sanitizer that strips the illegal stuff, collapses whitespace, caps length, falls back to “Untitled” if you somehow title a note with just dots. and if two notes want the same filename you get “Same Name” and “Same Name 2” like every sane file manager. oh and frontmatter tags vs inline tags are kept separate on purpose. if you wrote #tag in the body, that stays inline, it doesn’t get hoisted up into the YAML just because Penumbra touched the file. only frontmatter tags round-trip through YAML. respecting the user’s file, basically. the parser also got some unicode love while I was in there. tags can be #Ünïcodé now and nested like #projects/penumbra , and the whole split_text_for_custom walk steps by char instead of byte so it stops potentially panicking on multi-byte stuff. should’ve been like that from the start but oh well. on the UI side: there’s a folder picker now! rfd native dialog, “Choose your Penumbra vault”, and it remembers your choice in a config file so it doesn’t nag you every launch. also reads a PENUMBRA_VAULT env var if you want to override. getting the macOS dialog to behave was its own thing because rfd has to run on the thread that owns NSApplication, so it marshals onto the Slint event loop and sends the result back over a channel. the browser build just uses OPFS for now, showDirectoryPicker slots in later (TODO left in the code, future me’s problem). wrote a whole pile of tests for all of it too, but that’s booooriinnnngggggggggggggggggg
working wasm version and candle it runs in the browser now!! like, actually. wasm target, Slint rendering to a canvas, the whole thing. I’ve been dreading the wasm build this whole project and it just… went. mostly. the big win here is model caching, because downloading a ~130MB embedding model every single page load is obviously insane. so there’s a model_cache module now that’s the same two functions (get/put) with two backends behind cfg: native writes the bytes to a temp dir, wasm shoves them into the browser’s Cache API. first launch downloads and stashes, every launch after just pulls from cache. same idea as before but now it works on both sides. to make that clean I split CandleEmbedder::load() into two pieces: from_bytes() that takes raw model/config/tokenizer bytes and builds the thing, and load() (native only) that downloads then calls from_bytes. so the wasm path can grab bytes from cache (or fetch them itself) and hand them straight to from_bytes without the reqwest download dance. Candle running on CPU in wasm, no GPU, producing the same 384-dim vectors. genuinely did not expect that to just work. the wasm caching code is… a lot of JsFuture and dyn_into and web_sys ceremony. open the cache, build a Request, match it, pull the arraybuffer, convert to a Uint8Array, to_vec. and the put side builds a fake 200 Response with the bytes as the body and stuffs it in. it’s verbose but it’s the standard, nothing clever. the UI crate is a cdylib now (plus rlib) so it can compile to wasm, tokio features got split per-target (no rt-multi-thread in the browser, obviously), and there’s a tiny index.html that just imports the generated js and calls init(). Slint paints onto a <canvas id="canvas"> also wrote an inference benchmark test… all you need to know so yeah. desktop AND browser, same codebase, real ML embeddings on both. the “true cross-platformity” thing from the very first devlog is… actually real now? that rule I set on day one about no #[cfg] in the interfaces paid off HARD here, the only cfgs are tucked inside the cache and download internals where they belong.
lock in (the UI exists now. for real this time.) hehe okay. LOCK IN. this is the one where Penumbra stops being a really nice backend with no face and becomes an actual app you can look at. Slint UI, real components, and I wrote my own text editor because of course I did.so the editor. new crate, penumbra-editor. I could’ve just shoved a <textarea> equivalent in and called it a day but nooo, I wanted a proper block-based editor like the good note apps have. so it’s a document model made of blocks, each block has styled spans, and you edit it through commands: InsertText, DeleteRange, SplitBlock, MergeBlocks, SetMark, MoveCursor. every command goes through a Journal that’s just a command list + a pointer, which means undo/redo falls out for free (truncate on new push, walk the pointer back and forth). there’s a cursor/selection model and a view_model that snapshots the doc into something the UI can render without touching the guts. it’s BROKEN AND WEIRD NOW BUT IT’LL GET BETTER I PROMISE the layout engine grew a CPU brain. it was originally GPU-only via that vibe-graph-layout-gpu crate, which is great until you’re in an environment with no WebGPU (like… a lot of places, including some wasm setups) and then it just returns zero displacement and everything sits in a sad pile. so now there’s cpu.rs, my own Barnes-Hut quadtree force layout in plain Rust, and the engine tries GPU first and falls back to CPU when there’s no backend or the GPU step fails. no more “works on my machine with a discrete GPU only.” graceful degradation, hehe. and then the actual Slint UI which is the thing. it’s great. it’s split into real components now: theme.slint for the tokens, top-bar.slint, map-canvas.slint for the graph, note-card.slint for the cards, editor-panel.slint for writing. app.slint wires it together. this is the part that broke my brain in Dioxus for literal months and in Slint it’s just… a file with a live preview and it looks how I tell it to. I keep waiting for the catch. haven’t hit it yet tests too NO JINXING ME (please) I don’t want to jinx it but. this feels like the first time Penumbra is actually the thing I pictured back in that architecture-day devlog. backend I’m proud of, a UI that doesn’t fight me, my own editor, works on GPU or CPU, desktop or browser. I locked in :3
the map is alive You might wonder, why is bro devlogging so often? Wellll, i had this whole plan i wrote down a bit ago to commit when so that it’s not a 10000 line commit ( shudders in that happening before ) but I severely overestimated how long these things would take Most of the time not logged was testing, sigh i wish i could devlog that lolll hehe okay so the notes actually live on a map now. like they have positions, computed by the real layout engine, and you can drag the whole thing around and zoom. it’s a canvas!! a real one!! what and how so on boot (native), it spins up the LayoutEngine, drops every note in as a node, restores their saved positions if there are any, feeds in the links, and runs the layout to settle everything. then it builds two things for the UI: note cards (with x/y from the layout) and edges (lines between linked notes, computed from the endpoint positions). both get shoved into Slint models and the map renders them. add a new note and it gets added to the layout, re-stepped, and the cards + edges refresh. positions save back to storage when you close the app. the map-canvas. slint got the fun part: pan and zoom. a TouchArea catches pointer down/move to drag the camera around, scroll wheel zooms between 10% and 500%, and every card positions itself as (card.x - camera) * zoom. threw in viewport culling too so cards way off-screen just don’t render (visible: only if it’s within ~200px of the edges). and a little “N notes | zoom: X%” readout in the corner because I like knowing things. (it’s broken like most of this, we ignore that for now, polishing is later) my foolishness the whole thing is cfg-split for wasm because the GPU layout engine isn’t wired up on the browser side yet, so wasm gets a fallback that just lists the cards without real positions for now. desktop gets the full living map, browser gets the placeholder, both compile, nobody’s angry. (the wasm map is a TODO-shaped hole but it’s an silly one.) also had to expose universe.storage() so the UI can reach load_positions/save_positions, and added a small EdgeVM struct to carry line endpoints into Slint.
neighborhood steps actually mean something now so way back, I wrote step_neighborhood as a function that… just called step() . full graph. every time. with a little // Note: functionally equivalent to step() comment that was basically an “it’s fineeee” for now. it’s been sitting there mocking me… for months (no joke i had it at #1 on the mental todo after deleting Dioxus) not anymore! it does the real thing now. when you nudge one note, only the notes within ~400px of it recompute. everything past that radius stays frozen and acts as an anchor so the local cluster settles against the rest of the map instead of the whole universe re-jiggling every frame. this is the “atomic graph updates” idea from the original plan thing, finally real: touch one note, its neighborhood adjusts, the far-off constellations don’t even notice. Efficiency to make that not-slow I built a spatial hash. uniform grid, bucket nodes by cell, “give me everything within radius R” only checks the overlapping cells instead of all N nodes. the CPU layout uses it for the localized force pass (repulsion from local neighbors, springs to actual link partners even if they’re outside the neighborhood, gravity), and I also went back and ripped the O(n²) all-pairs loop out of the regular collision resolver and put it on the spatial hash too. that one was quietly quadratic this whole time and would’ve melted at a couple thousand notes. rebuild the hash each pass so pushed nodes land in their new cells. much better. Collisions? the collision resolver got a neighborhood-scoped twin as well, so a local step also only de-overlaps locally. nodes inside the neighborhood push each other apart normally; a node that’s an anchor outside it doesn’t move, so the inside node just gets shoved twice as hard away from it. felt like the right call. PERSISTENCE?! also taught storage about pins, separate workspace.pins.json file (refactored the workspace/pins file openers to share a state_file helper), and note cards carry a pinned flag now. Oh lines and there’s a whole new map module in the UI crate that generates the actual SVG-ish path strings: bezier edges between linked cards in screen coordinates, viewport culling so off-screen edges don’t get drawn, selected-neighborhood highlighting (the selected note’s edges render in the “selected” layer, everything else in “base”), and a grid path that anchors to the camera and clamps its own density so zooming way out doesn’t try to draw ten thousand grid lines. the map handling a lot of notes without choking was the thing I was VERY, VERY worried about. Not as much of a problem as I thought! :D
Broken but a working ish editor!!! you can WRITE in it now. like actually type words into a note and have them save. it’s janky but it works and I’m hyped. How the editor is block-based, which was the whole gamble. instead of one big textarea, a note is parsed into blocks (paragraphs, headings, code fences, etc) and you edit one block at a time. the active block shows its raw markdown so you can mess with the syntax, everything else renders. new session.rs in penumbra-editor holds all of it: EditorSession owns the list of BlockEdits, tracks which one’s active, and each block has a mode, Prose (renders as markdown, Enter splits into a new block), Heading (single line, Enter drops the tail into a paragraph below), and Raw (code, Enter is a literal newline). splitting a block at the cursor, merging, undo/redo with a 64-deep snapshot history. it’s a real little document editor. uhhh is it good? no! the commit message says “broken” and I mean it. the split logic has edge cases, the cursor does weird things, switching blocks is finicky. but you can open a note, type, and it round-trips to the markdown file on disk, which is the bar I set and it clears it. barely. hehe. yeah state is hard to make the editor and the layout worker both able to touch the graph, Universe’s graph is now an Arc<Mutex>. graph() hands back a guard, graph_handle() hands back the Arc for things that want to hold their own lock. had to sprinkle lock_graph() everywhere but it’s the honest cost of sharing state between the UI thread and the physics thread. oop forgot about this also implicit links persist now! the auto-associated links used to evaporate on restart because only explicit wikilinks got rebuilt from the files. now they save to their own file and get restored on open (skipping any whose notes are gone). so the constellations you didn’t draw by hand survive a relaunch too. eeh and the TODO… got GUTTED. so much got checked off I almost don’t believe it. Slint UI: done. map canvas v1 with pan/zoom/grid/edges/culling: done. spring animation so cards drift to their spots instead of teleporting: done. local neighborhood layout: done. pinned notes as fixed stars (pin via right-drag, right-tap to unpin, and left-dragging one nudges it back toward its pin): done. positions cached with throttled save + save-on-exit: done. physics running off the UI thread on the tokio runtime so the map doesn’t stutter while it’s solving: done. that whole “Slint” section of the roadmap is basically green now. new-note-pill.slint got added too, a little floating “new note” thing that’s partially broken. broken editor, but a broken editor that WORKS, which three months ago I could not have said about any part of the UI. we’re so back :3
Implement platform-specific modules approach like Saikuro okay so the ui/penumbra-ui/src/lib.rs had gotten GROSS. it was this soup of #[cfg(not(target_family = "wasm"))] and #[cfg(target_family = "wasm")] blocks sitting right next to each other, two versions of half the functions, the SharedState struct declared twice, the boot path forked inline. every time I added a thing I had to add it twice with the right cfg gate and it was exactly the kind of mess I swore off on day one. so I stole the pattern from Saikuro a platform module. now there’s src/platform/mod.rs that declares the shared interface, plus platform/native/mod.rs and platform/wasm/mod.rs behind one cfg switch at the top. the rest of the app just calls into platform:: and doesn’t care which one it got. all the two-versions-of-everything nonsense is now contained in exactly two files that never both compile at once, and lib.rs reads like a single coherent app again instead of a choose-your-own-adventure. it’s so much cleaner. while I was in the editor I also killed a dumb duplication: penumbra-editor had its OWN BlockKind enum that was just a lossy copy of the one in penumbra-markdown, with a whole block_kind() function to convert between them. why. they’re the same concept. so now the editor re-exports markdown’s BlockKind and clones it straight through, and that whole translation layer is gone.
Better editor the editor got a real display layer, and honestly most of the actual work here happened in the Slint live preview, just tweaking things until they looked right, so the hours logged don’t reflect it. same story for the last few commits, tbh, a lot of “sit in the preview and nudge” that Hackatime doesn’t see. oh well. anyway the thing that makes an editor feel like an editor is that the active block shows raw markdown but every other block renders nicely, and the piece that does that rendering is the new display module. it turns each block into the text you actually want to see. lists keep their markers because those go through the real markdown renderer. and tables, tables actually render as an aligned grid now, padded columns and a --- separator row, which looks so much better. there’s also scroll targeting given the active block, it works out where to scroll the editor so that block is comfortably in view. first block sits at zero, later blocks scroll proportionally, long bodies don’t leave you editing something off the bottom of the screen. wrote a chunk of tests for all of this the map got a zoom-to-card thing too click into a note and the camera zooms so the card fills the viewport width it’s great that’s what i wanted since the beginning tbh like that animation played in my head
Component library + live typing preview two things this commit first I pulled all the Slint components out of penumbra-ui into their own crate, penumbra-component. it’s a pure-markup library, no Rust logic, just .slint files: the Theme, all the block components (ProseBlock, HeadingBlock, QuoteBlock, CodeBlock, TableBlock, FootnoteBlock, HtmlBlock), the CanvasSurface, the TopBar, and PillButton (which used to be NewNotePill but I generalized it so it takes a text prop instead of hardcoding “New note”). there’s an index.slint that re-exports everything and now the app imports from @penumbra-component/index.slint like a real library. also why I did this: the live preview. I set up a slint library path in build.rs (and a .vscode/settings.json so the preview resolves @penumbra-component ), which means I can open any single component file and preview it in isolation instead of booting the whole app. given that basically all my UI work these days IS sitting in the preview nudging things, having the components be individually previewable is a massive quality-of-life win. also just cleaner, the editor-panel.slint used to have all seven block components copy-pasted inline at the top, like 200 lines of it, and now it just imports them. the VMs (BlockVM, NoteCardVM) moved to a data.slint too so the struct definitions aren’t tangled with the theme. second thing, and this is the fun one live preview while you type. before, the active block was just a raw text field, you’d type # Heading and see # Heading , and only once you clicked away did it render. now as you type, a little preview well under the input shows what the block WOULD render as, live. type # and it previews as a heading, type > and it’s a quote, type - and it’s a list. there’s a whole set of live_ functions (live_kind_name, live_display_text, live_heading_level, estimate_live_height) that route the currently-typed text through the same display logic the inactive blocks use, so you get instant feedback on your markdown without committing it. But it’s broken and weird and not working (see previous image) gosh might take a break from this and think about how to structure it again, Je n’aime pas ce désordre
Engine improvements ughhhhhhh i spent hours making “spikes” (is that what they’re called?) and it wasn’t counted cause slint live preview/editor = not hackatime-d sighhhh Oh well btw, hi, sorry for the random 1 month ish gap I come back, better at Slint, and with fresh motivation. okay so august 30 was my last commit and it is now october. in my defense i did not touch this once in that whole time which is either very bad or very healthy idk. but something clicked today and i opened it back up and immediately went “ew who wrote this” (me. it was me.) cough cough better engine so the editor had this whole situation in doc.rs where Document::new would parse the markdown into an ast, and then i had this convert_blocks function that walked through the blocks AND a second function called find_block_range that literally scanned the source bytes by hand looking for double newlines to guess where each block started and ended. like manually. byte by byte. offset += whatever. i genuinely cannot believe past me looked at that and went yeah ship it the thing is the parser already KNOWS where every block is. it has the offsets. it was just throwing them away and then i was reconstructing them with a worse, slower, buggier version downstream. so i added parse_blocks_offsets to the markdown parser so it just hands back (block, range) and now doc.rs is like. map over them, pull the range straight off, extract spans, collect. that’s it. find_block_range is gone. convert_blocks is gone. good riddance :3 also killed the edita-core dependency because it turns out i wasn’t actually using it for anything, it was just sitting in the Cargo.toml being decorative net result is like 1290 lines deleted vs 793 added which is my favorite kind of commit. deleting code that you wrote and were briefly proud of is so good for the soul hahaaaaa anyway the engine is better now (cough cough not)
SO GUESS WHAT I made a PR to big Slint itself!!!! https://github.com/slint-ui/slint/pull/14292 Basically… the markdown editor that Penumbra uses… is bad cause it’s a block style editor, which itself is hard to implement, and it’s not designed for markdown WYSIWYG. Double whammy Solution? Uhhh use cosmic-text and MAKE IT MYSELF BABYEEEEE In all seriousness tho, COSMIC text is so peak, truly universe-breaking. Well what’s the PR then? “This PR lets a FocusScope act as an input method (IME) client. That way, custom editing surfaces like rich text editors or code editors drawn with custom code can get composition events directly.” Aka, I stabilized an internal API and exposed it so that Penumbra can get a really cool editor....
|
1792803048.487678
|
1793407848.487678
|
|
62762
|
Hydrover by @bhanu-8215 | Stardance
|
bhanu-8215
|
0
|
14.45
|
0
|
[]
|
[{"post_id": 81406, "ts": "202 [{"post_id": 81406, "ts": "2026-10-21T05:02:33Z", "hours": 2.7667, "text": "DEVLOG-11: The sample collecting arm and tray is ready and also i figured out how to stop my sample ice for drilling from melting , so what i come up with is wraping a square box from silver foil paper from inside and with thermocol from outside to provide insulation from surrounding heat . And one more thing i have to built the suspension again because of wrong measurements ."}, {"post_id": 80888, "ts": "2026-10-19T05:24:52Z", "hours": 1.6094, "text": "DEVLOG-10 : Finally the arm of my rover is taking shape . what remains is its sample collecting tray and a mechanism through which it rm can deliver sample collected to onboard sample collecting tray ."}, {"post_id": 78446, "ts": "2026-10-10T20:17:34Z", "hours": 0.5481, "text": "DEVLOG 9 : This is my first time writing code . I have been watching tutorials and videos to learn how to code ."}, {"post_id": 76698, "ts": "2026-10-04T11:25:19Z", "hours": 0.7433, "text": "Devlog - 8 : All the tires are installed and i wired all the motors temporary to check its body structure and suspension ."}, {"post_id": 76678, "ts": "2026-10-04T10:15:03Z", "hours": 1.1658, "text": "Devlog - 7 : Today i do all the soldering work ."}, {"post_id": 75580, "ts": "2026-09-30T14:09:34Z", "hours": 0.3364, "text": "Devlog - 6 : Reporting back after a long break . The designing of the driler and arm of my rover is completed ."}, {"post_id": 72288, "ts": "2026-09-22T16:18:53Z", "hours": 1.2039, "text": "just make rover structure stand ."}, {"post_id": 71888, "ts": "2026-09-21T18:16:19Z", "hours": 2.2897, "text": "Devlog - 4: Suspension work is almost completed ."}, {"post_id": 71606, "ts": "2026-09-21T04:48:49Z", "hours": 1.6181, "text": "Devlog-3 : the work on ground has started . I has made a very basic shape for my rover."}, {"post_id": 71148, "ts": "2026-09-20T11:00:39Z", "hours": 1.0219, "text": "DEVLOG-2 : Now my plan has changed instead of sodium ion rover I am now designing a rover to conduct experiments about future fuels for outer space on our moon with water present their . Therefore name is changed to Hydrover from so-lo."}, {"post_id": 70296, "ts": "2026-09-18T21:54:27Z", "hours": 1.1442, "text": "I am building a space rover powered by a sodium ion battery . This battery pack will help it to function even in very harsh temperature .Now I have a clear plan and diagrames to work on it . most of my time is spend in researching because the design of space rovers are very complex."}]...
|
Title: Hydrover by @bhanu-8215 | Stardance
Devlog Title: Hydrover by @bhanu-8215 | Stardance
Devlogs:
I am building a space rover powered by a sodium ion battery . This battery pack will help it to function even in very harsh temperature .Now I have a clear plan and diagrames to work on it . most of my time is spend in researching because the design of space rovers are very complex.
DEVLOG-2 : Now my plan has changed instead of sodium ion rover I am now designing a rover to conduct experiments about future fuels for outer space on our moon with water present their . Therefore name is changed to Hydrover from so-lo.
Devlog-3 : the work on ground has started . I has made a very basic shape for my rover.
Devlog - 4: Suspension work is almost completed .
just make rover structure stand .
Devlog - 6 : Reporting back after a long break . The designing of the driler and arm of my rover is completed .
Devlog - 7 : Today i do all the soldering work .
Devlog - 8 : All the tires are installed and i wired all the motors temporary to check its body structure and suspension .
DEVLOG 9 : This is my first time writing code . I have been watching tutorials and videos to learn how to code .
DEVLOG-10 : Finally the arm of my rover is taking shape . what remains is its sample collecting tray and a mechanism through which it rm can deliver sample collected to onboard sample collecting tray .
DEVLOG-11: The sample collecting arm and tray is ready and also i figured out how to stop my sample ice for drilling from melting , so what i come up with is wraping a square box from silver foil paper from inside and with thermocol from outside to provide insulation from surrounding heat . And one more thing i have to built the suspension again because of wrong measurements ....
|
1793047776.501458
|
1793652576.501458
|
|
69244
|
Fort-os by @mason_davies | Stardance
|
mason_davies
|
2
|
9.0
|
20
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T04:15:21Z", "hours": 4.0, "multiplier": 5.14, "payout": 20, "blessing": "neutral", "text": "For this ship I updated some of the apps so that they look a little better and then I also made: Search engine (Google) Tracker app Recent Apps Page Welcome page only opens on your first time Notes save between sessions", "repo": "https://github.com/MasonDavies/my-os", "demo": "https://masondavies.github.io/my-os/"}, {"ship_num": 2, "ts": "2026-10-12T06:47:17Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Fortnite Inspired Web OS that has 2 apps: An App for taking notes for strategy and an app that you can paint on and clear to plan your game out. It also displays the current date and time in the top right corner", "repo": "https://github.com/MasonDavies/my-os", "demo": "https://masondavies.github.io/my-os/"}]...
|
[{"post_id": 81399, "ts": "202 [{"post_id": 81399, "ts": "2026-10-21T04:10:42Z", "hours": 3.8092, "text": "I missed a couple devlogs so I’ll just put everything from the last few sessions here because Its ready to ship. What I worked on Killing Bugs Recent apps system in the Home window. Prevented duplicate apps in the recent apps list. Removed Top Bar and replaced it with a taskbar on the bottom Bottom Bar shows currently opened apps App that directly connects to Fortnite tracker Search engine app Button to full screen apps that are able to"}, {"post_id": 78960, "ts": "2026-10-12T06:02:42Z", "hours": 0.9631, "text": "Final touches: Made a paint app where you paint on the current season’s map Made Making new apps even easier by making it into 1 function Arranged the apps into rows"}, {"post_id": 78950, "ts": "2026-10-12T05:01:33Z", "hours": 1.2281, "text": "What I did this time around: Created First app: Strategy Notes Made new functions for making windows easier Top Bar always on top The window that you last interacted with will be on top of the other windows"}, {"post_id": 78945, "ts": "2026-10-12T03:39:35Z", "hours": 2.0761, "text": "After 2 hours of experimenting with styles and JavaScript, here’s what I got done this time: Added a top bar that has the OS name, date, and time Added welcome window Added new styling file to hold the styles for each class Made windows draggable and closable"}, {"post_id": 78905, "ts": "2026-10-12T00:15:15Z", "hours": 0.3942, "text": "I started creating the welcome screen for my operating system. I decided to make it Fortnite themed because It’s my favorite video game. What I did: Added Fortnite picture from chapter 2 Styled body text Changed the background color"}]...
|
Title: Fort-os by @mason_davies | Stardance
Devlo Title: Fort-os by @mason_davies | Stardance
Devlogs:
I started creating the welcome screen for my operating system. I decided to make it Fortnite themed because It’s my favorite video game. What I did: Added Fortnite picture from chapter 2 Styled body text Changed the background color
After 2 hours of experimenting with styles and JavaScript, here’s what I got done this time: Added a top bar that has the OS name, date, and time Added welcome window Added new styling file to hold the styles for each class Made windows draggable and closable
What I did this time around: Created First app: Strategy Notes Made new functions for making windows easier Top Bar always on top The window that you last interacted with will be on top of the other windows
Final touches: Made a paint app where you paint on the current season’s map Made Making new apps even easier by making it into 1 function Arranged the apps into rows
I missed a couple devlogs so I’ll just put everything from the last few sessions here because Its ready to ship. What I worked on Killing Bugs Recent apps system in the Home window. Prevented duplicate apps in the recent apps list. Removed Top Bar and replaced it with a taskbar on the bottom Bottom Bar shows currently opened apps App that directly connects to Fortnite tracker Search engine app Button to full screen apps that are able to
Ships:
I made a Fortnite Inspired Web OS that has 2 apps: An App for taking notes for strategy and an app that you can paint on and clear to plan your game out. It also displays the current date and time in the top right corner
For this ship I updated some of the apps so that they look a little better and then I also made: Search engine (Google) Tracker app Recent Apps Page Welcome page only opens on your first time Notes save between sessions...
|
1793217351.6069758
|
1793303751.6069758
|
|
70714
|
priyanshu's site by @kpk22128 | Stardance
|
kpk22128
|
0
|
0.33
|
0
|
[]
|
[{"post_id": 81396, "ts": "202 [{"post_id": 81396, "ts": "2026-10-21T03:35:26Z", "hours": 0.3261, "text": "Made the homepage design using html and css and minimal js. Working on next sections."}]...
|
Title: priyanshu's site by @kpk22128 | Stardan Title: priyanshu's site by @kpk22128 | Stardance
Devlogs:
Made the homepage design using html and css and minimal js. Working on next sections....
|
1792554445.7592695
|
1793159245.7592695
|
|
37513
|
spatial computing web by @nicha | Stardance
|
nicha
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T03:43:54Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "For my school research assessment, I created website to compile my research on Spatial computing. This was my first website and first time using Github so I learnt many new skills and encountered many challenges such as… differentiating flexbox and grid in HTML figuring out how to commit changes in Github working CSS and figuring how it effects text I only made this to present my research, which is why I decided to only use HTML and CSS for it. I’m rather proud of my first website because of the amount of new things i’ve learnt despite the project being rather basic and small. In my next websites, I aim to incorporate JavaScript as well and experiment with animations.", "repo": "https://github.com/nmek-tale/spatialcomputing-website", "demo": "https://nmek-tale.github.io/spatialcomputing-website/"}]...
|
[{"post_id": 81393, "ts": "202 [{"post_id": 81393, "ts": "2026-10-21T03:31:24Z", "hours": 0.8833, "text": "README file I had difficulties committing changes to github, especially the readme files. I ended up having to refresh project files via terminal"}, {"post_id": 46754, "ts": "2026-08-14T07:27:23Z", "hours": 1.7336, "text": "Created the hero section of the website. I learnt and tried using the grid based layout system to organise it."}, {"post_id": 46302, "ts": "2026-08-13T13:08:48Z", "hours": 4.5981, "text": "Made a banner than sits as a separator between the reference links and research. Took a bit of trial and error to get what I envisioned: still image while the scrolling reveals what the rectangle is framing."}, {"post_id": 45649, "ts": "2026-08-12T08:50:38Z", "hours": 3.1692, "text": "I ended up scrapping the top navigation bar and moved it to the side. I had to do a bit of research to figure out how to get it to stick when i scroll it but i got there in the end."}]...
|
Title: spatial computing web by @nicha | Stardance Title: spatial computing web by @nicha | Stardance
Devlogs:
I ended up scrapping the top navigation bar and moved it to the side. I had to do a bit of research to figure out how to get it to stick when i scroll it but i got there in the end.
Made a banner than sits as a separator between the reference links and research. Took a bit of trial and error to get what I envisioned: still image while the scrolling reveals what the rectangle is framing.
Created the hero section of the website. I learnt and tried using the grid based layout system to organise it.
README file I had difficulties committing changes to github, especially the readme files. I ended up having to refresh project files via terminal
Ships:
For my school research assessment, I created website to compile my research on Spatial computing. This was my first website and first time using Github so I learnt many new skills and encountered many challenges such as… differentiating flexbox and grid in HTML figuring out how to commit changes in Github working CSS and figuring how it effects text I only made this to present my research, which is why I decided to only use HTML and CSS for it. I’m rather proud of my first website because of the amount of new things i’ve learnt despite the project being rather basic and small. In my next websites, I aim to incorporate JavaScript as well and experiment with animations....
|
1793210119.21881
|
1793296519.21881
|
|
37455
|
MacForms by @tonymac129 | Stardance
|
tonymac129
|
1
|
38.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T03:17:27Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I finally finished MacForms, an extensive, customizable, and feature-rich form creation tool for you to create surveys, forms, and quizzes with question options like multiple choice, multiple select, short answer, long answer, and more! To use it, simply sign in to a MacWeb account or select guest mode (which hopefully reduces voting friction). There are also a lot of different form settings for presentation, response management, quiz accuracy, visibility, and public/private forms, as well as options to invite collaborators to work on and manage the form together. You can browse other people’s forms and search your own forms as well. You can also visualize and view response statistics and individual responses with graphs and question response lists. The entire platform supports light/dark mode, smooth animations and transition effects, responsive design, accessibility, and SEO, as well as other quality of life improvements that hopefully make the website’s UI and UX more intuitive and user friendly. The codebase is surprisingly complex (and poorly organized :( , but I somehow managed to make everything work as expected. I really had a lot of fun working on and trying out this project myself, so hopefully yall will like it too :)", "repo": "https://github.com/Mac-Web/macforms", "demo": "https://macforms.macweb.app"}]...
|
[{"post_id": 81391, "ts": "202 [{"post_id": 81391, "ts": "2026-10-21T03:10:05Z", "hours": 0.9758, "text": "Quick final devlog before shipping!!! I finally finished all the features, customization, and everything else I planned to implement for MacForms after working (but mostly procrastinating) on it for more than 3 months ! I have no clue why this wasn’t done earlier, but I added a multiple select option for multiple choice questions to allow respondents to select multiple options (which also works with quizzes and other edge cases) Similarly, I also added an option to mark free response/text questions as having a long answer to render a textarea instead of the normal input field for more customization I already added most of these features while planning out the types and schemas, but somehow never implemented it, so it was kind of confusing but I was able to create them more quickly and easily that I’d expected Added guest mode so yall can actually try out the form engine without signing up (is that low enough friction for you guys ) Updated styling and readme Polished some other stuff for shipping! I’ve already wasted so much of Stardance’s extension not shipping any of my projects , so I panicked when I realized there was only 10 days left and forced myself to actually get to work and finish this project, hopefully you’ll enjoy and like it as much as I do :)"}, {"post_id": 78807, "ts": "2026-10-11T17:45:46Z", "hours": 2.6433, "text": "Individual responses and form options You can now also see, select, and manage each individual response to view in detail instead of only seeing summary graphs/tables of all the responses combined There’s a new dropdown on the form responses page where you can either view the summary stats/answers of all responses (default), or select every individual response to view its answer to each question, submission/edit date and time, accuracy (if the form is a quiz), as well as an option to delete the response after confirmation to make viewing responses easier and more useful If you make your form a quiz and designate certain questions as having correct answers, you can now finally select one or multiple options to all be correct for each question! This took a surprisingly long time since I had to fix a lot of bugs based on the old system Added sorting, filtering, and ordering dropdowns and options to the public form browse page to make finding and viewing different forms a lot easier I just realized there are a few bugs in prod while recording the video, so looks like more fun bug fixing in the next devlog Updated types and backend schemas to accept the new options Updated styling and colors I am now dedicating most of my time on (really amazing event btw), so I can only work on trying to finish and ship my Stardance projects on the little time I have on weekends, so hopefully I’ll be able to ship MacForms this weekend and finally finish my other Stardance projects before it ends"}, {"post_id": 76896, "ts": "2026-10-04T23:55:06Z", "hours": 3.3086, "text": "A bunch of small additions and changes! Added the Browse tab where you can see all the published public forms that other people made on MacForms! You can explore all the different forms easily with the search bar Finally added a nav search bar that actually works (instead of the old placeholder) by querying the new API endpoint for either your own forms or other people’s public forms so you can access everything faster and more easily Search results are matched by both title and description to be more useful, and your own forms take you directly to the edit page while others’ forms take you to the form filling page Added a bunch of smooth animations and transition effects for page loads, interactions, and search/filter results to improve user experience and interactivity Added responsive design on all the pages and components so MacForms is accessible and functional on all screen sizes Added feature description sections, icons, and buttons on the home landing page I have no idea why this was even a thing before, but now you can actually access the form pages and fill out the forms without being logged in Apparently my thought all get requests had to pass the auth gate or something, but now it’s fixed Removed the Settings tab (not form settings), because I couldn’t figure out anything to put there since I already have account settings on MacWeb, a separate form settings tab, and a dark/light mode toggle Updated styling and layout Fixed a few display bugs"}, {"post_id": 72023, "ts": "2026-09-22T00:50:01Z", "hours": 4.1978, "text": "MacForms is back: form settings and light mode! After taking a break from working on MacForms for 2 months to work on other projects, prepare for school, and do a lot of other stuff, I’m finally back to developing this project and getting it ready to ship before Stardance ends in 9 days! (plz extend the end date ) In this pretty massive devlog, I added a new settings tab to the form editing page where you can customize the published form’s presentation and many other options here are the settings I implemented, there might be other important stuff I forgot: whether to shuffle questions randomly whether to shuffle the multiple choice options for each question a custom background color for the top banner allow respondents to submit another response allow respondents to edit their submitted responses Because I couldn’t figure out a way (if there is one) to implement the last 2 without using accounts or cookies, if a form has either of the 2 enabled, you’ll need to sign in first to fill out the form Added a light/dark mode toggle option to the nav user dropdown menu for you to easily customize the site’s appearance and switch between light and dark modes Since I had to manually go through basically every component and page of the entire platform to modify the elements’ Tailwind classes for this, it also gave me a chance to refresh my memory of the project’s structure and how it works because I was gone for so long Going through all the files and testing the 2 modes was a long and tedious process, but the result turned out pretty well, both are consistent and visually appealing, and there’s also a smooth color transition Added a top loading indicator bar to improve the UX since some pages take a bit to load and the site may look unresponsive without the loading bar Fixed a few math bugs with 0s and NaNs and display bugs with the colors, layout, placeholder, and other styling Because Stardance is ending so soon and because of my procrastination and laziness, I’m going to have to cut a lot of the originally planned features before shipping since I have another big project to ship, so hopefully I can finish some last few features and polish MacForms and ship it soon!"}, {"post_id": 37716, "ts": "2026-07-30T16:54:37Z", "hours": 1.9336, "text": "Publish & share form You can now publish and share your forms for the rest of the world to see and fill out! Clicking on the publish button on the tool bar now opens a modal where you can either publish/unpublish the form or copy the link and send it to people If the form is already published, you can see its public link and an option to shorten it. Shortening it creates a unique 8-digit shortcut id for the form that redirects you to the main form (I’m planning on shortening it even more by buying a cool short domain or something, but that’s probably not gonna happen any time soon) You can also unpublish the form after a confirmation warning by clicking on the unpublish button If the form hasn’t been published yet, you can publish it by clicking on the publish button (in case this isn’t already obvious ) Updated some permissions so collaborators can also manage the form’s publication visibility status (instead of only the owner) Updated schema and types"}, {"post_id": 37141, "ts": "2026-07-29T17:06:56Z", "hours": 2.0547, "text": "Score distribution & autosave Added a quiz results summary section on the responses tab that shows some useful statistics about the scores as well as a histogram showing the score distribution if your form is a quiz It dynamically calculates scores based on the latest updated quiz, then organizes them and calculates their mean, median, min, and max in percentages It also renders a custom histogram with bins of 10 ranging from 0 to 100 so you can visualize how well your respondents did in one glance (server rendered + no Chart.js or external libraries = almost instantaneous load time) The histogram also shows the percentages of scores, and you can see how many responses are in each bin by hovering over the bar There’s also a view scores button that displays a modal showing each individual score Added autosave for editing forms that autosaves the entire form in the background every minute without revalidating the frontend to ensure smooth UX. The bar also shows the autosave status for a few seconds telling you it autosaved Added collaborator access so they can actually edit and manage the form and view responses without getting redirected. Updated some backend operations to ensure permissions are correct as well Fixed form editing so it actually updates the form and each question individually instead of creating a completely new set of it and neglecting the originally existing relations (~50 lines of code for one database transaction , but Prisma is actually so nice 🥹) Added filters and sort methods for shared forms vs forms you own (shared forms now display on the forms page)"}, {"post_id": 36789, "ts": "2026-07-29T02:03:54Z", "hours": 2.9133, "text": "Invite collaborators & update form You can now invite collaborators that will have access to edit the form, see its responses, and manage its settings! Only the form owner/creator can delete the form and invite and remove people, but invited people can basically do everything else On the invite modal page, you can search for MacWeb accounts by their name, email, or about through an API endpoint I added, and select multiple people to invite to the form at once Once you send out the invitation, you’ll see the users added to the form on the modal, and you can remove their access by clicking on the trash icon as well There isn’t real time form collaborative editing (at least not yet, though I don’t plan on overcomplicating a simple form app to be like Google Forms ), but changes you make to the form are revalidated the moment you click on save You can now actually edit and update your form by going to the edit tab and editing the form and its questions. This was actually fairly easy to implement since I just had to use the component used for the form creation page and update a few things Optimized database operations and API calls Updated schema and types Updated styling"}, {"post_id": 36475, "ts": "2026-07-28T16:42:14Z", "hours": 3.4131, "text": "Edit form & response pages Finally added the form editing page where you’ll be able to edit the entire form (title, description, questions, etc.), view response summaries and statistics, and configure its submission settings and other defaults When you click on one of your forms on the forms tab, you get redirected to the edit page that has a top utility bar with the form’s name displayed (you can rename the form by clicking on it) and 3 tabs for you to switch between edit, response, and settings modes On the right of the bar, there’s also an invite button, a preview form button, and a publish button (currently doesn’t work yet ) Clicking on the invite button opens a modal where you can either invite another MacWeb account to be a permanent collaborator (of course it doesn’t work yet), or generate a one-time single-use invite link/code that allows anyone (with or without an account) with the access code to edit the form using a custom access token cookie that expires after an hour Making this cookie access thing work was actually a bit more complicated than I thought, so I spent some time debugging the logic but it was pretty fun When you use the access code to edit a form, a page shows up confirming the access, and invalidates the code after confirming When you click on the responses tab, you can see all the responses and answers grouped by question to make visualizing and summarizing people’s responses a lot easier (definitely didn’t take inspo from Google Forms ) If the question is multiple choice, it shows how many responses each option got with percentages and presents it in sort of a bar graph If the question is free responses, it just lists each response Added placeholder tabs for editing and settings Added SEO for these tabs Updated types and schema Updated styling"}, {"post_id": 36034, "ts": "2026-07-27T21:08:54Z", "hours": 1.2928, "text": "Sorting & filtering Added sorting, filtering, and ordering dropdowns to the forms page so you can better browse and search through your forms! You can sort the forms by name, date created, type, starred, and more, and you can filter them by quiz, starred, private, and open. You can change the display order between descending and ascending as well Added form starring so you can now star/favorite/pin your most important forms directly by clicking on the star icon on the form card, or by clicking on the star option in the popup menu Added icons to form cards to better display the form’s information and attributes Added an access lock page for private forms that prompts for the access code, and it only shows the questions and allows you to fill out the form after verifying successfully Added a form not open page that shows if a form isn’t open (isn’t published), but if you’re the owner you can still see it with preview mode Updated schema and types Updated layout and styling"}, {"post_id": 35556, "ts": "2026-07-27T02:15:20Z", "hours": 2.9525, "text": "Form management & quizzes Added the Forms page where you can browse, search, view, and manage all the forms you created (you’ll be able to filter and sort them to browse and search through them more easily in the future) Each form is displayed as a card with a placeholder icon, title, shortened description preview, and creation date listed When you click on the 3 dots option button a menu shows up where you can edit the form (takes you to edit page), preview it (takes you to submission page but in preview mode), or delete it Preview mode only activates when you own the form, are logged in, and the link has the preview search param. In this mode, you can fill out the questions but can’t submit it, and you can go back to the edit page by clicking on the x icon When you click on delete, a confirmation modal shows up, and only deletes your form after confirmation so you don’t accidentally delete stuff Added quiz mode to forms so you can create quizzes with correct answers (for both multiple choice and free response questions) and see how your respondents do! On the quiz creation page, you can check the quiz checkbox to turn the form into a quiz, and you can customize each question individually to either accept a correct answer (multiselect coming soon) or to allow all choices If you fill out a form that’s a quiz, you will be able to see your score and accuracy (but not the correct answer) after submitting it Implementing the logic and types for quizzes was kind of a pain but I still managed to fix all the weird edge case bugs Added both static and dynamically generated SEO metadata across all pages on MacForms to make the site more accessible and user friendly Added a placeholder settings page You can now delete questions after a confirmation modal on the form creation page if you have multiple questions Updated styling and types Updated README This is a pretty big update that covers a ton of features, so the video is 3 minutes long and I had to compress it like 2 times…"}, {"post_id": 35426, "ts": "2026-07-26T20:31:56Z", "hours": 2.69, "text": "Form responses Added an actual public facing form submission page where anyone (regardless of whether or not they’re logged in) can fill out a form and submit their response On the response submission page, you can see the form’s title, description, creation date, all the questions and their choices/inputs rendered correctly, a submit button that submits your response, and a clear button that will clear everything you filled in after showing a confirmation modal If you haven’t filled out all the required fields before submitting, it shows a helpful warning message that tells you to fill out the options You can deselect your choice for a multiple choice question if it’s not required by clicking on the same choice again (but this isn’t allowed for required questions because duh ) Public/private forms aren’t implemented yet so the moment you create a form it’s respondable by anyone Once you submit your response, a response confirmation page will display confirming your submission, and it also shows an edit response option, as well as a submit another response option Response editing works by adding a search param with your response id after the form page path, so it dynamically fetches your response data and fills it in automatically The submit another response option just refreshes the page to create a new blank response state object Added a different layout for the form submission page (since nav and footer aren’t needed), so I had to reorganize the routes and folders into logical groups to make different layouts work Added schema and types for response data Updated styling and navigation"}, {"post_id": 34381, "ts": "2026-07-25T01:33:02Z", "hours": 3.0203, "text": "Form submission & auth Finally added backend form submission so when you click on save on the form creation page after filling in all the values, it gets created and added to the database When you click on save, MacForms validates all your new form’s values (title, description, etc.), as well as each question’s choices to make sure everything’s filled out properly If you’re missing fields or something isn’t validated, a helpful error message will appear telling you what to fix Once you successfully submit the new form, you get redirected to the form editing page where you will be able to edit it, change its settings, check the preview, and publish it (the page isn’t implemented yet) You can also delete options/choices for multiple choice questions, as long as there’s at least one available choice If you’re logged in, you can see your profile icon displayed on the right of the nav bar, and clicking on it opens a menu where you can view your account profile (redirects you back to MacWeb), toggle light/dark mode (doesn’t work yet), and log out I spent a ton of time trying to debug and make the log out thing work because of this entire cross subdomain auth thing that just makes everything super complicated and frustrating, but I figured it out and fixed it by changing a few auth configs Designed and added the MacForms logo (just a list icon on a green background) to the nav bar and the site favicon. The design is pretty terrible, hopefully I’ll come up with a better design Also spent a lot of time testing to ensure the app, especially auth, works both locally in dev environment and in production Added a helper function to fetch form data from Prisma, destructure and sanitize the data, and do some conditional typing to match the types and ensure type safety Updated README to be more informative on dev setup since there’s quite a few steps for setup and I don’t wanna forget them in the future Updated schema and types"}, {"post_id": 33842, "ts": "2026-07-24T02:42:42Z", "hours": 5.1803, "text": "Form creation & homepage I forgot to add devlogs for a couple days, so this devlog will be a bit long and cover a ton of changes Added a basic homepage with a hero that has a title, description, and some call to action buttons, and a few sections that are just placeholder text and images for now to fill the layout Added a navigation bar at the top with links to a few pages and an interactive search bar that doesn’t actually work yet (since there’s nothing to search) Copied the MacWeb footer and changed some links and styling to add the footer Auth isn’t completely set up yet, so a few things aren’t being displayed properly. Even if you’re not logged in, you can still access the form creation page, it just doesn’t do anything yet On the form creation page (that is a form itself), you can fill in the form’s name, description, visibility (making it private requires an access code, which you can generate or type in manually), and whether it’s accepting responses You can add new questions by clicking on the add question card, which shows a new question where you can select its type (only multiple and text are supported right now), set the question and description, set it as required/optional, and add answer choices or set the input placeholder depending on the question type The backend for making and publishing forms isn’t set up yet, so it’s only the frontend that doesn’t actually do anything Adding types for the form, questions, and answer choices was a huge pain because I had to set up a type map, extract its keys, and use them to dynamically construct type unions and some other advanced stuff for to dynamically infer option types based on the question type, and it was a huge headache to figure out Updated Prisma schema and added other types Updated styling and navigation"}, {"post_id": 31522, "ts": "2026-07-20T00:22:55Z", "hours": 1.3511, "text": "MacForms: simple but customizable form creation tool I’m building MacForms, an easy to use form creation tool with a lot of features and customization! This is actually a subapp of my online platform MacWeb with many different apps you can try out I started this app because I have to make a form for a few people to fill out, and instead of using Google Forms or Notion like a weirdo, I decided to make my own form tool and use it to make the form like a totally normal person Since this is a subapp of the main platform, it shares the same auth and database system with the other apps, so I had to update and migrate a ton of stuff on the root domain before I could start working on this app The auth system was also challenging to configure properly, but I figured out how to share cookie sessions across subdomains for my account system after a few hours of painful debugging After the root domain was migrated and updated properly, I could finally start working on MacForms and set up the project and its dependencies Currently there isn’t much since auth took so much time to work, but the hardest part is finished, so hopefully the rest of development will be smoother Also set up some DNS and Vercel records for the real domain to work"}]...
|
Title: MacForms by @tonymac129 | Stardance
Devlog Title: MacForms by @tonymac129 | Stardance
Devlogs:
MacForms: simple but customizable form creation tool I’m building MacForms, an easy to use form creation tool with a lot of features and customization! This is actually a subapp of my online platform MacWeb with many different apps you can try out I started this app because I have to make a form for a few people to fill out, and instead of using Google Forms or Notion like a weirdo, I decided to make my own form tool and use it to make the form like a totally normal person Since this is a subapp of the main platform, it shares the same auth and database system with the other apps, so I had to update and migrate a ton of stuff on the root domain before I could start working on this app The auth system was also challenging to configure properly, but I figured out how to share cookie sessions across subdomains for my account system after a few hours of painful debugging After the root domain was migrated and updated properly, I could finally start working on MacForms and set up the project and its dependencies Currently there isn’t much since auth took so much time to work, but the hardest part is finished, so hopefully the rest of development will be smoother Also set up some DNS and Vercel records for the real domain to work
Form creation & homepage I forgot to add devlogs for a couple days, so this devlog will be a bit long and cover a ton of changes Added a basic homepage with a hero that has a title, description, and some call to action buttons, and a few sections that are just placeholder text and images for now to fill the layout Added a navigation bar at the top with links to a few pages and an interactive search bar that doesn’t actually work yet (since there’s nothing to search) Copied the MacWeb footer and changed some links and styling to add the footer Auth isn’t completely set up yet, so a few things aren’t being displayed properly. Even if you’re not logged in, you can still access the form creation page, it just doesn’t do anything yet On the form creation page (that is a form itself), you can fill in the form’s name, description, visibility (making it private requires an access code, which you can generate or type in manually), and whether it’s accepting responses You can add new questions by clicking on the add question card, which shows a new question where you can select its type (only multiple and text are supported right now), set the question and description, set it as required/optional, and add answer choices or set the input placeholder depending on the question type The backend for making and publishing forms isn’t set up yet, so it’s only the frontend that doesn’t actually do anything Adding types for the form, questions, and answer choices was a huge pain because I had to set up a type map, extract its keys, and use them to dynamically construct type unions and some other advanced stuff for to dynamically infer option types based on the question type, and it was a huge headache to figure out Updated Prisma schema and added other types Updated styling and navigation
Form submission & auth Finally added backend form submission so when you click on save on the form creation page after filling in all the values, it gets created and added to the database When you click on save, MacForms validates all your new form’s values (title, description, etc.), as well as each question’s choices to make sure everything’s filled out properly If you’re missing fields or something isn’t validated, a helpful error message will appear telling you what to fix Once you successfully submit the new form, you get redirected to the form editing page where you will be able to edit it, change its settings, check the preview, and publish it (the page isn’t implemented yet) You can also delete options/choices for multiple choice questions, as long as there’s at least one available choice If you’re logged in, you can see your profile icon displayed on the right of the nav bar, and clicking on it opens a menu where you can view your account profile (redirects you back to MacWeb), toggle light/dark mode (doesn’t work yet), and log out I spent a ton of time trying to debug and make the log out thing work because of this entire cross subdomain auth thing that just makes everything super complicated and frustrating, but I figured it out and fixed it by changing a few auth configs Designed and added the MacForms logo (just a list icon on a green background) to the nav bar and the site favicon. The design is pretty terrible, hopefully I’ll come up with a better design Also spent a lot of time testing to ensure the app, especially auth, works both locally in dev environment and in production Added a helper function to fetch form data from Prisma, destructure and sanitize the data, and do some conditional typing to match the types and ensure type safety Updated README to be more informative on dev setup since there’s quite a few steps for setup and I don’t wanna forget them in the future Updated schema and types
Form responses Added an actual public facing form submission page where anyone (regardless of whether or not they’re logged in) can fill out a form and submit their response On the response submission page, you can see the form’s title, description, creation date, all the questions and their choices/inputs rendered correctly, a submit button that submits your response, and a clear button that will clear everything you filled in after showing a confirmation modal If you haven’t filled out all the required fields before submitting, it shows a helpful warning message that tells you to fill out the options You can deselect your choice for a multiple choice question if it’s not required by clicking on the same choice again (but this isn’t allowed for required questions because duh ) Public/private forms aren’t implemented yet so the moment you create a form it’s respondable by anyone Once you submit your response, a response confirmation page will display confirming your submission, and it also shows an edit response option, as well as a submit another response option Response editing works by adding a search param with your response id after the form page path, so it dynamically fetches your response data and fills it in automatically The submit another response option just refreshes the page to create a new blank response state object Added a different layout for the form submission page (since nav and footer aren’t needed), so I had to reorganize the routes and folders into logical groups to make different layouts work Added schema and types for response data Updated styling and navigation
Form management & quizzes Added the Forms page where you can browse, search, view, and manage all the forms you created (you’ll be able to filter and sort them to browse and search through them more easily in the future) Each form is displayed as a card with a placeholder icon, title, shortened description preview, and creation date listed When you click on the 3 dots option button a menu shows up where you can edit the form (takes you to edit page), preview it (takes you to submission page but in preview mode), or delete it Preview mode only activates when you own the form, are logged in, and the link has the preview search param. In this mode, you can fill out the questions but can’t submit it, and you can go back to the edit page by clicking on the x icon When you click on delete, a confirmation modal shows up, and only deletes your form after confirmation so you don’t accidentally delete stuff Added quiz mode to forms so you can create quizzes with correct answers (for both multiple choice and free response questions) and see how your respondents do! On the quiz creation page, you can check the quiz checkbox to turn the form into a quiz, and you can customize each question individually to either accept a correct answer (multiselect coming soon) or to allow all choices If you fill out a form that’s a quiz, you will be able to see your score and accuracy (but not the correct answer) after submitting it Implementing the logic and types for quizzes was kind of a pain but I still managed to fix all the weird edge case bugs Added both static and dynamically generated SEO metadata across all pages on MacForms to make the site more accessible and user friendly Added a placeholder settings page You can now delete questions after a confirmation modal on the form creation page if you have multiple questions Updated styling and types Updated README This is a pretty big update that covers a ton of features, so the video is 3 minutes long and I had to compress it like 2 times…
Sorting & filtering Added sorting, filtering, and ordering dropdowns to the forms page so you can better browse and search through your forms! You can sort the forms by name, date created, type, starred, and more, and you can filter them by quiz, starred, private, and open. You can change the display order between descending and ascending as well Added form starring so you can now star/favorite/pin your most important forms directly by clicking on the star icon on the form card, or by clicking on the star option in the popup menu Added icons to form cards to better display the form’s information and attributes Added an access lock page for private forms that prompts for the access code, and it only shows the questions and allows you to fill out the form after verifying successfully Added a form not open page that shows if a form isn’t open (isn’t published), but if you’re the owner you can still see it with preview mode Updated schema and types Updated layout and styling
Edit form & response pages Finally added the form editing page where you’ll be able to edit the entire form (title, description, questions, etc.), view response summaries and statistics, and configure its submission settings and other defaults When you click on one of your forms on the forms tab, you get redirected to the edit page that has a top utility bar with the form’s name displayed (you can rename the form by clicking on it) and 3 tabs for you to switch between edit, response, and settings modes On the right of the bar, there’s also an invite button, a preview form button, and a publish button (currently doesn’t work yet ) Clicking on the invite button opens a modal where you can either invite another MacWeb account to be a permanent collaborator (of course it doesn’t work yet), or generate a one-time single-use invite link/code that allows anyone (with or without an account) with the access code to edit the form using a custom access token cookie that expires after an hour Making this cookie access thing work was actually a bit more complicated than I thought, so I spent some time debugging the logic but it was pretty fun When you use the access code to edit a form, a page shows up confirming the access, and invalidates the code after confirming When you click on the responses tab, you can see all the responses and answers grouped by question to make visualizing and summarizing people’s responses a lot easier (definitely didn’t take inspo from Google Forms ) If the question is multiple choice, it shows how many responses each option got with percentages and presents it in sort of a bar graph If the question is free responses, it just lists each response Added placeholder tabs for editing and settings Added SEO for these tabs Updated types and schema Updated styling
Invite collaborators & update form You can now invite collaborators that will have access to edit the form, see its responses, and manage its settings! Only the form owner/creator can delete the form and invite and remove people, but invited people can basically do everything else On the invite modal page, you can search for MacWeb accounts by their name, email, or about through an API endpoint I added, and select multiple people to invite to the form at once Once you send out the invitation, you’ll see the users added to the form on the modal, and you can remove their access by clicking on the trash icon as well There isn’t real time form collaborative editing (at least not yet, though I don’t plan on overcomplicating a simple form app to be like Google Forms ), but changes you make to the form are revalidated the moment you click on save You can now actually edit and update your form by going to the edit tab and editing the form and its questions. This was actually fairly easy to implement since I just had to use the component used for the form creation page and update a few things Optimized database operations and API calls Updated schema and types Updated styling
Score distribution & autosave Added a quiz results summary section on the responses tab that shows some useful statistics about the scores as well as a histogram showing the score distribution if your form is a quiz It dynamically calculates scores based on the latest updated quiz, then organizes them and calculates their mean, median, min, and max in percentages It also renders a custom histogram with bins of 10 ranging from 0 to 100 so you can visualize how well your respondents did in one glance (server rendered + no Chart.js or external libraries = almost instantaneous load time) The histogram also shows the percentages of scores, and you can see how many responses are in each bin by hovering over the bar There’s also a view scores button that displays a modal showing each individual score Added autosave for editing forms that autosaves the entire form in the background every minute without revalidating the frontend to ensure smooth UX. The bar also shows the autosave status for a few seconds telling you it autosaved Added collaborator access so they can actually edit and manage the form and view responses without getting redirected. Updated some backend operations to ensure permissions are correct as well Fixed form editing so it actually updates the form and each question individually instead of creating a completely new set of it and neglecting the originally existing relations (~50 lines of code for one database transaction , but Prisma is actually so nice 🥹) Added filters and sort methods for shared forms vs forms you own (shared forms now display on the forms page)
Publish & share form You can now publish and share your forms for the rest of the world to see and fill out! Clicking on the publish button on the tool bar now opens a modal where you can either publish/unpublish the form or copy the link and send it to people If the form is already published, you can see its public link and an option to shorten it. Shortening it creates a unique 8-digit shortcut id for the form that redirects you to the main form (I’m planning on shortening it even more by buying a cool short domain or something, but that’s probably not gonna happen any time soon) You can also unpublish the form after a confirmation warning by clicking on the unpublish button If the form hasn’t been published yet, you can publish it by clicking on the publish button (in case this isn’t already obvious ) Updated some permissions so collaborators can also manage the form’s publication visibility status (instead of only the owner) Updated schema and types
MacForms is back: form settings and light mode! After taking a break from working on MacForms for 2 months to work on other projects, prepare for school, and do a lot of other stuff, I’m finally back to developing this project and getting it ready to ship before Stardance ends in 9 days! (plz extend the end date ) In this pretty massive devlog, I added a new settings tab to the form editing page where you can customize the published form’s presentation and many other options here are the settings I implemented, there might be other important stuff I forgot: whether to shuffle questions randomly whether to shuffle the multiple choice options for each question a custom background color for the top banner allow respondents to submit another response allow respondents to edit their submitted responses Because I couldn’t figure out a way (if there is one) to implement the last 2 without using accounts or cookies, if a form has either of the 2 enabled, you’ll need to sign in first to fill out the form Added a light/dark mode toggle option to the nav user dropdown menu for you to easily customize the site’s appearance and switch between light and dark modes Since I had to manually go through basically every component and page of the entire platform to modify the elements’ Tailwind classes for this, it also gave me a chance to refresh my memory of the project’s structure and how it works because I was gone for so long Going through all the files and testing the 2 modes was a long and tedious process, but the result turned out pretty well, both are consistent and visually appealing, and there’s also a smooth color transition Added a top loading indicator bar to improve the UX since some pages take a bit to load and the site may look unresponsive without the loading bar Fixed a few math bugs with 0s and NaNs and display bugs with the colors, layout, placeholder, and other styling Because Stardance is ending so soon and because of my procrastination and laziness, I’m going to have to cut a lot of the originally planned features before shipping since I have another big project to ship, so hopefully I can finish some last few features and polish MacForms and ship it soon!
A bunch of small additions and changes! Added the Browse tab where you can see all the published public forms that other people made on MacForms! You can explore all the different forms easily with the search bar Finally added a nav search bar that actually works (instead of the old placeholder) by querying the new API endpoint for either your own forms or other people’s public forms so you can access everything faster and more easily Search results are matched by both title and description to be more useful, and your own forms take you directly to the edit page while others’ forms take you to the form filling page Added a bunch of smooth animations and transition effects for page loads, interactions, and search/filter results to improve user experience and interactivity Added responsive design on all the pages and components so MacForms is accessible and functional on all screen sizes Added feature description sections, icons, and buttons on the home landing page I have no idea why this was even a thing before, but now you can actually access the form pages and fill out the forms without being logged in Apparently my thought all get requests had to pass the auth gate or something, but now it’s fixed Removed the Settings tab (not form settings), because I couldn’t figure out anything to put there since I already have account settings on MacWeb, a separate form settings tab, and a dark/light mode toggle Updated styling and layout Fixed a few display bugs
Individual responses and form options You can now also see, select, and manage each individual response to view in detail instead of only seeing summary graphs/tables of all the responses combined There’s a new dropdown on the form responses page where you can either view the summary stats/answers of all responses (default), or select every individual response to view its answer to each question, submission/edit date and time, accuracy (if the form is a quiz), as well as an option to delete the response after confirmation to make viewing responses easier and more useful If you make your form a quiz and designate certain questions as having correct answers, you can now finally select one or multiple options to all be correct for each question! This took a surprisingly long time since I had to fix a lot of bugs based on the old system Added sorting, filtering, and ordering dropdowns and options to the public form browse page to make finding and viewing different forms a lot easier I just realized there are a few bugs in prod while recording the video, so looks like more fun bug fixing in the next devlog Updated types and backend schemas to accept the new options Updated styling and colors I am now dedicating most of my time on (really amazing event btw), so I can only work on trying to finish and ship my Stardance projects on the little time I have on weekends, so hopefully I’ll be able to ship MacForms this weekend and finally finish my other Stardance projects before it ends
Quick final devlog before shipping!!! I finally finished all the features, customization, and everything else I planned to implement for MacForms after working (but mostly procrastinating) on it for more than 3 months ! I have no clue why this wasn’t done earlier, but I added a multiple select option for multiple choice questions to allow respondents to select multiple options (which also works with quizzes and other edge cases) Similarly, I also added an option to mark free response/text questions as having a long answer to render a textarea instead of the normal input field for more customization I already added most of these features while planning out the types and schemas, but somehow never implemented it, so it was kind of confusing but I was able to create them more quickly and easily that I’d expected Added guest mode so yall can actually try out the form engine without signing up (is that low enough friction for you guys ) Updated styling and readme Polished some other stuff for shipping! I’ve already wasted so much of Stardance’s extension not shipping any of my projects , so I panicked when I realized there was only 10 days left and forced myself to actually get to work and finish this project, hopefully you’ll enjoy and like it as much as I do :)
Ships:
I finally finished MacForms, an extensive, customizable, and feature-rich form creation tool for you to create surveys, forms, and quizzes with question options like multiple choice, multiple select, short answer, long answer, and more! To use it, simply sign in to a MacWeb account or select guest mode (which hopefully reduces voting friction). There are also a lot of different form settings for presentation, response management, quiz accuracy, visibility, and public/private forms, as well as options to invite collaborators to work on and manage the form together. You can browse other people’s forms and search your own forms as well. You can also visualize and view response statistics and individual responses with graphs and question response lists. The entire platform supports light/dark mode, smooth animations and transition effects, responsive design, accessibility, and SEO, as well as other quality of life improvements that hopefully make the website’s UI and UX more intuitive and user friendly. The codebase is surprisingly complex (and poorly organized :( , but I somehow managed to make everything work as expected. I really had a lot of fun working on and trying out this project myself, so hopefully yall will like it too :)...
|
1793156012.406571
|
1793242412.406571
|
|
1236
|
Fuddi AI by @unonown97 | Stardance
|
unonown97
|
1
|
64.0
|
1003
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:30:40Z", "hours": 64.0, "multiplier": 16.63, "payout": 1003, "blessing": "neutral", "text": "A sleek, privacy-first multi-model chat interface that runs entirely in your browser. Connects to dozens of AI models through a lightweight local proxy your API keys never leave your machine. so while deploying i encountered multiple issues and but the web helped me thankfully and also the costing doesnt work at all as of now and is something i will be fixing in the future :). g’day", "repo": "https://github.com/Miroredrpo/ai-chat-app", "demo": "https://fuddigai.vercel.app/"}]...
|
[{"post_id": 8139, "ts": "2026 [{"post_id": 8139, "ts": "2026-06-13T16:10:05Z", "hours": 0.7906, "text": "tried deploying to vercel but it didnt work tweaked some things in the server.js but reading online i foundout that i will need to make another folder for it to function properly so am doing that rn :)"}, {"post_id": 8102, "ts": "2026-06-13T14:58:43Z", "hours": 5.0, "text": "added an option to export and import all the things into a JSON, also an option to clear all the conversations, and remove all the API keys as now it has option to add multiple API keys, all the things are pretty much done so i think i will just do some finishing changes and ship it for the first time"}, {"post_id": 7843, "ts": "2026-06-13T02:35:10Z", "hours": 3.5333, "text": "added the prompting tab where specific instructions can be written and also completed the interface tab where one can toggle things like auto title generation and stuff am goging to add support for multiple api keys next and also an export/import chats and settings feutesrs that exports everthing, so when the local storage is full one can export and save there chat and import thhem later on"}, {"post_id": 6831, "ts": "2026-06-11T13:40:44Z", "hours": 5.4056, "text": "added option to pin the chat, edit the title manually, duplicate the chat and delete it also added fast delete which when shift is held while deletion it doesnt ask for conformation and directly deletes the chat, also added all the paraments accepted as far as i am aware of, added a default system prompt and i will also be making another tab specifically for prompts, also added dynamic size of the chat where the font size can be changed from the setting menu it self"}, {"post_id": 6076, "ts": "2026-06-10T06:43:41Z", "hours": 0.6, "text": "So… i tried using AI to do some visual changes only for it to completely messup the layout and populate the root directory with random js and css files saying these are the new ones and have the same logic and makes the app better but it did not do any of that, i reverted it to how it was i dont know if that counts to AI useage but i will still be putting the incident in the details of the project"}, {"post_id": 5753, "ts": "2026-06-09T17:31:13Z", "hours": 0.9672, "text": "when an API is enterd made a test endpoint so it tests if the API is correct or not and tells it also initialized the js logic for the thinking mode max tokens, temperature, max tokens (entire chat), and a default system prompt, also am thinking about adding a dedicated tab in the settings panel for prompts and all"}, {"post_id": 5606, "ts": "2026-06-09T13:51:25Z", "hours": 8.4333, "text": "completed the toasts, added web search functionality, added chat deletion, also populated the empty state with some prompts, added an option to choose if one wants to generate the title automatically or not in a new settings tab “interface” where the size of fonts, theme, etc can me changed, am goging to add things like temperature , maxtokens, thinking budget and all next"}, {"post_id": 5329, "ts": "2026-06-09T02:01:33Z", "hours": 1.2681, "text": "added a shortcuts tab that tells the users about the keybinds, also made the initial frame for toasts, also added a last refreshed time on the models tab and reload again button that again fetches it from the HCAI API"}, {"post_id": 4902, "ts": "2026-06-08T14:08:23Z", "hours": 10.1728, "text": "added empty state also added thinking mode where it sends the api with an extra parameter and enables the thinking mode if the model has the ability to do it, i also added some keybinds such as when ctrl + Shift + T is pressed thinkning mode is enabled, Ctrl+N opens new chat etc it is also confiured for mac instead of ctrl in mac we can use cmd, in the settings tab i have also added a dropdown menu to select a separate title generation model"}, {"post_id": 4073, "ts": "2026-06-07T08:25:09Z", "hours": 8.1322, "text": "i made it so that the model can be changed and accessed from the chat it self and change it as per the user intent, i also added a details panel showing thw models capabilities and its pricing and its abilities like if it can web search or not or if it has thinking mode etc. also now in the settings panel you can select the default model to be used when a new chant is opened and it is stored in the local storage similar to how the chat is stored"}, {"post_id": 3276, "ts": "2026-06-06T04:04:02Z", "hours": 12.3142, "text": "I have added a model selector now which pulls the models from https://ai.hackclub.com/proxy/v1/models although it has not been properly configures i will be making it so that there will be an option for a title generation model in the settings as well i have also added a side bar where previos chats can be accessed, up next: i will be adding a details panel that will allow one to veiw the context cost and provider, modelname, etc of the selected model, i will also be adding the feature to attach images and all, i have also made it responsive in this past time frame not entirely but i have made it fairly useable i will also be making it more mobile friendly"}, {"post_id": 1933, "ts": "2026-06-04T05:33:12Z", "hours": 2.745, "text": "implemented dark mode made layout cleaner added option to set base url, also made it so that the API gets saved in the local storage for future reload"}, {"post_id": 1603, "ts": "2026-06-03T18:49:52Z", "hours": 2.9808, "text": "made the layout better with buttons outlins and made a floating settings panel to input the HCAI API key into so that AI models can be accessed later, next changes: shift layout, figureout server calls and add more functionality also add dark mode :)"}, {"post_id": 269, "ts": "2026-06-01T14:20:29Z", "hours": 1.355, "text": "i am making an custom interface where one can bring their HCAI API key and talk to various LLM’s"}]...
|
Title: Fuddi AI by @unonown97 | Stardance
Devlogs Title: Fuddi AI by @unonown97 | Stardance
Devlogs:
i am making an custom interface where one can bring their HCAI API key and talk to various LLM’s
made the layout better with buttons outlins and made a floating settings panel to input the HCAI API key into so that AI models can be accessed later, next changes: shift layout, figureout server calls and add more functionality also add dark mode :)
implemented dark mode made layout cleaner added option to set base url, also made it so that the API gets saved in the local storage for future reload
I have added a model selector now which pulls the models from https://ai.hackclub.com/proxy/v1/models although it has not been properly configures i will be making it so that there will be an option for a title generation model in the settings as well i have also added a side bar where previos chats can be accessed, up next: i will be adding a details panel that will allow one to veiw the context cost and provider, modelname, etc of the selected model, i will also be adding the feature to attach images and all, i have also made it responsive in this past time frame not entirely but i have made it fairly useable i will also be making it more mobile friendly
i made it so that the model can be changed and accessed from the chat it self and change it as per the user intent, i also added a details panel showing thw models capabilities and its pricing and its abilities like if it can web search or not or if it has thinking mode etc. also now in the settings panel you can select the default model to be used when a new chant is opened and it is stored in the local storage similar to how the chat is stored
added empty state also added thinking mode where it sends the api with an extra parameter and enables the thinking mode if the model has the ability to do it, i also added some keybinds such as when ctrl + Shift + T is pressed thinkning mode is enabled, Ctrl+N opens new chat etc it is also confiured for mac instead of ctrl in mac we can use cmd, in the settings tab i have also added a dropdown menu to select a separate title generation model
added a shortcuts tab that tells the users about the keybinds, also made the initial frame for toasts, also added a last refreshed time on the models tab and reload again button that again fetches it from the HCAI API
completed the toasts, added web search functionality, added chat deletion, also populated the empty state with some prompts, added an option to choose if one wants to generate the title automatically or not in a new settings tab “interface” where the size of fonts, theme, etc can me changed, am goging to add things like temperature , maxtokens, thinking budget and all next
when an API is enterd made a test endpoint so it tests if the API is correct or not and tells it also initialized the js logic for the thinking mode max tokens, temperature, max tokens (entire chat), and a default system prompt, also am thinking about adding a dedicated tab in the settings panel for prompts and all
So… i tried using AI to do some visual changes only for it to completely messup the layout and populate the root directory with random js and css files saying these are the new ones and have the same logic and makes the app better but it did not do any of that, i reverted it to how it was i dont know if that counts to AI useage but i will still be putting the incident in the details of the project
added option to pin the chat, edit the title manually, duplicate the chat and delete it also added fast delete which when shift is held while deletion it doesnt ask for conformation and directly deletes the chat, also added all the paraments accepted as far as i am aware of, added a default system prompt and i will also be making another tab specifically for prompts, also added dynamic size of the chat where the font size can be changed from the setting menu it self
added the prompting tab where specific instructions can be written and also completed the interface tab where one can toggle things like auto title generation and stuff am goging to add support for multiple api keys next and also an export/import chats and settings feutesrs that exports everthing, so when the local storage is full one can export and save there chat and import thhem later on
added an option to export and import all the things into a JSON, also an option to clear all the conversations, and remove all the API keys as now it has option to add multiple API keys, all the things are pretty much done so i think i will just do some finishing changes and ship it for the first time
tried deploying to vercel but it didnt work tweaked some things in the server.js but reading online i foundout that i will need to make another folder for it to function properly so am doing that rn :)
Ships:
A sleek, privacy-first multi-model chat interface that runs entirely in your browser. Connects to dozens of AI models through a lightweight local proxy your API keys never leave your machine. so while deploying i encountered multiple issues and but the web helped me thankfully and also the costing doesnt work at all as of now and is something i will be fixing in the future :). g’day...
|
1792878545.9104006
|
1793742545.9104006
|
|
14130
|
Immortal Cultivation Mod (修仙) by @m3e660 | Stardan Immortal Cultivation Mod (修仙) by @m3e660 | Stardance...
|
m3e660
|
4
|
345.45
|
3100
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T17:07:11Z", "hours": 76.0, "multiplier": 18.81, "payout": 1254, "blessing": "neutral", "text": "I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 2, "ts": "2026-08-23T01:53:50Z", "hours": 96.0, "multiplier": 15.99, "payout": 1340, "blessing": "neutral", "text": "I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 3, "ts": "2026-07-11T00:52:33Z", "hours": 44.0, "multiplier": 18.82, "payout": 297, "blessing": "neutral", "text": "This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 4, "ts": "2026-06-16T02:19:15Z", "hours": 23.0, "multiplier": 10.72, "payout": 209, "blessing": "neutral", "text": "Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}]...
|
[{"post_id": 81380, "ts": "202 [{"post_id": 81380, "ts": "2026-10-21T02:39:43Z", "hours": 10.3219, "text": "Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc"}, {"post_id": 80679, "ts": "2026-10-18T13:51:12Z", "hours": 8.0572, "text": "Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)"}, {"post_id": 80384, "ts": "2026-10-17T14:03:45Z", "hours": 10.4, "text": "Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix"}, {"post_id": 79682, "ts": "2026-10-15T01:38:45Z", "hours": 8.0478, "text": "Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs"}, {"post_id": 79208, "ts": "2026-10-13T01:21:10Z", "hours": 9.6014, "text": "Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight"}, {"post_id": 78918, "ts": "2026-10-12T01:31:10Z", "hours": 10.5922, "text": "Devlog #28 Added 8 guide books for different part of the mod Added new bear model"}, {"post_id": 78651, "ts": "2026-10-11T05:20:58Z", "hours": 10.4994, "text": "Devlog #27 Improve overall guidance and improve existing model"}, {"post_id": 77981, "ts": "2026-10-09T03:03:43Z", "hours": 9.3439, "text": "Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items"}, {"post_id": 76814, "ts": "2026-10-04T17:37:22Z", "hours": 9.2553, "text": "Devlog #25 Add a lot of new weapons A lot of new fire And more clothes"}, {"post_id": 75392, "ts": "2026-09-29T22:21:34Z", "hours": 9.3814, "text": "Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love"}, {"post_id": 72892, "ts": "2026-09-23T23:37:48Z", "hours": 10.9486, "text": "Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP"}, {"post_id": 67505, "ts": "2026-09-13T17:02:49Z", "hours": 8.2731, "text": "Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic"}, {"post_id": 64408, "ts": "2026-09-08T19:30:48Z", "hours": 15.1625, "text": "Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system"}, {"post_id": 61873, "ts": "2026-09-05T01:00:25Z", "hours": 12.3611, "text": "Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!"}, {"post_id": 59887, "ts": "2026-09-01T21:31:56Z", "hours": 11.3725, "text": "Devlog #19 Some mobs, yea that is really it"}, {"post_id": 59086, "ts": "2026-08-31T18:20:43Z", "hours": 10.5844, "text": "Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast"}, {"post_id": 55551, "ts": "2026-08-27T14:05:21Z", "hours": 9.8333, "text": "Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!"}, {"post_id": 54475, "ts": "2026-08-25T14:27:13Z", "hours": 8.5392, "text": "Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward"}, {"post_id": 52657, "ts": "2026-08-22T22:04:35Z", "hours": 10.8006, "text": "Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho"}, {"post_id": 46112, "ts": "2026-08-13T03:24:25Z", "hours": 11.3525, "text": "Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust"}, {"post_id": 44036, "ts": "2026-08-09T15:23:44Z", "hours": 11.2058, "text": "Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation"}, {"post_id": 39851, "ts": "2026-08-03T03:24:18Z", "hours": 12.4425, "text": "Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation"}, {"post_id": 37945, "ts": "2026-07-30T23:57:05Z", "hours": 10.8044, "text": "Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models"}, {"post_id": 35415, "ts": "2026-07-26T20:10:28Z", "hours": 11.2708, "text": "Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level"}, {"post_id": 33331, "ts": "2026-07-23T04:32:21Z", "hours": 12.9683, "text": "Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 ."}, {"post_id": 31014, "ts": "2026-07-19T02:14:35Z", "hours": 3.8225, "text": "Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)"}, {"post_id": 28609, "ts": "2026-07-14T23:19:52Z", "hours": 11.3969, "text": "New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修"}, {"post_id": 26263, "ts": "2026-07-10T23:12:53Z", "hours": 37.7453, "text": "Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑"}, {"post_id": 12339, "ts": "2026-06-20T03:56:26Z", "hours": 0.4739, "text": "There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level"}, {"post_id": 12304, "ts": "2026-06-20T02:31:23Z", "hours": 5.2906, "text": "Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure"}, {"post_id": 9608, "ts": "2026-06-16T00:23:52Z", "hours": 3.5289, "text": "See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui"}, {"post_id": 8409, "ts": "2026-06-13T23:43:00Z", "hours": 5.0458, "text": "Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功"}, {"post_id": 7205, "ts": "2026-06-12T01:03:44Z", "hours": 2.4225, "text": "Look at what your boy cooked up in the lab!!!"}, {"post_id": 6577, "ts": "2026-06-11T01:41:07Z", "hours": 12.0342, "text": "WOW SO MUCH STUFF (look at the pics!!!)"}]...
|
Title: Immortal Cultivation Mod (修仙) by @m3e660 | Title: Immortal Cultivation Mod (修仙) by @m3e660 | Stardance
Devlogs:
WOW SO MUCH STUFF (look at the pics!!!)
Look at what your boy cooked up in the lab!!!
Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功
See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui
Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure
There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level
Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑
New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修
Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)
Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 .
Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level
Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models
Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation
Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation
Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust
Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho
Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward
Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!
Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast
Devlog #19 Some mobs, yea that is really it
Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!
Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system
Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic
Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP
Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love
Devlog #25 Add a lot of new weapons A lot of new fire And more clothes
Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items
Devlog #27 Improve overall guidance and improve existing model
Devlog #28 Added 8 guide books for different part of the mod Added new bear model
Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight
Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs
Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix
Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)
Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc
Ships:
Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.
This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!
I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs
I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY...
|
1793066008.5703037
|
1793152408.5703037
|
|
7118
|
Starboard! by @world | Stardance
|
world
|
1
|
47.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T01:43:23Z", "hours": 47.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Starboard! I made this macro keyboard from scratch. This was my first time using KiCad and Fusion for a project! (And it took forever…) But it was a really fun project. Checkout the demo website using Three.js! I really can’t wait to see my keyboard irl", "repo": "https://github.com/deveworld/starboard", "demo": ""}]...
|
[{"post_id": 8138, "ts": "2026 [{"post_id": 8138, "ts": "2026-06-13T16:09:32Z", "hours": 10.5117, "text": "Starboard! Starboard is a compact 63×63 mm Hackpad macropad built entirely from kit parts with QMK firmware and a fully 3D-printed sandwich case. I designed the 2-layer PCB in KiCad and wrote a custom-matrix QMK keymap (six keys plus encoder press, encoder volume control, OLED status readout, and RGB underglow), then cross-checked the firmware pin map against the board netlist from three independent sources. Along the way I caught and fixed a stale prebuilt UF2 (a leftover 10 ms vs 30 ms bootmagic delay) by rebuilding deterministically from source, and confirmed every checklist dimension. Finally I packaged the repo to the required structure and pushed it public!"}, {"post_id": 5702, "ts": "2026-06-09T16:26:54Z", "hours": 5.8964, "text": "Full 3D Modeling It was way harder than my first thought… Many PCB correction… etc."}, {"post_id": 5509, "ts": "2026-06-09T09:49:13Z", "hours": 12.2217, "text": "I’m working on Fusion! But I think I need to fix some collision and clearance a bit. Does it look good?"}, {"post_id": 3420, "ts": "2026-06-06T11:04:16Z", "hours": 3.4808, "text": "PCB also done!!!"}, {"post_id": 3353, "ts": "2026-06-06T07:34:15Z", "hours": 14.6039, "text": "Schematic Done!"}]...
|
Title: Starboard! by @world | Stardance
Devlogs:
Title: Starboard! by @world | Stardance
Devlogs:
Schematic Done!
PCB also done!!!
I’m working on Fusion! But I think I need to fix some collision and clearance a bit. Does it look good?
Full 3D Modeling It was way harder than my first thought… Many PCB correction… etc.
Starboard! Starboard is a compact 63×63 mm Hackpad macropad built entirely from kit parts with QMK firmware and a fully 3D-printed sandwich case. I designed the 2-layer PCB in KiCad and wrote a custom-matrix QMK keymap (six keys plus encoder press, encoder volume control, OLED status readout, and RGB underglow), then cross-checked the firmware pin map against the board netlist from three independent sources. Along the way I caught and fixed a stale prebuilt UF2 (a leftover 10 ms vs 30 ms bootmagic delay) by rebuilding deterministically from source, and confirmed every checklist dimension. Finally I packaged the repo to the required structure and pushed it public!
Ships:
Starboard! I made this macro keyboard from scratch. This was my first time using KiCad and Fusion for a project! (And it took forever…) But it was a really fun project. Checkout the demo website using Three.js! I really can’t wait to see my keyboard irl...
|
1793134333.1538208
|
1793220733.1538208
|
|
47578
|
Digital Compass by @Luminix | Stardance
|
Luminix
|
1
|
88.36
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T17:21:34Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "🎉 The theoretical content for all the modules is finally complete! Now I’m focusing on translating the content into English and polishing everything.", "repo": "https://github.com/lucianahernandezgutierrez77-jpg/brujula-digital", "demo": "https://lucianahernandezgutierrez77-jpg.github.io/brujula-digital/"}]...
|
[{"post_id": 81379, "ts": "202 [{"post_id": 81379, "ts": "2026-10-21T02:25:52Z", "hours": 8.8906, "text": "The activity for module 4 is finally finished :)"}, {"post_id": 79430, "ts": "2026-10-13T23:03:07Z", "hours": 11.1847, "text": "Finished designing the Deepfakes activity! Now working on its functionality."}, {"post_id": 68926, "ts": "2026-09-16T01:46:03Z", "hours": 12.1794, "text": "I created a simple living room with a computer, sofa, window, and other decorations. The scene will lead into the computer activity."}, {"post_id": 59619, "ts": "2026-09-01T15:15:18Z", "hours": 8.265, "text": "Today I’m working on the interactive activity for module 3! I’m currently adding structure and visual design 🖥️⌨️ There’s still a lot of work to build, but I’m excited to see it finally come together :)"}, {"post_id": 53104, "ts": "2026-08-23T15:17:20Z", "hours": 9.8364, "text": "Today I worked on the interactive activity for Module 2. I implemented the question structure and started integrating the activity with the project’s translation system 🧭"}, {"post_id": 47717, "ts": "2026-08-15T20:16:30Z", "hours": 3.935, "text": "Currently working on translating Digital Compass from Spanish to English! :) Making sure everything sounds natural in both languages. ✨"}, {"post_id": 46572, "ts": "2026-08-13T21:59:14Z", "hours": 33.9433, "text": "Today I’m working on the interactive activity for Module 1. It encourages users to take breaks after spending time on a computer. I’m currently working on the walking animation and the questions that appear during the activity."}]...
|
Title: Digital Compass by @Luminix | Stardance
De Title: Digital Compass by @Luminix | Stardance
Devlogs:
Today I’m working on the interactive activity for Module 1. It encourages users to take breaks after spending time on a computer. I’m currently working on the walking animation and the questions that appear during the activity.
Currently working on translating Digital Compass from Spanish to English! :) Making sure everything sounds natural in both languages. ✨
Today I worked on the interactive activity for Module 2. I implemented the question structure and started integrating the activity with the project’s translation system 🧭
Today I’m working on the interactive activity for module 3! I’m currently adding structure and visual design 🖥️⌨️ There’s still a lot of work to build, but I’m excited to see it finally come together :)
I created a simple living room with a computer, sofa, window, and other decorations. The scene will lead into the computer activity.
Finished designing the Deepfakes activity! Now working on its functionality.
The activity for module 4 is finally finished :)
Ships:
🎉 The theoretical content for all the modules is finally complete! Now I’m focusing on translating the content into English and polishing everything....
|
1793102113.1172485
|
1793188513.1172485
|
|
46447
|
My own site! by @spearedrice | Stardance
|
spearedrice
|
0
|
163.4
|
0
|
[]
|
[{"post_id": 81376, "ts": "202 [{"post_id": 81376, "ts": "2026-10-21T01:50:11Z", "hours": 0.3669, "text": "we all love larpin!!"}, {"post_id": 81365, "ts": "2026-10-21T00:13:33Z", "hours": 8.1392, "text": "more poses ig"}, {"post_id": 81231, "ts": "2026-10-20T11:42:14Z", "hours": 18.3669, "text": "added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)"}, {"post_id": 80282, "ts": "2026-10-17T03:01:36Z", "hours": 10.0369, "text": "added the konami code so now lots of stuff happens"}, {"post_id": 80056, "ts": "2026-10-16T02:48:40Z", "hours": 15.3181, "text": "adding a INSANE feature"}, {"post_id": 79517, "ts": "2026-10-14T12:36:15Z", "hours": 10.6333, "text": "progress (adding screensaver, unfinished so here is some blurry code)"}, {"post_id": 78938, "ts": "2026-10-12T03:06:08Z", "hours": 10.0128, "text": "adding a button that finally mutes the music"}, {"post_id": 78726, "ts": "2026-10-11T12:33:55Z", "hours": 11.0222, "text": "almost done, 2 features left"}, {"post_id": 78482, "ts": "2026-10-10T22:27:34Z", "hours": 10.0333, "text": "amazing things (unfinished)"}, {"post_id": 78316, "ts": "2026-10-10T12:13:10Z", "hours": 11.795, "text": "uhh unfinished right now but great things coming 😭"}, {"post_id": 78205, "ts": "2026-10-09T23:36:45Z", "hours": 56.6311, "text": "spent 50 hours on THIS"}, {"post_id": 57011, "ts": "2026-08-29T02:36:13Z", "hours": 0.6814, "text": "Adding windows to my site, also added GTA 6"}, {"post_id": 54873, "ts": "2026-08-26T02:26:45Z", "hours": 0.3675, "text": "I made my own site (for the 2nd time) and added some pretty cool styling."}]...
|
Title: My own site! by @spearedrice | Stardance
D Title: My own site! by @spearedrice | Stardance
Devlogs:
I made my own site (for the 2nd time) and added some pretty cool styling.
Adding windows to my site, also added GTA 6
spent 50 hours on THIS
uhh unfinished right now but great things coming 😭
amazing things (unfinished)
almost done, 2 features left
adding a button that finally mutes the music
progress (adding screensaver, unfinished so here is some blurry code)
adding a INSANE feature
added the konami code so now lots of stuff happens
added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)
more poses ig
we all love larpin!!...
|
1792662908.7921853
|
1793267708.7921853
|
|
66646
|
Isometric Dungeon Crawler by @TotsllyRandom | Star Isometric Dungeon Crawler by @TotsllyRandom | Stardance...
|
TotsllyRandom
|
0
|
27.15
|
0
|
[]
|
[{"post_id": 81368, "ts": "202 [{"post_id": 81368, "ts": "2026-10-21T00:34:49Z", "hours": 7.8339, "text": "Soooooo I added a cool camera system then my dungeon gen went bad. remaking it now then my scripts started bugging out on the engine side??? Now I’m gunna remake the github project and tryyyyy to get it to work again… but hey cool camera!"}, {"post_id": 79627, "ts": "2026-10-14T19:02:08Z", "hours": 0.6336, "text": "you’re gunna hate me. we’re back to 3d. I had to remake my project cuz the old framework wouldnt work with the shift, so we’re working on a basic engine before anything big."}, {"post_id": 79543, "ts": "2026-10-14T15:13:32Z", "hours": 4.9714, "text": "I hate coding. I decided to remake my game in 3d, right? fix the physics, get everything together, make it great! But then i realized that I dont know anything about 3d modeling or Godot 3D. so we’re back at square 1. BUT i did get the guy’s arm to follow the mouse cursor so thats a win!"}, {"post_id": 77050, "ts": "2026-10-05T14:26:42Z", "hours": 1.4053, "text": "I’ve made a system of room generation that will spawn rooms in via a branching generation method. I also made “Heightmaps” which allow me to make rooms much easier"}, {"post_id": 75952, "ts": "2026-10-01T18:33:37Z", "hours": 12.31, "text": "been working on a new 2d Isometric dungeoncrawler game. Been making a little tileset: take a look at this! made all these myself, and made all angles (that I would need)"}]...
|
Title: Isometric Dungeon Crawler by @TotsllyRandom Title: Isometric Dungeon Crawler by @TotsllyRandom | Stardance
Devlogs:
been working on a new 2d Isometric dungeoncrawler game. Been making a little tileset: take a look at this! made all these myself, and made all angles (that I would need)
I’ve made a system of room generation that will spawn rooms in via a branching generation method. I also made “Heightmaps” which allow me to make rooms much easier
I hate coding. I decided to remake my game in 3d, right? fix the physics, get everything together, make it great! But then i realized that I dont know anything about 3d modeling or Godot 3D. so we’re back at square 1. BUT i did get the guy’s arm to follow the mouse cursor so thats a win!
you’re gunna hate me. we’re back to 3d. I had to remake my project cuz the old framework wouldnt work with the shift, so we’re working on a basic engine before anything big.
Soooooo I added a cool camera system then my dungeon gen went bad. remaking it now then my scripts started bugging out on the engine side??? Now I’m gunna remake the github project and tryyyyy to get it to work again… but hey cool camera!...
|
1793101787.942786
|
1793706587.942786
|
|
26228
|
Memory Galaxy by @Sparky10 | Stardance
|
Sparky10
|
0
|
14.53
|
0
|
[]
|
[{"post_id": 81363, "ts": "202 [{"post_id": 81363, "ts": "2026-10-21T00:04:38Z", "hours": 4.1786, "text": "Hi guys after a long gap I almost done with the galaxy just a small part left which is to create by GitHub repo and demo url stay tuned for updates (note the pic is a reference not the exact output of the project)✨🌌☁️"}, {"post_id": 57384, "ts": "2026-08-29T14:55:02Z", "hours": 1.4961, "text": "Today, I done with next part that is the tags and then the searching part. I made some change in the front so the web looks more elegant"}, {"post_id": 55573, "ts": "2026-08-27T14:43:48Z", "hours": 1.3958, "text": "Today, I done with the important part my website it is album. I faced a problem with the html code even after completing css and js code still some part stayed in the interface I changed the html code to resolve it"}, {"post_id": 53928, "ts": "2026-08-24T17:04:36Z", "hours": 0.3219, "text": "Today, I made some changes in the html and css code and started with the code for my album and done with the html part 📸📸🌟🌟(if you guys have any suggestions pls comment)"}, {"post_id": 51898, "ts": "2026-08-21T20:02:57Z", "hours": 0.7314, "text": "Hi guys today I have done ✅ with the time line part and faced a small issue due to conflicting of codes with when I added the js code for album I am working on it to make it much more realistic and similar to space"}, {"post_id": 50334, "ts": "2026-08-19T14:32:24Z", "hours": 0.8083, "text": "Hi guys today I made some important changed in java script file so that website can create memories as stars and save it in json and i am having a plan of sync the web with the gallery so we can retrieve the pic even it is permanently deleted from our device"}, {"post_id": 49295, "ts": "2026-08-18T01:06:29Z", "hours": 0.3667, "text": "Hi guys today I made some small changes in the html code to make it look better but it still look the old one…."}, {"post_id": 48002, "ts": "2026-08-16T08:53:58Z", "hours": 1.4181, "text": "Hi today DAY-3 I worked on some important changes that can be made to make the web site much similar to milkyway galaxy"}, {"post_id": 47425, "ts": "2026-08-15T10:52:59Z", "hours": 3.5581, "text": "DAY-2 Hi, today I have made some change in my html and done my css and java script and about 50% of my websites frontend got over😃😃😺😺"}, {"post_id": 46490, "ts": "2026-08-13T18:47:01Z", "hours": 0.2553, "text": "DAY-1 Hi guys this the day one after resolving the problem in my vs code . I had done my html code for the login page and the combines t with the css and js code which is progress .i had just created the required buttons ,headings"}]...
|
Title: Memory Galaxy by @Sparky10 | Stardance
Dev Title: Memory Galaxy by @Sparky10 | Stardance
Devlogs:
DAY-1 Hi guys this the day one after resolving the problem in my vs code . I had done my html code for the login page and the combines t with the css and js code which is progress .i had just created the required buttons ,headings
DAY-2 Hi, today I have made some change in my html and done my css and java script and about 50% of my websites frontend got over😃😃😺😺
Hi today DAY-3 I worked on some important changes that can be made to make the web site much similar to milkyway galaxy
Hi guys today I made some small changes in the html code to make it look better but it still look the old one….
Hi guys today I made some important changed in java script file so that website can create memories as stars and save it in json and i am having a plan of sync the web with the gallery so we can retrieve the pic even it is permanently deleted from our device
Hi guys today I have done ✅ with the time line part and faced a small issue due to conflicting of codes with when I added the js code for album I am working on it to make it much more realistic and similar to space
Today, I made some changes in the html and css code and started with the code for my album and done with the html part 📸📸🌟🌟(if you guys have any suggestions pls comment)
Today, I done with the important part my website it is album. I faced a problem with the html code even after completing css and js code still some part stayed in the interface I changed the html code to resolve it
Today, I done with next part that is the tags and then the searching part. I made some change in the front so the web looks more elegant
Hi guys after a long gap I almost done with the galaxy just a small part left which is to create by GitHub repo and demo url stay tuned for updates (note the pic is a reference not the exact output of the project)✨🌌☁️...
|
1792734459.8385558
|
1793339259.8385558
|
|
9961
|
Koganeee by @quintessence24 | Stardance
|
quintessence24
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T23:30:59Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "As a Jujutsu Kaisen fan and an admirer of flying pets, I wanted to make Kogane for my room. The objective of Kogane is to be a person-following flying pet assistant that can communicate with voice and through a retractable screen, sort of like a flying Alexa but friendlier! I also wanted to make drones for a while and it seemed like a cool approach to make Kogane. A use case that I had in mind is when I’m working in my room and my hands are busy and if I need to quickly pull up a tutorial, I would normally have to put things down to find my laptop. Instead with Kogane, I can call for Kogane wherever I am in my room and quickly check for information or pull up a Youtube tutorial from its screen without any physical contact. I got everything to work on a very close call, but my harnesses weren’t very strong and accidentally tangled with the propeller for a second, causing a motor to burn up and failing the first test flight (and of course, the shell for Koganeee was pretty but reduced performance aerodynamically). Nonetheless, all of the tests passed and I just need to swap out the motor, but still a successful project regardless and I’m proud of everything I was able to learn, whether it be firmware and networking with the ESP32, the endless soldering sessions for different kinds of components, taking care of batteries, etc. Check out my project and of course, contact me on Slack (sujaygolla24) for questions or just to nerd out about JJK or other anime!!! :D", "repo": "https://github.com/Sujay-Golla/koganeee", "demo": ""}]...
|
[{"post_id": 81355, "ts": "202 [{"post_id": 81355, "ts": "2026-10-20T23:13:21Z", "hours": 6.1683, "text": "Devlog #4 - Preparing and starting build Summary Had to unpack and arrange all of the electronics I received, checked connectors and what I needed to make connectors for again. Realized I had designed for JST-XH rather than JST-SH connectors so spent a while trying to learn all of the different types of connectors so that I can avoid making the same mistake again For the time being, I stripped wires, crimped them and used my JST-XH connectors for the FC to ESC connection I had no idea how to solder XT60 connectors so I had to learn, and then after a while, I realized I needed to connect a male female pair at the end to avoid deformation so I had wasted the soldering session Next Steps Noticed that JOURNAL.md is more preferred for hardware projects, so I will be switching to that for future documentation Will continue soldering, wiring and coding step by step, but more specifically, I will work on checking if the ESC to FC connection works and if I can power the 5V rail on the board"}, {"post_id": 22542, "ts": "2026-07-05T02:00:31Z", "hours": 16.4061, "text": "Devlog #3 - Finishing the CAD and Ready to Ship Summary Finished the CAD for Kogane, the drone and the ground station Vibe coded firmware temporarily and tested functionality with my laptop webcam manually Finished documentation and shipping it to Outpost Next Steps Once approved, I have to order and build Will work on firmware while waiting for the parts to arrive to save time"}, {"post_id": 21100, "ts": "2026-07-02T21:54:54Z", "hours": 16.3197, "text": "Devlog #2 - Finishing the FC PCB Summary Followed the tutorial for tips to layout the board Used more tutorials and datasheets to understand different concepts of board layout like via stitching and filled zones Made a 4-layer PCB for the first time and learned how to connect power and grounds to appropriate components with vias Learned different routing practices, and despite the suboptimal routing, I am pretty confident now that it will at least be functional Next Steps Finishing the CAD model and final BOM Finishing the firmware template, maybe even using some cameras to test the positioning system"}, {"post_id": 15499, "ts": "2026-06-25T06:02:25Z", "hours": 25.7803, "text": "Devlog #1 [Real] - Schematic design and shopping Summary Used various different sources to learn about different components used in FCs Learned how to use datasheets, Webench, LCSC part selections, etc. Spent time reviewing different requirements for batteries and W/T ratios for drones in general and picking the right batteries and circuit designs Spent a lot of time scoping and rescoping the PCB, including having to remove battery charger and using an external ESC as it was too complex and tight for the compact PCB, especially while having a separate MCU and a lot of other peripherals Learned how to use the STM32CubeMX firmware and how different protocols worked Started exploring PCB editor and systematically arranging components Next Steps Finish arranging PCB Route the PCB and get it verified Finish the CAD model and final BOM Come up with a basic template for firmware"}, {"post_id": 8169, "ts": "2026-06-13T16:44:15Z", "hours": 1.3878, "text": "Spent some time figuring out how to deal with the placement of different components and the scope of this project. Firstly, I decided that it made sense to use lightweight models for voice and video, keeping it limited so that it can run independently on A7S rather than relying on my laptop. Then I decided to have 2 mmWave sensors to cover blindspots and detect position of humans in the room, and decided it would be cool to integrate CV with mmWave, so added a fixed camera to help inform the drone position. A small FPV camera on the drone can allow it to avoid obstacles, and it would be cool to integrate VISTA (a research paper about drones navigating unknown maps) at least for initial calibration. Still figuring out the feasibility of a custom FC or if it would be easier to have a basic FC and a separate ESP32 for communication, camera and for extending the project to control servos for the rolling screen and a gripper in the future. Drafted the BOM but will find more stuff on AliExpress tomorrow. I also explored how to use Hackatime with Onshape and started making the head of Kogane"}]...
|
Title: Koganeee by @quintessence24 | Stardance
De Title: Koganeee by @quintessence24 | Stardance
Devlogs:
Spent some time figuring out how to deal with the placement of different components and the scope of this project. Firstly, I decided that it made sense to use lightweight models for voice and video, keeping it limited so that it can run independently on A7S rather than relying on my laptop. Then I decided to have 2 mmWave sensors to cover blindspots and detect position of humans in the room, and decided it would be cool to integrate CV with mmWave, so added a fixed camera to help inform the drone position. A small FPV camera on the drone can allow it to avoid obstacles, and it would be cool to integrate VISTA (a research paper about drones navigating unknown maps) at least for initial calibration. Still figuring out the feasibility of a custom FC or if it would be easier to have a basic FC and a separate ESP32 for communication, camera and for extending the project to control servos for the rolling screen and a gripper in the future. Drafted the BOM but will find more stuff on AliExpress tomorrow. I also explored how to use Hackatime with Onshape and started making the head of Kogane
Devlog #1 [Real] - Schematic design and shopping Summary Used various different sources to learn about different components used in FCs Learned how to use datasheets, Webench, LCSC part selections, etc. Spent time reviewing different requirements for batteries and W/T ratios for drones in general and picking the right batteries and circuit designs Spent a lot of time scoping and rescoping the PCB, including having to remove battery charger and using an external ESC as it was too complex and tight for the compact PCB, especially while having a separate MCU and a lot of other peripherals Learned how to use the STM32CubeMX firmware and how different protocols worked Started exploring PCB editor and systematically arranging components Next Steps Finish arranging PCB Route the PCB and get it verified Finish the CAD model and final BOM Come up with a basic template for firmware
Devlog #2 - Finishing the FC PCB Summary Followed the tutorial for tips to layout the board Used more tutorials and datasheets to understand different concepts of board layout like via stitching and filled zones Made a 4-layer PCB for the first time and learned how to connect power and grounds to appropriate components with vias Learned different routing practices, and despite the suboptimal routing, I am pretty confident now that it will at least be functional Next Steps Finishing the CAD model and final BOM Finishing the firmware template, maybe even using some cameras to test the positioning system
Devlog #3 - Finishing the CAD and Ready to Ship Summary Finished the CAD for Kogane, the drone and the ground station Vibe coded firmware temporarily and tested functionality with my laptop webcam manually Finished documentation and shipping it to Outpost Next Steps Once approved, I have to order and build Will work on firmware while waiting for the parts to arrive to save time
Devlog #4 - Preparing and starting build Summary Had to unpack and arrange all of the electronics I received, checked connectors and what I needed to make connectors for again. Realized I had designed for JST-XH rather than JST-SH connectors so spent a while trying to learn all of the different types of connectors so that I can avoid making the same mistake again For the time being, I stripped wires, crimped them and used my JST-XH connectors for the FC to ESC connection I had no idea how to solder XT60 connectors so I had to learn, and then after a while, I realized I needed to connect a male female pair at the end to avoid deformation so I had wasted the soldering session Next Steps Noticed that JOURNAL.md is more preferred for hardware projects, so I will be switching to that for future documentation Will continue soldering, wiring and coding step by step, but more specifically, I will work on checking if the ESC to FC connection works and if I can power the 5V rail on the board
Ships:
As a Jujutsu Kaisen fan and an admirer of flying pets, I wanted to make Kogane for my room. The objective of Kogane is to be a person-following flying pet assistant that can communicate with voice and through a retractable screen, sort of like a flying Alexa but friendlier! I also wanted to make drones for a while and it seemed like a cool approach to make Kogane. A use case that I had in mind is when I’m working in my room and my hands are busy and if I need to quickly pull up a tutorial, I would normally have to put things down to find my laptop. Instead with Kogane, I can call for Kogane wherever I am in my room and quickly check for information or pull up a Youtube tutorial from its screen without any physical contact. I got everything to work on a very close call, but my harnesses weren’t very strong and accidentally tangled with the propeller for a second, causing a motor to burn up and failing the first test flight (and of course, the shell for Koganeee was pretty but reduced performance aerodynamically). Nonetheless, all of the tests passed and I just need to swap out the motor, but still a successful project regardless and I’m proud of everything I was able to learn, whether it be firmware and networking with the ESP32, the endless soldering sessions for different kinds of components, taking care of batteries, etc. Check out my project and of course, contact me on Slack (sujaygolla24) for questions or just to nerd out about JJK or other anime!!! :D...
|
1793155987.6299675
|
1793242387.6299675
|
|
62581
|
STAR LOG by @Marre | Stardance
|
Marre
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T22:43:08Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Star Log, an astronomy PWA where people can explore NASA’s Astronomy Picture of the Day and Hubble-related discoveries. Getting the NASA API connected was one of the challenges, so I used AI to help me find the API and understand how to use it. I’m proud to have deployed the project on GitHub Pages and made it installable. Try it out and explore the universe!", "repo": "", "demo": ""}]...
|
[{"post_id": 81349, "ts": "202 [{"post_id": 81349, "ts": "2026-10-20T22:14:24Z", "hours": 1.8011, "text": "🌌 Star Log update! I deployed Star Log using GitHub Pages and made it installable as a Progressive Web App (PWA). I also tested the service worker and checked how the app behaves offline. I’m continuing to improve the project Live demo: https://gweth189-hub.github.io/star-log/"}]...
|
Title: STAR LOG by @Marre | Stardance
Devlogs:
🌌 Title: STAR LOG by @Marre | Stardance
Devlogs:
🌌 Star Log update! I deployed Star Log using GitHub Pages and made it installable as a Progressive Web App (PWA). I also tested the service worker and checked how the app behaves offline. I’m continuing to improve the project Live demo: https://gweth189-hub.github.io/star-log/
Ships:
I built Star Log, an astronomy PWA where people can explore NASA’s Astronomy Picture of the Day and Hubble-related discoveries. Getting the NASA API connected was one of the challenges, so I used AI to help me find the API and understand how to use it. I’m proud to have deployed the project on GitHub Pages and made it installable. Try it out and explore the universe!...
|
1793195330.1878576
|
1793281730.1878576
|
|
70559
|
The American Dream by @obedot | Stardance
|
obedot
|
0
|
1.25
|
0
|
[]
|
[{"post_id": 81348, "ts": "202 [{"post_id": 81348, "ts": "2026-10-20T22:14:17Z", "hours": 1.2472, "text": "Set up the Godot project and made a basic mockup of what the UI should look like I’m making a game about life in the 1920s and the difficulty of balancing money, family, and other relationships. I wanted the main play area to be divided into three different tabs, and you had to manage all three of them. Right now, the UI looks really boring and feels unresponsive. But it’s important that I create an outline of how the game’s space is used before I polish it so I can get an idea of where the mechanics will fit on screen."}]...
|
Title: The American Dream by @obedot | Stardance
Title: The American Dream by @obedot | Stardance
Devlogs:
Set up the Godot project and made a basic mockup of what the UI should look like I’m making a game about life in the 1920s and the difficulty of balancing money, family, and other relationships. I wanted the main play area to be divided into three different tabs, and you had to manage all three of them. Right now, the UI looks really boring and feels unresponsive. But it’s important that I create an outline of how the game’s space is used before I polish it so I can get an idea of where the mechanics will fit on screen....
|
1793080141.208573
|
1793684941.208573
|
|
70509
|
IkuOS by @iku_dev | Stardance
|
iku_dev
|
0
|
6.34
|
0
|
[]
|
[{"post_id": 81342, "ts": "202 [{"post_id": 81342, "ts": "2026-10-20T21:50:46Z", "hours": 3.0881, "text": "-_- TODAY okays as for today I changed some stuff and add some elements firstly, I changed the gargage wallpaper and add a nice clean one. I also add this dot feature at the top that adapts to the background color!! i add live time and I made the bottom bar bettter if u noticed i made the welcome card more transparent for the feel ––––of topic—— I crushed out like 10 times today cuz of the guide testing was my brain cells. I was like staring at JavaScript for like 1 hour changing random stuff but i got it to work almost :p cuz it does move but then teleports of the screen soo… and I cut my finger:\\"}, {"post_id": 80980, "ts": "2026-10-19T14:27:42Z", "hours": 3.2475, "text": "ToDaY :| i picked up another project “create your own WebOS!!!!”, so i started with the background, board and task bar with its icons (i drew it m self :D) !!!!The best part!!!!! I made everything adaptive using “percentage” and “vw”, and I hopeful it will work on all devices!!!!"}]...
|
Title: IkuOS by @iku_dev | Stardance
Devlogs:
ToD Title: IkuOS by @iku_dev | Stardance
Devlogs:
ToDaY :| i picked up another project “create your own WebOS!!!!”, so i started with the background, board and task bar with its icons (i drew it m self :D) !!!!The best part!!!!! I made everything adaptive using “percentage” and “vw”, and I hopeful it will work on all devices!!!!
-_- TODAY okays as for today I changed some stuff and add some elements firstly, I changed the gargage wallpaper and add a nice clean one. I also add this dot feature at the top that adapts to the background color!! i add live time and I made the bottom bar bettter if u noticed i made the welcome card more transparent for the feel ––––of topic—— I crushed out like 10 times today cuz of the guide testing was my brain cells. I was like staring at JavaScript for like 1 hour changing random stuff but i got it to work almost :p cuz it does move but then teleports of the screen soo… and I cut my finger:\...
|
1793026035.670857
|
1793630835.670857
|
|
70555
|
web shooter by @Tony1292 | Stardance
|
Tony1292
|
0
|
0.83
|
0
|
[]
|
[{"post_id": 81332, "ts": "202 [{"post_id": 81332, "ts": "2026-10-20T21:13:18Z", "hours": 0.8333, "text": "I was planning and designing the web shooter and listing and finding supplis that I can use to build the web shooter. My fav thing that is going to be in the web shooter is that it will be able to retreat the object that was shoot back to you with a string and a motor when pressing the push button."}]...
|
Title: web shooter by @Tony1292 | Stardance
Devlo Title: web shooter by @Tony1292 | Stardance
Devlogs:
I was planning and designing the web shooter and listing and finding supplis that I can use to build the web shooter. My fav thing that is going to be in the web shooter is that it will be able to retreat the object that was shoot back to you with a string and a motor when pressing the push button....
|
1793062315.3273485
|
1793667115.3273485
|
|
65480
|
Simple Chat by @MarioS271 | Stardance
|
MarioS271
|
1
|
23.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T21:29:00Z", "hours": 23.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Simple Chat A TUI-based chat client and server for local networks, featuring encryption and ssh-like host configuration. simple-chat lets you chat with others on the same network (a LAN, a tailscale tailnet or similar) via a simple terminal UI. It requires no classical internet connection (in the sense that you have to be able to reach the world wide web like google.com or similar), no accounts and no third-party servers. You control everything, and you’re the only one who sees the messages unencrypted. How to get it working quickly Begin by downloading the executable. Then, open a shell in the directory where the simple-chat or simple-chat.exe file is located (or open one via the start menu and cd into the folder where the file is). You will also need multiple shells for this; at least two (one server and one client) but I recommend testing with three to have two clients join onto one server. First, you need to create a server: ./simple-chat server --new <name> You will get an encryption key and a QR code. You need to copy or note down the encryption key. When scanned, the QR code also contains the encryption key. Then, you need to register the server so the clients can connect to it: ./simple-chat client --add <name> --address localhost <name> doesn’t need to be the same name you used in the first command, but I still strongly recommend it. Now, we wanna start the server: ./simple-chat server <name> You should see something like Running as server on port 42003 . Now, in a second terminal, type: ./simple-chat client <name> --name \"Testuser-1\" Then, you should see the TUI pop up. If not, use the README and the docs in the GitHub repo to troubleshoot. Note: In the above command, we’re using the explicit --name flag because if we want two clients on the same machine, they would try to load the same name from the configs. Therefore, we need to explicitly assign two different names via --name . If you want a second client, run the following in a third terminal: ./simple-chat client <name> --name \"Testuser-2\" Additional Info for the above guide In all of the commands, you should substitute <name> with the name for the server, for example Testserver . I recommend you use the same name everywhere, although you CAN theoretically give the actual server and the client-saved server a different name. Thanks for reading all this if you came to this part and have fun! :P", "repo": "https://github.com/MarioS271/simple-chat", "demo": "https://github.com/MarioS271/simple-chat/releases/latest"}]...
|
[{"post_id": 81331, "ts": "202 [{"post_id": 81331, "ts": "2026-10-20T21:11:08Z", "hours": 3.0769, "text": "Final Touches Simple Chat is now basically finished after some final touches. Lots of fixes have been made, along with adding more documentation. Here’s a quick changelog: Fix issue where invalid timestamps would panic all clients which received them Fix key inputs being registered twice on windows Check user name length properly Fix multi-line message drawing logic Add a timeout for the initial handshake (5s) Validate chat messages and user names for control characters Write the timestamp on the server-side to prevent spoofing Fix CTRL+C not quitting the TUI Add a TUI message backlog limit Fix the TUI text input box (wide chars now work properly) Update documentation Fix a few other minor inconsistencies"}, {"post_id": 80738, "ts": "2026-10-18T17:32:01Z", "hours": 3.6989, "text": "Packet Types After a (way too long) pause, I’m finally working on Simple Chat again. I’ve added a packet enum, which wraps all possible kinds of data communication. What this means Basically, now everything that’s being sent has the same interface: serialize and deserialize. You don’t need to worry about what is in this packet, just serialize it, encrypt it and it works. This means handshakes aren’t loose bytes being sent between client and server and held together by pure hopes and dream (im praying somebody gets the reference), but instead a proper packet, which can also now be encrypted. Heartbeats Previously, there was also a big design flaw. If no message was being sent, you couldn’t tell if the others were just not sending anything or had already (uncleanly) disconnected. The TCP stream looked the same in both scenarios. Because of this, I’ve added a Packet::Heartbeat type. It contains no data, and if it gets received by any party, (almost) nothing happens. It’s sole purpose is to keep the stream alive. Now with this, lets say we’re the server: a client doesn’t send a heartbeat twice. We now know that they’ve likely crashed or not properly disconnected in some other way. Because of this, we can now kick them instead of keeping a connection live."}, {"post_id": 76098, "ts": "2026-10-02T10:04:08Z", "hours": 8.5097, "text": "Server Rewrite! I’ve rewritten the server using Tokio instead of Threads for improved performance and less server-side overhead. What Tokio is It utilizes Rust’s async implementation with futures to create a much more lightweight alternative to threads. Basically, you can summon multiple tasks and instead of them being full threads with seperate 8MB stacks and so on, they have way less context switching overhead and a much smaller stack per instance. Other Server-Side Changes In the initial handshake, the client provides its name to the server. If the server receives a message with the wrong name from that client, it will replace the name with the originally given one. Encryption I’m still working on finishing up encryption for all messages and the initial handshake."}, {"post_id": 73319, "ts": "2026-09-24T21:00:42Z", "hours": 2.165, "text": "im almost done already what So… it kinda works???? The client AND server, the TUI, the new message structs and all of that work now. Changelog Reworked Message Struct(s) and multiple message types ( Chat , System ) Proper connect handshake Rework server to use SystemMessage s to broadcast client connect/disconnect events What’s planned A config file to store your name ( ~/.lan-chat ) Encryption (between clients)"}, {"post_id": 73260, "ts": "2026-09-24T18:08:38Z", "hours": 1.1111, "text": "TUI Time! :) The TUI works now, I only need to polish it (stuff like scrolling when message box is full) Additonally, I’m planning to add a special kind of message that the server sends on client join/leave events."}, {"post_id": 73217, "ts": "2026-09-24T16:48:43Z", "hours": 4.4622, "text": "New Project!! This is LAN Chat, a TUI chat messenger to use in the same LAN as others. Build using Rust with ratatui (a TUI library) Currently, I have a working client/server system, which sends serialized message structs. Next up, I’m gonna work on getting the TUI running."}]...
|
Title: Simple Chat by @MarioS271 | Stardance
Devl Title: Simple Chat by @MarioS271 | Stardance
Devlogs:
New Project!! This is LAN Chat, a TUI chat messenger to use in the same LAN as others. Build using Rust with ratatui (a TUI library) Currently, I have a working client/server system, which sends serialized message structs. Next up, I’m gonna work on getting the TUI running.
TUI Time! :) The TUI works now, I only need to polish it (stuff like scrolling when message box is full) Additonally, I’m planning to add a special kind of message that the server sends on client join/leave events.
im almost done already what So… it kinda works???? The client AND server, the TUI, the new message structs and all of that work now. Changelog Reworked Message Struct(s) and multiple message types ( Chat , System ) Proper connect handshake Rework server to use SystemMessage s to broadcast client connect/disconnect events What’s planned A config file to store your name ( ~/.lan-chat ) Encryption (between clients)
Server Rewrite! I’ve rewritten the server using Tokio instead of Threads for improved performance and less server-side overhead. What Tokio is It utilizes Rust’s async implementation with futures to create a much more lightweight alternative to threads. Basically, you can summon multiple tasks and instead of them being full threads with seperate 8MB stacks and so on, they have way less context switching overhead and a much smaller stack per instance. Other Server-Side Changes In the initial handshake, the client provides its name to the server. If the server receives a message with the wrong name from that client, it will replace the name with the originally given one. Encryption I’m still working on finishing up encryption for all messages and the initial handshake.
Packet Types After a (way too long) pause, I’m finally working on Simple Chat again. I’ve added a packet enum, which wraps all possible kinds of data communication. What this means Basically, now everything that’s being sent has the same interface: serialize and deserialize. You don’t need to worry about what is in this packet, just serialize it, encrypt it and it works. This means handshakes aren’t loose bytes being sent between client and server and held together by pure hopes and dream (im praying somebody gets the reference), but instead a proper packet, which can also now be encrypted. Heartbeats Previously, there was also a big design flaw. If no message was being sent, you couldn’t tell if the others were just not sending anything or had already (uncleanly) disconnected. The TCP stream looked the same in both scenarios. Because of this, I’ve added a Packet::Heartbeat type. It contains no data, and if it gets received by any party, (almost) nothing happens. It’s sole purpose is to keep the stream alive. Now with this, lets say we’re the server: a client doesn’t send a heartbeat twice. We now know that they’ve likely crashed or not properly disconnected in some other way. Because of this, we can now kick them instead of keeping a connection live.
Final Touches Simple Chat is now basically finished after some final touches. Lots of fixes have been made, along with adding more documentation. Here’s a quick changelog: Fix issue where invalid timestamps would panic all clients which received them Fix key inputs being registered twice on windows Check user name length properly Fix multi-line message drawing logic Add a timeout for the initial handshake (5s) Validate chat messages and user names for control characters Write the timestamp on the server-side to prevent spoofing Fix CTRL+C not quitting the TUI Add a TUI message backlog limit Fix the TUI text input box (wide chars now work properly) Update documentation Fix a few other minor inconsistencies
Ships:
Simple Chat A TUI-based chat client and server for local networks, featuring encryption and ssh-like host configuration. simple-chat lets you chat with others on the same network (a LAN, a tailscale tailnet or similar) via a simple terminal UI. It requires no classical internet connection (in the sense that you have to be able to reach the world wide web like google.com or similar), no accounts and no third-party servers. You control everything, and you’re the only one who sees the messages unencrypted. How to get it working quickly Begin by downloading the executable. Then, open a shell in the directory where the simple-chat or simple-chat.exe file is located (or open one via the start menu and cd into the folder where the file is). You will also need multiple shells for this; at least two (one server and one client) but I recommend testing with three to have two clients join onto one server. First, you need to create a server: ./simple-chat server --new <name> You will get an encryption key and a QR code. You need to copy or note down the encryption key. When scanned, the QR code also contains the encryption key. Then, you need to register the server so the clients can connect to it: ./simple-chat client --add <name> --address localhost <name> doesn’t need to be the same name you used in the first command, but I still strongly recommend it. Now, we wanna start the server: ./simple-chat server <name> You should see something like Running as server on port 42003 . Now, in a second terminal, type: ./simple-chat client <name> --name "Testuser-1" Then, you should see the TUI pop up. If not, use the README and the docs in the GitHub repo to troubleshoot. Note: In the above command, we’re using the explicit --name flag because if we want two clients on the same machine, they would try to load the same name from the configs. Therefore, we need to explicitly assign two different names via --name . If you want a second client, run the following in a third terminal: ./simple-chat client <name> --name "Testuser-2" Additional Info for the above guide In all of the commands, you should substitute <name> with the name for the server, for example Testserver . I recommend you use the same name everywhere, although you CAN theoretically give the actual server and the client-saved server a different name. Thanks for reading all this if you came to this part and have fun! :P...
|
1793087564.1708493
|
1793173964.1708493
|
|
70689
|
mini About me website for Boba Bash workshop by @L mini About me website for Boba Bash workshop by @Luksus | Stardance...
|
Luksus
|
0
|
2.2
|
0
|
[]
|
[{"post_id": 81325, "ts": "202 [{"post_id": 81325, "ts": "2026-10-20T20:39:12Z", "hours": 2.2047, "text": "Website for Boba bash workshop The workshop was about learning basic html, css, js. Since I know how to html, I created something funny, because I wanted to be a part of the workshop that was online. Those who live in India in some spot, Boba Bash will have a live event, where you need your website to enter. I wont ship this project as I don’t take it as a serious project. I added it because it was a part of Stardance and I wanted it here. The website contains basic js, css, html. Only true coders mix html and css into index.html. When you click the “next” button, you get next message and the button will move to another spot for funsies ."}]...
|
Title: mini About me website for Boba Bash worksho Title: mini About me website for Boba Bash workshop by @Luksus | Stardance
Devlogs:
Website for Boba bash workshop The workshop was about learning basic html, css, js. Since I know how to html, I created something funny, because I wanted to be a part of the workshop that was online. Those who live in India in some spot, Boba Bash will have a live event, where you need your website to enter. I wont ship this project as I don’t take it as a serious project. I added it because it was a part of Stardance and I wanted it here. The website contains basic js, css, html. Only true coders mix html and css into index.html. When you click the “next” button, you get next message and the button will move to another spot for funsies ....
|
1793195367.0045469
|
1793800167.0045469
|
|
70410
|
WAKEUP by @gustavocunha | Stardance
|
gustavocunha
|
0
|
1.88
|
0
|
[]
|
[{"post_id": 81324, "ts": "202 [{"post_id": 81324, "ts": "2026-10-20T20:38:23Z", "hours": 1.8833, "text": "I did the whole PCB part myself. I know it ended up looking a bit like the example, but I can’t think of other simple features, since keeping it simple is my goal. My only doubt was that my XIAO is different from the one in the tutorial, but I think it’s right."}]...
|
Title: WAKEUP by @gustavocunha | Stardance
Devlog Title: WAKEUP by @gustavocunha | Stardance
Devlogs:
I did the whole PCB part myself. I know it ended up looking a bit like the example, but I can’t think of other simple features, since keeping it simple is my goal. My only doubt was that my XIAO is different from the one in the tutorial, but I think it’s right....
|
1793008419.0316083
|
1793613219.0316083
|
|
37056
|
Main Website/Portfolio by @reshiiiram | Stardance
|
reshiiiram
|
2
|
23.0
|
61
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T20:28:46Z", "hours": 8.0, "multiplier": 7.28, "payout": 61, "blessing": "neutral", "text": "Alright!!! this is going to be my website’s second ship! Please check out the art gallery and the cool image map! I’m really proud of how this portfolio came out and I will be adding the photography page next and may be a blog page next ship.", "repo": "https://github.com/mairemare/reshi-the-coolram", "demo": "https://mairemare.github.io/reshi-the-coolram/"}, {"ship_num": 2, "ts": "2026-07-26T04:11:47Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It’s finally done!!! I really love how this website turned out after 15 hours of coding. This website really shows my interests and love for space. My website includes: an about me, projects section, and an updates section where I’ll put any important updates on my projects or my life. I’m gonna improve more on website making so that I can promote my future projects even more and my friends with their fan merch businesses. Thank you for all your support! I might take a short break on coding after this and begin on Library of Halcyon.", "repo": "https://github.com/mairemare/reshi-the-coolram", "demo": "https://mairemare.github.io/reshi-the-coolram/"}]...
|
[{"post_id": 81322, "ts": "202 [{"post_id": 81322, "ts": "2026-10-20T20:24:59Z", "hours": 0.4608, "text": "Alright!!! my website it ready for shipping! Not all the pages are done but the gallery is up!"}, {"post_id": 81109, "ts": "2026-10-19T22:17:55Z", "hours": 0.8553, "text": "Image Map Complete! I am now currently adding my art in my art gallery and I will potentially add my photos next."}, {"post_id": 80882, "ts": "2026-10-19T04:44:37Z", "hours": 1.2711, "text": "Added my first link on image map. I’m having a slight problem on alignment but that just means I need to watch a tut on how to actually do this. I also added some of the stuff back from the first version of the website."}, {"post_id": 78923, "ts": "2026-10-12T01:57:39Z", "hours": 1.0742, "text": "reworked about me Okay so I reworked the about me section and put up small details about myself. I will be working on adding coordinates on my image map after I’m done with the main page so that there wouldn’t be any conflict (just in case that it turns my html does not care that the image is a separate entity)."}, {"post_id": 78739, "ts": "2026-10-11T13:25:37Z", "hours": 1.3261, "text": "progress^^ I’m working on an image map so my website can look more cooler and colorful. Might make mini-pages alongside that to show all my artworks and coding projects. I should be able to ship this before stardance ends."}, {"post_id": 60642, "ts": "2026-09-03T04:03:41Z", "hours": 2.9783, "text": "I’ve been reworking on my main website layout (since witchyware is out and there isn’t enough space on the page). I’m still sticking to the space concept and I’m gonna try and figure out the script for making tabs. Probably tomorrow night I’ll think of a different header design."}, {"post_id": 46158, "ts": "2026-08-13T05:36:00Z", "hours": 0.3444, "text": "I’m back! — okay so I updated the website to put concept arts and new updates. I’ve been watching and learning css stuff so that I can make my website easier to navigate. My plan is to separate the sections and the projects…something like that. Then, I’ll add a gallery section and other stuff. — I think I’ll be able to update it once I finish half of the warioware mission."}, {"post_id": 34961, "ts": "2026-07-26T02:47:43Z", "hours": 4.6428, "text": "My website is about to be ready for shipping! I can’t figure out how to get the link to open my website instead of my readme. Either way, here’s a preview of my read me!"}, {"post_id": 34417, "ts": "2026-07-25T03:27:28Z", "hours": 3.8119, "text": "Almost done with the site! All I need to do is to add a few aesthetics and more mechanisms. Anyways, here’s a preview of the projects section. Thank you for all your support chat."}, {"post_id": 33894, "ts": "2026-07-24T05:29:07Z", "hours": 2.3725, "text": "New Layout!! I finally got the arrangement and the buttons to work. I might be able to ship this tomorrow or the day after that."}, {"post_id": 33350, "ts": "2026-07-23T05:56:41Z", "hours": 1.1056, "text": "a lot of progress!! I discovered the existence of img src and text align and underwent an Industrial Revolution. I just need to learn how to code buttons and I’m off to designing and adding stuff."}, {"post_id": 33329, "ts": "2026-07-23T04:24:55Z", "hours": 1.9858, "text": "After 3 Youtube tutorials and 10 google searches later, I finally made some great progress! Well, it doesn’t really look like what I had planned, but everything is starting to come together."}, {"post_id": 32784, "ts": "2026-07-22T05:14:34Z", "hours": 0.4086, "text": "Lowkey finished my website’s outline and what it should look like. I’m working on a cyberpunk style website where I can put up my works and all that stuff."}, {"post_id": 32768, "ts": "2026-07-22T04:13:21Z", "hours": 0.6614, "text": "Just finished the personal web tutorial. Not bad as my first coding project that isn’t block based. I’m gonna start outlining what I want my web to look like on Canva and learn CSS after this log."}]...
|
Title: Main Website/Portfolio by @reshiiiram | Sta Title: Main Website/Portfolio by @reshiiiram | Stardance
Devlogs:
Just finished the personal web tutorial. Not bad as my first coding project that isn’t block based. I’m gonna start outlining what I want my web to look like on Canva and learn CSS after this log.
Lowkey finished my website’s outline and what it should look like. I’m working on a cyberpunk style website where I can put up my works and all that stuff.
After 3 Youtube tutorials and 10 google searches later, I finally made some great progress! Well, it doesn’t really look like what I had planned, but everything is starting to come together.
a lot of progress!! I discovered the existence of img src and text align and underwent an Industrial Revolution. I just need to learn how to code buttons and I’m off to designing and adding stuff.
New Layout!! I finally got the arrangement and the buttons to work. I might be able to ship this tomorrow or the day after that.
Almost done with the site! All I need to do is to add a few aesthetics and more mechanisms. Anyways, here’s a preview of the projects section. Thank you for all your support chat.
My website is about to be ready for shipping! I can’t figure out how to get the link to open my website instead of my readme. Either way, here’s a preview of my read me!
I’m back! — okay so I updated the website to put concept arts and new updates. I’ve been watching and learning css stuff so that I can make my website easier to navigate. My plan is to separate the sections and the projects…something like that. Then, I’ll add a gallery section and other stuff. — I think I’ll be able to update it once I finish half of the warioware mission.
I’ve been reworking on my main website layout (since witchyware is out and there isn’t enough space on the page). I’m still sticking to the space concept and I’m gonna try and figure out the script for making tabs. Probably tomorrow night I’ll think of a different header design.
progress^^ I’m working on an image map so my website can look more cooler and colorful. Might make mini-pages alongside that to show all my artworks and coding projects. I should be able to ship this before stardance ends.
reworked about me Okay so I reworked the about me section and put up small details about myself. I will be working on adding coordinates on my image map after I’m done with the main page so that there wouldn’t be any conflict (just in case that it turns my html does not care that the image is a separate entity).
Added my first link on image map. I’m having a slight problem on alignment but that just means I need to watch a tut on how to actually do this. I also added some of the stuff back from the first version of the website.
Image Map Complete! I am now currently adding my art in my art gallery and I will potentially add my photos next.
Alright!!! my website it ready for shipping! Not all the pages are done but the gallery is up!
Ships:
It’s finally done!!! I really love how this website turned out after 15 hours of coding. This website really shows my interests and love for space. My website includes: an about me, projects section, and an updates section where I’ll put any important updates on my projects or my life. I’m gonna improve more on website making so that I can promote my future projects even more and my friends with their fan merch businesses. Thank you for all your support! I might take a short break on coding after this and begin on Library of Halcyon.
Alright!!! this is going to be my website’s second ship! Please check out the art gallery and the cool image map! I’m really proud of how this portfolio came out and I will be adding the photography page next and may be a blog page next ship....
|
1793091247.515727
|
1793177647.515727
|
|
57429
|
UltimateWarioPlane by @niejestemprawdziwyy | Stard UltimateWarioPlane by @niejestemprawdziwyy | Stardance...
|
niejestemprawdziwyy
|
0
|
6.55
|
0
|
[]
|
[{"post_id": 81320, "ts": "202 [{"post_id": 81320, "ts": "2026-10-20T20:14:01Z", "hours": 4.4625, "text": "Ole mole guacamole Got seriously lost and had to fix a bug, because the game crashed but now i’ve got minigame 1 done. I also wanted to add the explosion when losing a life, because why not. The next minigame will be either clicker or space invaders clone, we’ll see. And why is piwo the substitute of heart here, when it’s a game about a plane? Because piwo is my fuel."}, {"post_id": 77100, "ts": "2026-10-05T17:08:55Z", "hours": 2.0906, "text": "Just a simple look at the platform level, most things still don’t have textures, so what would i be showing lol. For now i’m following the tutorial, but i still want to add some variations. Except the playable character being, well, a plane. And all jokes aside, flappy bird with it would be quite the idea for another minigame. And also, if anyone reads devlogs, do you know why is the plane so blurry? When i look at the image it’s normal, but in godot it’s all blurred. I made it in piskel and exported as .png. Lastly, if YOU have an idea of a fun minigame, comment down below and remember to like, subscribe and whatever byee"}]...
|
Title: UltimateWarioPlane by @niejestemprawdziwyy Title: UltimateWarioPlane by @niejestemprawdziwyy | Stardance
Devlogs:
Just a simple look at the platform level, most things still don’t have textures, so what would i be showing lol. For now i’m following the tutorial, but i still want to add some variations. Except the playable character being, well, a plane. And all jokes aside, flappy bird with it would be quite the idea for another minigame. And also, if anyone reads devlogs, do you know why is the plane so blurry? When i look at the image it’s normal, but in godot it’s all blurred. I made it in piskel and exported as .png. Lastly, if YOU have an idea of a fun minigame, comment down below and remember to like, subscribe and whatever byee
Ole mole guacamole Got seriously lost and had to fix a bug, because the game crashed but now i’ve got minigame 1 done. I also wanted to add the explosion when losing a life, because why not. The next minigame will be either clicker or space invaders clone, we’ll see. And why is piwo the substitute of heart here, when it’s a game about a plane? Because piwo is my fuel....
|
1792705933.8041182
|
1793310733.8041182
|
|
69463
|
fast typing by @pmandal7355 | Stardance
|
pmandal7355
|
0
|
5.54
|
0
|
[]
|
[{"post_id": 81310, "ts": "202 [{"post_id": 81310, "ts": "2026-10-20T19:30:08Z", "hours": 0.6739, "text": "made the readme and now its time to ship"}, {"post_id": 81200, "ts": "2026-10-20T08:12:57Z", "hours": 1.3483, "text": "made the game , just some bugs need to be fixed and the readme is left"}, {"post_id": 80997, "ts": "2026-10-19T15:31:09Z", "hours": 0.6178, "text": "made the full parts of the rendering , just the ui is left to made and the readme is left"}, {"post_id": 80668, "ts": "2026-10-18T13:25:01Z", "hours": 1.8475, "text": "made the livery and race sentences and some tweaks, next will be the rendering part and ui , everything is from scratch"}, {"post_id": 79632, "ts": "2026-10-14T19:16:52Z", "hours": 1.0489, "text": "made some parts of the game and downloaded the dependencies and made the graphics"}]...
|
Title: fast typing by @pmandal7355 | Stardance
De Title: fast typing by @pmandal7355 | Stardance
Devlogs:
made some parts of the game and downloaded the dependencies and made the graphics
made the livery and race sentences and some tweaks, next will be the rendering part and ui , everything is from scratch
made the full parts of the rendering , just the ui is left to made and the readme is left
made the game , just some bugs need to be fixed and the readme is left
made the readme and now its time to ship...
|
1792849852.9382157
|
1793454652.9382157
|
|
66842
|
Netcity by @Mando328 | Stardance
|
Mando328
|
1
|
21.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T19:41:18Z", "hours": 21.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "NETCITY Netcity is an animated network visualizer. For now it only works in demo mode, in which it generates fake network traffic to use in the visualizer. In the future i plan on adding real network listener to show it and an audio layer generated from the network movement.", "repo": "https://github.com/Mando328/NetCity", "demo": "https://github.com/Mando328/NetCity/releases/tag/v0.2.0-alpha"}]...
|
[{"post_id": 81307, "ts": "202 [{"post_id": 81307, "ts": "2026-10-20T19:22:39Z", "hours": 5.8833, "text": "Devlog #6: Wrote the frontend and package TL;DR: Wrote the 3D engine and vibecoded the package Goal for this session: Write an visual interpretation for the data from server What I did: In three js i turn every ip into separate buildings. Ips from the same host group into districts. In the center there is a router. AI usage: Used AI to polish up the front end because I hate working with it, but like 4.5h of my time was spend on laying the basics down and than AI came and added a bit of animations and the distrification feature. AI wrote the whole instaler thing with electron. I added human vs AI coding bar here for proof of not being a vibecoder. What I learned A whole lot about THREE.js That electron exists"}, {"post_id": 79421, "ts": "2026-10-13T21:51:50Z", "hours": 7.7525, "text": "Devlog #5: Wrote memory system TL;DR: Wrote a memory system that holds the city state and sends changes that occurred to frontend Goal for this session: Make city.py track which cells changed since the last read, so the server can send small updates instead of the full state 10 times per second. What I did: Made a Cell and City class that hold info about… city and cell. Could have guessed tbh. Decided that each cell will represent one ip, and ips used by the same process will spawn (if possible) neighboring each another so we can get distinct districts. Problems I hit: My first grid generating algorithm could not spawn cells in an even way around the center. I used ai to help me with the math needed for the new one. It now works really good. What I learned Yes Math is hard Next up: Establish the actual connection that will use this code MY LONGEST SESSION EVER"}, {"post_id": 77491, "ts": "2026-10-07T06:53:25Z", "hours": 0.8111, "text": "Devlog #4: Wrote a web socket TL;DR: Wrote a simple asynchronous web socket to connect backend with frontend. Goal for this session: Write a backend connection to upcoming frontend What I did: Wrote a script that turns snapshots from the aggregator into JSON and sends them to the browser window through a websocket. It worked pretty well (see the screenshots) Problems I hit: I spent a while searching for why is the port i am trying to use already taken (I could not open connection through it) and it turned out that MY OWN SERVER.PY WAS ALREADY RUNNING AND BLOCKING THE PORT. Nonetheless, lesson learned. I also had problem with websocket.serve expecting only one argument while my handler needed two, but I solved it with lambda temporary function. What I learned What a websocket is What a async function is That I can use lambda ws: handler(ws, agg) to pass more arguments into websocket.serve when I need to. Next up: Create the 3D engine in JS"}, {"post_id": 77380, "ts": "2026-10-06T18:31:17Z", "hours": 1.2567, "text": "Devlog #3: Tested the aggregator TL;DR: Built test_run.py to bridge the fake traffic generator and the aggregator in real-time using threads. Goal for this session: Connect the background event generator to the aggregator and test them both What I did: So I simply started the generator in a separate thread and wrote a loop that calculates the packets and bytes/s in/out in each tick (100ms) . It later prints it in terminal with info about packet and event count. The output: processes=4 packets=28 events=0 in : 133078 B/s, out: 20054 B/s processes=5 packets=25 events=0 in : 114678 B/s, out: 21327 B/s processes=5 packets=27 events=1 in : 86732 B/s, out: 29492 B/s processes=4 packets=25 events=1 in : 67049 B/s, out: 7650 B/s processes=4 packets=28 events=1 in : 124895 B/s, out: 15077 B/s processes=6 packets=25 events=0 in : 83312 B/s, out: 30431 B/s processes=6 packets=48 events=0 in : 241464 B/s, out: 60790 B/s processes=5 packets=119 events=0 in : 751542 B/s, out: 74549 B/s processes=5 packets=133 events=0 in : 790185 B/s, out: 63535 B/s btw the sudden spike of packets we see at the end is a proof of the burst functionality working! Problems I hit: I accidentally overwrote the values of bytes per second so it only showed the values of the last packet, not the sum of them. Next up: Write the web socket for frontend integration (this is fully new territory for me so I am excited) P.S thanks to @ethmarks for devlog review"}, {"post_id": 77104, "ts": "2026-10-05T17:16:20Z", "hours": 1.41, "text": "Devlog #2: Writing the aggregator TL;DR: Wrote the Aggregator that empties the queue every tick and turns hundreds of single events into one snapshot. Tested it with asserts. Hit a few silent bugs on the way. Goal for this session: Write the part that actually reads the queue from the fake generator and summarizes it. What I did: Wrote the aggregator with flush() function flush() takes everything out of the queue and returns one snapshot: bytes in, bytes out and packet count per process, plus a list of one-off events (DNS and connections) Traffic with no known process goes under \"unknown\" - Added a limit of 20000 events per tick, so a flood of events can’t make one tick last forever This is how the snapshots looks like: { \"t\": 1791121104.34, \"processes\": { \"chrome.exe\": {\"bytes_in\": 1000, \"bytes_out\": 200, \"packets\": 2}, \"spotify.exe\": {\"bytes_in\": 500, \"bytes_out\": 0, \"packets\": 1}, \"unknown\": {\"bytes_in\": 0, \"bytes_out\": 120, \"packets\": 1} }, \"events\": [ {\"type\": \"dns\", \"process\": \"unknown\", \"request_name\": \"google.com\"} ]} Problems I hit: I used =+ 1 instead of += 1 so the program just set the counter to 1 instead of adding 1 What I learned: -That the bugs that do not crash the script are worse than the ones that do #Next up: test_run.py : fake generator in a thread + aggregator every 100 ms Turn per-tick sums into bytes/s P.S. : BUKU BUKU GO!"}, {"post_id": 75974, "ts": "2026-10-01T19:55:22Z", "hours": 1.4017, "text": "Devlog #1.1 Just a quick update: I managed to finish the fake traffic generator. If you want to read about it, check the last devlog. Next up: An aggregator that will collect and encapsulate all those random-timed events into organized packets"}, {"post_id": 75688, "ts": "2026-09-30T19:18:46Z", "hours": 2.4631, "text": "Devlog #1: Writing fake traffic generator TL;DR: Wrote a fake event generator for normal events, still need to do it for DNS and connections. Had trouble with time.sleep() Goal for this session Write a bigger part of fake event generator What I did Wrote helper functions for queueing, making states of processes and making packets from states Wrote a function that using them all adds packets to queue Implemented the burst functionality into it Problems I hit The output was not smooth. During 5 seconds it was sometimes generating much less packets than expected. It was because time.sleep(0.01) is not exactly 0.01s but at least 0.01s. Fix: measure the real time since the last iteration dt and scale by it, so the packet count follows real time, not loop speed. The fractional part is handled with a random coin flip, since I can’t send 0.033 of a packet: expected = state [ \"rate\" ] * mult * dt n = int ( expected ) if random . random () < ( expected - n ) : n = n + 1 for _ in range ( n ) : put ( q , make_packet ( name , prof , state )) What I learned That time.sleep can’t be trusted What threading is What queues are Next up Add DNS and connection events to this"}, {"post_id": 75320, "ts": "2026-09-29T19:00:26Z", "hours": 0.3839, "text": "Devlog #0: Project started! TL;DR: Just some basic info about the project What is this project? Netcity is going to be an audiovisual representation of internet traffic being sent from and to your device. I want to visualize the flow of packet as city traffic, apps as building and apps categories as districts. What is done? I coded the classes. Event info will be held in NamedTuples, just like that class PacketEvent(NamedTuple): time_s: float process: str | None direction : str # in or out protocol : str # tcp or udp remote_ip: str remote_port : int size: int Next up Test the data types Add fake readings generator"}]...
|
Title: Netcity by @Mando328 | Stardance
Devlogs:
Title: Netcity by @Mando328 | Stardance
Devlogs:
Devlog #0: Project started! TL;DR: Just some basic info about the project What is this project? Netcity is going to be an audiovisual representation of internet traffic being sent from and to your device. I want to visualize the flow of packet as city traffic, apps as building and apps categories as districts. What is done? I coded the classes. Event info will be held in NamedTuples, just like that class PacketEvent(NamedTuple): time_s: float process: str | None direction : str # in or out protocol : str # tcp or udp remote_ip: str remote_port : int size: int Next up Test the data types Add fake readings generator
Devlog #1: Writing fake traffic generator TL;DR: Wrote a fake event generator for normal events, still need to do it for DNS and connections. Had trouble with time.sleep() Goal for this session Write a bigger part of fake event generator What I did Wrote helper functions for queueing, making states of processes and making packets from states Wrote a function that using them all adds packets to queue Implemented the burst functionality into it Problems I hit The output was not smooth. During 5 seconds it was sometimes generating much less packets than expected. It was because time.sleep(0.01) is not exactly 0.01s but at least 0.01s. Fix: measure the real time since the last iteration dt and scale by it, so the packet count follows real time, not loop speed. The fractional part is handled with a random coin flip, since I can’t send 0.033 of a packet: expected = state [ "rate" ] * mult * dt n = int ( expected ) if random . random () < ( expected - n ) : n = n + 1 for _ in range ( n ) : put ( q , make_packet ( name , prof , state )) What I learned That time.sleep can’t be trusted What threading is What queues are Next up Add DNS and connection events to this
Devlog #1.1 Just a quick update: I managed to finish the fake traffic generator. If you want to read about it, check the last devlog. Next up: An aggregator that will collect and encapsulate all those random-timed events into organized packets
Devlog #2: Writing the aggregator TL;DR: Wrote the Aggregator that empties the queue every tick and turns hundreds of single events into one snapshot. Tested it with asserts. Hit a few silent bugs on the way. Goal for this session: Write the part that actually reads the queue from the fake generator and summarizes it. What I did: Wrote the aggregator with flush() function flush() takes everything out of the queue and returns one snapshot: bytes in, bytes out and packet count per process, plus a list of one-off events (DNS and connections) Traffic with no known process goes under "unknown" - Added a limit of 20000 events per tick, so a flood of events can’t make one tick last forever This is how the snapshots looks like: { "t": 1791121104.34, "processes": { "chrome.exe": {"bytes_in": 1000, "bytes_out": 200, "packets": 2}, "spotify.exe": {"bytes_in": 500, "bytes_out": 0, "packets": 1}, "unknown": {"bytes_in": 0, "bytes_out": 120, "packets": 1} }, "events": [ {"type": "dns", "process": "unknown", "request_name": "google.com"} ]} Problems I hit: I used =+ 1 instead of += 1 so the program just set the counter to 1 instead of adding 1 What I learned: -That the bugs that do not crash the script are worse than the ones that do #Next up: test_run.py : fake generator in a thread + aggregator every 100 ms Turn per-tick sums into bytes/s P.S. : BUKU BUKU GO!
Devlog #3: Tested the aggregator TL;DR: Built test_run.py to bridge the fake traffic generator and the aggregator in real-time using threads. Goal for this session: Connect the background event generator to the aggregator and test them both What I did: So I simply started the generator in a separate thread and wrote a loop that calculates the packets and bytes/s in/out in each tick (100ms) . It later prints it in terminal with info about packet and event count. The output: processes=4 packets=28 events=0 in : 133078 B/s, out: 20054 B/s processes=5 packets=25 events=0 in : 114678 B/s, out: 21327 B/s processes=5 packets=27 events=1 in : 86732 B/s, out: 29492 B/s processes=4 packets=25 events=1 in : 67049 B/s, out: 7650 B/s processes=4 packets=28 events=1 in : 124895 B/s, out: 15077 B/s processes=6 packets=25 events=0 in : 83312 B/s, out: 30431 B/s processes=6 packets=48 events=0 in : 241464 B/s, out: 60790 B/s processes=5 packets=119 events=0 in : 751542 B/s, out: 74549 B/s processes=5 packets=133 events=0 in : 790185 B/s, out: 63535 B/s btw the sudden spike of packets we see at the end is a proof of the burst functionality working! Problems I hit: I accidentally overwrote the values of bytes per second so it only showed the values of the last packet, not the sum of them. Next up: Write the web socket for frontend integration (this is fully new territory for me so I am excited) P.S thanks to @ethmarks for devlog review
Devlog #4: Wrote a web socket TL;DR: Wrote a simple asynchronous web socket to connect backend with frontend. Goal for this session: Write a backend connection to upcoming frontend What I did: Wrote a script that turns snapshots from the aggregator into JSON and sends them to the browser window through a websocket. It worked pretty well (see the screenshots) Problems I hit: I spent a while searching for why is the port i am trying to use already taken (I could not open connection through it) and it turned out that MY OWN SERVER.PY WAS ALREADY RUNNING AND BLOCKING THE PORT. Nonetheless, lesson learned. I also had problem with websocket.serve expecting only one argument while my handler needed two, but I solved it with lambda temporary function. What I learned What a websocket is What a async function is That I can use lambda ws: handler(ws, agg) to pass more arguments into websocket.serve when I need to. Next up: Create the 3D engine in JS
Devlog #5: Wrote memory system TL;DR: Wrote a memory system that holds the city state and sends changes that occurred to frontend Goal for this session: Make city.py track which cells changed since the last read, so the server can send small updates instead of the full state 10 times per second. What I did: Made a Cell and City class that hold info about… city and cell. Could have guessed tbh. Decided that each cell will represent one ip, and ips used by the same process will spawn (if possible) neighboring each another so we can get distinct districts. Problems I hit: My first grid generating algorithm could not spawn cells in an even way around the center. I used ai to help me with the math needed for the new one. It now works really good. What I learned Yes Math is hard Next up: Establish the actual connection that will use this code MY LONGEST SESSION EVER
Devlog #6: Wrote the frontend and package TL;DR: Wrote the 3D engine and vibecoded the package Goal for this session: Write an visual interpretation for the data from server What I did: In three js i turn every ip into separate buildings. Ips from the same host group into districts. In the center there is a router. AI usage: Used AI to polish up the front end because I hate working with it, but like 4.5h of my time was spend on laying the basics down and than AI came and added a bit of animations and the distrification feature. AI wrote the whole instaler thing with electron. I added human vs AI coding bar here for proof of not being a vibecoder. What I learned A whole lot about THREE.js That electron exists
Ships:
NETCITY Netcity is an animated network visualizer. For now it only works in demo mode, in which it generates fake network traffic to use in the visualizer. In the future i plan on adding real network listener to show it and an audio layer generated from the network movement....
|
1793102057.1953986
|
1793188457.1953986
|
|
70680
|
Test by @radioblahaj | Stardance
|
radioblahaj
|
0
|
1.27
|
0
|
[]
|
[{"post_id": 81303, "ts": "202 [{"post_id": 81303, "ts": "2026-10-20T18:50:20Z", "hours": 1.275, "text": "Desktop pet"}]...
|
Title: Test by @radioblahaj | Stardance
Devlogs:
Title: Test by @radioblahaj | Stardance
Devlogs:
Desktop pet...
|
1793191744.676343
|
1793796544.676343
|
|
67095
|
Lightweight minesweeper by @Pery | Stardance
|
Pery
|
0
|
1.29
|
0
|
[]
|
[{"post_id": 81301, "ts": "202 [{"post_id": 81301, "ts": "2026-10-20T18:39:25Z", "hours": 1.2889, "text": "Read more"}]...
|
Title: Lightweight minesweeper by @Pery | Stardanc Title: Lightweight minesweeper by @Pery | Stardance
Devlogs:
Read more...
|
1793105665.8977618
|
1793710465.8977618
|
|
30933
|
HamOS (ham-ster, not ham) by @Luksus | Stardance
|
Luksus
|
4
|
37.0
|
361
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T19:20:33Z", "hours": 13.0, "multiplier": 16.46, "payout": 219, "blessing": "neutral", "text": "PLEASE READ LAST DEVLOG <3 Hello. This is the 3rd and last ship of HamOS. It was incredibly fun making this project. In this ship I added a lots of things which I don’t remember (CurrentOpenAppsBar, F11, animations, styles, widgets, bug fixes, QoL updates, etc..) Please checkout every app, windows, features in HamOS. There is a hidden secret for you the second, you enter the website! My main inspiration for this project was the old era of computers and my hamster “Džambule”. (May my luck find 188 stardust for grants from this ship)", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}, {"ship_num": 2, "ts": "2026-08-10T20:10:55Z", "hours": 8.0, "multiplier": 9.8, "payout": 81, "blessing": "neutral", "text": "Hello everyone! This is my 3nd ship of HamOS. (2nd of WebOS 2) A lot has changed since 2nd ship and those are: Apps: Help, App for helping users with QnA Settings, App for customization of HamOS HamOS To Go, Similar app (tool) to Windows To Go, it will launch HamOS in your tab instead of Džambulas computer. A new shortcut to Wikipedia New look for existing Introduction app, in NOKIA style (hands) And the biggest nightmare…. Scaling. I had problems with scaling HamOS website to other resolutions. Only 1920x1080 was supported, but now from 720p to 4K (16:9) should work without any major issues. The most annoying thing about this were also always changing margins, so app icons are alligned, etc… And for fun, I added a little sticky note that will help visitors start up the computer with HamOS. Also please, do not mind if the window you are moving is faster or slower than your mouse pointer. (check app Help) If you have any ideas, on what I should add, comment please! Visit HamOS at: https://lkspodmol.github.io/myos1/ (Please try F11) Thanks for reading. Happy coding and happy rating!", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}, {"ship_num": 3, "ts": "2026-07-24T23:17:16Z", "hours": 7.0, "multiplier": 8.65, "payout": 61, "blessing": "neutral", "text": "Hello everyone! This is 2nd ship of HamOS, that brought some cool features and that are: Crt monitor Coslop Starting and shutting down the system Sound effects! I had a lot of fun drawing in this ship. I think the crt monitor turned out very good. I am also very happy with the sounds I added. Fits in so well. I am also updating the very fine text on the “Floppy”, that says, what version you are running (always the newest). I have some ideas for the future, but I think that a little break whould be also very good idea. If you have any ideas, on what I should add, comment please! Likes are very appreciated <3. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}, {"ship_num": 4, "ts": "2026-07-22T16:02:57Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Have a working webpage with multiple draggable windows, Check It should look like your own and not exactly like the guide, Check Have at least 3 devlogs showing your progress along the way, Check Have at least 1 new feature that the guide didn’t list, Check It shouldn’t have a password (so anyone can test it out!), Check Hello everyone! This is my first ship on stardance and I hope, that you will like my WebOS 1. My WebOS 1 is HamOS. Not ham like ham, but ham like ham-ster. Hamster, because of my hamster Džambule. I love him very much, so I got an idea to create WebOS, that is designed for him and you got in somehow. Little things that I liked when coding is being lost in my own code. The best things I added in my opinion are: The loading screen!! Photo gallery of him And the custom hand drew icons made by me (intentionally bad) So please, visit and try HamOS at: https://lkspodmol.github.io/myos1/ . WebOS 1 was incredibly fun and interesting and I will try to continue in WebOS 2. Should it be HamOS, or HamOS PRO? Let me know. Thank you for reading this or commenting, liking and happy coding!", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}]...
|
[{"post_id": 81298, "ts": "202 [{"post_id": 81298, "ts": "2026-10-20T18:28:24Z", "hours": 1.8453, "text": "Devlog? #15 - PLEASE READ! Hello everyone… New version of HamOS v1.7 just rolled out. What have I added or fixed? Bugs: volume lowered of loud sounds Added: new styles menu new styles The end? So yeah. This will be probably the last devlog of HamOS. I had many laughs when making HamOS and I must thank the organizers of Stardance for this! I want to say thank you to the every person I have talked to on stardance / hackclub. That includes slack. Specifically: Ethan, Brahmtej, Craw, Fraud squad , mixid_mbb, LakasZada, Thunder, starviper, SeradedStripes and all of unmentioned. You made my day less boring either with just chatting in the #stardance, huddling in huddle, playing on our minecraft server or playing games in #boba-bash-greater-noida. #boba-bash-greater-noida deserves its own section. It was incredibly fun playing with all of you for a week. The best ones were Skribbl, Among Us and Gartic Phone. I will include some funny screenshots. Big + to the organizers of this event, Brahmtej and agm. I hope we will meet again next year or sooner ❤️ . I will remember (hopefully). Lukas out . Visit HamOS at: https://lkspodmol.github.io/hamos/"}, {"post_id": 77886, "ts": "2026-10-08T17:29:40Z", "hours": 1.905, "text": "Devlog #14 Hello everyone! New version of HamOS v1.6 just rolled out! What have I added or fixed? Bugs: Added: “current open apps bar” animations! New system of indexes.html and fodler structures! A whole new STYLES system!! The boring part: I had idea of different styles a long time back in time. So I implemented them in this update. You can select what style you want and it will apply. The new selection menu will be more polished in the next update. I promise. If YOU (yes, you) want to make a style for hamos, please click the link in the selection menu and dm me! I would be very happy! With the animations of “CAOB”. It was a little difficult. I need to make the timing right, make it launch or not close when app is still open. It had its bugs when in development, but it should be working flawlessly now. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!"}, {"post_id": 75899, "ts": "2026-10-01T15:22:15Z", "hours": 0.9667, "text": "The opening of community styles for HamOS! Hello everyone. Today im announcing that YOU, can create styles for HamOS, that will be added! If anyone wants to make a style (please do, I will be very happy), dm me on slack @luksus with the files, etc. (View the before last attached photo.) Everything you will need, will be in the template that I made for you (dimensions, info, restricted areas, etc.) Please download the template ( https://drive.google.com/drive/folders/1wteLNYUOm6-3gt77MpcvDc4UFpRlmfD8?usp=sharing ). You can also view the finished example. Edit 2 hours later: I just tried doing style myself and it turned out pretty okay! Check before last attached screenshot. I will be waiting for everyone’s styles ! Happy coding stardancers. ( https://lapse.hackclub.com/timelapse/7iCZKuc8ZhRJ )"}, {"post_id": 74799, "ts": "2026-09-28T09:18:33Z", "hours": 1.6833, "text": "Devlog #13 Hello everyone! What did I add in this update? Animations for “Currently opened apps bar”! And delay for the apps to launch (just like in a real life). When you open app, the little icon BOUNCES (video in attachment). This update isn’t live right now and wont be until v1.6. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!"}, {"post_id": 74152, "ts": "2026-09-26T19:42:31Z", "hours": 2.7161, "text": "Devlog #12 Hello everyone! New version of HamOS v1.5 just rolled out! What have I added or fixed? Bugs: cursor: pointer; bug fix (entire desktop was clickable) cursor: pointer; bug fix (entire app rows were clickable, not only apps) Added: Widgets! Current apps opened bar! New settings feature New QnA The boring part: In this version, I had an idea to add widgets (because I loved widgets in Windows Vista). Then I needed content for the widgets. I wanted clock, but I was lazy to create some clock, so I just used clock widget iframe. Some people dont have to like the widgets, so I added a new option in settings to hide them. And with all of the apps opened, it was a little bit difficult to navigate between them, so I added “Current apps opened bar”. When app is opened, it shows its icon in the bar, which can be clicked for focusing the app window. The order of app icons in the bar is fixed, because I was too lazy to implement some kind of order-system. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!"}, {"post_id": 69102, "ts": "2026-09-16T11:33:43Z", "hours": 2.94, "text": "Devlog #11 Hello everyone! A little devlog after a long time of inactivity. The break was amazing. Been to Bulgaria. Nice sea they’ve got. And now to HamOS. I am currently working on widgets, (little inspiration taken from my beloved Windows Vista). I am too lazy to create some clock, so I just used clock widget iframe. ( ) The version of the HamOS with a one widget added is live now, but it is in beta and not polished. (Something like a developer version of iOS) I had a lot of ideas for HamOS, but I don’t know if I will have enough time to add all of them. Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!"}, {"post_id": 46604, "ts": "2026-08-13T23:20:19Z", "hours": 0.3886, "text": "oh my god. What am I even publishing? Before checking the code for other bugs, etc.. I shipped it, because I was very excited and wanted to get item that I very want. I checked on HamOS today if I didn’t overlook anything and I saw that newly opened app windows weren’t in the center of the crt. So I changed multiple % values. And then I noticed that Welcome and Introduction app windows weren’t getting focused when they are clicked. I left welcome app and introduction app in one div, because of one < /div >. After fixing that, the app windows weren’t in the center of the crt AGAIN. So I had to revert every % value that I changed. (Thank god for github commits) So this was a little log of fixing ONE < /DIV > that caused these issues… Happy coding everyone.. happy happy."}, {"post_id": 45451, "ts": "2026-08-11T22:18:13Z", "hours": 0.8619, "text": "Hey everyone! Quick fix happened. On some screens, there was a bug that the icons weren’t aligned properly. My dumb ah put row div in a row div in a row div. The best code you will ever see. Had to change so many % values. But it is over now. Fix is now live (thankfully, before reviewers could rate it)."}, {"post_id": 44783, "ts": "2026-08-10T19:54:34Z", "hours": 1.0506, "text": "Devlog #10 Hello everyone! Just published HamOS v1.4, version mainly about resolution scaling and small fixes. In v1.4 was alongside added Settings app that has personalization features (primary colors and set wallpapers). And if you will notice, a little sticky paper was added that will help visitors start up HamOS. After this Devlog I will ship HamOS Again! I want more opinions :> (and stardust tooo–.) Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!"}, {"post_id": 42926, "ts": "2026-08-07T22:05:49Z", "hours": 3.1981, "text": "Devlog #9 omg this was a nightmare. Hey everyone! Just wanted to share that I finally somehow fixed scaling of HamOS! Previously, only 1920x1080 was supported, but now, 720p HD —> 4K! Yippie! : b Now I just need to add one more feature and this update will be live in the next version of HamOS v1.4. The biggest issue I encountered while making this was also applying it to the top bar. I also somehow broke a bug, bug-feature, that the top bar is always under app windows, now, app windows are under the top bar. Happy coding everyone! Ham out. –hehe"}, {"post_id": 41033, "ts": "2026-08-04T23:18:32Z", "hours": 4.0636, "text": "Devlog #8 Hey everyone! HamOS v1.3 is here. This is everything that happened in this update: The new Help app contains some problems that people issue with HamOS. In the style of QnA. If you have any questions or problems with HamOS, please comment under one of my devlogs. And the new HamOS To Go tool does something like Windows To Go tool. Windows To Go creates Windows on usb drive that you can plug into any computer and run your version of Windows. The HamOS To Go tool opens a new tab that will have only the HamOS, without the crt monitor. I added this feature to help some people with bugs or if they only want the HamOS without the crt monitor. And a new shortcut for Wikipedia. I was also playing with margins, so icons, divs look aligned. I used the existing icon of app Introduction for the new app Help and designed a new icon for it. I had idea in my mind, that well, if it is an introduction, it is like connecting people (or hamsters) no? I remembered old nokia loading screen and was inspired by it (the hands). And at the end, I added a little bit more info to the githubs README file. After the break, I had a whole set of ideas that I wrote down. One of them is Theme app suggested from anonymous that rated 2nd ship. Sadly, I have to fix a big issue first and that is screen scaling D: HamOS is only fully supported on 1920x1080 for now. Others have to workaround by scaling the site bigger or smaller. That is it. Happy coding everyone! Visit HamOS here: https://lkspodmol.github.io/myos1/"}, {"post_id": 34338, "ts": "2026-07-24T23:03:03Z", "hours": 1.3542, "text": "Devlog #7 Hey everyone! HamOS version v1.2 is here! What have I updated: Different crt monitor stand LED retextured Power-on button retextured Added Welcome SOUNDS!! (starting up, power-on button, welcome) If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)"}, {"post_id": 34077, "ts": "2026-07-24T15:19:18Z", "hours": 3.3767, "text": "Devlog #6 Hey everyone! HamOS version v1.1 is here! What have I updated: Copilot, but Coslop The crt monitor! Nicer power-on button Removed the Pro If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)"}, {"post_id": 33562, "ts": "2026-07-23T16:23:39Z", "hours": 2.3761, "text": "Hey everyone! Just added a crt monitor that will show HamOS Pro! Check it out at: https://lkspodmol.github.io/myos1/ Likes and comments are appreciated <3. (image is a sneak peak, until you check it out yourself)"}, {"post_id": 32989, "ts": "2026-07-22T14:45:45Z", "hours": 1.8106, "text": "Devlog #5 Hey everyone! Last update on HamOS. What have I updated: Removed link texts in bar Added new shortcuts with new goated icons Image optimisations ( < picture > idea @ethmarks , Thanks!) New loading screen! I will probably continue HamOS in WebOS 2, so HamOS 2, HamOS PRO? - Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)"}, {"post_id": 32503, "ts": "2026-07-21T18:36:49Z", "hours": 1.0731, "text": "Devlog #4 Hey everyone! A lot of this update wasn’t about adding huge features, just one app and fixing some small things. I added a Photos app, so Džambule finally has somewhere to keep his favorite pictures. 🐹📸 You can also click individual photo and view it in full resolution / quality. Also fyi, the icons are drawn by me. It is intentionally bad, don’t think that I cant draw. hehe.. I’m thinking about adding a very lite version of Start button. We will see if that will happen. Whould be cool. I’m also wondering how does stardances algorithm work. I’ve seen one devlog, that had one sentence and got hundreds of views. Hope algorithm will notice me. If the Start button will happen, then I’m probably gonna ship my HamOS to the stars. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding."}, {"post_id": 29815, "ts": "2026-07-16T23:12:33Z", "hours": 0.6344, "text": "Not technically a devlog, but Devlog #3 Hey everyone! It struck me out of nowhere, that I am making a HamOS. OS for / about hamster. So should not it be about my hamster? Its logic. So, I personalized it to my hamster Džambule. You will by in my hamsters computer (please do not break anything). In the next update, I am thinking that I will make apps like Notes and Photos, that will already have something in them (Džambule’s notes or photos) Thanks everyone for reading this and happy coding!"}, {"post_id": 29565, "ts": "2026-07-16T16:16:43Z", "hours": 3.4081, "text": "Devlog #2 Hey everyone! Heres what I added to my HamOS: Draggable windows Bar at top of a window with X Closing and opening apps/windows Desktop icons Only welcome window shows up when page is loaded Window focusing… Etc. It looks very nice in this state right now. Little bit scared of part 5 in the tutorial. I have an idea for the app, but I just hope that it wont be too hard. Thanks everyone for reading this devlog and maybe visiting my HamOS? Bye! Link for HamOS: https://lkspodmol.github.io/myos1/"}, {"post_id": 29029, "ts": "2026-07-15T17:59:05Z", "hours": 1.7144, "text": "Hello everyone! Just started working on my WebOS, that will be called HamOS. No, not ham, like ham, but ham like ham-ster :D. The tutorial was super helpful even though it didn’t look like at first. This HamOS will be mainly customized to my hamster Džambule. I even added a gif of him :>. That was enough coding for the day. Finished 2 parts. Thanks stardance for this, for everything and for the STICKERS!!. Out."}]...
|
Title: HamOS (ham-ster, not ham) by @Luksus | Star Title: HamOS (ham-ster, not ham) by @Luksus | Stardance
Devlogs:
Hello everyone! Just started working on my WebOS, that will be called HamOS. No, not ham, like ham, but ham like ham-ster :D. The tutorial was super helpful even though it didn’t look like at first. This HamOS will be mainly customized to my hamster Džambule. I even added a gif of him :>. That was enough coding for the day. Finished 2 parts. Thanks stardance for this, for everything and for the STICKERS!!. Out.
Devlog #2 Hey everyone! Heres what I added to my HamOS: Draggable windows Bar at top of a window with X Closing and opening apps/windows Desktop icons Only welcome window shows up when page is loaded Window focusing… Etc. It looks very nice in this state right now. Little bit scared of part 5 in the tutorial. I have an idea for the app, but I just hope that it wont be too hard. Thanks everyone for reading this devlog and maybe visiting my HamOS? Bye! Link for HamOS: https://lkspodmol.github.io/myos1/
Not technically a devlog, but Devlog #3 Hey everyone! It struck me out of nowhere, that I am making a HamOS. OS for / about hamster. So should not it be about my hamster? Its logic. So, I personalized it to my hamster Džambule. You will by in my hamsters computer (please do not break anything). In the next update, I am thinking that I will make apps like Notes and Photos, that will already have something in them (Džambule’s notes or photos) Thanks everyone for reading this and happy coding!
Devlog #4 Hey everyone! A lot of this update wasn’t about adding huge features, just one app and fixing some small things. I added a Photos app, so Džambule finally has somewhere to keep his favorite pictures. 🐹📸 You can also click individual photo and view it in full resolution / quality. Also fyi, the icons are drawn by me. It is intentionally bad, don’t think that I cant draw. hehe.. I’m thinking about adding a very lite version of Start button. We will see if that will happen. Whould be cool. I’m also wondering how does stardances algorithm work. I’ve seen one devlog, that had one sentence and got hundreds of views. Hope algorithm will notice me. If the Start button will happen, then I’m probably gonna ship my HamOS to the stars. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding.
Devlog #5 Hey everyone! Last update on HamOS. What have I updated: Removed link texts in bar Added new shortcuts with new goated icons Image optimisations ( < picture > idea @ethmarks , Thanks!) New loading screen! I will probably continue HamOS in WebOS 2, so HamOS 2, HamOS PRO? - Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Hey everyone! Just added a crt monitor that will show HamOS Pro! Check it out at: https://lkspodmol.github.io/myos1/ Likes and comments are appreciated <3. (image is a sneak peak, until you check it out yourself)
Devlog #6 Hey everyone! HamOS version v1.1 is here! What have I updated: Copilot, but Coslop The crt monitor! Nicer power-on button Removed the Pro If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Devlog #7 Hey everyone! HamOS version v1.2 is here! What have I updated: Different crt monitor stand LED retextured Power-on button retextured Added Welcome SOUNDS!! (starting up, power-on button, welcome) If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Devlog #8 Hey everyone! HamOS v1.3 is here. This is everything that happened in this update: The new Help app contains some problems that people issue with HamOS. In the style of QnA. If you have any questions or problems with HamOS, please comment under one of my devlogs. And the new HamOS To Go tool does something like Windows To Go tool. Windows To Go creates Windows on usb drive that you can plug into any computer and run your version of Windows. The HamOS To Go tool opens a new tab that will have only the HamOS, without the crt monitor. I added this feature to help some people with bugs or if they only want the HamOS without the crt monitor. And a new shortcut for Wikipedia. I was also playing with margins, so icons, divs look aligned. I used the existing icon of app Introduction for the new app Help and designed a new icon for it. I had idea in my mind, that well, if it is an introduction, it is like connecting people (or hamsters) no? I remembered old nokia loading screen and was inspired by it (the hands). And at the end, I added a little bit more info to the githubs README file. After the break, I had a whole set of ideas that I wrote down. One of them is Theme app suggested from anonymous that rated 2nd ship. Sadly, I have to fix a big issue first and that is screen scaling D: HamOS is only fully supported on 1920x1080 for now. Others have to workaround by scaling the site bigger or smaller. That is it. Happy coding everyone! Visit HamOS here: https://lkspodmol.github.io/myos1/
Devlog #9 omg this was a nightmare. Hey everyone! Just wanted to share that I finally somehow fixed scaling of HamOS! Previously, only 1920x1080 was supported, but now, 720p HD —> 4K! Yippie! : b Now I just need to add one more feature and this update will be live in the next version of HamOS v1.4. The biggest issue I encountered while making this was also applying it to the top bar. I also somehow broke a bug, bug-feature, that the top bar is always under app windows, now, app windows are under the top bar. Happy coding everyone! Ham out. –hehe
Devlog #10 Hello everyone! Just published HamOS v1.4, version mainly about resolution scaling and small fixes. In v1.4 was alongside added Settings app that has personalization features (primary colors and set wallpapers). And if you will notice, a little sticky paper was added that will help visitors start up HamOS. After this Devlog I will ship HamOS Again! I want more opinions :> (and stardust tooo–.) Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!
Hey everyone! Quick fix happened. On some screens, there was a bug that the icons weren’t aligned properly. My dumb ah put row div in a row div in a row div. The best code you will ever see. Had to change so many % values. But it is over now. Fix is now live (thankfully, before reviewers could rate it).
oh my god. What am I even publishing? Before checking the code for other bugs, etc.. I shipped it, because I was very excited and wanted to get item that I very want. I checked on HamOS today if I didn’t overlook anything and I saw that newly opened app windows weren’t in the center of the crt. So I changed multiple % values. And then I noticed that Welcome and Introduction app windows weren’t getting focused when they are clicked. I left welcome app and introduction app in one div, because of one < /div >. After fixing that, the app windows weren’t in the center of the crt AGAIN. So I had to revert every % value that I changed. (Thank god for github commits) So this was a little log of fixing ONE < /DIV > that caused these issues… Happy coding everyone.. happy happy.
Devlog #11 Hello everyone! A little devlog after a long time of inactivity. The break was amazing. Been to Bulgaria. Nice sea they’ve got. And now to HamOS. I am currently working on widgets, (little inspiration taken from my beloved Windows Vista). I am too lazy to create some clock, so I just used clock widget iframe. ( ) The version of the HamOS with a one widget added is live now, but it is in beta and not polished. (Something like a developer version of iOS) I had a lot of ideas for HamOS, but I don’t know if I will have enough time to add all of them. Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!
Devlog #12 Hello everyone! New version of HamOS v1.5 just rolled out! What have I added or fixed? Bugs: cursor: pointer; bug fix (entire desktop was clickable) cursor: pointer; bug fix (entire app rows were clickable, not only apps) Added: Widgets! Current apps opened bar! New settings feature New QnA The boring part: In this version, I had an idea to add widgets (because I loved widgets in Windows Vista). Then I needed content for the widgets. I wanted clock, but I was lazy to create some clock, so I just used clock widget iframe. Some people dont have to like the widgets, so I added a new option in settings to hide them. And with all of the apps opened, it was a little bit difficult to navigate between them, so I added “Current apps opened bar”. When app is opened, it shows its icon in the bar, which can be clicked for focusing the app window. The order of app icons in the bar is fixed, because I was too lazy to implement some kind of order-system. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!
Devlog #13 Hello everyone! What did I add in this update? Animations for “Currently opened apps bar”! And delay for the apps to launch (just like in a real life). When you open app, the little icon BOUNCES (video in attachment). This update isn’t live right now and wont be until v1.6. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!
The opening of community styles for HamOS! Hello everyone. Today im announcing that YOU, can create styles for HamOS, that will be added! If anyone wants to make a style (please do, I will be very happy), dm me on slack @luksus with the files, etc. (View the before last attached photo.) Everything you will need, will be in the template that I made for you (dimensions, info, restricted areas, etc.) Please download the template ( https://drive.google.com/drive/folders/1wteLNYUOm6-3gt77MpcvDc4UFpRlmfD8?usp=sharing ). You can also view the finished example. Edit 2 hours later: I just tried doing style myself and it turned out pretty okay! Check before last attached screenshot. I will be waiting for everyone’s styles ! Happy coding stardancers. ( https://lapse.hackclub.com/timelapse/7iCZKuc8ZhRJ )
Devlog #14 Hello everyone! New version of HamOS v1.6 just rolled out! What have I added or fixed? Bugs: Added: “current open apps bar” animations! New system of indexes.html and fodler structures! A whole new STYLES system!! The boring part: I had idea of different styles a long time back in time. So I implemented them in this update. You can select what style you want and it will apply. The new selection menu will be more polished in the next update. I promise. If YOU (yes, you) want to make a style for hamos, please click the link in the selection menu and dm me! I would be very happy! With the animations of “CAOB”. It was a little difficult. I need to make the timing right, make it launch or not close when app is still open. It had its bugs when in development, but it should be working flawlessly now. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!
Devlog? #15 - PLEASE READ! Hello everyone… New version of HamOS v1.7 just rolled out. What have I added or fixed? Bugs: volume lowered of loud sounds Added: new styles menu new styles The end? So yeah. This will be probably the last devlog of HamOS. I had many laughs when making HamOS and I must thank the organizers of Stardance for this! I want to say thank you to the every person I have talked to on stardance / hackclub. That includes slack. Specifically: Ethan, Brahmtej, Craw, Fraud squad , mixid_mbb, LakasZada, Thunder, starviper, SeradedStripes and all of unmentioned. You made my day less boring either with just chatting in the #stardance, huddling in huddle, playing on our minecraft server or playing games in #boba-bash-greater-noida. #boba-bash-greater-noida deserves its own section. It was incredibly fun playing with all of you for a week. The best ones were Skribbl, Among Us and Gartic Phone. I will include some funny screenshots. Big + to the organizers of this event, Brahmtej and agm. I hope we will meet again next year or sooner ❤️ . I will remember (hopefully). Lukas out . Visit HamOS at: https://lkspodmol.github.io/hamos/
Ships:
Have a working webpage with multiple draggable windows, Check It should look like your own and not exactly like the guide, Check Have at least 3 devlogs showing your progress along the way, Check Have at least 1 new feature that the guide didn’t list, Check It shouldn’t have a password (so anyone can test it out!), Check Hello everyone! This is my first ship on stardance and I hope, that you will like my WebOS 1. My WebOS 1 is HamOS. Not ham like ham, but ham like ham-ster. Hamster, because of my hamster Džambule. I love him very much, so I got an idea to create WebOS, that is designed for him and you got in somehow. Little things that I liked when coding is being lost in my own code. The best things I added in my opinion are: The loading screen!! Photo gallery of him And the custom hand drew icons made by me (intentionally bad) So please, visit and try HamOS at: https://lkspodmol.github.io/myos1/ . WebOS 1 was incredibly fun and interesting and I will try to continue in WebOS 2. Should it be HamOS, or HamOS PRO? Let me know. Thank you for reading this or commenting, liking and happy coding!
Hello everyone! This is 2nd ship of HamOS, that brought some cool features and that are: Crt monitor Coslop Starting and shutting down the system Sound effects! I had a lot of fun drawing in this ship. I think the crt monitor turned out very good. I am also very happy with the sounds I added. Fits in so well. I am also updating the very fine text on the “Floppy”, that says, what version you are running (always the newest). I have some ideas for the future, but I think that a little break whould be also very good idea. If you have any ideas, on what I should add, comment please! Likes are very appreciated <3. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Hello everyone! This is my 3nd ship of HamOS. (2nd of WebOS 2) A lot has changed since 2nd ship and those are: Apps: Help, App for helping users with QnA Settings, App for customization of HamOS HamOS To Go, Similar app (tool) to Windows To Go, it will launch HamOS in your tab instead of Džambulas computer. A new shortcut to Wikipedia New look for existing Introduction app, in NOKIA style (hands) And the biggest nightmare…. Scaling. I had problems with scaling HamOS website to other resolutions. Only 1920x1080 was supported, but now from 720p to 4K (16:9) should work without any major issues. The most annoying thing about this were also always changing margins, so app icons are alligned, etc… And for fun, I added a little sticky note that will help visitors start up the computer with HamOS. Also please, do not mind if the window you are moving is faster or slower than your mouse pointer. (check app Help) If you have any ideas, on what I should add, comment please! Visit HamOS at: https://lkspodmol.github.io/myos1/ (Please try F11) Thanks for reading. Happy coding and happy rating!
PLEASE READ LAST DEVLOG <3 Hello. This is the 3rd and last ship of HamOS. It was incredibly fun making this project. In this ship I added a lots of things which I don’t remember (CurrentOpenAppsBar, F11, animations, styles, widgets, bug fixes, QoL updates, etc..) Please checkout every app, windows, features in HamOS. There is a hidden secret for you the second, you enter the website! My main inspiration for this project was the old era of computers and my hamster “Džambule”. (May my luck find 188 stardust for grants from this ship)...
|
1793083756.847836
|
1793170156.847836
|
|
70372
|
Tycoon game by @centcoder | Stardance
|
centcoder
|
1
|
13.0
|
55
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T19:54:57Z", "hours": 13.0, "multiplier": 4.2, "payout": 55, "blessing": "neutral", "text": "I made a tycoon game where you can upgrade your skills, your job and the goal is to get more money. You can acquire business/shops to get passive income and you can also invest in stock simulations! Enjoy!", "repo": "https://github.com/centcodergit/myfirstgame", "demo": "https://centcodergit.github.io/myfirstgame/"}]...
|
[{"post_id": 81297, "ts": "202 [{"post_id": 81297, "ts": "2026-10-20T18:22:36Z", "hours": 1.6514, "text": "I am DONE!!! -Finished the js Fixed any remaining bugs (Let’s go!) Publishing the game right now to! Go check it out if you want to!"}, {"post_id": 81273, "ts": "2026-10-20T16:02:24Z", "hours": 2.6847, "text": "I was mainly working on continuing the js but also fixed some bugs Bugs fixed: -Fixed the bug with the empty screen (blank screen) -Fixed some errors on the html and css (most were minor but there was a major one with the variables that took some time) Fixed bugs with the new file (the js) and connections with it with the html and css I will continue working on the js now and I think i will be done soon (can’t really show a result cause it is not something actual to see yet.) In the previous devlogs (which were a bit shorter) I was developing the html and css, there were some bugs there as mentioned but everything looks better (at least for now). I hope that the game will be out soon!"}, {"post_id": 80808, "ts": "2026-10-18T20:53:34Z", "hours": 3.4139, "text": "BROO I finally fixed some bugs on the css and progressing on the js. Game out soon i hope!"}, {"post_id": 80716, "ts": "2026-10-18T16:25:56Z", "hours": 5.4614, "text": "I finished the html (the bugs, at least for now) and currently working on the js and css"}]...
|
Title: Tycoon game by @centcoder | Stardance
Devl Title: Tycoon game by @centcoder | Stardance
Devlogs:
I finished the html (the bugs, at least for now) and currently working on the js and css
BROO I finally fixed some bugs on the css and progressing on the js. Game out soon i hope!
I was mainly working on continuing the js but also fixed some bugs Bugs fixed: -Fixed the bug with the empty screen (blank screen) -Fixed some errors on the html and css (most were minor but there was a major one with the variables that took some time) Fixed bugs with the new file (the js) and connections with it with the html and css I will continue working on the js now and I think i will be done soon (can’t really show a result cause it is not something actual to see yet.) In the previous devlogs (which were a bit shorter) I was developing the html and css, there were some bugs there as mentioned but everything looks better (at least for now). I hope that the game will be out soon!
I am DONE!!! -Finished the js Fixed any remaining bugs (Let’s go!) Publishing the game right now to! Go check it out if you want to!
Ships:
I made a tycoon game where you can upgrade your skills, your job and the goal is to get more money. You can acquire business/shops to get passive income and you can also invest in stock simulations! Enjoy!...
|
1793155998.5614984
|
1793242398.5614984
|
|
29722
|
Pikne by @marksdude | Stardance
|
marksdude
|
0
|
115.02
|
0
|
[]
|
[{"post_id": 81292, "ts": "202 [{"post_id": 81292, "ts": "2026-10-20T17:46:43Z", "hours": 6.5956, "text": "I have finished version 0.1 of the firmware. It currently only has a simple menu to check some battery information. It relies on the ArduinoSMBus library for communicating with the BMS and the Adafruit SSD1306 and Adafruit GFX libraries for drawing on the OLED. I also made some wiring diagrams."}, {"post_id": 77053, "ts": "2026-10-05T14:31:05Z", "hours": 2.1569, "text": "Started work on the main firmware file. I will implement the more important stuff first, like the stuff needed for the power bank to function and most of the status displaying. Then, I will start work on the less important features, like more advanced safety (in case one of the BMS’s MOSFETs fail) and communication between the power bank and modules. I have currently made functions for reading the USB output current and for reading the battery charger’s status."}, {"post_id": 74074, "ts": "2026-09-26T16:57:15Z", "hours": 3.0439, "text": "I learned how to send data over UART to ESPHome. I will use this to send battery info from the power bank to the LED controller module, so it could be displayed in Home Assistant. How will it work? First the ATmega328P in the power bank will put all the values that will be sent into a single string. The string will look like this: bat:xx|current:xx|voltage:xx|usb_current:xx Then when the module receives it, ESPHome will run a lambda that splits the received string into separate strings for each value. They will then be converted into floats and sent to the corresponding sensor component. For testing, I used a XIAO ESP32-C3 to send dummy data to a revision 1 LED controller PCB. Next, I will work on module detection or the OLED interface for the power bank."}, {"post_id": 69799, "ts": "2026-09-17T20:11:47Z", "hours": 0.55, "text": "Took some pictures First I’m going to talk about funding. I’m currently waiting for funding. Hopefully I get it before Stardance ends. I requested funding for the power bank and the LED controller module, no flashlight module because I’m prioritizing getting the power bank working. It was also the most expensive module and would have required me to write even more firmware. Firmware development isn’t my strong suit. In the meantime I thought it would be a good idea to ask for permission to use my school’s 3D printers. Got the permission, printed the enclosure and took some pictures. Currently, it is basically just an empty enclosure, I put in the screws, OLED, pogo connector and the first revision non-working PCB to test how the parts would fit and so it would look better on the pictures. That’s all for now, thank you. I will be working on the firmware from now on."}, {"post_id": 66872, "ts": "2026-09-12T20:22:03Z", "hours": 8.9631, "text": "Been working on the BOM. It has been pretty boring. Every PCB has its own BOM and I have put the final price of every one of them into one main BOM so it will be easier to read. I also changed the inductor on the main power bank PCB to a one that fits the enclosure. I found one that has the needed current rating and is small enough so I didn’t have to change anything other than the inductor on the PCB."}, {"post_id": 60975, "ts": "2026-09-03T17:34:00Z", "hours": 1.1475, "text": "Not enough space yay!!! With a higher current inductor comes a bigger package which doesn’t fit. I have a few options now: Change the case Find a smaller connector that can handle the current use a different inductor that isn’t that tall Probably going to try to find a shorter inductor. I may be able to make the 5v regulator inductor smaller because I don’t think it needs a current rating that high and then maybe use the regained space for a wider and shorter inductor."}, {"post_id": 59573, "ts": "2026-09-01T13:56:19Z", "hours": 2.8336, "text": "Found an issue on the BMS board I found that I had connected the cell sense pins in the wrong order. I had connected them like this: B- to VC0, B+ to VC1 and cell 1 to VC2, but it should have been connected like this: B- to VC0, cell 1 to VC1 and B+ to VC2. I almost didn’t notice it because I didn’t check that part of it. I thought that I wouldn’t have made a mistake like that. This wasn’t the only issue with the sense connections the other was that I didn’t use kelvin connections for them. Without kelvin connections you will get less accurate readings because of voltage drop in the copper. I also improved it a little. I added cutouts for the current sensing resistor so I have separate pads for the sensing traces and the high current path. This should improve the current sensing accuracy which means I get a more accurate battery charge estimate. Then I added buttons for waking the IC up for programming and for shutting the output down so the battery can safely be removed. I moved the connector for the thermistors and the balance lead to the other side so the wires won’t have to run near a high current switching inductor which is on the main PCB. Thank you for reading!"}, {"post_id": 57572, "ts": "2026-08-29T19:15:51Z", "hours": 4.9053, "text": "Discovered some issues with the main PCB’s schematic when I was checking it before making the BOM First issue was that the inductor I chose for the battery charge IC (BQ25792) that also makes the 9, 12, 15 and 20V for USB PD had a current rating too little (guess that’s what happens if you design a PCB like this very inexperienced like I was 8 months ago) which would have limited it to around 30W output max, so this time I calculated the required rating myself (previously got the inductor from a reference design). Found that it should have been almost double the previous 7A for the 45W I initially aimed for, but if the IC can handle 60W then why not choose an inductor for 60W? So that’s what I did, the new inductor that has a rating of 15.8A should be able handle 60W. Second was that for some reason I tied the SDRV pin of the battery charge IC to the battery when instead it should have been tied to GND through a 1nf capacitor if not in use. I don’t know why I did it because the datasheet clearly says “Connect a 0402 / 50V / 1nF ceramic capacitor from SDRV to GND when the ship FET is not used.” This may have been the cause why the PCB didn’t work correctly when I made the first prototype of it around 2 months ago. I thought it was because of bad soldering, so I tried to resolder everything with a hot plate and burned bunch of my capacitors and probably some other components too. There were some other minor issues like me choosing footprints too small for some capacitors and not using the output current monitoring of the efuse. The efuse current monitoring isn’t really an issue but it is nice to see the exact output current on the display. I probably skipped it because I couldn’t understand how it worked back then. Thank you for reading!"}, {"post_id": 55106, "ts": "2026-08-26T15:45:34Z", "hours": 6.0947, "text": "Added logos to everything, fixed some alignment issues and added little holes for the module to go into to take stress away from the USB-C plug when dropped or twisted."}, {"post_id": 53222, "ts": "2026-08-23T17:43:03Z", "hours": 7.9406, "text": "Finished the flashlight module case! It will be CNCed out of aluminum, so it could act as a heatsink only the frame that holds the acrylic lens is 3D printed. I tried to fill up as much free space as possible with aluminum so the LEDs could run at max brightness for as long as possible. And… about the LiPo charger module I probably won’t make it I don’t think I have enough time since getting a grant and shipping of the PCBs will take a few weeks, so I may not have enough time to make firmware for everything so I’m skipping it for now."}, {"post_id": 49133, "ts": "2026-08-17T19:24:28Z", "hours": 3.1836, "text": "Started designing the case for the flashlight module. I had to move some stuff around on the driver PCB to make a cutout for the pogo connector. Also changed the connector for the LEDs from JST VH to JST XH for a smaller footprint."}, {"post_id": 47123, "ts": "2026-08-14T19:37:40Z", "hours": 4.6836, "text": "Finished the LED controller shell and made a logo I solved the pogo connector mounting problem by having the front of the upper part open and having the wall on the bottom part."}, {"post_id": 45372, "ts": "2026-08-11T19:45:09Z", "hours": 5.3339, "text": "I’ve been designing the shell for the LED controller module. I Currently have a problem with mounting the pogo connector. The issue is that the design I had in mind won’t work because I have no way of putting brass inserts into the screw holes so I have to find another way. Maybe I could have the top in 2 parts then I could put the brass inserts in."}, {"post_id": 44206, "ts": "2026-08-09T20:18:29Z", "hours": 3.9331, "text": "Finished the LED PCB for the flashlight module I couldn’t fit 40 LEDs like I said I would so there are 30 LEDs. It should still have close to 9000 lm max brightness (It will probably run only for a few seconds at max brightness before it will overheat). I’m just going to drive the LEDs little harder. I first wanted to have connectors for power and the thermistor but I found that JLCPCB only offers 1 layer aluminum core PCBs so I was limited to a 1 layer PCB and I couldn’t use THT connectors so instead I’m going to solder the wires straight to the board."}, {"post_id": 43450, "ts": "2026-08-08T18:21:27Z", "hours": 4.0211, "text": "Finished the LED driver board of the flashlight module! So that’s one of the PCBs done for the flashlight module will do the one that holds the LEDs next. I will be using about 40 of these LEDs so the max brightness will be around 9600 lm. I probably won’t be able to run it at max brightness for very long because it will (probably) hit thermal limits since the only cooling for it is the aluminum core PCB and maybe a CNC aluminum body."}, {"post_id": 42675, "ts": "2026-08-07T15:03:56Z", "hours": 3.1503, "text": "Started designing the flashlight module PCB! I finished the schematic for the driver board yesterday. It’s going to have 2 different PCBs one that does all the communication and driving of the LEDs and the other that is going to have all the LEDs on it. I think thermal management will be easier this way since the LEDs will get pretty hot. I also thought of a name for the project I’m going to name it Pikne which means lightning in estonian."}, {"post_id": 40833, "ts": "2026-08-04T16:44:28Z", "hours": 6.6417, "text": "Finished routing the PCB Now I just got to run it through drc and fix silkscreen. Then the LiPo charger module PCB should be finished."}, {"post_id": 39039, "ts": "2026-08-01T18:32:26Z", "hours": 4.9156, "text": "Finished the LiPo charger module schematic! I had some problems making the battery balancing circuitry because I didn’t know how to switch the balancing mosfets without frying the microcontroller. The problem was that the ground reference for the microcontroller and mosfets were different that basically means that for example the mosfet connected for balancing cell 3 of the battery will have its reference from cell 3 of the pack but the microcontroller will have its reference from the negative of the pack (cell 1) so for the mosfet its source will be at 0V (gnd), but for the microcontroller the mosfet’s source will be around 10.8V. That will mean if I try to turn on the mosfet with 3.3V from the microcontroller Vgs would equal -7.5V (3.3V - 10.8V) which means the mosfet will not turn on since for an N-channel mosfet Vgs has to be positive (atleast 2V for the one I used). First I wanted to use a P-channel mosfet to connect the positive side of the cell to the gate of the N-channel mosfet that would turn on the N-channel mosfet since Vgs would be around 3.6V (3.6V - 0V) but when the balancing mosfet will be off the P-channel mosfet’s gate will be pulled up to the cell voltage so for the mosfets its around 3.6V but for the microcontroller around 10.8v for cell 3 that will fry the microcontroller. Instead I used a octocoupler to connect the positive side of the cell to the N-channel mosfet. Like this I can turn the balancing mosfet on without having the high voltage on the pin of the microcontroller. That probably wasn’t a very good explanation. I’m not very good at explaining. Expected features of the module: Supports charging 1-4S LiPo and Li-Ion batteries Max charge current: 5-6A (1S), 4-4.5A (2S), 3A (3S), 2A (4S) If you actually read through all of this, thank you!"}, {"post_id": 35984, "ts": "2026-07-27T19:43:01Z", "hours": 2.7172, "text": "Finished the shell! This should mean that the hardware of the power bank is mostly finished I still have to test it and then also make firmware for it. Now I think I’m gonna start working more on the modules. I currently have these planned: A Led controller module that will integrate with Home Assistant and allow you to control led strips and stuff (I already have a PCB made for this one). A LiPo charger module that will allow you to charge up to 3s LiPos maybe even 4s A flashlight module (I don’t think I have to explain this) If you have any ideas on more modules I should make please comment them."}, {"post_id": 35430, "ts": "2026-07-26T20:40:28Z", "hours": 8.3822, "text": "Got done with the redesign of the front It took longer than I thought it would. Most of the time I spent fixing the stuff that broke after changing the shell size, but after 8h it’s done! Now I just gotta figure out the button placement again because the old place won’t work with the new design and do some finishing touches and then the shell should be ready. Also I didn’t need to redesign the BMS because the current design fit the new design no problem."}, {"post_id": 33690, "ts": "2026-07-23T20:18:58Z", "hours": 4.6111, "text": "I had almost finished the shell but I got an idea on how to make the power bank a little smaller (2 mm thinner and 4-10 mm shorter). So now I’m gonna redesign the BMS and hope that my idea will actually work without any clearance issues. And also I now have a github repo for the project so you can go take a look at the current PCB designs yourself."}, {"post_id": 32507, "ts": "2026-07-21T18:49:13Z", "hours": 7.6381, "text": "I finished the lower shell part! I ran into some issues with the button placement because I didn’t think about it when designing the main PCB. I placed the button too close to the edge of the PCB, leaving only about 3mm of space between the button and the wall of the shell, as shown in one of the pictures. Since I already have the PCB and I don’t want to order a new revision just to move the button, I will use a different button on the side of the power bank that I will solder to the original button pads with wires. It’s probably not the best solution, but it should work."}, {"post_id": 28833, "ts": "2026-07-15T10:39:10Z", "hours": 6.8114, "text": "So I had to resolder the main PCB because I ripped a pad off a IC while trying to reflow it. I learned the hard way that capacitors also don’t like being on a hot plate for too long. I ended up burning most of them. Now I have to wait for new capacitors before I can fully assemble the PCB."}, {"post_id": 22286, "ts": "2026-07-04T17:52:55Z", "hours": 4.7672, "text": "First devlog on my power bank. Just finished the battery holder in cad. Next will be the lower shell part."}]...
|
Title: Pikne by @marksdude | Stardance
Devlogs:
F Title: Pikne by @marksdude | Stardance
Devlogs:
First devlog on my power bank. Just finished the battery holder in cad. Next will be the lower shell part.
So I had to resolder the main PCB because I ripped a pad off a IC while trying to reflow it. I learned the hard way that capacitors also don’t like being on a hot plate for too long. I ended up burning most of them. Now I have to wait for new capacitors before I can fully assemble the PCB.
I finished the lower shell part! I ran into some issues with the button placement because I didn’t think about it when designing the main PCB. I placed the button too close to the edge of the PCB, leaving only about 3mm of space between the button and the wall of the shell, as shown in one of the pictures. Since I already have the PCB and I don’t want to order a new revision just to move the button, I will use a different button on the side of the power bank that I will solder to the original button pads with wires. It’s probably not the best solution, but it should work.
I had almost finished the shell but I got an idea on how to make the power bank a little smaller (2 mm thinner and 4-10 mm shorter). So now I’m gonna redesign the BMS and hope that my idea will actually work without any clearance issues. And also I now have a github repo for the project so you can go take a look at the current PCB designs yourself.
Got done with the redesign of the front It took longer than I thought it would. Most of the time I spent fixing the stuff that broke after changing the shell size, but after 8h it’s done! Now I just gotta figure out the button placement again because the old place won’t work with the new design and do some finishing touches and then the shell should be ready. Also I didn’t need to redesign the BMS because the current design fit the new design no problem.
Finished the shell! This should mean that the hardware of the power bank is mostly finished I still have to test it and then also make firmware for it. Now I think I’m gonna start working more on the modules. I currently have these planned: A Led controller module that will integrate with Home Assistant and allow you to control led strips and stuff (I already have a PCB made for this one). A LiPo charger module that will allow you to charge up to 3s LiPos maybe even 4s A flashlight module (I don’t think I have to explain this) If you have any ideas on more modules I should make please comment them.
Finished the LiPo charger module schematic! I had some problems making the battery balancing circuitry because I didn’t know how to switch the balancing mosfets without frying the microcontroller. The problem was that the ground reference for the microcontroller and mosfets were different that basically means that for example the mosfet connected for balancing cell 3 of the battery will have its reference from cell 3 of the pack but the microcontroller will have its reference from the negative of the pack (cell 1) so for the mosfet its source will be at 0V (gnd), but for the microcontroller the mosfet’s source will be around 10.8V. That will mean if I try to turn on the mosfet with 3.3V from the microcontroller Vgs would equal -7.5V (3.3V - 10.8V) which means the mosfet will not turn on since for an N-channel mosfet Vgs has to be positive (atleast 2V for the one I used). First I wanted to use a P-channel mosfet to connect the positive side of the cell to the gate of the N-channel mosfet that would turn on the N-channel mosfet since Vgs would be around 3.6V (3.6V - 0V) but when the balancing mosfet will be off the P-channel mosfet’s gate will be pulled up to the cell voltage so for the mosfets its around 3.6V but for the microcontroller around 10.8v for cell 3 that will fry the microcontroller. Instead I used a octocoupler to connect the positive side of the cell to the N-channel mosfet. Like this I can turn the balancing mosfet on without having the high voltage on the pin of the microcontroller. That probably wasn’t a very good explanation. I’m not very good at explaining. Expected features of the module: Supports charging 1-4S LiPo and Li-Ion batteries Max charge current: 5-6A (1S), 4-4.5A (2S), 3A (3S), 2A (4S) If you actually read through all of this, thank you!
Finished routing the PCB Now I just got to run it through drc and fix silkscreen. Then the LiPo charger module PCB should be finished.
Started designing the flashlight module PCB! I finished the schematic for the driver board yesterday. It’s going to have 2 different PCBs one that does all the communication and driving of the LEDs and the other that is going to have all the LEDs on it. I think thermal management will be easier this way since the LEDs will get pretty hot. I also thought of a name for the project I’m going to name it Pikne which means lightning in estonian.
Finished the LED driver board of the flashlight module! So that’s one of the PCBs done for the flashlight module will do the one that holds the LEDs next. I will be using about 40 of these LEDs so the max brightness will be around 9600 lm. I probably won’t be able to run it at max brightness for very long because it will (probably) hit thermal limits since the only cooling for it is the aluminum core PCB and maybe a CNC aluminum body.
Finished the LED PCB for the flashlight module I couldn’t fit 40 LEDs like I said I would so there are 30 LEDs. It should still have close to 9000 lm max brightness (It will probably run only for a few seconds at max brightness before it will overheat). I’m just going to drive the LEDs little harder. I first wanted to have connectors for power and the thermistor but I found that JLCPCB only offers 1 layer aluminum core PCBs so I was limited to a 1 layer PCB and I couldn’t use THT connectors so instead I’m going to solder the wires straight to the board.
I’ve been designing the shell for the LED controller module. I Currently have a problem with mounting the pogo connector. The issue is that the design I had in mind won’t work because I have no way of putting brass inserts into the screw holes so I have to find another way. Maybe I could have the top in 2 parts then I could put the brass inserts in.
Finished the LED controller shell and made a logo I solved the pogo connector mounting problem by having the front of the upper part open and having the wall on the bottom part.
Started designing the case for the flashlight module. I had to move some stuff around on the driver PCB to make a cutout for the pogo connector. Also changed the connector for the LEDs from JST VH to JST XH for a smaller footprint.
Finished the flashlight module case! It will be CNCed out of aluminum, so it could act as a heatsink only the frame that holds the acrylic lens is 3D printed. I tried to fill up as much free space as possible with aluminum so the LEDs could run at max brightness for as long as possible. And… about the LiPo charger module I probably won’t make it I don’t think I have enough time since getting a grant and shipping of the PCBs will take a few weeks, so I may not have enough time to make firmware for everything so I’m skipping it for now.
Added logos to everything, fixed some alignment issues and added little holes for the module to go into to take stress away from the USB-C plug when dropped or twisted.
Discovered some issues with the main PCB’s schematic when I was checking it before making the BOM First issue was that the inductor I chose for the battery charge IC (BQ25792) that also makes the 9, 12, 15 and 20V for USB PD had a current rating too little (guess that’s what happens if you design a PCB like this very inexperienced like I was 8 months ago) which would have limited it to around 30W output max, so this time I calculated the required rating myself (previously got the inductor from a reference design). Found that it should have been almost double the previous 7A for the 45W I initially aimed for, but if the IC can handle 60W then why not choose an inductor for 60W? So that’s what I did, the new inductor that has a rating of 15.8A should be able handle 60W. Second was that for some reason I tied the SDRV pin of the battery charge IC to the battery when instead it should have been tied to GND through a 1nf capacitor if not in use. I don’t know why I did it because the datasheet clearly says “Connect a 0402 / 50V / 1nF ceramic capacitor from SDRV to GND when the ship FET is not used.” This may have been the cause why the PCB didn’t work correctly when I made the first prototype of it around 2 months ago. I thought it was because of bad soldering, so I tried to resolder everything with a hot plate and burned bunch of my capacitors and probably some other components too. There were some other minor issues like me choosing footprints too small for some capacitors and not using the output current monitoring of the efuse. The efuse current monitoring isn’t really an issue but it is nice to see the exact output current on the display. I probably skipped it because I couldn’t understand how it worked back then. Thank you for reading!
Found an issue on the BMS board I found that I had connected the cell sense pins in the wrong order. I had connected them like this: B- to VC0, B+ to VC1 and cell 1 to VC2, but it should have been connected like this: B- to VC0, cell 1 to VC1 and B+ to VC2. I almost didn’t notice it because I didn’t check that part of it. I thought that I wouldn’t have made a mistake like that. This wasn’t the only issue with the sense connections the other was that I didn’t use kelvin connections for them. Without kelvin connections you will get less accurate readings because of voltage drop in the copper. I also improved it a little. I added cutouts for the current sensing resistor so I have separate pads for the sensing traces and the high current path. This should improve the current sensing accuracy which means I get a more accurate battery charge estimate. Then I added buttons for waking the IC up for programming and for shutting the output down so the battery can safely be removed. I moved the connector for the thermistors and the balance lead to the other side so the wires won’t have to run near a high current switching inductor which is on the main PCB. Thank you for reading!
Not enough space yay!!! With a higher current inductor comes a bigger package which doesn’t fit. I have a few options now: Change the case Find a smaller connector that can handle the current use a different inductor that isn’t that tall Probably going to try to find a shorter inductor. I may be able to make the 5v regulator inductor smaller because I don’t think it needs a current rating that high and then maybe use the regained space for a wider and shorter inductor.
Been working on the BOM. It has been pretty boring. Every PCB has its own BOM and I have put the final price of every one of them into one main BOM so it will be easier to read. I also changed the inductor on the main power bank PCB to a one that fits the enclosure. I found one that has the needed current rating and is small enough so I didn’t have to change anything other than the inductor on the PCB.
Took some pictures First I’m going to talk about funding. I’m currently waiting for funding. Hopefully I get it before Stardance ends. I requested funding for the power bank and the LED controller module, no flashlight module because I’m prioritizing getting the power bank working. It was also the most expensive module and would have required me to write even more firmware. Firmware development isn’t my strong suit. In the meantime I thought it would be a good idea to ask for permission to use my school’s 3D printers. Got the permission, printed the enclosure and took some pictures. Currently, it is basically just an empty enclosure, I put in the screws, OLED, pogo connector and the first revision non-working PCB to test how the parts would fit and so it would look better on the pictures. That’s all for now, thank you. I will be working on the firmware from now on.
I learned how to send data over UART to ESPHome. I will use this to send battery info from the power bank to the LED controller module, so it could be displayed in Home Assistant. How will it work? First the ATmega328P in the power bank will put all the values that will be sent into a single string. The string will look like this: bat:xx|current:xx|voltage:xx|usb_current:xx Then when the module receives it, ESPHome will run a lambda that splits the received string into separate strings for each value. They will then be converted into floats and sent to the corresponding sensor component. For testing, I used a XIAO ESP32-C3 to send dummy data to a revision 1 LED controller PCB. Next, I will work on module detection or the OLED interface for the power bank.
Started work on the main firmware file. I will implement the more important stuff first, like the stuff needed for the power bank to function and most of the status displaying. Then, I will start work on the less important features, like more advanced safety (in case one of the BMS’s MOSFETs fail) and communication between the power bank and modules. I have currently made functions for reading the USB output current and for reading the battery charger’s status.
I have finished version 0.1 of the firmware. It currently only has a simple menu to check some battery information. It relies on the ArduinoSMBus library for communicating with the BMS and the Adafruit SSD1306 and Adafruit GFX libraries for drawing on the OLED. I also made some wiring diagrams....
|
1793199060.5800586
|
1793803860.5800586
|
|
64411
|
SmolPadV1 by @mandeepswami | Stardance
|
mandeepswami
|
0
|
20.53
|
0
|
[]
|
[{"post_id": 81291, "ts": "202 [{"post_id": 81291, "ts": "2026-10-20T17:44:09Z", "hours": 1.8058, "text": "made a final hole for knob"}, {"post_id": 77536, "ts": "2026-10-07T11:14:10Z", "hours": 1.1169, "text": "Changed footprints as they were diffrent from the ones used in hacpad kit"}, {"post_id": 76607, "ts": "2026-10-04T04:53:11Z", "hours": 4.3603, "text": "Yeah i forgot to record half of the case , the firmware and the readme and BOM . Lost lot of time but i used Visual Studio code for the firmware and reame , bom so i didnt lose that time but now the project is complete and is looking good and now i will ship it"}, {"post_id": 73982, "ts": "2026-09-26T13:37:43Z", "hours": 3.3003, "text": "The case is almost complete just the backside is left and i am thingking of a adding a hackclub logo"}, {"post_id": 73548, "ts": "2026-09-25T11:25:27Z", "hours": 1.5836, "text": "Completed Routing"}, {"post_id": 73173, "ts": "2026-09-24T15:09:29Z", "hours": 2.8781, "text": "Currently routing copper traces"}, {"post_id": 72704, "ts": "2026-09-23T15:20:06Z", "hours": 1.2669, "text": "https://www.youtube.com/watch?v=8WXpGTIbxlQ using his guide to make it"}, {"post_id": 72648, "ts": "2026-09-23T12:45:04Z", "hours": 1.5669, "text": "Finnally started on my own hackpad . using https://wiki.ai03.com/books/pcb-design/page/pcb-guide-part-3---creating-the-mcu-schematic guide"}, {"post_id": 72304, "ts": "2026-09-22T16:58:58Z", "hours": 1.6147, "text": "Creating my case"}, {"post_id": 71845, "ts": "2026-09-21T17:11:04Z", "hours": 1.0333, "text": "Almost completed Designing your pcb part but there is a error i am currently fixing . am using ai to help me"}]...
|
Title: SmolPadV1 by @mandeepswami | Stardance
Dev Title: SmolPadV1 by @mandeepswami | Stardance
Devlogs:
Almost completed Designing your pcb part but there is a error i am currently fixing . am using ai to help me
Creating my case
Finnally started on my own hackpad . using https://wiki.ai03.com/books/pcb-design/page/pcb-guide-part-3---creating-the-mcu-schematic guide
https://www.youtube.com/watch?v=8WXpGTIbxlQ using his guide to make it
Currently routing copper traces
Completed Routing
The case is almost complete just the backside is left and i am thingking of a adding a hackclub logo
Yeah i forgot to record half of the case , the firmware and the readme and BOM . Lost lot of time but i used Visual Studio code for the firmware and reame , bom so i didnt lose that time but now the project is complete and is looking good and now i will ship it
Changed footprints as they were diffrent from the ones used in hacpad kit
made a final hole for knob...
|
1793062448.0813906
|
1793667248.0813906
|
|
69049
|
Wish sender by @sarthak_jnj | Stardance
|
sarthak_jnj
|
1
|
4.35
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-11T14:16:50Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It is supposed to be a bot that automatically runs with your device startup, checks it’s own history and then executes the command to send a specific message & image to a defined contact on WhatsApp. I personally kept it at 9 days as a small fun project to tease a friend during a 9-day long indian traditional festival. The messages, phone number, file location and photos can easily be replaced. The difficulty for me was the new experience, making projects itself is a new thing for me I’ve recently added to my timeline, and i prefer hardware mostly so I’m not much experienced with software work and working with so many libraries, that’s why this project is more of a reminder that “you have to do this today too. just keep an eye if something goes wrong” rather than something dealing with itself in the background. What i am proud of can be that i learnt the JSON thing for this project solely but practice rather than any theory reading. and even tho i used an AI to guide me, i genuinely found a lot of troubles and came up with 3-4 creative workarounds by the end and completely made the structure myself even if i asked the specific commands from AI. For those trying this, it is easy to use as it is, just make sure you already have logged into WhatsApp, adjust the pixel locations according to your device as given in README.md, increase time.sleep() if you think your device/network is taking too long. adjust the file location before running it and don’t use it to actually mess with someone, it’s supposed to be something for a joke, not to irritate anyone (unless they’re a close friend)", "repo": "https://github.com/Sarthak-jnj/Just-a-wishing-bot", "demo": "https://github.com/Sarthak-jnj/Just-a-wishing-bot/blob/main/Demo.zip"}]...
|
[{"post_id": 81289, "ts": "202 [{"post_id": 81289, "ts": "2026-10-20T17:20:08Z", "hours": 0.3531, "text": "Just worked up with a needed demo to quick install the files."}, {"post_id": 78728, "ts": "2026-10-11T12:36:51Z", "hours": 1.4719, "text": "Devlog Post-final Yeah…..so i discovered some more issues. primarily the WhatsApp’s internal safeguard to prevent automated bots from attaching files. had to work around that. should definetly be final devlog tho."}, {"post_id": 78665, "ts": "2026-10-11T07:05:07Z", "hours": 0.4492, "text": "Devlog final: Finished it up and set the GitHub repository, although forgot to record that on lapse. run a test once to ensure it’s working too. Link on the project page"}, {"post_id": 78424, "ts": "2026-10-10T19:29:56Z", "hours": 1.8186, "text": "Devlog 1 Pretty much completed the thing; it took me more time than expected. Since it’s late, I’ll just finish up a few remaining adjustments tomorrow morning and post a GitHub repo. A basic WhatsApp bot that scans the date every time you turn your computer on and will send a wish to any defined number through WhatsApp, if you turn your pc on a second time the same day it won’t trigger. Feel free to use it as a meme with friends or genuinely with family (once i finish up tomorrow). Was kinda a micro-fun-project, nothing serious."}]...
|
Title: Wish sender by @sarthak_jnj | Stardance
De Title: Wish sender by @sarthak_jnj | Stardance
Devlogs:
Devlog 1 Pretty much completed the thing; it took me more time than expected. Since it’s late, I’ll just finish up a few remaining adjustments tomorrow morning and post a GitHub repo. A basic WhatsApp bot that scans the date every time you turn your computer on and will send a wish to any defined number through WhatsApp, if you turn your pc on a second time the same day it won’t trigger. Feel free to use it as a meme with friends or genuinely with family (once i finish up tomorrow). Was kinda a micro-fun-project, nothing serious.
Devlog final: Finished it up and set the GitHub repository, although forgot to record that on lapse. run a test once to ensure it’s working too. Link on the project page
Devlog Post-final Yeah…..so i discovered some more issues. primarily the WhatsApp’s internal safeguard to prevent automated bots from attaching files. had to work around that. should definetly be final devlog tho.
Just worked up with a needed demo to quick install the files.
Ships:
It is supposed to be a bot that automatically runs with your device startup, checks it’s own history and then executes the command to send a specific message & image to a defined contact on WhatsApp. I personally kept it at 9 days as a small fun project to tease a friend during a 9-day long indian traditional festival. The messages, phone number, file location and photos can easily be replaced. The difficulty for me was the new experience, making projects itself is a new thing for me I’ve recently added to my timeline, and i prefer hardware mostly so I’m not much experienced with software work and working with so many libraries, that’s why this project is more of a reminder that “you have to do this today too. just keep an eye if something goes wrong” rather than something dealing with itself in the background. What i am proud of can be that i learnt the JSON thing for this project solely but practice rather than any theory reading. and even tho i used an AI to guide me, i genuinely found a lot of troubles and came up with 3-4 creative workarounds by the end and completely made the structure myself even if i asked the specific commands from AI. For those trying this, it is easy to use as it is, just make sure you already have logged into WhatsApp, adjust the pixel locations according to your device as given in README.md, increase time.sleep() if you think your device/network is taking too long. adjust the file location before running it and don’t use it to actually mess with someone, it’s supposed to be something for a joke, not to irritate anyone (unless they’re a close friend)...
|
1793217335.4570804
|
1793303735.4570804
|
|
70586
|
Stock Return Calculator by @dillonnagar | Stardanc Stock Return Calculator by @dillonnagar | Stardance...
|
dillonnagar
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T23:25:53Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Stock Return Calculator that lets users enter a stock’s purchase price, selling price, and number of shares to calculate their total profit or loss and percentage return. The most challenging part was getting the JavaScript to work correctly. I ran into a few HTML errors, and initially the calculate button wasn’t doing anything. I debugged the error and figuered out what was wrong and fixed it. I’m proud that I got a working website online and learned how to code with HTML and JavaScript. To test it, enter your purchase price, your selling price, and however many shares you want. Click Calculate Returns, and it should show your profit and return.", "repo": "https://github.com/Manateek1/stock-return-calculator", "demo": "https://manateek1.github.io/stock-return-calculator/"}]...
|
[{"post_id": 81288, "ts": "202 [{"post_id": 81288, "ts": "2026-10-20T16:59:24Z", "hours": 1.3247, "text": "Today I worked on my Stock Return Calculator, a website that calculates stock investment profits and percentage returns. I had trouble with the design but learned how to use CSS to make it look good. Also the calculation wouldn’t work so I had to debug it and figued out what was wrong with the logic."}]...
|
Title: Stock Return Calculator by @dillonnagar | S Title: Stock Return Calculator by @dillonnagar | Stardance
Devlogs:
Today I worked on my Stock Return Calculator, a website that calculates stock investment profits and percentage returns. I had trouble with the design but learned how to use CSS to make it look good. Also the calculation wouldn’t work so I had to debug it and figued out what was wrong with the logic.
Ships:
I made a Stock Return Calculator that lets users enter a stock’s purchase price, selling price, and number of shares to calculate their total profit or loss and percentage return. The most challenging part was getting the JavaScript to work correctly. I ran into a few HTML errors, and initially the calculate button wasn’t doing anything. I debugged the error and figuered out what was wrong and fixed it. I’m proud that I got a working website online and learned how to code with HTML and JavaScript. To test it, enter your purchase price, your selling price, and however many shares you want. Click Calculate Returns, and it should show your profit and return....
|
1793138329.237509
|
1793224729.237509
|