|
42717
|
Flujo by @jupeme6 | Stardance
|
jupeme6
|
2
|
65.0
|
864
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T01:07:38Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? A local-first expense tracker called Flujo with an editorial / ledger aesthetic. It tracks income and expenses, has a Sankey diagram drawn from scratch on canvas (no libraries), an OCR ticket scanner, a debt settlement system for flatmates, budgets with alerts, savings goals, statistics, and CSV/JSON backup. Six betas in total. Everything is in localStorage, no backend, no account, PWA installable for offline use. What was challenging? The Sankey diagram was the hardest. Built it with bezier curves on canvas, had to fix proportional sizing and ribbon flow. The OCR scanner had a bug where it would hang forever because I was calling a boolean instead of the Tesseract library. The i18n had a sneaky bug where early betas left some sections in Spanish even after switching to English. What are you proud of? The Sankey diagram with zero dependencies, the greedy algorithm that settles debts with the minimum number of transfers, and the statistics dashboard comparing month-over-month spending. The whole thing works offline. What should people know so they can test your project? Open the demo. Choose language on first launch. The resumen tab has charts, budgets, goals, stats, and backup. The apuntes tab is for expenses. The tickets tab scans receipts via OCR. The deudas tab tracks shared expenses and suggests minimum transfers to settle. Gear icon for dark mode and language. Live demo: https://notjuangamer10.github.io/flujo/ Source: https://github.com/notjuangamer10/flujo", "repo": "https://github.com/NOTJuangamer10/flujo", "demo": "https://notjuangamer10.github.io/flujo/"}, {"ship_num": 2, "ts": "2026-08-10T14:12:57Z", "hours": 54.0, "multiplier": 16.01, "payout": 864, "blessing": "neutral", "text": "What did you make? A personal expense tracker called Flujo, built with an editorial / ledger aesthetic. The app tracks income and expenses with categories, a 5-day forecast visualization, an OCR ticket scanner, and a full debt and shared expenses system for tracking who owes whom between flatmates or friends. Everything is local-first, stored in localStorage, no account, no server, no tracking. Built in four betas. Beta 1 was the basics: add expenses, browse by month, summary totals. Beta 2 added a Sankey diagram showing money flow from income to expense categories, a stacked bar chart for the last 6 months, and a donut chart for category breakdown, all drawn on canvas with vanilla JS (no charting library). Beta 3 added a tabbed interface (resumen, apuntes, tickets, deudas) and an OCR ticket scanner using Tesseract.js that extracts products and prices from receipt photos. Beta 4 added the debts system with four split methods (equal, by shares, exact, by percentage), a greedy algorithm to settle debts with minimum transfers, pattern detection for subscriptions and recurring expenses, plus a dark mode and ES/EN language toggle. What was challenging? The Sankey diagram was the hardest part. My first version drew two separate bezier curves joined at the ends, which looked angular and flat and kinda ugly ngl. Asked another AI for help and it spotted a missing lineTo, but the real fix was using a single bezierCurveTo per ribbon with control points at 42 percent of the horizontal distance (the same proportion D3 uses). Also had to make both sides share the same scale so ribbons flow horizontally instead of diagonal. The proportional sizing was another bug: I had a minimum height of 38px, so a 10 euro expense looked the same as a 400 euro income. Fixed by dropping the minimum to 3px. The OCR scanner had a silent bug where it would hang forever on “procesando imagen”. I was calling tesseractCargado.createWorker where tesseractCargado is a boolean, not the Tesseract library object. So I was doing true.createWorker which throws a TypeError that nobody caught. Fixed by calling Tesseract.createWorker and added a 90 second timeout. The internationalization had a sneaky bug too. The language toggle translated the main UI but left the forecast and debts sections in Spanish because that code was hardcoded from earlier betas. Had to re-translate every section separately. What are you proud of? The Sankey diagram, drawn entirely with vanilla canvas, no D3 or any charting library. About 200 lines of math and bezier curves, but the result looks professional. The debt settlement algorithm that minimizes transfers, so if three people owe each other small amounts it suggests the minimum set of payments instead of everyone paying everyone. The pattern detection that finds subscriptions and projects their annual cost, which is a sobering number to see. And the whole thing works offline with no backend, no account, no tracking. What should people know so they can test your project? Open the demo URL. The resumen tab shows the Sankey diagram, bar chart and donut chart. The apuntes tab lets you add expenses and browse them by month. The tickets tab lets you upload a receipt photo and the OCR extracts products and prices automatically. The deudas tab is where you add people and track shared expenses with four split methods, then see the minimum transfers needed to settle all debts. The gear icon in the header opens settings with a dark mode toggle and ES/EN language switch. Everything is stored locally in the browser, nothing is sent anywhere. Live demo: https://notjuangamer10.github.io/flujo/ Source: https://github.com/notjuangamer10/flujo", "repo": "https://github.com/NOTJuangamer10/flujo", "demo": "https://notjuangamer10.github.io/flujo/"}]...
|
[{"post_id": 64538, "ts": "202 [{"post_id": 64538, "ts": "2026-09-09T01:02:58Z", "hours": 3.3525, "text": "Flujo 6.2. Statistics, backup, and custom categories. Statistics dashboard. The resumen tab now shows six stat cards: total spent across all time, comparison vs last month (with up/down arrows and percentage), daily average for the current month, the most expensive day of the month, number of entries this month, and average per entry. The cards update automatically when you add or remove expenses. Backup. You can export all your data to CSV (for spreadsheets) or JSON (for a full backup that includes expenses, income, people, debts, budgets, and goals). You can also import a JSON file to restore everything. Useful for moving your data to another browser or just keeping a safe copy. Custom categories. You can now create your own expense categories with a custom name and a custom color using a color picker. The new categories appear automatically in the expense form and the ticket scanner. The charts and Sankey diagram will use your custom colors."}, {"post_id": 59025, "ts": "2026-08-31T16:40:42Z", "hours": 3.5872, "text": "Flujo 6.1. Budgets and savings goals. Budgets. Set a monthly limit per category. A progress bar shows how much you have spent vs the limit. The bar changes color: category color under 80 percent, ochre at 80 to 100 (almost there warning), red over 100 (over budget). The percentage and a short warning message appear next to each bar. Delete a budget with the x button on hover. Savings goals. Set a goal with a name, target amount and optional deadline. The app calculates your current savings (total income minus total expenses across all time) and shows a green progress bar toward the goal. When you hit 100 percent the goal name turns green with a checkmark. Useful for things like save 500 for summer trip. Both features appear in the resumen tab below the charts. They update automatically when you add or remove expenses. Everything is stored in localStorage, no server."}, {"post_id": 52733, "ts": "2026-08-23T01:54:52Z", "hours": 3.9356, "text": "Beta 5 of Flujo. Improvements based on reviewer feedback.PWA installable. A service worker now caches the core files so the app works offline on desktop and Android. The manifest is generated dynamically. CDN assets like Tesseract.js and Google Fonts are not cached to avoid bloat. The app itself, your expenses and charts all work offline.Language prompt on first launch. New users now see a modal asking them to choose Spanish or English before the app loads. This was the top complaint from reviewers on my other projects, who said the language toggle was hard to find.Onboarding overlay. First-time visitors get a welcome screen explaining the four tabs (resumen, apuntes, tickets, deudas) with a short description of each, plus tips like adding income sources first to see the Sankey diagram. Dismissible with a single click.Fixed incomplete translations. The canvas text “sin datos para mostrar” and “sin gastos” now respect the language setting. The footer and header subtitle also translate. Everything visible to the user is now either English or Spanish based on the preference."}, {"post_id": 44493, "ts": "2026-08-10T09:19:08Z", "hours": 8.0956, "text": "Beta 4 of Flujo is up. The biggest one yet, split into two parts because of the autoescritor’s 10 hour session limit. Beta 4a added the settings panel with dark mode and language toggle (ES/EN). The dark mode uses a warm dark brown palette instead of the usual cold gray, so it still feels editorial. The language toggle reloads the page to re-translate static text. Beta 4b added the debts and shared expenses system. You can add people (flatmates, friends) and track who owes whom. Shared expenses support four split methods: equal, by shares (e.g. 2:1:1 means one person pays double), exact amounts per person, and by percentage. The settle-up section uses a greedy algorithm to minimize the number of transfers needed to clear all debts, so if three people owe each other small amounts, it suggests the minimum set of transfers instead of everyone paying everyone. Also added pattern detection. The app analyzes your expenses and finds recurring ones, things you pay the same amount for multiple times. It separates them into likely subscriptions (same exact amount, repeated) and general recurring expenses (same description, similar amounts). Shows the projected annual cost for subscriptions, which is a sobering number to see. Next version will be the last: FastAPI backend for sync between phone and laptop, plus PWA installable."}, {"post_id": 43704, "ts": "2026-08-09T03:31:43Z", "hours": 7.7708, "text": "Beta 4a of Flujo is up. I’m starting to get tired of being all day coding. Started the debts and shared expenses feature, plus two settings that were requested on my other projects. First, a theme toggle. The app now supports a dark mode alongside the default cream paper look. The toggle is in a small settings panel in the header. The dark palette uses a warm dark brown instead of the usual cold gray, so it still feels like the editorial aesthetic.Second, multi-language support. The interface can switch between Spanish and English. Switching reloads the page so all the static text gets re-translated. The dynamic content (expenses, descriptions) stays in whatever language the user typed it in.Third, the structure for the debts tab is in place. A new “deudas” tab appears next to resumen, apuntes and tickets. The HTML is there (persons form, shared expense form with split method selector, movements list, settle-up section, patterns section) but the JavaScript logic comes in Beta 4b. The shared expense form supports four split methods: equal, by shares (e.g. 2:1:1 means one person pays double), exact amounts per person, and by percentage.Split this into two parts because of the autoescritor session limit. 4b comes next with all the logic for shared expenses, debt settlement and pattern detection."}, {"post_id": 43184, "ts": "2026-08-08T09:33:02Z", "hours": 6.4356, "text": "Beta 4a of Flujo is up. Started the debts and shared expenses feature, plus two settings that were requested on my other projects. First, a theme toggle. The app now supports a dark mode alongside the default cream paper look. The toggle is in a small settings panel in the header. The dark palette uses a warm dark brown instead of the usual cold gray, so it still feels like the editorial aesthetic. Second, multi-language support. The interface can switch between Spanish and English. Switching reloads the page so all the static text gets re-translated. The dynamic content (expenses, descriptions) stays in whatever language the user typed it in. Third, the structure for the debts tab is in place. A new “deudas” tab appears next to resumen, apuntes and tickets. The HTML is there (persons form, shared expense form with split method selector, movements list, settle-up section, patterns section) but the JavaScript logic comes in Beta 4b. The shared expense form supports four split methods: equal, by shares (e.g. 2:1:1), exact amounts per person, and by percentage. The settle-up section will use a greedy algorithm to minimize the number of transfers needed to clear all debts."}, {"post_id": 42943, "ts": "2026-08-07T22:39:17Z", "hours": 4.0389, "text": "Beta 3.1 is a bugfix release. Two issues. First, the OCR ticket scanner was completely broken. When you uploaded a photo it would say “procesando imagen” forever and never finish. Turned out I was calling tesseractCargado.createWorker where tesseractCargado is a boolean (true), not the Tesseract library object. So I was doing true.createWorker which is undefined.createWorker which throws a TypeError that nobody caught. Switched to Tesseract.createWorker and added a 90 second timeout plus proper try/catch so it can never hang again. Second, the Sankey text was blurry. Canvas draws with whatever font is available at draw time, and if Google Fonts was still loading on the first render it fell back to Arial which looked bad when scaled by devicePixelRatio. Fixed by waiting for document.fonts.ready before the first draw, rounding all Y coordinates to integers so they align with physical pixels, and redrawing on window resize so the DPR stays correct."}, {"post_id": 42609, "ts": "2026-08-07T12:57:34Z", "hours": 7.0344, "text": "Beta 3 is up Tabs and OCR Update!! Three changes. First, the Sankey is now proportional. Before, every node had a minimum height of 38px, so a 10 euro expense looked the same as a 400 euro income. Now the minimum is 3px and both sides use the global total as their scale, so node heights actually reflect the amounts. A 10 euro category is a tiny sliver next to a 400 euro income source. Second, added tabs. The app was getting long with everything in one column. Now there are three tabs: resumen (income sources and charts), apuntes (the expense form and list), and tickets (new). The tab bar uses the same editorial styling, lowercase text with an ochre underline on the active tab. Third, the big one: OCR ticket scanning. On the tickets tab you upload a photo of a supermarket receipt and Tesseract.js extracts the text, then a regex parser pulls out product names and prices. Each detected item shows up in a list with a checkbox, you pick a category, hit save, and all items become individual expenses. The parser looks for lines ending in a decimal number (the classic receipt format) and skips lines that look like totals, subtotals or payment info. Tesseract loads from CDN the first time you use it. It runs entirely in the browser, no server involved, which keeps the local-first promise. The recognition is decent for clean photos, struggles with crumpled receipts. The parser is basic but catches most supermarket formats. If it fails, there is a details panel showing the raw OCR text so you can see what went wrong."}, {"post_id": 41662, "ts": "2026-08-06T01:01:30Z", "hours": 4.3533, "text": "Beta 2.1 is a visual rework of the Sankey diagram. Charts Update!: The previous version worked but looked rough: the flow ribbons were angular, the nodes were plain rectangles, and the two sides used independent scales so the ribbons went diagonal instead of horizontal. I asked another AI for help with the algorithm and it suggested a cleaner approach. Each ribbon is now a single bezier curve with control points at 42 percent of the horizontal distance (the same proportion D3 uses in its Sankey layout), instead of two curves joined at the ends. The nodes are rounded rectangles with a soft shadow. Both sides share the same scale so the ribbons flow straight. Nodes are centered vertically instead of pinned to the top. I kept the editorial palette: dark green for income nodes, black ink for the center “total” node, cream with a colored accent stripe for each expense category. The ribbons use the category color at 30 percent opacity so overlaps create natural layering. Also fixed a timezone bug in the 6 month bar chart. I was using toISOString to build the month key, which converts to UTC and can return the wrong month near midnight. Switched to getFullYear and getMonth which stay in local time. The bars were technically drawing before but some months were mismatched, now they line up correctly. I still have to work that better, but it isnt thaaat bad"}, {"post_id": 41274, "ts": "2026-08-05T11:58:13Z", "hours": 8.9636, "text": "Beta 2 of Flujo is up. The big one: a Sankey diagram showing the flow of your money, income sources on the left, expense categories on the right, with smooth flowing ribbons in between. Drawn on canvas with vanilla JS, no D3 or any charting library. Just bezierCurveTo and a lot of math. Also added two more charts: a stacked bar chart showing the last 6 months (each bar broken down by category, with the monthly total on top), and a donut chart for the current month’s category breakdown with a legend. To make the Sankey meaningful I had to add an income system, a small form where you register your income sources (scholarship, parents, job, etc.). The balance section now shows five numbers: spent, count, average, income, and balance (green if positive, red if negative). The Sankey was the hardest part. My first version drew two separate bezier curves (top and bottom) and joined them at the ends, the ribbons looked flat and angular, like triangles. I asked Gemini for help and it spotted a missing lineTo at the destination node, which fixed the pinch. But the ribbons still looked off. Turned out the real problem was the algorithm: each ribbon needs to be ONE single bezierCurveTo with four control points (not two curves joined), and both sides need to share the same scale (not normalize independently). Once I fixed that, the ribbons flowed organically like a real Sankey. The bar chart had a sneaky bug too: it drew the grid lines but no bars. Took me a while, I was using canvas.clientWidth (DOM size) instead of canvas.width (drawing context size). The CSS makes the canvas visually smaller than its internal resolution, so the bars were being drawn outside the visible area. Classic canvas gotcha. Used a muted, desaturated palette for the 8 categories (ochre, dusty blue, sage green, etc.) instead of bright primary colors, keeps the editorial aesthetic intact. Next version will be the OCR ticket scanner, organized in tabs so the charts don’t compete with the expense list for space. And also redigning the sankey because i dont like how it looks."}, {"post_id": 40077, "ts": "2026-08-03T13:40:22Z", "hours": 7.2981, "text": "Started a new project called Flujo, a personal expense tracker. The idea was to make something that doesn’t look like every other finance app most of them use blue or green with cards and Material-style shadows. I went with an “editorial ledger” aesthetic: paper cream background, dark ink text, an ochre accent, and three typefaces working together Fraunces (a serif) for titles, Inter Tight for UI, and JetBrains Mono with tabular numerals for the amounts so they align like a real accounting book. Beta 1 is the basics: a form to add an expense (amount, category, description, date), a list of expenses for the current month with running numbers (001, 002…), and three totals on top spent, count, and average. There’s a month selector in the header. Everything lives in localStorage, no backend, no server, no tracking. The list is called “libro mayor” (general ledger) and each entry is an “apunte” (bookkeeping entry) small details that lean into the book metaphor. Next version will add the Sankey diagram and bar charts."}]...
|
Title: Flujo by @jupeme6 | Stardance
Devlogs:
Sta Title: Flujo by @jupeme6 | Stardance
Devlogs:
Started a new project called Flujo, a personal expense tracker. The idea was to make something that doesn’t look like every other finance app most of them use blue or green with cards and Material-style shadows. I went with an “editorial ledger” aesthetic: paper cream background, dark ink text, an ochre accent, and three typefaces working together Fraunces (a serif) for titles, Inter Tight for UI, and JetBrains Mono with tabular numerals for the amounts so they align like a real accounting book. Beta 1 is the basics: a form to add an expense (amount, category, description, date), a list of expenses for the current month with running numbers (001, 002…), and three totals on top spent, count, and average. There’s a month selector in the header. Everything lives in localStorage, no backend, no server, no tracking. The list is called “libro mayor” (general ledger) and each entry is an “apunte” (bookkeeping entry) small details that lean into the book metaphor. Next version will add the Sankey diagram and bar charts.
Beta 2 of Flujo is up. The big one: a Sankey diagram showing the flow of your money, income sources on the left, expense categories on the right, with smooth flowing ribbons in between. Drawn on canvas with vanilla JS, no D3 or any charting library. Just bezierCurveTo and a lot of math. Also added two more charts: a stacked bar chart showing the last 6 months (each bar broken down by category, with the monthly total on top), and a donut chart for the current month’s category breakdown with a legend. To make the Sankey meaningful I had to add an income system, a small form where you register your income sources (scholarship, parents, job, etc.). The balance section now shows five numbers: spent, count, average, income, and balance (green if positive, red if negative). The Sankey was the hardest part. My first version drew two separate bezier curves (top and bottom) and joined them at the ends, the ribbons looked flat and angular, like triangles. I asked Gemini for help and it spotted a missing lineTo at the destination node, which fixed the pinch. But the ribbons still looked off. Turned out the real problem was the algorithm: each ribbon needs to be ONE single bezierCurveTo with four control points (not two curves joined), and both sides need to share the same scale (not normalize independently). Once I fixed that, the ribbons flowed organically like a real Sankey. The bar chart had a sneaky bug too: it drew the grid lines but no bars. Took me a while, I was using canvas.clientWidth (DOM size) instead of canvas.width (drawing context size). The CSS makes the canvas visually smaller than its internal resolution, so the bars were being drawn outside the visible area. Classic canvas gotcha. Used a muted, desaturated palette for the 8 categories (ochre, dusty blue, sage green, etc.) instead of bright primary colors, keeps the editorial aesthetic intact. Next version will be the OCR ticket scanner, organized in tabs so the charts don’t compete with the expense list for space. And also redigning the sankey because i dont like how it looks.
Beta 2.1 is a visual rework of the Sankey diagram. Charts Update!: The previous version worked but looked rough: the flow ribbons were angular, the nodes were plain rectangles, and the two sides used independent scales so the ribbons went diagonal instead of horizontal. I asked another AI for help with the algorithm and it suggested a cleaner approach. Each ribbon is now a single bezier curve with control points at 42 percent of the horizontal distance (the same proportion D3 uses in its Sankey layout), instead of two curves joined at the ends. The nodes are rounded rectangles with a soft shadow. Both sides share the same scale so the ribbons flow straight. Nodes are centered vertically instead of pinned to the top. I kept the editorial palette: dark green for income nodes, black ink for the center “total” node, cream with a colored accent stripe for each expense category. The ribbons use the category color at 30 percent opacity so overlaps create natural layering. Also fixed a timezone bug in the 6 month bar chart. I was using toISOString to build the month key, which converts to UTC and can return the wrong month near midnight. Switched to getFullYear and getMonth which stay in local time. The bars were technically drawing before but some months were mismatched, now they line up correctly. I still have to work that better, but it isnt thaaat bad
Beta 3 is up Tabs and OCR Update!! Three changes. First, the Sankey is now proportional. Before, every node had a minimum height of 38px, so a 10 euro expense looked the same as a 400 euro income. Now the minimum is 3px and both sides use the global total as their scale, so node heights actually reflect the amounts. A 10 euro category is a tiny sliver next to a 400 euro income source. Second, added tabs. The app was getting long with everything in one column. Now there are three tabs: resumen (income sources and charts), apuntes (the expense form and list), and tickets (new). The tab bar uses the same editorial styling, lowercase text with an ochre underline on the active tab. Third, the big one: OCR ticket scanning. On the tickets tab you upload a photo of a supermarket receipt and Tesseract.js extracts the text, then a regex parser pulls out product names and prices. Each detected item shows up in a list with a checkbox, you pick a category, hit save, and all items become individual expenses. The parser looks for lines ending in a decimal number (the classic receipt format) and skips lines that look like totals, subtotals or payment info. Tesseract loads from CDN the first time you use it. It runs entirely in the browser, no server involved, which keeps the local-first promise. The recognition is decent for clean photos, struggles with crumpled receipts. The parser is basic but catches most supermarket formats. If it fails, there is a details panel showing the raw OCR text so you can see what went wrong.
Beta 3.1 is a bugfix release. Two issues. First, the OCR ticket scanner was completely broken. When you uploaded a photo it would say “procesando imagen” forever and never finish. Turned out I was calling tesseractCargado.createWorker where tesseractCargado is a boolean (true), not the Tesseract library object. So I was doing true.createWorker which is undefined.createWorker which throws a TypeError that nobody caught. Switched to Tesseract.createWorker and added a 90 second timeout plus proper try/catch so it can never hang again. Second, the Sankey text was blurry. Canvas draws with whatever font is available at draw time, and if Google Fonts was still loading on the first render it fell back to Arial which looked bad when scaled by devicePixelRatio. Fixed by waiting for document.fonts.ready before the first draw, rounding all Y coordinates to integers so they align with physical pixels, and redrawing on window resize so the DPR stays correct.
Beta 4a of Flujo is up. Started the debts and shared expenses feature, plus two settings that were requested on my other projects. First, a theme toggle. The app now supports a dark mode alongside the default cream paper look. The toggle is in a small settings panel in the header. The dark palette uses a warm dark brown instead of the usual cold gray, so it still feels like the editorial aesthetic. Second, multi-language support. The interface can switch between Spanish and English. Switching reloads the page so all the static text gets re-translated. The dynamic content (expenses, descriptions) stays in whatever language the user typed it in. Third, the structure for the debts tab is in place. A new “deudas” tab appears next to resumen, apuntes and tickets. The HTML is there (persons form, shared expense form with split method selector, movements list, settle-up section, patterns section) but the JavaScript logic comes in Beta 4b. The shared expense form supports four split methods: equal, by shares (e.g. 2:1:1), exact amounts per person, and by percentage. The settle-up section will use a greedy algorithm to minimize the number of transfers needed to clear all debts.
Beta 4a of Flujo is up. I’m starting to get tired of being all day coding. Started the debts and shared expenses feature, plus two settings that were requested on my other projects. First, a theme toggle. The app now supports a dark mode alongside the default cream paper look. The toggle is in a small settings panel in the header. The dark palette uses a warm dark brown instead of the usual cold gray, so it still feels like the editorial aesthetic.Second, multi-language support. The interface can switch between Spanish and English. Switching reloads the page so all the static text gets re-translated. The dynamic content (expenses, descriptions) stays in whatever language the user typed it in.Third, the structure for the debts tab is in place. A new “deudas” tab appears next to resumen, apuntes and tickets. The HTML is there (persons form, shared expense form with split method selector, movements list, settle-up section, patterns section) but the JavaScript logic comes in Beta 4b. The shared expense form supports four split methods: equal, by shares (e.g. 2:1:1 means one person pays double), exact amounts per person, and by percentage.Split this into two parts because of the autoescritor session limit. 4b comes next with all the logic for shared expenses, debt settlement and pattern detection.
Beta 4 of Flujo is up. The biggest one yet, split into two parts because of the autoescritor’s 10 hour session limit. Beta 4a added the settings panel with dark mode and language toggle (ES/EN). The dark mode uses a warm dark brown palette instead of the usual cold gray, so it still feels editorial. The language toggle reloads the page to re-translate static text. Beta 4b added the debts and shared expenses system. You can add people (flatmates, friends) and track who owes whom. Shared expenses support four split methods: equal, by shares (e.g. 2:1:1 means one person pays double), exact amounts per person, and by percentage. The settle-up section uses a greedy algorithm to minimize the number of transfers needed to clear all debts, so if three people owe each other small amounts, it suggests the minimum set of transfers instead of everyone paying everyone. Also added pattern detection. The app analyzes your expenses and finds recurring ones, things you pay the same amount for multiple times. It separates them into likely subscriptions (same exact amount, repeated) and general recurring expenses (same description, similar amounts). Shows the projected annual cost for subscriptions, which is a sobering number to see. Next version will be the last: FastAPI backend for sync between phone and laptop, plus PWA installable.
Beta 5 of Flujo. Improvements based on reviewer feedback.PWA installable. A service worker now caches the core files so the app works offline on desktop and Android. The manifest is generated dynamically. CDN assets like Tesseract.js and Google Fonts are not cached to avoid bloat. The app itself, your expenses and charts all work offline.Language prompt on first launch. New users now see a modal asking them to choose Spanish or English before the app loads. This was the top complaint from reviewers on my other projects, who said the language toggle was hard to find.Onboarding overlay. First-time visitors get a welcome screen explaining the four tabs (resumen, apuntes, tickets, deudas) with a short description of each, plus tips like adding income sources first to see the Sankey diagram. Dismissible with a single click.Fixed incomplete translations. The canvas text “sin datos para mostrar” and “sin gastos” now respect the language setting. The footer and header subtitle also translate. Everything visible to the user is now either English or Spanish based on the preference.
Flujo 6.1. Budgets and savings goals. Budgets. Set a monthly limit per category. A progress bar shows how much you have spent vs the limit. The bar changes color: category color under 80 percent, ochre at 80 to 100 (almost there warning), red over 100 (over budget). The percentage and a short warning message appear next to each bar. Delete a budget with the x button on hover. Savings goals. Set a goal with a name, target amount and optional deadline. The app calculates your current savings (total income minus total expenses across all time) and shows a green progress bar toward the goal. When you hit 100 percent the goal name turns green with a checkmark. Useful for things like save 500 for summer trip. Both features appear in the resumen tab below the charts. They update automatically when you add or remove expenses. Everything is stored in localStorage, no server.
Flujo 6.2. Statistics, backup, and custom categories. Statistics dashboard. The resumen tab now shows six stat cards: total spent across all time, comparison vs last month (with up/down arrows and percentage), daily average for the current month, the most expensive day of the month, number of entries this month, and average per entry. The cards update automatically when you add or remove expenses. Backup. You can export all your data to CSV (for spreadsheets) or JSON (for a full backup that includes expenses, income, people, debts, budgets, and goals). You can also import a JSON file to restore everything. Useful for moving your data to another browser or just keeping a safe copy. Custom categories. You can now create your own expense categories with a custom name and a custom color using a color picker. The new categories appear automatically in the expense form and the ticket scanner. The charts and Sankey diagram will use your custom colors.
Ships:
What did you make? A personal expense tracker called Flujo, built with an editorial / ledger aesthetic. The app tracks income and expenses with categories, a 5-day forecast visualization, an OCR ticket scanner, and a full debt and shared expenses system for tracking who owes whom between flatmates or friends. Everything is local-first, stored in localStorage, no account, no server, no tracking. Built in four betas. Beta 1 was the basics: add expenses, browse by month, summary totals. Beta 2 added a Sankey diagram showing money flow from income to expense categories, a stacked bar chart for the last 6 months, and a donut chart for category breakdown, all drawn on canvas with vanilla JS (no charting library). Beta 3 added a tabbed interface (resumen, apuntes, tickets, deudas) and an OCR ticket scanner using Tesseract.js that extracts products and prices from receipt photos. Beta 4 added the debts system with four split methods (equal, by shares, exact, by percentage), a greedy algorithm to settle debts with minimum transfers, pattern detection for subscriptions and recurring expenses, plus a dark mode and ES/EN language toggle. What was challenging? The Sankey diagram was the hardest part. My first version drew two separate bezier curves joined at the ends, which looked angular and flat and kinda ugly ngl. Asked another AI for help and it spotted a missing lineTo, but the real fix was using a single bezierCurveTo per ribbon with control points at 42 percent of the horizontal distance (the same proportion D3 uses). Also had to make both sides share the same scale so ribbons flow horizontally instead of diagonal. The proportional sizing was another bug: I had a minimum height of 38px, so a 10 euro expense looked the same as a 400 euro income. Fixed by dropping the minimum to 3px. The OCR scanner had a silent bug where it would hang forever on “procesando imagen”. I was calling tesseractCargado.createWorker where tesseractCargado is a boolean, not the Tesseract library object. So I was doing true.createWorker which throws a TypeError that nobody caught. Fixed by calling Tesseract.createWorker and added a 90 second timeout. The internationalization had a sneaky bug too. The language toggle translated the main UI but left the forecast and debts sections in Spanish because that code was hardcoded from earlier betas. Had to re-translate every section separately. What are you proud of? The Sankey diagram, drawn entirely with vanilla canvas, no D3 or any charting library. About 200 lines of math and bezier curves, but the result looks professional. The debt settlement algorithm that minimizes transfers, so if three people owe each other small amounts it suggests the minimum set of payments instead of everyone paying everyone. The pattern detection that finds subscriptions and projects their annual cost, which is a sobering number to see. And the whole thing works offline with no backend, no account, no tracking. What should people know so they can test your project? Open the demo URL. The resumen tab shows the Sankey diagram, bar chart and donut chart. The apuntes tab lets you add expenses and browse them by month. The tickets tab lets you upload a receipt photo and the OCR extracts products and prices automatically. The deudas tab is where you add people and track shared expenses with four split methods, then see the minimum transfers needed to settle all debts. The gear icon in the header opens settings with a dark mode toggle and ES/EN language switch. Everything is stored locally in the browser, nothing is sent anywhere. Live demo: https://notjuangamer10.github.io/flujo/ Source: https://github.com/notjuangamer10/flujo
What did you make? A local-first expense tracker called Flujo with an editorial / ledger aesthetic. It tracks income and expenses, has a Sankey diagram drawn from scratch on canvas (no libraries), an OCR ticket scanner, a debt settlement system for flatmates, budgets with alerts, savings goals, statistics, and CSV/JSON backup. Six betas in total. Everything is in localStorage, no backend, no account, PWA installable for offline use. What was challenging? The Sankey diagram was the hardest. Built it with bezier curves on canvas, had to fix proportional sizing and ribbon flow. The OCR scanner had a bug where it would hang forever because I was calling a boolean instead of the Tesseract library. The i18n had a sneaky bug where early betas left some sections in Spanish even after switching to English. What are you proud of? The Sankey diagram with zero dependencies, the greedy algorithm that settles debts with the minimum number of transfers, and the statistics dashboard comparing month-over-month spending. The whole thing works offline. What should people know so they can test your project? Open the demo. Choose language on first launch. The resumen tab has charts, budgets, goals, stats, and backup. The apuntes tab is for expenses. The tickets tab scans receipts via OCR. The deudas tab tracks shared expenses and suggests minimum transfers to settle. Gear icon for dark mode and language. Live demo: https://notjuangamer10.github.io/flujo/ Source: https://github.com/notjuangamer10/flujo...
|
1792878584.0517979
|
1793742584.0517979
|
|
59151
|
My own site! by @Seed | Stardance
|
Seed
|
1
|
2.49
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T00:11:33Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’ve created a personal website,one of the challenges were learning how to align some div with css, i also learned that you cant put red as the text color and black as the background color lol (sorry for bad english)", "repo": "https://github.com/liamkury/myweb", "demo": "https://liamkury.github.io/myweb/"}]...
|
[{"post_id": 65133, "ts": "202 [{"post_id": 65133, "ts": "2026-09-10T01:54:51Z", "hours": 0.4936, "text": "added more informations about me,I reorganized the layout,added a @media ,and made the github readme more complete"}, {"post_id": 63926, "ts": "2026-09-07T23:45:26Z", "hours": 1.7711, "text": "adding more informations like social media…"}]...
|
Title: My own site! by @Seed | Stardance
Devlogs: Title: My own site! by @Seed | Stardance
Devlogs:
adding more informations like social media…
added more informations about me,I reorganized the layout,added a @media ,and made the github readme more complete
Ships:
I’ve created a personal website,one of the challenges were learning how to align some div with css, i also learned that you cant put red as the text color and black as the background color lol (sorry for bad english)...
|
1793119931.4947555
|
1793206331.4947555
|
|
30561
|
No Let by @ethmarks | Stardance
|
ethmarks
|
2
|
38.0
|
499
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T00:10:21Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "No Let: a JS puzzle site where you aren’t allowed to use let or anything with mutable state. This second ship was about implementing the fantastic suggestions in the feedback I got from my first ship. I added anti-hardcoding checks to stop people from cheesing the puzzles I added two new levels, including a very difficult one I added confetti and visual feedback when a user completes a puzzle I added a favicon …Plus a handful of small tweaks and improvements I’m looking forward to reading the feedback I get this time :)", "repo": "https://github.com/ethmarks/nolet", "demo": "https://ethmarks.github.io/nolet/"}, {"ship_num": 2, "ts": "2026-07-09T21:55:18Z", "hours": 28.0, "multiplier": 18.96, "payout": 499, "blessing": "neutral", "text": "No Let is a JavaScript puzzle site where you have to use pure functional programming, which means that you aren’t allowed to use let variables or anything else with mutable state. I learned how to use QuickJS-emscripten, Prism code editor, and AcornJS, all of which are skills that I intend to reuse for later projects. I also learned a lot about pure functional programming itself while designing the puzzles. I’m especially proud of how the linter/test messages smoothly animate in and out. The animation itself was just a simple slide transition with Svelte, but in order to make it work I had to refactor and unify the error message generation into one big array, which was unexpectedly difficult.", "repo": "https://github.com/ethmarks/nolet", "demo": "https://ethmarks.github.io/nolet/"}]...
|
[{"post_id": 64518, "ts": "202 [{"post_id": 64518, "ts": "2026-09-08T23:57:42Z", "hours": 0.6822, "text": "Final devlog before ship #2 I added difficulty ratings for each puzzle I moved the logic/linter output (aka the checklist) right above the “run” button because it makes more sense there I updated the README and added some screenshots"}, {"post_id": 63280, "ts": "2026-09-07T00:56:34Z", "hours": 2.1544, "text": "How the heck did this take 2 hours… All that I did in this devlog was improve the Conway’s Game of Life puzzle a bit. I rewrote some of the starter and solution code for simplicity (I can’t believe I forgot about the .flatMap() method), and I also wrote a bunch of comments that explain the starter code and solution code. Next, I think I’ll add a difficulty indicator for the puzzles. I think I’ll probably be ready to re-ship after that!"}, {"post_id": 60511, "ts": "2026-09-02T21:57:40Z", "hours": 4.1878, "text": "Hi! It’s been a while. Again. The highlight of this devlog is the new puzzle: Conway’s Game of Life. In the feedback on my first ship, several people mentioned that they wanted more challenging levels. Well, here ya go! This puzzle is much more complex, and it also doesn’t lend itself well to functional programming, so you have to get creative in order to make the linter happy. Personally, after I designed the puzzle and wrote the starter code, it took me over 45 minutes to write the solution code. It’s pretty difficult, so hopefully it’ll satisfy the users who want a challenge. I also made a few smaller changes: I removed dev.css’s light mode, because all the rest of my styling is meant for dark mode I set Maple Mono as the preferred font, but I intentionally made it only work if you already have Maple Mono installed, because I know that not everybody likes it I added a special message if you try to run empty code Next, I think I’ll start adding comments to some of the starter code and solution code. I think it’d be helpful for users who aren’t as familiar with JavaScript or function programming, so that they can more easily get acquainted with the starter code, and so that they can learn how the solution works if they choose to use it."}, {"post_id": 43738, "ts": "2026-08-09T04:43:58Z", "hours": 1.0986, "text": "I made a new puzzle! The puzzle involves implementing a Caesar cipher. That’s it, actually. It’s certainly not a very difficult puzzle, but it does contribute to puzzle variety. Also, do you notice the new favicon? No more Svelte logo!"}, {"post_id": 42385, "ts": "2026-08-07T02:27:16Z", "hours": 0.4897, "text": "…i think the user would have more feedback/satisfaction if upon completion, something else happens to let them know they successfully completed a puzzle, something like confetti, or even just the “run” button changing color/text When the puzzle states changes to “passed” (meaning the logic test and linter both passed) from some other status, I made it trigger a confetti effect via canvas-confetti and made the run button turn green. Next, I’m probably going to make a favicon."}, {"post_id": 42359, "ts": "2026-08-07T01:15:08Z", "hours": 0.4586, "text": "One thing: I can just cheese everything by changing the output manually. I recommend you use multiple test cases so i can not just type “return 6” and complete the task. I added secretInput values to the rest of the puzzles to fix the hardcoding cheese. I also mentioned the anti-hardcoding in the README. Next, I’m going to work on adding some confetti and whatnot for when the user’s code passes both the logic test and the linter."}, {"post_id": 41006, "ts": "2026-08-04T21:57:16Z", "hours": 0.7825, "text": "Hi again! It’s been a while. I’m coming back to No Let because when I shipped it the first time, the lovely people who rated it took the time to write really thoughtful feedback and suggest great actionable improvements. So i thought it’d be fun to implement your suggestions (and also I was bored). Here are some excerpts from the feedback I got: One thing: I can just cheese everything by changing the output manually. I recommend you use multiple test cases so i can not just type “return 6” and complete the task. Anyway, my biggest critique would be the lack of levels. I think that adding tiers of difficulty, along with 10-15 more levels would take this project to the highest possible level. …svelte favicon ;)… …i think the user would have more feedback/satisfaction if upon completion, something else happens to let them know they successfully completed a puzzle, something like confetti, or even just the “run” button changing color/text I intend to fix/implement each one of these. With the exception of the “10-15 levels” one; that’s a bit more than I’m willing to make, but I will add some new puzzles. So far, I’ve started implementing the first suggestion. I’m creating secretInput values for each puzzle, and in the test function, after it evaluates the input (which is publicly displayed), it runs the code again using the secretInput . If the code passes the input check but fails the secretInput check, it fails the logic test with this message: Failed secret anti-hardcoding check. You need to generalize your logic. I’ve only added secretInput s for two puzzles so far, so the work is still ongoing."}, {"post_id": 25055, "ts": "2026-07-09T00:36:32Z", "hours": 3.2028, "text": "I wrote the README and also fixed a minor performance bug. Because Prism code editor only initializes once Svelte finishes hydrating, there’s a delay of a few hundred milliseconds between when the page becomes visible and when the editor initializes. This caused a layout shift on each puzzle page, which was making Lighthouse take away a few points in the performance category. So I precalculated the height of each puzzle editor in advance and applied that minimum height to the placeholder text. This fixed the layout shift, so now Lighthouse gives the site perfect 100s in performance, best practices, and SEO, which is cool."}, {"post_id": 24392, "ts": "2026-07-07T22:22:32Z", "hours": 0.7942, "text": "I just added some error handling for infinite loops and infinite recursion. Before, if you wrote while (true) {} in the editor and pressed run, it would permanently lock up the UI and crash the browser tab. Now the logic test just interrupts the execution after 1000ms and fails your code for taking too long. Likewise, if you wrote const r=()=>r();r(); and ran it, QuickJS would silently throw an uncaught error and the logic test would be stuck at “Waiting…” forever. Now it just instantly fails the code because it recurses too deeply and QuickJS can’t execute it. I’m probably going to ship No Let soon, unless I have more puzzle ideas, find more bugs to patch, or think of more features to add."}, {"post_id": 23943, "ts": "2026-07-07T04:44:58Z", "hours": 3.4903, "text": "I spent the last 3.5 hours making a single puzzle. It’s the hardest puzzle yet and took the most time to create, and by a lot. The puzzle is called Headcount, and it involves extracting a total count from a deeply-nested data object. I considered using nested arrays instead, but that would have a pretty trivial solution: return input.flat(Infinity).length . JS has far fewer built-in utilities for manipulating objects than it does for arrays, so I figured that using objects would pose more of a challenge, which I think it does. You can play the new puzzle here: https://ethmarks.github.io/nolet/headcount ."}, {"post_id": 23703, "ts": "2026-07-06T20:13:38Z", "hours": 1.945, "text": "I added more puzzles and wrote a congrats page for users who finish the whole site. The congrats page finally gave me the excuse to reference xkcd 1312 , which I’d been dying to do since I started this project. Next, I just need to make more puzzles. I have 4 so far, which I don’t think is nearly enough. Puzzle design is really hard though."}, {"post_id": 23105, "ts": "2026-07-05T21:00:44Z", "hours": 11.4647, "text": "I’ve made a lot of progress since my last devlog. I’d say that No Let is basically feature-complete now. All that’s left to do is adding polish and creating a bunch more puzzles. You can try No Let right now at https://ethmarks.github.io/nolet/ . Here are some of the highlights of the changes in this devlog. I added the Output.svelte component that runs the logic test and the linter and outputs their results into a human-readable HTML list. I also made it use Svelte’s slide transition , which required a lot of refactoring . I made each puzzle a separate page. I was originally planning on making the site an SPA, but I decided that a MPA was probably a better fit. Because the puzzles are defined as classes and not as separate Svelte routes, I had to add a dynamic route. I’m using SvelteKit’s static adapter because I prefer static sites, but that meant that I had to tell SvelteKit which pages to prerender. I added description text and suggested solutions for each puzzle. The descriptions provide instructions, tips, and flavor text, and the solutions should keep users from getting stuck or frustrated. But most of the work I did has been refactors, fixes, and creating new puzzles."}, {"post_id": 22007, "ts": "2026-07-04T07:34:27Z", "hours": 6.9069, "text": "So my idea for this project is that it’s a JavaScript puzzle site which forces you to use pure functional programming , which means that you aren’t allowed to use let or anything else with mutable state. Basically, pure functional programming says that you should never ever reassign variables after you declare them. Ever. Because you can’t reassign variables, you also can’t increment counters, which means that it’s impossible to use for loops. The same logic applies to while loops, and to a few other things. These extremely restrictive self-imposed limitations force you to do things the functional programming way, which involves lambda calculus, recursive functions, currying, etc. I think that this project will have four main parts. I’ve been working on it for about 7 hours and I’ve made some good progress, but there’s still a lot to do. Running the user’s code and reading the result. I can just wrap quickjs-emscripten and remove a few built-in methods like Math.random() that are considered “impure” by functional programming because they’re non-deterministic. Linting the user’s code to check if it uses any banned syntax like let . I can use acornjs to parse the code into an AST, then applying a bunch of custom rules to it. Allowing the user to write their code. The conventional choice would be to use Monaco or CodeMirror, but they’re extremely heavy and I don’t like VSCode anyways, so I’m going with Prism code editor , which is much lighter and in my opinion nicer. Having puzzles for the user to complete. Each puzzle should have a test function that can check if the code logic is correct, and also should have some initial code that has correct logic but fails the linting because it uses let and whatnot. Right now I have minimal versions of parts 1, 2, and 3. They do work (mostly), but they’re missing features and don’t integrate well with each other."}]...
|
Title: No Let by @ethmarks | Stardance
Devlogs:
S Title: No Let by @ethmarks | Stardance
Devlogs:
So my idea for this project is that it’s a JavaScript puzzle site which forces you to use pure functional programming , which means that you aren’t allowed to use let or anything else with mutable state. Basically, pure functional programming says that you should never ever reassign variables after you declare them. Ever. Because you can’t reassign variables, you also can’t increment counters, which means that it’s impossible to use for loops. The same logic applies to while loops, and to a few other things. These extremely restrictive self-imposed limitations force you to do things the functional programming way, which involves lambda calculus, recursive functions, currying, etc. I think that this project will have four main parts. I’ve been working on it for about 7 hours and I’ve made some good progress, but there’s still a lot to do. Running the user’s code and reading the result. I can just wrap quickjs-emscripten and remove a few built-in methods like Math.random() that are considered “impure” by functional programming because they’re non-deterministic. Linting the user’s code to check if it uses any banned syntax like let . I can use acornjs to parse the code into an AST, then applying a bunch of custom rules to it. Allowing the user to write their code. The conventional choice would be to use Monaco or CodeMirror, but they’re extremely heavy and I don’t like VSCode anyways, so I’m going with Prism code editor , which is much lighter and in my opinion nicer. Having puzzles for the user to complete. Each puzzle should have a test function that can check if the code logic is correct, and also should have some initial code that has correct logic but fails the linting because it uses let and whatnot. Right now I have minimal versions of parts 1, 2, and 3. They do work (mostly), but they’re missing features and don’t integrate well with each other.
I’ve made a lot of progress since my last devlog. I’d say that No Let is basically feature-complete now. All that’s left to do is adding polish and creating a bunch more puzzles. You can try No Let right now at https://ethmarks.github.io/nolet/ . Here are some of the highlights of the changes in this devlog. I added the Output.svelte component that runs the logic test and the linter and outputs their results into a human-readable HTML list. I also made it use Svelte’s slide transition , which required a lot of refactoring . I made each puzzle a separate page. I was originally planning on making the site an SPA, but I decided that a MPA was probably a better fit. Because the puzzles are defined as classes and not as separate Svelte routes, I had to add a dynamic route. I’m using SvelteKit’s static adapter because I prefer static sites, but that meant that I had to tell SvelteKit which pages to prerender. I added description text and suggested solutions for each puzzle. The descriptions provide instructions, tips, and flavor text, and the solutions should keep users from getting stuck or frustrated. But most of the work I did has been refactors, fixes, and creating new puzzles.
I added more puzzles and wrote a congrats page for users who finish the whole site. The congrats page finally gave me the excuse to reference xkcd 1312 , which I’d been dying to do since I started this project. Next, I just need to make more puzzles. I have 4 so far, which I don’t think is nearly enough. Puzzle design is really hard though.
I spent the last 3.5 hours making a single puzzle. It’s the hardest puzzle yet and took the most time to create, and by a lot. The puzzle is called Headcount, and it involves extracting a total count from a deeply-nested data object. I considered using nested arrays instead, but that would have a pretty trivial solution: return input.flat(Infinity).length . JS has far fewer built-in utilities for manipulating objects than it does for arrays, so I figured that using objects would pose more of a challenge, which I think it does. You can play the new puzzle here: https://ethmarks.github.io/nolet/headcount .
I just added some error handling for infinite loops and infinite recursion. Before, if you wrote while (true) {} in the editor and pressed run, it would permanently lock up the UI and crash the browser tab. Now the logic test just interrupts the execution after 1000ms and fails your code for taking too long. Likewise, if you wrote const r=()=>r();r(); and ran it, QuickJS would silently throw an uncaught error and the logic test would be stuck at “Waiting…” forever. Now it just instantly fails the code because it recurses too deeply and QuickJS can’t execute it. I’m probably going to ship No Let soon, unless I have more puzzle ideas, find more bugs to patch, or think of more features to add.
I wrote the README and also fixed a minor performance bug. Because Prism code editor only initializes once Svelte finishes hydrating, there’s a delay of a few hundred milliseconds between when the page becomes visible and when the editor initializes. This caused a layout shift on each puzzle page, which was making Lighthouse take away a few points in the performance category. So I precalculated the height of each puzzle editor in advance and applied that minimum height to the placeholder text. This fixed the layout shift, so now Lighthouse gives the site perfect 100s in performance, best practices, and SEO, which is cool.
Hi again! It’s been a while. I’m coming back to No Let because when I shipped it the first time, the lovely people who rated it took the time to write really thoughtful feedback and suggest great actionable improvements. So i thought it’d be fun to implement your suggestions (and also I was bored). Here are some excerpts from the feedback I got: One thing: I can just cheese everything by changing the output manually. I recommend you use multiple test cases so i can not just type “return 6” and complete the task. Anyway, my biggest critique would be the lack of levels. I think that adding tiers of difficulty, along with 10-15 more levels would take this project to the highest possible level. …svelte favicon ;)… …i think the user would have more feedback/satisfaction if upon completion, something else happens to let them know they successfully completed a puzzle, something like confetti, or even just the “run” button changing color/text I intend to fix/implement each one of these. With the exception of the “10-15 levels” one; that’s a bit more than I’m willing to make, but I will add some new puzzles. So far, I’ve started implementing the first suggestion. I’m creating secretInput values for each puzzle, and in the test function, after it evaluates the input (which is publicly displayed), it runs the code again using the secretInput . If the code passes the input check but fails the secretInput check, it fails the logic test with this message: Failed secret anti-hardcoding check. You need to generalize your logic. I’ve only added secretInput s for two puzzles so far, so the work is still ongoing.
One thing: I can just cheese everything by changing the output manually. I recommend you use multiple test cases so i can not just type “return 6” and complete the task. I added secretInput values to the rest of the puzzles to fix the hardcoding cheese. I also mentioned the anti-hardcoding in the README. Next, I’m going to work on adding some confetti and whatnot for when the user’s code passes both the logic test and the linter.
…i think the user would have more feedback/satisfaction if upon completion, something else happens to let them know they successfully completed a puzzle, something like confetti, or even just the “run” button changing color/text When the puzzle states changes to “passed” (meaning the logic test and linter both passed) from some other status, I made it trigger a confetti effect via canvas-confetti and made the run button turn green. Next, I’m probably going to make a favicon.
I made a new puzzle! The puzzle involves implementing a Caesar cipher. That’s it, actually. It’s certainly not a very difficult puzzle, but it does contribute to puzzle variety. Also, do you notice the new favicon? No more Svelte logo!
Hi! It’s been a while. Again. The highlight of this devlog is the new puzzle: Conway’s Game of Life. In the feedback on my first ship, several people mentioned that they wanted more challenging levels. Well, here ya go! This puzzle is much more complex, and it also doesn’t lend itself well to functional programming, so you have to get creative in order to make the linter happy. Personally, after I designed the puzzle and wrote the starter code, it took me over 45 minutes to write the solution code. It’s pretty difficult, so hopefully it’ll satisfy the users who want a challenge. I also made a few smaller changes: I removed dev.css’s light mode, because all the rest of my styling is meant for dark mode I set Maple Mono as the preferred font, but I intentionally made it only work if you already have Maple Mono installed, because I know that not everybody likes it I added a special message if you try to run empty code Next, I think I’ll start adding comments to some of the starter code and solution code. I think it’d be helpful for users who aren’t as familiar with JavaScript or function programming, so that they can more easily get acquainted with the starter code, and so that they can learn how the solution works if they choose to use it.
How the heck did this take 2 hours… All that I did in this devlog was improve the Conway’s Game of Life puzzle a bit. I rewrote some of the starter and solution code for simplicity (I can’t believe I forgot about the .flatMap() method), and I also wrote a bunch of comments that explain the starter code and solution code. Next, I think I’ll add a difficulty indicator for the puzzles. I think I’ll probably be ready to re-ship after that!
Final devlog before ship #2 I added difficulty ratings for each puzzle I moved the logic/linter output (aka the checklist) right above the “run” button because it makes more sense there I updated the README and added some screenshots
Ships:
No Let is a JavaScript puzzle site where you have to use pure functional programming, which means that you aren’t allowed to use let variables or anything else with mutable state. I learned how to use QuickJS-emscripten, Prism code editor, and AcornJS, all of which are skills that I intend to reuse for later projects. I also learned a lot about pure functional programming itself while designing the puzzles. I’m especially proud of how the linter/test messages smoothly animate in and out. The animation itself was just a simple slide transition with Svelte, but in order to make it work I had to refactor and unify the error message generation into one big array, which was unexpectedly difficult.
No Let: a JS puzzle site where you aren’t allowed to use let or anything with mutable state. This second ship was about implementing the fantastic suggestions in the feedback I got from my first ship. I added anti-hardcoding checks to stop people from cheesing the puzzles I added two new levels, including a very difficult one I added confetti and visual feedback when a user completes a puzzle I added a favicon …Plus a handful of small tweaks and improvements I’m looking forward to reading the feedback I get this time :)...
|
1793127240.641565
|
1793213640.641565
|
|
58356
|
Pop-It by @Sadiya | Stardance
|
Sadiya
|
1
|
2.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T00:00:23Z", "hours": 2.0, "multiplier": 1.27, "payout": 2, "blessing": "neutral", "text": "This is a simple pop-it where users will click on the circles and each time they are clicked and unclicked it will make a popping sound. There is also a button to change the background color. I just hope in the future I can add more to this.", "repo": "https://github.com/sadiyameem/pop-it", "demo": "https://sadiyameem.github.io/pop-it/"}]...
|
[{"post_id": 64512, "ts": "202 [{"post_id": 64512, "ts": "2026-09-08T23:38:48Z", "hours": 0.2517, "text": "I added a counter, so every time the circles are popped and unpopped the counter will go up."}, {"post_id": 63923, "ts": "2026-09-07T23:40:30Z", "hours": 0.2925, "text": "I added a button that changes the background color each time it is clicked and I am thinking of adding more and I have something in mind but I will not say until its done."}, {"post_id": 63075, "ts": "2026-09-06T17:47:26Z", "hours": 0.4903, "text": "I did it. I resizing it, added more circles, and I found a downloaded able but I am not done yet I plan on adding more to this pop-it, but it is fully works. And the sound could be loud so keep that in mind cause I know it is loud for me and I will see if I can find an alternative popping sound for this."}, {"post_id": 62499, "ts": "2026-09-05T21:57:45Z", "hours": 0.3378, "text": "This is what I have so far. I plan on resizing it and all but I am mostly done with the css and js but I need to find a audio sound and for some reason pixabay is not letting me download so i have to do some research to find a sound."}, {"post_id": 61820, "ts": "2026-09-04T22:18:06Z", "hours": 0.2922, "text": "I am only doing a little bit of code today since I am not feeling well but I did finish the HTML and started the CSS. Here is the background color I will use."}]...
|
Title: Pop-It by @Sadiya | Stardance
Devlogs:
I a Title: Pop-It by @Sadiya | Stardance
Devlogs:
I am only doing a little bit of code today since I am not feeling well but I did finish the HTML and started the CSS. Here is the background color I will use.
This is what I have so far. I plan on resizing it and all but I am mostly done with the css and js but I need to find a audio sound and for some reason pixabay is not letting me download so i have to do some research to find a sound.
I did it. I resizing it, added more circles, and I found a downloaded able but I am not done yet I plan on adding more to this pop-it, but it is fully works. And the sound could be loud so keep that in mind cause I know it is loud for me and I will see if I can find an alternative popping sound for this.
I added a button that changes the background color each time it is clicked and I am thinking of adding more and I have something in mind but I will not say until its done.
I added a counter, so every time the circles are popped and unpopped the counter will go up.
Ships:
This is a simple pop-it where users will click on the circles and each time they are clicked and unclicked it will make a popping sound. There is also a button to change the background color. I just hope in the future I can add more to this....
|
1793076508.1995254
|
1793162908.1995254
|
|
56554
|
MyFirstWebsite by @Agam_27 | Stardance
|
Agam_27
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T23:11:01Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a basic webpage which has an interactive button. I made it to understand the basics of coding so that it helps me to work on my main project. I learned how to make a static page interactive and add different elements while working on this project. The challenging part was to initially understand how the basics work but now I feel comfortable with it.", "repo": "https://github.com/Coder2769/MyFirstWebsite", "demo": "https://coder2769.github.io/MyFirstWebsite/"}]...
|
[{"post_id": 64010, "ts": "202 [{"post_id": 64010, "ts": "2026-09-08T03:43:17Z", "hours": 0.9147, "text": "I worked on my first website and got my first interactive feature working! I started by creating the basic webpage in VS Code and learning how HTML, CSS, and JavaScript work together. Then I added an interactive button using JavaScript. When the button is clicked, it actually responds, which was really cool to see because this is one of my first times coding. This helped me understand that websites aren’t just static pages and I can use JavaScript to make things actually happen when someone interacts with them. I’m planning to work on my main project now and I will post more about it."}]...
|
Title: MyFirstWebsite by @Agam_27 | Stardance
Dev Title: MyFirstWebsite by @Agam_27 | Stardance
Devlogs:
I worked on my first website and got my first interactive feature working! I started by creating the basic webpage in VS Code and learning how HTML, CSS, and JavaScript work together. Then I added an interactive button using JavaScript. When the button is clicked, it actually responds, which was really cool to see because this is one of my first times coding. This helped me understand that websites aren’t just static pages and I can use JavaScript to make things actually happen when someone interacts with them. I’m planning to work on my main project now and I will post more about it.
Ships:
I made a basic webpage which has an interactive button. I made it to understand the basics of coding so that it helps me to work on my main project. I learned how to make a static page interactive and add different elements while working on this project. The challenging part was to initially understand how the basics work but now I feel comfortable with it....
|
1793130773.0690641
|
1793217173.0690641
|
|
54437
|
George's Attire Website by @GeorgeSun | Starda George's Attire Website by @GeorgeSun | Stardance...
|
GeorgeSun
|
1
|
6.69
|
43
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T22:58:36Z", "hours": 6.0, "multiplier": 6.52, "payout": 43, "blessing": "neutral", "text": "I made a website for George’s Attire, my own small business that makes custom apparel for individuals, teams, businesses, and organizations in Canada. The most challenging part of making this website was adding integrations for Stripe and Supabase to make payments and track orders. I am most proud of the flow of the website and how easy it is to order as previously my business ran on a google form. I am very happy about this website and it also has it’s own custom domain. You can come look at the website by clicking try project below!", "repo": "https://github.com/Geofoods/George-s-Attire", "demo": "https://www.georgesattire.works/"}]...
|
[{"post_id": 65713, "ts": "202 [{"post_id": 65713, "ts": "2026-09-11T01:46:20Z", "hours": 0.6858, "text": "I rewrote the CSS to make the UI feel more similiar to the logo matching the black and white theme"}, {"post_id": 64486, "ts": "2026-09-08T22:18:02Z", "hours": 0.2961, "text": "I added a small polishing page animation that fades in the elements when you go to a page"}, {"post_id": 61897, "ts": "2026-09-05T02:02:46Z", "hours": 2.0819, "text": "I made the overall UI look better and fixed the stripe UI so that you can make payments"}, {"post_id": 58974, "ts": "2026-08-31T15:29:36Z", "hours": 3.2075, "text": "I made the design of the website matching the black and white theme and added some images all across the page. I also added functionality to choose positioning and scaling of your designs. I got a custom domain to put my page on as well"}]...
|
Title: George's Attire Website by @GeorgeSun | Title: George's Attire Website by @GeorgeSun | Stardance
Devlogs:
I made the design of the website matching the black and white theme and added some images all across the page. I also added functionality to choose positioning and scaling of your designs. I got a custom domain to put my page on as well
I made the overall UI look better and fixed the stripe UI so that you can make payments
I added a small polishing page animation that fades in the elements when you go to a page
I rewrote the CSS to make the UI feel more similiar to the logo matching the black and white theme
Ships:
I made a website for George’s Attire, my own small business that makes custom apparel for individuals, teams, businesses, and organizations in Canada. The most challenging part of making this website was adding integrations for Stripe and Supabase to make payments and track orders. I am most proud of the flow of the website and how easy it is to order as previously my business ran on a google form. I am very happy about this website and it also has it’s own custom domain. You can come look at the website by clicking try project below!...
|
1793123637.8890874
|
1793210037.8890874
|
|
59684
|
My very own WebOS by @Tom1234 | Stardance
|
Tom1234
|
1
|
2.28
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T22:44:33Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A basic WebOS. My first HTML project so it’s quite simple, but it works. Had some issues with bugs so had to use a little bit of AI to get some fixes, but tried to avoid it where possible.", "repo": "https://github.com/Timmyaintit12/Hack-Club-Website", "demo": "https://timmyaintit12.github.io/Hack-Club-Website/"}]...
|
[{"post_id": 65199, "ts": "202 [{"post_id": 65199, "ts": "2026-09-10T05:02:37Z", "hours": 0.2789, "text": "I fixed the bug where you could only drag the windows by their headers, and the close button covered the whole are above it. Some AI use to solve some bugs."}, {"post_id": 64492, "ts": "2026-09-08T22:34:38Z", "hours": 0.2742, "text": "I added a to do app. Used some AI to fix some bugs in it."}, {"post_id": 64102, "ts": "2026-09-08T09:18:18Z", "hours": 0.7236, "text": "I made it so the main page can open and close, I also added a notes style app with the ability to open and close as well."}, {"post_id": 64085, "ts": "2026-09-08T08:09:41Z", "hours": 0.4569, "text": "I made it so the middle box is draggable around the screen. Took quite a bit of effort when all I needed to do was remove the margin around the div."}, {"post_id": 64058, "ts": "2026-09-08T06:01:13Z", "hours": 0.3289, "text": "I added a Div to make everything central. I also added a background image to the whole thing along with a bar on top, showing the webite name and current time."}, {"post_id": 64047, "ts": "2026-09-08T05:34:50Z", "hours": 0.3011, "text": "Working on the opening page and Top bar"}]...
|
Title: My very own WebOS by @Tom1234 | Stardance
Title: My very own WebOS by @Tom1234 | Stardance
Devlogs:
Working on the opening page and Top bar
I added a Div to make everything central. I also added a background image to the whole thing along with a bar on top, showing the webite name and current time.
I made it so the middle box is draggable around the screen. Took quite a bit of effort when all I needed to do was remove the margin around the div.
I made it so the main page can open and close, I also added a notes style app with the ability to open and close as well.
I added a to do app. Used some AI to fix some bugs in it.
I fixed the bug where you could only drag the windows by their headers, and the close button covered the whole are above it. Some AI use to solve some bugs.
Ships:
A basic WebOS. My first HTML project so it’s quite simple, but it works. Had some issues with bugs so had to use a little bit of AI to get some fixes, but tried to avoid it where possible....
|
1793051533.7095406
|
1793137933.7095406
|
|
28495
|
Projects/Devlog Site by @ritvikgrandhi | Stardance
|
ritvikgrandhi
|
2
|
17.29
|
32
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T22:14:18Z", "hours": 9.0, "multiplier": 3.54, "payout": 32, "blessing": "neutral", "text": "##Ship 2! Hello, reviewers! This is an updated, more useful version of my portfolio website that can now log projects and devlogs, similar to Stardance! I made this after realizing that after Stardance is over, I’ll have nowhere to log my projects and the progress I make on them! To keep a good habit going and log my projects for everyone to see, I decided to edit this portfolio site into a dedicated server for all of my projects, after realizing that I already have a good portfolio that I constantly edit at school. This ship does not have full functionality: it can save any number of projects and devlogs, but once you reload, they are all gone. I can safely say that it was a pain to create a new project and devlog for testing, and now you get to do it too! As you might see in my last devlog, I’m currently shipping this so that everyone can see the project and devlog adding functionality now, because later I’ll add an admin login page so that I can only add my projects, while others who access the website can see them but not edit them. Anyway, that’s all, and have fun!", "repo": "https://github.com/ritvikgrandhi-hue/stardancechallengewebsite", "demo": "https://ritvikgrandhi-hue.github.io/stardancechallengewebsite/"}, {"ship_num": 2, "ts": "2026-08-09T17:10:42Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello, here is my portfolio website, which will eventually contain information about me and my life. So far, I have done the minimum requirements for this beginner project, which is why I am shipping it. However, I am pretty excited and happy about how it currently looks. What I did find challenging is that I haven’t used html and css in a while, which meant I had to relearn almost everything while juggling extracurriculars and school events. This personal project will grow as I achieve more things, but for now, the index page is the only truly functional page, which has more than 3 sections. I hope everyone will be able to see my passion and encourage me to continue into the future!", "repo": "https://github.com/ritvikgrandhi-hue/stardancechallengewebsite", "demo": "https://ritvikgrandhi-hue.github.io/stardancechallengewebsite/"}]...
|
[{"post_id": 80870, "ts": "202 [{"post_id": 80870, "ts": "2026-10-19T03:42:06Z", "hours": 2.2892, "text": "Working on the Backend: Literally no functionality has changed yet, this is just me trying to configure node.js to do everything 😭 . Anyway, sorry for not updating in a while, I promise I’ll get back to work on it soon!"}, {"post_id": 64478, "ts": "2026-09-08T22:06:46Z", "hours": 1.865, "text": "Devlog 5: 9/8/26 Nothing much, I managed to get the node.js server running and got the css and html to work, but its nowhere near done. Anyway, for now, I’m going to ship this project so that reviewers can actually see and try to use the add project and add devlog functions. Stay tuned!"}, {"post_id": 63315, "ts": "2026-09-07T02:07:35Z", "hours": 3.3178, "text": "Devlog: 9/6/2026 I made SO much progress!! Changes: Can now create devlogs within projects Can edit those devlogs Can add multiple images and videos within the devlogs When you click on the images, they open in a new window above the page New Navbar and logo design, courtesy of this video: https://www.youtube.com/watch?v=uTPO6fKtBvM Can delete devlogs Devlogs gain certain ids based on the date and time, so each devlog has a unique id to allow for edits and deletions For the JavaScript, the basic functionality was carried over from the notes app on my NINJAGO WEBOS, but I did need AI to educate me on how to implement new functions. Also, the CSS and HTML were written mostly by me with the help of tutorials."}, {"post_id": 60407, "ts": "2026-09-02T18:24:33Z", "hours": 2.5461, "text": "Woohoo, some functionality! Ok, so far I haven’t differentiated a backend and frontend for the projects tab, but for now you can add projects with an image, title, and summary, and they’ll appear as projects on the projects tab. Also, when you click on them, it brings you to a separate viewing tab to see all about the project, although I haven’t started working on the part where you can add devlogs. Also, adding projects isn’t permanent, as when I reload the tab, they all disappear (since I want it to save to the website for everyone to see, I have to implement a Node.js backend, which I haven’t learned about yet). I also slightly changed the theme into dark mode and made the buttons to enter the project look futuristic. They are NOT AI; I made them with the help of this video: ( https://www.youtube.com/watch?v=a1NVen8SaqE ), but it does look a bit different for reasons unknown. Anyway, stay tuned!"}, {"post_id": 59970, "ts": "2026-09-02T01:30:45Z", "hours": 1.4286, "text": "NEW DESIGN: For those that don’t want to read: I’m tearing down most of the site to make it a dedicated project site. After realizing that I already have most of my accomplishments and extracurriculars on a different project that I’m making in school, I understood that maintaining a second site would be kind of useless. So, in an attempt to salvage my efforts and make it something worth using, I’m going to take my Javascript knowledge from the NINJAGO OS project I’m also currently making to create a project and devlog site, similar to stardance, as I want to have a place to store all of my hobby projects. However, I don’t want anyone adding information to my site but me, so i’m biting the bullet and learning to differentiate a frontend and backend (with minor AI help), while salvaging the about page of the already existing porfolio. This way, when people online stumble upon it (as i’ll use the grant I got for purchasing a website domain), they’ll know about me first before moving on to my projects. That’s pretty much it! Looking forward to it!"}, {"post_id": 43725, "ts": "2026-08-09T04:13:32Z", "hours": 5.9075, "text": "This project isn’t just a portfolio, but an entrance into my world. Hey everyone, welcome to my portfolio website! After exams up until the beginning of August, I’ve finally found time to begin developing a website. First, this website only has one functioning page as of yet, which is the index page. I admit, at first I did try vibecoding(using AI), to see what it would do and if I could understand and learn from, but it turned out to be utterly useless in that regard, and so I’ve built it up again mostly from scratch to get to this point, although some traces of AI remain in the other pages, which I will delete remove. However, I am proud of how far it has gotten since I’ve imagined how it would be like. My plan for this website is to include everything I’ve accomplished or done here so people can learn who I am as a person. To do this, and to separate it from other portfolios, I believe I will eventually put in a blog of projects I’ve done to further my career path, as well as write and teach others on certain topics. However, this will take some time, so stay tuned! Up next is the Extracurriculars and Skills pages to fix."}]...
|
Title: Projects/Devlog Site by @ritvikgrandhi | St Title: Projects/Devlog Site by @ritvikgrandhi | Stardance
Devlogs:
This project isn’t just a portfolio, but an entrance into my world. Hey everyone, welcome to my portfolio website! After exams up until the beginning of August, I’ve finally found time to begin developing a website. First, this website only has one functioning page as of yet, which is the index page. I admit, at first I did try vibecoding(using AI), to see what it would do and if I could understand and learn from, but it turned out to be utterly useless in that regard, and so I’ve built it up again mostly from scratch to get to this point, although some traces of AI remain in the other pages, which I will delete remove. However, I am proud of how far it has gotten since I’ve imagined how it would be like. My plan for this website is to include everything I’ve accomplished or done here so people can learn who I am as a person. To do this, and to separate it from other portfolios, I believe I will eventually put in a blog of projects I’ve done to further my career path, as well as write and teach others on certain topics. However, this will take some time, so stay tuned! Up next is the Extracurriculars and Skills pages to fix.
NEW DESIGN: For those that don’t want to read: I’m tearing down most of the site to make it a dedicated project site. After realizing that I already have most of my accomplishments and extracurriculars on a different project that I’m making in school, I understood that maintaining a second site would be kind of useless. So, in an attempt to salvage my efforts and make it something worth using, I’m going to take my Javascript knowledge from the NINJAGO OS project I’m also currently making to create a project and devlog site, similar to stardance, as I want to have a place to store all of my hobby projects. However, I don’t want anyone adding information to my site but me, so i’m biting the bullet and learning to differentiate a frontend and backend (with minor AI help), while salvaging the about page of the already existing porfolio. This way, when people online stumble upon it (as i’ll use the grant I got for purchasing a website domain), they’ll know about me first before moving on to my projects. That’s pretty much it! Looking forward to it!
Woohoo, some functionality! Ok, so far I haven’t differentiated a backend and frontend for the projects tab, but for now you can add projects with an image, title, and summary, and they’ll appear as projects on the projects tab. Also, when you click on them, it brings you to a separate viewing tab to see all about the project, although I haven’t started working on the part where you can add devlogs. Also, adding projects isn’t permanent, as when I reload the tab, they all disappear (since I want it to save to the website for everyone to see, I have to implement a Node.js backend, which I haven’t learned about yet). I also slightly changed the theme into dark mode and made the buttons to enter the project look futuristic. They are NOT AI; I made them with the help of this video: ( https://www.youtube.com/watch?v=a1NVen8SaqE ), but it does look a bit different for reasons unknown. Anyway, stay tuned!
Devlog: 9/6/2026 I made SO much progress!! Changes: Can now create devlogs within projects Can edit those devlogs Can add multiple images and videos within the devlogs When you click on the images, they open in a new window above the page New Navbar and logo design, courtesy of this video: https://www.youtube.com/watch?v=uTPO6fKtBvM Can delete devlogs Devlogs gain certain ids based on the date and time, so each devlog has a unique id to allow for edits and deletions For the JavaScript, the basic functionality was carried over from the notes app on my NINJAGO WEBOS, but I did need AI to educate me on how to implement new functions. Also, the CSS and HTML were written mostly by me with the help of tutorials.
Devlog 5: 9/8/26 Nothing much, I managed to get the node.js server running and got the css and html to work, but its nowhere near done. Anyway, for now, I’m going to ship this project so that reviewers can actually see and try to use the add project and add devlog functions. Stay tuned!
Working on the Backend: Literally no functionality has changed yet, this is just me trying to configure node.js to do everything 😭 . Anyway, sorry for not updating in a while, I promise I’ll get back to work on it soon!
Ships:
Hello, here is my portfolio website, which will eventually contain information about me and my life. So far, I have done the minimum requirements for this beginner project, which is why I am shipping it. However, I am pretty excited and happy about how it currently looks. What I did find challenging is that I haven’t used html and css in a while, which meant I had to relearn almost everything while juggling extracurriculars and school events. This personal project will grow as I achieve more things, but for now, the index page is the only truly functional page, which has more than 3 sections. I hope everyone will be able to see my passion and encourage me to continue into the future!
##Ship 2! Hello, reviewers! This is an updated, more useful version of my portfolio website that can now log projects and devlogs, similar to Stardance! I made this after realizing that after Stardance is over, I’ll have nowhere to log my projects and the progress I make on them! To keep a good habit going and log my projects for everyone to see, I decided to edit this portfolio site into a dedicated server for all of my projects, after realizing that I already have a good portfolio that I constantly edit at school. This ship does not have full functionality: it can save any number of projects and devlogs, but once you reload, they are all gone. I can safely say that it was a pain to create a new project and devlog for testing, and now you get to do it too! As you might see in my last devlog, I’m currently shipping this so that everyone can see the project and devlog adding functionality now, because later I’ll add an admin login page so that I can only add my projects, while others who access the website can see them but not edit them. Anyway, that’s all, and have fun!...
|
1793137787.7139075
|
1793224187.7139075
|
|
59625
|
the lahcen website by @lahcen | Stardance
|
lahcen
|
1
|
1.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T20:53:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a bare bones site with everything that i know", "repo": "https://github.com/lahcenkhmaissi/site-ig", "demo": "https://lahcenkhmaissi.github.io/site-ig/"}]...
|
[{"post_id": 66959, "ts": "202 [{"post_id": 66959, "ts": "2026-09-12T23:00:03Z", "hours": 0.2972, "text": "i fixed the problemssssssssssss!!!!!!!!!!!!!!!!!!!!!!!!!!"}, {"post_id": 64450, "ts": "2026-09-08T20:51:58Z", "hours": 1.1208, "text": "i just finished my first ever website it’s not much but im happy with how it turned out :)"}]...
|
Title: the lahcen website by @lahcen | Stardance
Title: the lahcen website by @lahcen | Stardance
Devlogs:
i just finished my first ever website it’s not much but im happy with how it turned out :)
i fixed the problemssssssssssss!!!!!!!!!!!!!!!!!!!!!!!!!!
Ships:
i made a bare bones site with everything that i know...
|
1793141458.306048
|
1793227858.306048
|
|
59488
|
My first slack bot! by @Thenix | Stardance
|
Thenix
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T20:14:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Soo i made a slack bot. Pretty useless one, but it works and it is alive. Ive made it out of javascrypt which I dont find very useful nor something that I want to do again, but here we are.😂", "repo": "https://github.com/Thenix1/Slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 64421, "ts": "202 [{"post_id": 64421, "ts": "2026-09-08T19:49:53Z", "hours": 0.9933, "text": "Well the slack bot is done. I have used some commands from the guide and added like 3 new to it. Ive set up my nest ssh into it and now the slack bot is 24/7 running on Slack under the name Akzret"}]...
|
Title: My first slack bot! by @Thenix | Stardance
Title: My first slack bot! by @Thenix | Stardance
Devlogs:
Well the slack bot is done. I have used some commands from the guide and added like 3 new to it. Ive set up my nest ssh into it and now the slack bot is 24/7 running on Slack under the name Akzret
Ships:
Soo i made a slack bot. Pretty useless one, but it works and it is alive. Ive made it out of javascrypt which I dont find very useful nor something that I want to do again, but here we are.😂...
|
1793134248.7610943
|
1793220648.7610943
|
|
42886
|
Resumight by @ABN | Stardance
|
ABN
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T20:10:05Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Resumight: a resume-building tool specifically catered towards early job seekers and students. For anyone testing it out, make sure to be using a Chromium browser to use the voice feature, and be patient with the AI analysis of inputted PDF’s or resumes (it might take a bit). Now for features. There’s the resume maker, which easily formats your experience into appropriate categories, and can even use AI to smartly sort your spoken experience. Then there’s the tailor, which takes your resume and makes it perfect for any job description you paste in. Finally, the coach helps turn your resume into notes that can be used in an interview. The most challenging part of this was getting the AI integration to work; even with AI Studio being made by the same company as Gemini AI, there were a lot of problems with the way it analyzed and especially generated resume PDF’s. I am most proud of getting the voice integration to work so intelligently, since it can automatically sort things and even understand abbreviations.", "repo": "https://github.com/abn3000/Resumight", "demo": "https://resumight.ai.studio/"}]...
|
[{"post_id": 64425, "ts": "202 [{"post_id": 64425, "ts": "2026-09-08T19:54:23Z", "hours": 0.7389, "text": "#5: Final Tool A problem I think a lot of people face with job applications is actually putting their resume stuff into words in an interview. Even if you have all the qualifications, you can’t exactly list them bullet-point style when face-to-face with someone. The new Coach feature solves this issue with direct integration between Resumight and Tailor. Basically, it tells you how you can best present your unique skills to the hiring team. The End With that, I believe the crux of the project is complete. There’s obviously more stuff I could add, and I still haven’t figured out how to speed up the AI integration, but I’ve also noticed that I’m reaching the end of the line for what I actually know how to make, and have been relying on AI Studio suggestions a bit more."}, {"post_id": 59795, "ts": "2026-09-01T18:45:42Z", "hours": 0.5925, "text": "#4: Back Up It’s been a while since I’ve made changes to Resumight, so I want to take things slow for a bit to make sure nothing breaks. After all, I’m really proud of the tools it has so far! Running from my problems API keys don’t last forever, so my solution was to add a section for a backup API key that only gets used once the first one comes up empty. I couldn’t think of anything else. In case you’re wondering, since the app is hosted using Google AI Studio, I can integrate the keys without having them directly in code or anything. That way this can stay open source and have a GitHub. Adding on I realised that the most useful thing for me to do with Resumight would actually be to update my old resume. Adding the PDF upload feature to Resumaker was very easy, but this does require token usage again. I’m also a bit concerned about how long it took to parse my one page resume, but it does work for now. Next The website really feels like a one and done sort of thing right now. I want to have some sort of multi-resume management system: nothing fancy, but it would use cookies and help people stay organised. Also, voice recognition really does not like any browser other than Chrome."}, {"post_id": 40424, "ts": "2026-08-03T22:42:47Z", "hours": 1.5378, "text": "#3: It lives! I cleaned up the layout and created my Resumaker and Tailor sections. One makes your resume, and the other gears it up for any possible job listing. AI Integration (Misery) Resumight sort of needs AI to function. Without an AI parsing and sorting your speech, the Resumaker is a glorified document editor. Without an AI to tailor your resume to a job listing, the best I can do is match keywords Solution Google has an awesome free tool called AI Studio which lets you get an API key, which I was able to hook up directly to Resumight. Now, Google’s Gemini automatically sorts everything you say into where it needs to go! It’s pretty smart, too (see images). No master list necessary! The Tailor uses AI to specifically let you know what to update about your bullet points, and then makes a downloadable version for you. It’s not just buzzwords this time, since Gemini can actually explain what it wants to delete. Next Time API sustainability is at a critical point."}, {"post_id": 39686, "ts": "2026-08-02T20:28:21Z", "hours": 0.9136, "text": "#2: Spoken Language is Hard It’s kind of a hassle to have to input all your information into a website every time, right? I decided to start making a speech parsing thing that directly translates microphone input to words. I found an open-source base script online, which I was able to use to create my own speech-to-text which works with just code. Just to see how far it would go, I even tried seeing if I could get it to recognize shorthands and list them accordingly. I found a list of popular majors and schools, and just went from there. Categorization is still messy. Solution(?) Yeah, I’m probably going to have to use AI integration for this part, but we’ll cross the bridge of token limits once we get there."}, {"post_id": 39207, "ts": "2026-08-02T00:38:12Z", "hours": 0.7419, "text": "#1: Warm regards from BPT Figured out the color palette for my project; a crisp white and soft green are pretty nice to look at. This has been coded in HTML, CSS (so much CSS) and JS. An app might be more functional, but I like GitHub Pages too much for that. This image should give you a hint as to what we’ll be moving into. Let the suspense eat away at you. Main order of business : I’m working on getting that cool scrolling effect you see on Apple websites working now, just to make the website seem more legit."}]...
|
Title: Resumight by @ABN | Stardance
Devlogs:
#1: Title: Resumight by @ABN | Stardance
Devlogs:
#1: Warm regards from BPT Figured out the color palette for my project; a crisp white and soft green are pretty nice to look at. This has been coded in HTML, CSS (so much CSS) and JS. An app might be more functional, but I like GitHub Pages too much for that. This image should give you a hint as to what we’ll be moving into. Let the suspense eat away at you. Main order of business : I’m working on getting that cool scrolling effect you see on Apple websites working now, just to make the website seem more legit.
#2: Spoken Language is Hard It’s kind of a hassle to have to input all your information into a website every time, right? I decided to start making a speech parsing thing that directly translates microphone input to words. I found an open-source base script online, which I was able to use to create my own speech-to-text which works with just code. Just to see how far it would go, I even tried seeing if I could get it to recognize shorthands and list them accordingly. I found a list of popular majors and schools, and just went from there. Categorization is still messy. Solution(?) Yeah, I’m probably going to have to use AI integration for this part, but we’ll cross the bridge of token limits once we get there.
#3: It lives! I cleaned up the layout and created my Resumaker and Tailor sections. One makes your resume, and the other gears it up for any possible job listing. AI Integration (Misery) Resumight sort of needs AI to function. Without an AI parsing and sorting your speech, the Resumaker is a glorified document editor. Without an AI to tailor your resume to a job listing, the best I can do is match keywords Solution Google has an awesome free tool called AI Studio which lets you get an API key, which I was able to hook up directly to Resumight. Now, Google’s Gemini automatically sorts everything you say into where it needs to go! It’s pretty smart, too (see images). No master list necessary! The Tailor uses AI to specifically let you know what to update about your bullet points, and then makes a downloadable version for you. It’s not just buzzwords this time, since Gemini can actually explain what it wants to delete. Next Time API sustainability is at a critical point.
#4: Back Up It’s been a while since I’ve made changes to Resumight, so I want to take things slow for a bit to make sure nothing breaks. After all, I’m really proud of the tools it has so far! Running from my problems API keys don’t last forever, so my solution was to add a section for a backup API key that only gets used once the first one comes up empty. I couldn’t think of anything else. In case you’re wondering, since the app is hosted using Google AI Studio, I can integrate the keys without having them directly in code or anything. That way this can stay open source and have a GitHub. Adding on I realised that the most useful thing for me to do with Resumight would actually be to update my old resume. Adding the PDF upload feature to Resumaker was very easy, but this does require token usage again. I’m also a bit concerned about how long it took to parse my one page resume, but it does work for now. Next The website really feels like a one and done sort of thing right now. I want to have some sort of multi-resume management system: nothing fancy, but it would use cookies and help people stay organised. Also, voice recognition really does not like any browser other than Chrome.
#5: Final Tool A problem I think a lot of people face with job applications is actually putting their resume stuff into words in an interview. Even if you have all the qualifications, you can’t exactly list them bullet-point style when face-to-face with someone. The new Coach feature solves this issue with direct integration between Resumight and Tailor. Basically, it tells you how you can best present your unique skills to the hiring team. The End With that, I believe the crux of the project is complete. There’s obviously more stuff I could add, and I still haven’t figured out how to speed up the AI integration, but I’ve also noticed that I’m reaching the end of the line for what I actually know how to make, and have been relying on AI Studio suggestions a bit more.
Ships:
I made Resumight: a resume-building tool specifically catered towards early job seekers and students. For anyone testing it out, make sure to be using a Chromium browser to use the voice feature, and be patient with the AI analysis of inputted PDF’s or resumes (it might take a bit). Now for features. There’s the resume maker, which easily formats your experience into appropriate categories, and can even use AI to smartly sort your spoken experience. Then there’s the tailor, which takes your resume and makes it perfect for any job description you paste in. Finally, the coach helps turn your resume into notes that can be used in an interview. The most challenging part of this was getting the AI integration to work; even with AI Studio being made by the same company as Gemini AI, there were a lot of problems with the way it analyzed and especially generated resume PDF’s. I am most proud of getting the voice integration to work so intelligently, since it can automatically sort things and even understand abbreviations....
|
1793145326.4159079
|
1793231726.4159079
|
|
59506
|
All Finance by @nicklogan1412 | Stardance
|
nicklogan1412
|
1
|
5.0
|
47
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T19:45:59Z", "hours": 5.0, "multiplier": 8.83, "payout": 47, "blessing": "neutral", "text": "Before I ship, I want to say thank you to the Stardance Community and the Shipwrights. You guys are the nicest people ive ever made and this platform is amazing, thank you for making it what it is today. Love yall This project is a website that holds Finance information in one place, so you dont have to go to multiple websites. The project solves the following issues a laggy browser from many tabs opening many tabs Trusting data from unsafe websites and finally, saving you time from search up and down one the internet.", "repo": "https://github.com/Biscutbuilder/All-Finance", "demo": "https://biscutbuilder.github.io/All-Finance/"}]...
|
[{"post_id": 64411, "ts": "202 [{"post_id": 64411, "ts": "2026-09-08T19:32:10Z", "hours": 0.85, "text": "Devlog 4 here’s what I did Fully integrated the new Silver and Gold price charts Integrated a stock price tracker for the top 4 most traded stocks Cleaned up my CSS more Added footer that contains credits Added more scroll down buttons I had a really hard time putting the new graphs in because they were really buggy and incredibly hard to resize. The Stock thing was easier to put in due to the fact the code was way less complicated. For more information, check my github The charts are stocks are powered by Goldbroker and Elfsight. Big thanks to @aavarvd for encouraging me to make this"}, {"post_id": 64015, "ts": "2026-09-08T03:52:30Z", "hours": 0.6922, "text": "Devlog 3 what i worked on: Integrated a new silver and gold tracker, with jump to buttons. The old tracker has a cloud fare anti bot system that didnt allow the Iframe to work consistently. I aslo restructed alot of my code to make it easier to understand."}, {"post_id": 63988, "ts": "2026-09-08T02:42:07Z", "hours": 2.2022, "text": "Devlog 2 Today I did the following things :) Improved on my CSS and made the website look alot better Removed the graphs with silver and gold prices, as they stopped working. made images that will be inside of the website on a later date Made a intro area with directions and credits to people that have helped The project worked very well!!"}, {"post_id": 63911, "ts": "2026-09-07T22:59:44Z", "hours": 1.5908, "text": "Created the base of the website The website will be a finance site that shows the value of many items. Here is how I created my website 1. I created a HTML website 2. I researched different price trackers that I can input into my wonderful HTML website 3. I coded them into my website, big thank you to APMEX for allowing me to use their trackers. 4. Improved my CSS 5. Cleaned up alot of my code"}]...
|
Title: All Finance by @nicklogan1412 | Stardance
Title: All Finance by @nicklogan1412 | Stardance
Devlogs:
Created the base of the website The website will be a finance site that shows the value of many items. Here is how I created my website 1. I created a HTML website 2. I researched different price trackers that I can input into my wonderful HTML website 3. I coded them into my website, big thank you to APMEX for allowing me to use their trackers. 4. Improved my CSS 5. Cleaned up alot of my code
Devlog 2 Today I did the following things :) Improved on my CSS and made the website look alot better Removed the graphs with silver and gold prices, as they stopped working. made images that will be inside of the website on a later date Made a intro area with directions and credits to people that have helped The project worked very well!!
Devlog 3 what i worked on: Integrated a new silver and gold tracker, with jump to buttons. The old tracker has a cloud fare anti bot system that didnt allow the Iframe to work consistently. I aslo restructed alot of my code to make it easier to understand.
Devlog 4 here’s what I did Fully integrated the new Silver and Gold price charts Integrated a stock price tracker for the top 4 most traded stocks Cleaned up my CSS more Added footer that contains credits Added more scroll down buttons I had a really hard time putting the new graphs in because they were really buggy and incredibly hard to resize. The Stock thing was easier to put in due to the fact the code was way less complicated. For more information, check my github The charts are stocks are powered by Goldbroker and Elfsight. Big thanks to @aavarvd for encouraging me to make this
Ships:
Before I ship, I want to say thank you to the Stardance Community and the Shipwrights. You guys are the nicest people ive ever made and this platform is amazing, thank you for making it what it is today. Love yall This project is a website that holds Finance information in one place, so you dont have to go to multiple websites. The project solves the following issues a laggy browser from many tabs opening many tabs Trusting data from unsafe websites and finally, saving you time from search up and down one the internet....
|
1793137732.4848144
|
1793224132.4848144
|
|
59554
|
Slack-bot by @mons_reinus | Stardance
|
mons_reinus
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T19:39:48Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a bot named after myself. It responds to a few commands. If you ping them they get angry, they can tell jokes via an API, they have a reference to my favourite book Project Hail Mary and also a helpful help command if you happen to forget their commands", "repo": "https://github.com/eestigamer69/monsbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 64409, "ts": "202 [{"post_id": 64409, "ts": "2026-09-08T19:30:51Z", "hours": 0.4108, "text": "I started the project, V1.0 is now out! Use /monsbot-help for the commands.. it should work I think"}]...
|
Title: Slack-bot by @mons_reinus | Stardance
Devl Title: Slack-bot by @mons_reinus | Stardance
Devlogs:
I started the project, V1.0 is now out! Use /monsbot-help for the commands.. it should work I think
Ships:
I made a bot named after myself. It responds to a few commands. If you ping them they get angry, they can tell jokes via an API, they have a reference to my favourite book Project Hail Mary and also a helpful help command if you happen to forget their commands...
|
1793138122.7434182
|
1793224522.7434182
|
|
54752
|
WebOS 1 by @rayyans4890 | Stardance
|
rayyans4890
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T18:42:54Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a webos for a stardance project and i must say that i am pretty satisfied with this project for now i plan on updating this project and making this one piece themed by adding the wdigets based on one piece characters i am a very big fan of one piece so when i unlock webos 2 i will actually start putting more work in this such as adding more features and maybe base it around one piece more.", "repo": "https://github.com/rayyans4890-png/WebOS", "demo": "https://rayyans4890-png.github.io/WebOS/"}]...
|
[{"post_id": 64267, "ts": "202 [{"post_id": 64267, "ts": "2026-09-08T15:22:51Z", "hours": 1.1847, "text": "Completed all of the features and updated the javascrpit im gonna update the github and finally ship it now"}, {"post_id": 64222, "ts": "2026-09-08T14:04:01Z", "hours": 1.2889, "text": "Finally completed the CSS now gonna work alittle on the features in javascript and then im gonna ship"}, {"post_id": 62132, "ts": "2026-09-05T11:59:24Z", "hours": 1.5222, "text": "Started working on the project but for some reason the backgroup pic aint showing up i decided to round the corners for my widgets and plan on improving the project as a whole tmrw"}]...
|
Title: WebOS 1 by @rayyans4890 | Stardance
Devlog Title: WebOS 1 by @rayyans4890 | Stardance
Devlogs:
Started working on the project but for some reason the backgroup pic aint showing up i decided to round the corners for my widgets and plan on improving the project as a whole tmrw
Finally completed the CSS now gonna work alittle on the features in javascript and then im gonna ship
Completed all of the features and updated the javascrpit im gonna update the github and finally ship it now
Ships:
I made a webos for a stardance project and i must say that i am pretty satisfied with this project for now i plan on updating this project and making this one piece themed by adding the wdigets based on one piece characters i am a very big fan of one piece so when i unlock webos 2 i will actually start putting more work in this such as adding more features and maybe base it around one piece more....
|
1792878705.1501846
|
1793742705.1501846
|
|
57393
|
My own site! by @m-altahan | Stardance
|
m-altahan
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T18:35:29Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own personal website that shows my projects and the events that i attended and a little description for each project . The Css was a little bit of a hassle Because it kept breaking and me to fix the problem. Note: Used AI to decide the colors on the website . But all code was written by me with no Ai assistance .", "repo": "https://github.com/mahmoud-altahanxvii/My-Personal-Website", "demo": "https://mahmoud-altahanxvii.github.io/My-Personal-Website/"}]...
|
[{"post_id": 64380, "ts": "202 [{"post_id": 64380, "ts": "2026-09-08T18:21:07Z", "hours": 1.1261, "text": "Third Devlog : finished the following pages : Dumb google , Reverse Search . Also added links to the projects and hackathons i attended with most recent one Being Replay alexandria and the other ones . And with that iam going to ship my Personal-Website"}, {"post_id": 61845, "ts": "2026-09-04T23:32:30Z", "hours": 3.1508, "text": "Devlog 2 : revamped the CSS changing the color scheme , font and tiny stuff like font size . Also added a page for Shadow Swap Check it Out ,and a little bit of the reverse google page (WIP) and organized the files (if that’s your thing ) see You next Devlog (´▽`ʃ♡ƪ)"}, {"post_id": 60500, "ts": "2026-09-02T21:27:34Z", "hours": 1.3294, "text": "First log : My personal website ,is (as you guessed ) MY Personal website 😄 made the structure and chose the color palate (might change it later ) . Caution !: Links listed only lead to a blank page with only the title in tab😅"}]...
|
Title: My own site! by @m-altahan | Stardance
Dev Title: My own site! by @m-altahan | Stardance
Devlogs:
First log : My personal website ,is (as you guessed ) MY Personal website 😄 made the structure and chose the color palate (might change it later ) . Caution !: Links listed only lead to a blank page with only the title in tab😅
Devlog 2 : revamped the CSS changing the color scheme , font and tiny stuff like font size . Also added a page for Shadow Swap Check it Out ,and a little bit of the reverse google page (WIP) and organized the files (if that’s your thing ) see You next Devlog (´▽`ʃ♡ƪ)
Third Devlog : finished the following pages : Dumb google , Reverse Search . Also added links to the projects and hackathons i attended with most recent one Being Replay alexandria and the other ones . And with that iam going to ship my Personal-Website
Ships:
I made my own personal website that shows my projects and the events that i attended and a little description for each project . The Css was a little bit of a hassle Because it kept breaking and me to fix the problem. Note: Used AI to decide the colors on the website . But all code was written by me with no Ai assistance ....
|
1793105281.185898
|
1793191681.185898
|
|
54344
|
My duckysite by @mazobot | Stardance
|
mazobot
|
1
|
8.88
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T17:57:57Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I make my personal site in theme of duck after I asked ai for image of spider and I got duck.The most challenging thing was the frame and how I am going to stylize but it turned out okay.I used Ai for main frame and picture and for some java script.", "repo": "https://github.com/mazobot/Ducky-site-", "demo": "https://mazobot.github.io/Ducky-site-/"}]...
|
[{"post_id": 74137, "ts": "202 [{"post_id": 74137, "ts": "2026-09-26T19:00:55Z", "hours": 1.6022, "text": "I am tired boss"}, {"post_id": 68792, "ts": "2026-09-15T19:19:59Z", "hours": 0.2931, "text": "Is anyone actually going to check my project or should I give up?"}, {"post_id": 68750, "ts": "2026-09-15T17:47:46Z", "hours": 0.6517, "text": "I gave my site diffrent font to feel more alive and make few adjustments"}, {"post_id": 68258, "ts": "2026-09-14T19:50:40Z", "hours": 1.7319, "text": "I changed a lot in css because it was flagged as most ai and now looks kinda wors :("}, {"post_id": 67525, "ts": "2026-09-13T17:19:50Z", "hours": 1.6033, "text": "I added a light mode and removed frame"}, {"post_id": 64366, "ts": "2026-09-08T17:51:16Z", "hours": 1.2031, "text": "My last devlog, I think I spent a bit too much time on it but I hope It is good enough"}, {"post_id": 62426, "ts": "2026-09-05T19:29:12Z", "hours": 0.7569, "text": "How much could I add before it is to much ?"}, {"post_id": 61779, "ts": "2026-09-04T21:04:44Z", "hours": 0.9689, "text": "About me section"}, {"post_id": 61033, "ts": "2026-09-03T18:55:11Z", "hours": 0.4672, "text": "My very personal ducksite and it will be very ducky :3"}]...
|
Title: My duckysite by @mazobot | Stardance
Devlo Title: My duckysite by @mazobot | Stardance
Devlogs:
My very personal ducksite and it will be very ducky :3
About me section
How much could I add before it is to much ?
My last devlog, I think I spent a bit too much time on it but I hope It is good enough
I added a light mode and removed frame
I changed a lot in css because it was flagged as most ai and now looks kinda wors :(
I gave my site diffrent font to feel more alive and make few adjustments
Is anyone actually going to check my project or should I give up?
I am tired boss
Ships:
I make my personal site in theme of duck after I asked ai for image of spider and I got duck.The most challenging thing was the frame and how I am going to stylize but it turned out okay.I used Ai for main frame and picture and for some java script....
|
1793119753.1210127
|
1793206153.1210127
|
|
50456
|
NovaBot by @Akkorpy | Stardance
|
Akkorpy
|
3
|
4.0
|
6
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T17:51:05Z", "hours": 2.0, "multiplier": 1.19, "payout": 3, "blessing": "neutral", "text": "Final Update! I finally finished working on this project by adding 4 new useful features. The main challenge was to fix API bugs and coming up with new features. I’m proud of myself for finishing this simple project that was build from scratch. To test the project, go read the README - I fully explained everything there. See you all in my next project!", "repo": "https://github.com/Akkorpy/NovaBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BRLJ4FYQ0"}, {"ship_num": 2, "ts": "2026-09-06T15:46:44Z", "hours": 1.0, "multiplier": 2.9, "payout": 3, "blessing": "neutral", "text": "I updated my Slack bot and added one new feature that delivers a random quote with its author to inspire you. There was almost no challenge because code for quote and joke command were absolutely identical. Also, I restored /novabot-help so you can see all the available commands.", "repo": "https://github.com/Akkorpy/NovaBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BRLJ4FYQ0"}, {"ship_num": 3, "ts": "2026-08-17T20:25:51Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built NovaBot, a NestJS/TypeScript Slack bot usin Socket Mode and Axios for external API data. The main challenge was configuring Slack API authentification and setting up environmental variables cleaanly. I’m most proud of structuring a complete application from scratch with 4 working commands and a clear README. To test it, clone repo, run npm install, add your SLACK_BOT_TOKEN and SLACK_APP_TOKEN to a .env file, and start it with node index.js.", "repo": "https://github.com/Akkorpy/NovaBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BRLJ4FYQ0"}]...
|
[{"post_id": 64354, "ts": "202 [{"post_id": 64354, "ts": "2026-09-08T17:33:32Z", "hours": 1.7131, "text": "Today I added 4 new useful commands. After reading a commnet on my Ship #2 mentioning that this bot mainly has entertainment commands, I added USEFUL features you can use on a daily basis. I think this is my final update and after Ship #3 I’m going to focus on another project"}, {"post_id": 63700, "ts": "2026-09-07T17:07:01Z", "hours": 0.5214, "text": "As I promised added Pomodoro timer and weather check. I think wttr.in is simple and not always correct but it’s better than nothing. All the commands work correctly and I am proud of it"}, {"post_id": 62988, "ts": "2026-09-06T15:40:36Z", "hours": 0.4442, "text": "Added one new feature and restored the /novabot-help command. I will probably add Pomodoro timer and weather check function later"}, {"post_id": 50118, "ts": "2026-08-19T05:56:28Z", "hours": 0.4906, "text": "I was trying to fix /novabot-help command, which worked yesterday. I’ve tried to regenerate App token, rewrite the code, but it didn’t work. Consequently, I deleted this command and shipped only the working ones"}, {"post_id": 49157, "ts": "2026-08-17T19:47:11Z", "hours": 0.5983, "text": "Built the /novabot-joke and /novabot-catfact commands using Axios for API requests. The trickiest part was configuring Slack’s Socket Mode in NestJS so the bot could receive payload events instantly without setup of a public webhook endpoint. After a few structural adjustments with the @slack /bolt lifecycle, all four slash commands are responding with 0-1ms delay"}]...
|
Title: NovaBot by @Akkorpy | Stardance
Devlogs:
B Title: NovaBot by @Akkorpy | Stardance
Devlogs:
Built the /novabot-joke and /novabot-catfact commands using Axios for API requests. The trickiest part was configuring Slack’s Socket Mode in NestJS so the bot could receive payload events instantly without setup of a public webhook endpoint. After a few structural adjustments with the @slack /bolt lifecycle, all four slash commands are responding with 0-1ms delay
I was trying to fix /novabot-help command, which worked yesterday. I’ve tried to regenerate App token, rewrite the code, but it didn’t work. Consequently, I deleted this command and shipped only the working ones
Added one new feature and restored the /novabot-help command. I will probably add Pomodoro timer and weather check function later
As I promised added Pomodoro timer and weather check. I think wttr.in is simple and not always correct but it’s better than nothing. All the commands work correctly and I am proud of it
Today I added 4 new useful commands. After reading a commnet on my Ship #2 mentioning that this bot mainly has entertainment commands, I added USEFUL features you can use on a daily basis. I think this is my final update and after Ship #3 I’m going to focus on another project
Ships:
I built NovaBot, a NestJS/TypeScript Slack bot usin Socket Mode and Axios for external API data. The main challenge was configuring Slack API authentification and setting up environmental variables cleaanly. I’m most proud of structuring a complete application from scratch with 4 working commands and a clear README. To test it, clone repo, run npm install, add your SLACK_BOT_TOKEN and SLACK_APP_TOKEN to a .env file, and start it with node index.js.
I updated my Slack bot and added one new feature that delivers a random quote with its author to inspire you. There was almost no challenge because code for quote and joke command were absolutely identical. Also, I restored /novabot-help so you can see all the available commands.
Final Update! I finally finished working on this project by adding 4 new useful features. The main challenge was to fix API bugs and coming up with new features. I’m proud of myself for finishing this simple project that was build from scratch. To test the project, go read the README - I fully explained everything there. See you all in my next project!...
|
1793120043.1243992
|
1793206443.1243992
|
|
59882
|
tabbed by @xvcf | Stardance
|
xvcf
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T17:45:59Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a new tab site with a search bar! You can search things there on DuckDuckGo or search on YouTube by starting your search with “@yt “!", "repo": "https://github.com/RafaeloxMC/tabbed", "demo": "https://tabbed.xvcf.dev"}]...
|
[{"post_id": 64357, "ts": "202 [{"post_id": 64357, "ts": "2026-09-08T17:42:45Z", "hours": 0.38, "text": "Made the site! I tried to speedrun this mission and my timer is still counting as of writing this! I made the whole site and deployed it! It has a search bar, where you can search on DuckDuckGo or YouTube (if you start your search with “@yt “)!"}]...
|
Title: tabbed by @xvcf | Stardance
Devlogs:
Made Title: tabbed by @xvcf | Stardance
Devlogs:
Made the site! I tried to speedrun this mission and my timer is still counting as of writing this! I made the whole site and deployed it! It has a search bar, where you can search on DuckDuckGo or YouTube (if you start your search with “@yt “)!
Ships:
I made a new tab site with a search bar! You can search things there on DuckDuckGo or search on YouTube by starting your search with “@yt “!...
|
1793055100.6729674
|
1793141500.6729674
|
|
58241
|
My first slack bot! by @Geki | Stardance
|
Geki
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:55:22Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello, I made OrionHL-bot. Its a 24/7 Slack bot with 3 commands such as: /orionhl-ping , /orionhl-help , /orionhl-catfact. It runs continuously on a Nest server and responds directly in Slack chats I will add more in the future. I ran into issues with the app response time but I fixed it with the help of ChatGPT. Could of been made way faster but I am very new. Was very frustrating at times but the feeling of it working was amazing. If anyone tests it could you please contact me if the response time is very slow or if it says app did not respond. The photo bellow showcases the commands:", "repo": "https://github.com/GesPm/OrionHL-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354?_gl=1*1hmx4zg*_gcl_au*MTM2NTIwMzY0NS4xNzg4NzkxMTkxLi0uLS4xNzg4NzkxMzM0LjUyNTAyMDA1OC4xNzg4NzkxMzM1LjE3ODg3OTEzMzQ"}]...
|
[{"post_id": 64326, "ts": "202 [{"post_id": 64326, "ts": "2026-09-08T16:47:04Z", "hours": 0.6119, "text": "Bugs fixed. Issue with app responding. Now everything should run smoothly :). Response time went from 14 seconds down to 0.3 with the catfact and help command!! Anybody got any requests or ideas for more commands I could add?"}, {"post_id": 64217, "ts": "2026-09-08T13:38:09Z", "hours": 1.5261, "text": "OrionHL-bot is now running! Repo name: OrionHL-bot. Go give it a visit :)"}]...
|
Title: My first slack bot! by @Geki | Stardance
D Title: My first slack bot! by @Geki | Stardance
Devlogs:
OrionHL-bot is now running! Repo name: OrionHL-bot. Go give it a visit :)
Bugs fixed. Issue with app responding. Now everything should run smoothly :). Response time went from 14 seconds down to 0.3 with the catfact and help command!! Anybody got any requests or ideas for more commands I could add?
Ships:
Hello, I made OrionHL-bot. Its a 24/7 Slack bot with 3 commands such as: /orionhl-ping , /orionhl-help , /orionhl-catfact. It runs continuously on a Nest server and responds directly in Slack chats I will add more in the future. I ran into issues with the app response time but I fixed it with the help of ChatGPT. Could of been made way faster but I am very new. Was very frustrating at times but the feeling of it working was amazing. If anyone tests it could you please contact me if the response time is very slow or if it says app did not respond. The photo bellow showcases the commands:...
|
1793051580.9089863
|
1793137980.9089863
|
|
30259
|
sqush by @Dackel | Stardance
|
Dackel
|
1
|
441.32
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:54:50Z", "hours": 428.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git.", "repo": "https://github.com/DerRealeHier/sqush", "demo": "https://sqush.dev/"}]...
|
[{"post_id": 66216, "ts": "202 [{"post_id": 66216, "ts": "2026-09-11T21:59:59Z", "hours": 6.0431, "text": "added moderation Now I have an AI model that constantly scans new messages and searches for inappropriate content. If the AI finds such content the person that wrote it will be banned and every single message the user wrote will be checked for issues. Oh I forgot to mention that Copilot fixed some critical secruity vulnerabilitys for me. The user that got banned will also be put on the Wall of Shame where there is a record of every single banned Account ever on the Platform. Developers of games can also always search for not so cool content. And of course Admins can manually ban accounts. (Yeah your private messages are also getting scanned)"}, {"post_id": 66009, "ts": "2026-09-11T15:02:37Z", "hours": 6.5411, "text": "added Inventory, Card drops You can now get cards dropped by buying or reviewing games. There are 4 rarities you can get and you can also just test pull these (so you can try it out yourself). Also because of this new feature I found a Issue with the notification system I am gonna fix. You can also trade these card with others through the chat or the trade tab. And you can also forge cards together if you have to many duplicates. Because of this new feature I also found a issue with the notification system, Hopefully have it fixed tommorow."}, {"post_id": 64370, "ts": "2026-09-08T17:55:35Z", "hours": 0.7389, "text": "Didn’t know that I could format it at the shipment so there is the text again formatted. Also I fixed a little download error ( The Site didn’t have the test files in the folder) Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. Issues: The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. The good side: On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). What I didn’t do: My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git."}, {"post_id": 64237, "ts": "2026-09-08T14:23:48Z", "hours": 5.1408, "text": "looked for errors and started website Today I overlooked the site one last time and fixed secruity issues and others. I fixed Email service added an option to change the background Image of the score and made my testdata a bit more secure (had my real emails in there before). I used AI for much of the progress cause it was my first time starting a server (see commits). I ran into many issues while setting everything up."}, {"post_id": 63722, "ts": "2026-09-07T17:34:18Z", "hours": 7.1667, "text": "added dev cut and reworked Background Image I also added test Data. Thats entirely made by AI except some covers that were made by me. Cause I ain’t interactng thousands of times with my own platform. Also which background banner would you like more?"}, {"post_id": 63175, "ts": "2026-09-06T20:44:54Z", "hours": 7.1403, "text": "added roadmap So there is the list of what I have done: Public Roadmaps and Feature Voting the roadmaap can have the status (Planned/In Progress/Done) and the Types (Feature/Bug/Improvment) the dev can Drag and Drop the items into the status it is in and also mdelete it. Users can comment and upvote those Items Redesign of Game Detail site Its not 9 Buttons in one row anymore It’s seperatd into two sections. updated the sale section And I also added Unit Tests."}, {"post_id": 62518, "ts": "2026-09-05T22:36:59Z", "hours": 6.4219, "text": "fixed optimization and UI errors (and not ill anymore) So i fixed many Issues regarding the performance of the website Performance (Optimization) videos don’t get loaded instantly anymore (180ms cooldown) Search is done in memmory atribut caches and requestAnimationFrame. all countdown intervalls have been put into one. background image is done locally instead of GitHub Offscreen Cards now use content-visibility:auto. Database and Queries: SQLite changed to 64MB Cahe. made 10 indizes for Foreign Keys/Filter. Even the translator doesn’t wanna tell me what this means in English. You have to find out yourself. UI and Interaction errors js doesnt crash when pressing a button without being logged in (don’t ask how that happend) guest cart can now delete a game from their carts. when checking out and not being logged in you get forwarded to login. Didn’t actually happen before. Wishlist and card buttons now syncronize when a game is there two times or even more on the front page. It pissed me off before. collection badge gets added after animation. Thats all I wanna write for today"}, {"post_id": 61045, "ts": "2026-09-03T19:12:23Z", "hours": 10.5322, "text": "added tip jar, fixed some UI bugs So now you can tip the game devs and they can see it on their dashboard and on the game detail page. You can also add a message to your donation. And I fixed the message button that hid under the profiles in the community tab."}, {"post_id": 60467, "ts": "2026-09-02T20:05:43Z", "hours": 12.0164, "text": "added messaging , updated UI Now users can message devlopers and other ussers. They can also include game Links and Update Links so you can discuss games."}, {"post_id": 59753, "ts": "2026-09-01T18:00:53Z", "hours": 9.7142, "text": "added Readme and fixed some visual bugs Yesterday the UI looked a bit off. Especially at the unlocking of the badges. It’s now looking good."}, {"post_id": 59207, "ts": "2026-08-31T21:27:06Z", "hours": 11.2833, "text": "added profile badges It’s hard getting the badges right. Cause currently I’m only using Plain HTML and CSS for these badges. And I added the js to the HTML files. Thats much cleaner then in a seperate js file."}, {"post_id": 58172, "ts": "2026-08-30T15:09:34Z", "hours": 9.8781, "text": "cleaned up all of the backend code So yeah I’ve done it! I cleaned up all of the code and now its much easier to get through all. It’s so much better now."}, {"post_id": 57497, "ts": "2026-08-29T17:39:29Z", "hours": 5.1814, "text": "fixed the gifting system (and beginning to clean up that code) So i fixed the gifting system and I also began my work on cleaning up all of this. And as you see it doesnt look beautyfull right now if someone gifts you something but I’ll make it better."}, {"post_id": 56823, "ts": "2026-08-28T19:12:19Z", "hours": 10.8536, "text": "added gifting system and failed miserably (again) Yea I promised to make the code cleaner today. But I found out that doing that is boring. Thats why I added more features. Now I’m paying for it by having new errors pop up every few minutes. If I’d like to just feel some progress at cleaning this mess up I had to do it in small steps. (cause I ain’t fixing 3000 lines in one day) So tommorow I’ll at least try getting the first 1000 lines cleaned up again"}, {"post_id": 56200, "ts": "2026-08-27T21:06:27Z", "hours": 9.985, "text": "Fixed it ☺️ So now it’s totally possible to make new collections. No errors anymore. Also I fixed some more bugs. And tommorow I will begin cleaning up some of the code."}, {"post_id": 55149, "ts": "2026-08-26T16:57:07Z", "hours": 11.1111, "text": "added library collections (tried) Yeah so I did get to add a good UI but currently it does not work to add a collection. I will have it fixed tommorow. Most likely a minor mistae breaking everything."}, {"post_id": 54559, "ts": "2026-08-25T16:06:35Z", "hours": 10.0472, "text": "added honeypot and fixed this horrendeus cart UI So yeah I fixed the UI I had yesterday to make it look more like everything else on the store."}, {"post_id": 53985, "ts": "2026-08-24T18:17:31Z", "hours": 11.4483, "text": "added cart system So for today I added a new cart system. I know I’ve done more than epic. You can now get games into your cart and buy them later. You will also get a warning if a game is cheaper in a bundle.HTML will be fixed tommorow"}, {"post_id": 53215, "ts": "2026-08-23T17:35:14Z", "hours": 9.9589, "text": "fixed that fricking page(couldn’t buy something before) Yeah I just made a completly new route for buying bundles and also a completly new HTML page. For some reason I always find a way to make something extremly complicated"}, {"post_id": 52631, "ts": "2026-08-22T21:06:14Z", "hours": 10.3861, "text": "updated my super dubba design So yeah it should look good now. see for yourself"}, {"post_id": 51791, "ts": "2026-08-21T17:07:05Z", "hours": 11.7708, "text": "fixed backend added first HTML Page with bundles It willl look better tommorow (I PROMISE) But for now it looks like that. I also fixed the backend code so now you should actually be able to buy bundles. It will look more like the dev dashboard tommorow I just used the store.html as template."}, {"post_id": 51181, "ts": "2026-08-20T18:00:39Z", "hours": 10.2681, "text": "added backend for bundles Here a little code snippet. HTML will be finished tommorow. I hope"}, {"post_id": 50504, "ts": "2026-08-19T17:49:13Z", "hours": 10.3353, "text": "fixed the backend So you can now buy games and should get the monopoly money back when refunding it. But if I wanted to make it for a real system I would have to save the payment_tenent_id which I cxurrently don’t. But that should be a easy fix.So it should work like in that cool drawing I made."}, {"post_id": 49756, "ts": "2026-08-18T17:55:42Z", "hours": 10.4592, "text": "added Refund Handling (firs code) So I added Refund Handling for my Store. Unfourtanely I could’t finish it but I did get to finish the frontend. So what did I do. I updated the library page so its now easier to see that you can actually refund the game and how long you have until its not possible anymore. For the backend I currently have some problems with the real refund. You cant really get the money back because of how the buying of a game currently works. Especially automated refunding would be extremly hard in the current system."}, {"post_id": 49062, "ts": "2026-08-17T17:33:22Z", "hours": 12.0856, "text": "added Rate Limits Unfourtanetly I can’t push the code right now cause of github having problems with their API. So but it did take very long cause im Albert himself. So first I tried hardcoding Rate Limits with timers and stuff like that and I very much had very dumb ways to deal with it. Then I found out that Flask actually has a own Libary just for Limits. So after failing doing it my own way I just sticked with that."}, {"post_id": 48247, "ts": "2026-08-16T15:29:51Z", "hours": 12.3036, "text": "added Account Linking/fixed Hackclub auth (again) So now its getting rememberd if you also have a password and not only auth with google or hackclub. Also in the database there is a completly new columm for the hackclub ID. Backend:hackclub_callback() now also checks for Login/register or Link Modus. google_login() now accepts link mode.There are two new routes for unlinking google and hackclub. And last but not least. There is also a secruity check. The last used login methoid cant be deleted."}, {"post_id": 47643, "ts": "2026-08-15T17:49:50Z", "hours": 10.6342, "text": "fixed the hackclub auth So I finally fixed the authentication. So here is a list of all of my mistakes: Used the wrong email field; use identity.primary_emailRequested (I did not need this) use openid emailValidated state even though the callback only returned code (how do I even get to sucessfully code anything) Added duplicate OAuth routes/functions (the dumbest mistake of mine) Left the callback incomplete: no user creation, login, or redirectLogged sensitive access and refresh tokens (name me albstein) Kept Flask debug mode enabled outside local development (hopefully no one saw that) Tommorow I’ll do something. Maybe I’ll even be finished. Cause I dont know what to add anymore. If you have some recommendations just drop them off. thats the list of all current features: User registrationUsername and password login Email verification Resend email verification Email based 2FA 2FA code resend Enable or disable 2FA Change username Change email address Change password Logout Google login Hack Club login First login username setup User profiles Profile pictures Profile comments Delete profile comments Enable or disable profile comments Community page User search Follow users Unfollow users Friend requests Accept friend requests Notifications Unread notification counter Mark notifications as read User roles Developer roles Developer dashboard Create games Edit games Upload game files Upload demo files Upload screenshots Upload images Upload videos Add YouTube videos ZIP game uploads EXE game uploads Optional ClamAV malware scanning Game updates Version labels Patch notes Update history Update comments Update upvotes Update downvotes Update view counts Follow games Game update notifications Store page Genre grouping Game tags Tag filter data Game details Game descriptions Game screenshots Game videos Game view counter Positive/negative ratings Written reviews Edit reviews Helpful review votes Funny review votes Review scoring Wishlist Add to wishlist Remove from wishlist Personal game library Purchases Duplicate purchase prevention Buy page Stripe Checkout Payment success page Sales Discounts Sale end dates Automatic sale expiration Price calculation Developer revenue page Revenue per game Sales count per game Game analytics Daily view statistics Daily wishlist statistics Daily purchase statistics Daily revenue statistics Personalized game recommendations(Yeah thats real) Popular game recommendations SQLite database SQLAlchemy ORMDatabase migrations SMTP email support Firebase configuration Stripe configuration Hack Club OAuth configuration Environment variable secret configuration Please drop some recommendatins🥲"}, {"post_id": 47073, "ts": "2026-08-14T18:18:25Z", "hours": 10.4444, "text": "added hackclub auth (or atleast tried) Thats just because of me being a dum dum. You may see whats the mistake. Will have it fixed tommorow."}, {"post_id": 46511, "ts": "2026-08-13T19:48:06Z", "hours": 10.3497, "text": "Fixed the code (again) So like I said yesterday I rewrote the js. So what was the problem? Well yesterday while testing out the Site I found out that the buy button didn’t send a GET request to the backend. So when I looked at the js I first looked confused cause everything seemed to be fine. After some debugging I found out that my new feature somehow collided with the buy button (Don’t ask how) So I fixed it. Here is my totally real payment information, Everything works fine now:"}, {"post_id": 45999, "ts": "2026-08-12T20:57:45Z", "hours": 7.4628, "text": "fixed all the issues of yesterday made new ones(kinda) So I fixed the old issues you can now see the updates page and actual updates. But I began cleaning up some of the js code and I’m still not finished. So now I need to get over 100 more lines of js. Also I need to look over my python code cause well. 1800 lines of code in one file is horrendeus(At least for me) So wish me luck for tommorow!"}, {"post_id": 45326, "ts": "2026-08-11T18:24:42Z", "hours": 10.7886, "text": "Added update feed SO today I did end up making an update feed but I still have to fix some frustrating errors. You can view your own games updates these of your friends or the updates of the hole platform. You should also be able to upvote these but I currently have some errors with that."}, {"post_id": 44766, "ts": "2026-08-10T19:21:12Z", "hours": 10.5611, "text": "I’m back So I’m back from my holidays and my stress with Oracle. So I added a new simple feature and also updated some of my secruity checks. So I did test the file scanner on my PC and it turns out to be good enough. It can find malicious files and get them out before even anyone sees them. Also you can now update your game. Currently you can write what you changed but there is no way of seeing what you wrote for now. I will add that tommorow. It will just be a thread of all updates and the newest come out on top."}, {"post_id": 30891, "ts": "2026-07-18T21:16:48Z", "hours": 10.9772, "text": "Can’t show real progress because of Oracle. So I have fnished the backend and already had a plan, but Oracle had to ruin the fun. I wanted to host a VirtualMachine on Oracle Servers because I already have experience with them. But after wanting to sign up I was straight up rejected from getting the Server I paid for . They also debited my money twice (Not cool) . So now I have to wait for the support to answer me and give me some of my money back. There is a small snippet of the code:"}, {"post_id": 30418, "ts": "2026-07-17T22:52:15Z", "hours": 10.2122, "text": "It’s getting somewhere That was a lot less work than in the last days. So what have I added today? overworked Dropdown Menu Beforehands the Dropdown Menu always was a bit behind the page. Now I have fixed it and also it has become much more interactive. overworked Store Search Now the Store search has more options to search for a game. made Settings Page You can now change Important settings on the help tab. For example your Email Adress, your username, or your password. made Page to choose username when logging in with Google You can now choose a username when logging in with google. You couldn’t do that yesterday!"}, {"post_id": 29842, "ts": "2026-07-17T00:01:04Z", "hours": 11.6853, "text": "Google is not that cool 🤬 So guys like I said I finished it today so thats what I added: Basic Recommendation System So there are the three factors for the Recommendations: Tag taste: users who own a game sharing tags with your library also own the canditate Popularity: how many people in total own the candidate (Thats the least important) Similar library wishlists: users who share games with your library wishlisted the candidate All of that is done in phython, which is very dumb to do if you wanna have thousands of games. (But for that small store its enough) 2fa authentification So for that I have used firebase. For me it was extremly hard configuring this.But I made it. Also I have used a gmail address to send a potential user the verification and email confirmation. And if you dont wanna verify anything you can deactivate it with the checkmark( But please if the demo is online do it(Note: Analytics are activated on firebase )) added google login You can also login in with google. For that I had to use the most irrating API Keys. Really why is Google making it so hard? IMPORTANT: For now your Username will automatically be the name you have on you Google account."}, {"post_id": 29221, "ts": "2026-07-16T00:04:58Z", "hours": 10.5619, "text": "havent finished anything today So today I began working on something big. But I havent really made any real progress in that. I had to work around so many logic problems. Also over the course of working on this I found out that my code isn’t really optimised for much data. If this code would ever be used with 10.000 games or even more it would most likely crash. But still I will finish the feature tommorow. And also I will start a Demo site in the next days. It would be great if anyone just tested it out. Here a code snippet"}, {"post_id": 28557, "ts": "2026-07-14T21:38:29Z", "hours": 10.1431, "text": "added revenue tab and new background image So today I added a new metric to the stats page. It was really hard getting it right. Especially in the graph because I didnt wanna use the same axis for the revenue again. I also made the backround image more pixelated so it gets more of a retro look. Tomorrow I’ll begin making something big(I already did some of the work today but yeah)"}, {"post_id": 27955, "ts": "2026-07-13T21:55:59Z", "hours": 10.12, "text": "added stats page I added a stats page for every game a developer has published. You can see the history of how your game has developed. Thats why I’ve worked on the wishlist ,views and purchase features, so I can actually put them on a stats page. Adding the graph was especially hard and also saving the old datapoints was difficult. For example I had used simple Optimization like if its the same data as yesterday there will just be no new datapoint added. So there is a look at the new page::"}, {"post_id": 27383, "ts": "2026-07-12T22:09:28Z", "hours": 10.1817, "text": "added comments to user profiles I added comments to user profiles. The great thing is you can deactivate the comment tab and delete comments you dont like. It really took super long making this feature. Especially handling the errors. In the end I did make it but I still have to fix some errors tomoorow. Now I’ll go to sleep (:"}, {"post_id": 26883, "ts": "2026-07-11T22:34:49Z", "hours": 10.6103, "text": "added demos, user badge, blurred email and default picture(penguins of madagascar) overworked login, register, profile, community , game_detail , dashboard and edit game So today I added Demos you can install. I just copied the code of the game upload. I also added a user badge so you can see who is a dev and who is a user. Now youn will also not see your whole email but reade just the first three letters. (That took way too long to do) And I also overworked all of these pages so they have a look that better fits the entire store."}, {"post_id": 26225, "ts": "2026-07-10T21:46:58Z", "hours": 10.6775, "text": "added reactions to reviews and wishlist so today I already began working on bigger features. It was a bit hard to do all off this but I made it. I just found out today that you can actually migrate databases wth Flask. I always thought I had to delete the hole database and set it up again to make everything work. Also I spent around 4 hours searching for a mistake just to find out that I linked the wrong javascript file. My backend code gets worse every day. I must find a solution for that. Here my new wishlist page and the reactions:"}, {"post_id": 25527, "ts": "2026-07-09T20:53:38Z", "hours": 10.2692, "text": "fixed several bugs and commented,optimized the code So today I decided to look through all of my code and look for ways to improve. In the end I made several fixes and I’am satisfied with how it ended up. The reason I did this is because I wanna add many more features tommorow. But yesterday I already noticed that its hard to look through the code and that there were so many issues. Also some on the performance side. I believe that all errors are fixed for now. Here a code snipet:"}, {"post_id": 25006, "ts": "2026-07-08T22:20:11Z", "hours": 10.1572, "text": "added notifications, countdown for sales, friend request (not just following like yesterday) ,overworked UI aspects and reviews For the notifications I mjust had to add a new route and add it to the front end. The countdown was really hard to figure out for my but it worked out with unix time I searched for an error the entire time just to find out that my countdown was written in white on a white background. The friend request are why I added notifications. Because I wanted to let the user see who sent a request and respond to that. For the new system I had to delete the entire database to make it work. After that I added reviews. You can now give a game a thumbs up or down. The average score will be shown and your text (the review). When finishing that I overworked some of the most Important UI’s and made it much better to look at. Like you see here:"}, {"post_id": 24404, "ts": "2026-07-07T22:50:08Z", "hours": 10.1739, "text": "added views, befriending, community, paying, user profiles and searching for users So first the biggest: I added paying with Stripe . I only used the sandbox but you could basicially just add your own API Keys in an .env file and youd be able to start. The documentation was really tuff to read through but I made it with the help of a tutorial. After that I added user profiles. I just reused my game backend with the screenshots and so for the avatar. When I was finished with the unique users I started with the view system. For now it’s pretty basic and you just have to view a site for 5 seconds to count as a view. After that I added the community tab where you can search users and befriend them. Some of my error highlights: “stripe is not defined”; I forgot to add the API key. Not an error but. I hardcoded the API Keys. Already fixed but still. “Template…… unexpected” I had to delete the database because I added a new velue for it."}, {"post_id": 23753, "ts": "2026-07-06T21:37:45Z", "hours": 1.93, "text": "Libary and buying today I just added a basic libary where you can view the games added to your account and even download them and I overworked the login and register page. Tommorow I’ll begin the payment process when buying a game. For that I will use the sandbox tools of Stripe."}, {"post_id": 23122, "ts": "2026-07-05T21:45:27Z", "hours": 10.1194, "text": "Most Productive day Today was really crazy. I worked for the hole day and made some big progress. Dashboard I first added a dashboard for developers. So you can finally add a game. I used flask (python) for the backend. You can also add screenshots and youtube links or mp.4. On the homepage you can preview the games trailer by hovering over it. Secruity Also editing of the game is only possible if you are the owner of the game. So I had to add a System for User Authorization and hashing for the passwords of course. Luckily Flask did most of it.So its getting checked if you are even a developer. When you are not you dont even get the options shown to publish a game or edit one. Media I also expanded on the media upload . You can now add as many screenshots or videos as you want (Little side note: don’t keep the video upload blank). And the biggest part you can add games now. UI Changes The UI also got a big Overhaul. I have decided to use a comic style for the site. Please Note that the background image at the nav is still AI generated(Even tho I did edit it a bit too get more of a retro style) Also I fixed several error. Mostly just typos that ended up getting the hole site down. Features: I also added new features such as tags, genres, game pages, the developer dashboard, search and an edit page for the games you made."}, {"post_id": 22423, "ts": "2026-07-04T21:40:26Z", "hours": 2.1081, "text": "Interactive Home Screen with Banner Today I began overworking my initial concept from yesterday and I made some progress. The home site now has a background banner with the most important things in the nav. The background Image currently is AI generated but I will make my own in the next few days. I also made the site much more interactive. Everything you see here has an effect when hovering it. But don’t worry I didn’t exaggerate with the effects. For the pulsing Image I used the inbuild keyframes CSS has. I also blurred the text when hovering the image but that may has to be reverted tommorow. I also don’t think that I’l be able to make much more in the next 3 days. But I will try making small changes. I will most likely begin with the backend in the next week at the current pace."}, {"post_id": 21706, "ts": "2026-07-03T20:03:19Z", "hours": 2.1947, "text": "Ideas for the front end Today I only ended up making some bold prototypes for the front end in HTML and CSS. I did have a small error already because of using bootstrap. I always load up the scripts for the HTML and CSS from the Bootstrap site, and that was not a good idea. I ended up searching for an error that didn’t really exist . In the end I found out what was wrong by seeking help from gemini. Nothing else was done with the help of AI as you can see by the bad UX. I didn’t really have time for anything big so thats what I ended up with. I will make it much nicer tomorrow if I have the time to do it."}]...
|
Title: sqush by @Dackel | Stardance
Devlogs:
Idea Title: sqush by @Dackel | Stardance
Devlogs:
Ideas for the front end Today I only ended up making some bold prototypes for the front end in HTML and CSS. I did have a small error already because of using bootstrap. I always load up the scripts for the HTML and CSS from the Bootstrap site, and that was not a good idea. I ended up searching for an error that didn’t really exist . In the end I found out what was wrong by seeking help from gemini. Nothing else was done with the help of AI as you can see by the bad UX. I didn’t really have time for anything big so thats what I ended up with. I will make it much nicer tomorrow if I have the time to do it.
Interactive Home Screen with Banner Today I began overworking my initial concept from yesterday and I made some progress. The home site now has a background banner with the most important things in the nav. The background Image currently is AI generated but I will make my own in the next few days. I also made the site much more interactive. Everything you see here has an effect when hovering it. But don’t worry I didn’t exaggerate with the effects. For the pulsing Image I used the inbuild keyframes CSS has. I also blurred the text when hovering the image but that may has to be reverted tommorow. I also don’t think that I’l be able to make much more in the next 3 days. But I will try making small changes. I will most likely begin with the backend in the next week at the current pace.
Most Productive day Today was really crazy. I worked for the hole day and made some big progress. Dashboard I first added a dashboard for developers. So you can finally add a game. I used flask (python) for the backend. You can also add screenshots and youtube links or mp.4. On the homepage you can preview the games trailer by hovering over it. Secruity Also editing of the game is only possible if you are the owner of the game. So I had to add a System for User Authorization and hashing for the passwords of course. Luckily Flask did most of it.So its getting checked if you are even a developer. When you are not you dont even get the options shown to publish a game or edit one. Media I also expanded on the media upload . You can now add as many screenshots or videos as you want (Little side note: don’t keep the video upload blank). And the biggest part you can add games now. UI Changes The UI also got a big Overhaul. I have decided to use a comic style for the site. Please Note that the background image at the nav is still AI generated(Even tho I did edit it a bit too get more of a retro style) Also I fixed several error. Mostly just typos that ended up getting the hole site down. Features: I also added new features such as tags, genres, game pages, the developer dashboard, search and an edit page for the games you made.
Libary and buying today I just added a basic libary where you can view the games added to your account and even download them and I overworked the login and register page. Tommorow I’ll begin the payment process when buying a game. For that I will use the sandbox tools of Stripe.
added views, befriending, community, paying, user profiles and searching for users So first the biggest: I added paying with Stripe . I only used the sandbox but you could basicially just add your own API Keys in an .env file and youd be able to start. The documentation was really tuff to read through but I made it with the help of a tutorial. After that I added user profiles. I just reused my game backend with the screenshots and so for the avatar. When I was finished with the unique users I started with the view system. For now it’s pretty basic and you just have to view a site for 5 seconds to count as a view. After that I added the community tab where you can search users and befriend them. Some of my error highlights: “stripe is not defined”; I forgot to add the API key. Not an error but. I hardcoded the API Keys. Already fixed but still. “Template…… unexpected” I had to delete the database because I added a new velue for it.
added notifications, countdown for sales, friend request (not just following like yesterday) ,overworked UI aspects and reviews For the notifications I mjust had to add a new route and add it to the front end. The countdown was really hard to figure out for my but it worked out with unix time I searched for an error the entire time just to find out that my countdown was written in white on a white background. The friend request are why I added notifications. Because I wanted to let the user see who sent a request and respond to that. For the new system I had to delete the entire database to make it work. After that I added reviews. You can now give a game a thumbs up or down. The average score will be shown and your text (the review). When finishing that I overworked some of the most Important UI’s and made it much better to look at. Like you see here:
fixed several bugs and commented,optimized the code So today I decided to look through all of my code and look for ways to improve. In the end I made several fixes and I’am satisfied with how it ended up. The reason I did this is because I wanna add many more features tommorow. But yesterday I already noticed that its hard to look through the code and that there were so many issues. Also some on the performance side. I believe that all errors are fixed for now. Here a code snipet:
added reactions to reviews and wishlist so today I already began working on bigger features. It was a bit hard to do all off this but I made it. I just found out today that you can actually migrate databases wth Flask. I always thought I had to delete the hole database and set it up again to make everything work. Also I spent around 4 hours searching for a mistake just to find out that I linked the wrong javascript file. My backend code gets worse every day. I must find a solution for that. Here my new wishlist page and the reactions:
added demos, user badge, blurred email and default picture(penguins of madagascar) overworked login, register, profile, community , game_detail , dashboard and edit game So today I added Demos you can install. I just copied the code of the game upload. I also added a user badge so you can see who is a dev and who is a user. Now youn will also not see your whole email but reade just the first three letters. (That took way too long to do) And I also overworked all of these pages so they have a look that better fits the entire store.
added comments to user profiles I added comments to user profiles. The great thing is you can deactivate the comment tab and delete comments you dont like. It really took super long making this feature. Especially handling the errors. In the end I did make it but I still have to fix some errors tomoorow. Now I’ll go to sleep (:
added stats page I added a stats page for every game a developer has published. You can see the history of how your game has developed. Thats why I’ve worked on the wishlist ,views and purchase features, so I can actually put them on a stats page. Adding the graph was especially hard and also saving the old datapoints was difficult. For example I had used simple Optimization like if its the same data as yesterday there will just be no new datapoint added. So there is a look at the new page::
added revenue tab and new background image So today I added a new metric to the stats page. It was really hard getting it right. Especially in the graph because I didnt wanna use the same axis for the revenue again. I also made the backround image more pixelated so it gets more of a retro look. Tomorrow I’ll begin making something big(I already did some of the work today but yeah)
havent finished anything today So today I began working on something big. But I havent really made any real progress in that. I had to work around so many logic problems. Also over the course of working on this I found out that my code isn’t really optimised for much data. If this code would ever be used with 10.000 games or even more it would most likely crash. But still I will finish the feature tommorow. And also I will start a Demo site in the next days. It would be great if anyone just tested it out. Here a code snippet
Google is not that cool 🤬 So guys like I said I finished it today so thats what I added: Basic Recommendation System So there are the three factors for the Recommendations: Tag taste: users who own a game sharing tags with your library also own the canditate Popularity: how many people in total own the candidate (Thats the least important) Similar library wishlists: users who share games with your library wishlisted the candidate All of that is done in phython, which is very dumb to do if you wanna have thousands of games. (But for that small store its enough) 2fa authentification So for that I have used firebase. For me it was extremly hard configuring this.But I made it. Also I have used a gmail address to send a potential user the verification and email confirmation. And if you dont wanna verify anything you can deactivate it with the checkmark( But please if the demo is online do it(Note: Analytics are activated on firebase )) added google login You can also login in with google. For that I had to use the most irrating API Keys. Really why is Google making it so hard? IMPORTANT: For now your Username will automatically be the name you have on you Google account.
It’s getting somewhere That was a lot less work than in the last days. So what have I added today? overworked Dropdown Menu Beforehands the Dropdown Menu always was a bit behind the page. Now I have fixed it and also it has become much more interactive. overworked Store Search Now the Store search has more options to search for a game. made Settings Page You can now change Important settings on the help tab. For example your Email Adress, your username, or your password. made Page to choose username when logging in with Google You can now choose a username when logging in with google. You couldn’t do that yesterday!
Can’t show real progress because of Oracle. So I have fnished the backend and already had a plan, but Oracle had to ruin the fun. I wanted to host a VirtualMachine on Oracle Servers because I already have experience with them. But after wanting to sign up I was straight up rejected from getting the Server I paid for . They also debited my money twice (Not cool) . So now I have to wait for the support to answer me and give me some of my money back. There is a small snippet of the code:
I’m back So I’m back from my holidays and my stress with Oracle. So I added a new simple feature and also updated some of my secruity checks. So I did test the file scanner on my PC and it turns out to be good enough. It can find malicious files and get them out before even anyone sees them. Also you can now update your game. Currently you can write what you changed but there is no way of seeing what you wrote for now. I will add that tommorow. It will just be a thread of all updates and the newest come out on top.
Added update feed SO today I did end up making an update feed but I still have to fix some frustrating errors. You can view your own games updates these of your friends or the updates of the hole platform. You should also be able to upvote these but I currently have some errors with that.
fixed all the issues of yesterday made new ones(kinda) So I fixed the old issues you can now see the updates page and actual updates. But I began cleaning up some of the js code and I’m still not finished. So now I need to get over 100 more lines of js. Also I need to look over my python code cause well. 1800 lines of code in one file is horrendeus(At least for me) So wish me luck for tommorow!
Fixed the code (again) So like I said yesterday I rewrote the js. So what was the problem? Well yesterday while testing out the Site I found out that the buy button didn’t send a GET request to the backend. So when I looked at the js I first looked confused cause everything seemed to be fine. After some debugging I found out that my new feature somehow collided with the buy button (Don’t ask how) So I fixed it. Here is my totally real payment information, Everything works fine now:
added hackclub auth (or atleast tried) Thats just because of me being a dum dum. You may see whats the mistake. Will have it fixed tommorow.
fixed the hackclub auth So I finally fixed the authentication. So here is a list of all of my mistakes: Used the wrong email field; use identity.primary_emailRequested (I did not need this) use openid emailValidated state even though the callback only returned code (how do I even get to sucessfully code anything) Added duplicate OAuth routes/functions (the dumbest mistake of mine) Left the callback incomplete: no user creation, login, or redirectLogged sensitive access and refresh tokens (name me albstein) Kept Flask debug mode enabled outside local development (hopefully no one saw that) Tommorow I’ll do something. Maybe I’ll even be finished. Cause I dont know what to add anymore. If you have some recommendations just drop them off. thats the list of all current features: User registrationUsername and password login Email verification Resend email verification Email based 2FA 2FA code resend Enable or disable 2FA Change username Change email address Change password Logout Google login Hack Club login First login username setup User profiles Profile pictures Profile comments Delete profile comments Enable or disable profile comments Community page User search Follow users Unfollow users Friend requests Accept friend requests Notifications Unread notification counter Mark notifications as read User roles Developer roles Developer dashboard Create games Edit games Upload game files Upload demo files Upload screenshots Upload images Upload videos Add YouTube videos ZIP game uploads EXE game uploads Optional ClamAV malware scanning Game updates Version labels Patch notes Update history Update comments Update upvotes Update downvotes Update view counts Follow games Game update notifications Store page Genre grouping Game tags Tag filter data Game details Game descriptions Game screenshots Game videos Game view counter Positive/negative ratings Written reviews Edit reviews Helpful review votes Funny review votes Review scoring Wishlist Add to wishlist Remove from wishlist Personal game library Purchases Duplicate purchase prevention Buy page Stripe Checkout Payment success page Sales Discounts Sale end dates Automatic sale expiration Price calculation Developer revenue page Revenue per game Sales count per game Game analytics Daily view statistics Daily wishlist statistics Daily purchase statistics Daily revenue statistics Personalized game recommendations(Yeah thats real) Popular game recommendations SQLite database SQLAlchemy ORMDatabase migrations SMTP email support Firebase configuration Stripe configuration Hack Club OAuth configuration Environment variable secret configuration Please drop some recommendatins🥲
added Account Linking/fixed Hackclub auth (again) So now its getting rememberd if you also have a password and not only auth with google or hackclub. Also in the database there is a completly new columm for the hackclub ID. Backend:hackclub_callback() now also checks for Login/register or Link Modus. google_login() now accepts link mode.There are two new routes for unlinking google and hackclub. And last but not least. There is also a secruity check. The last used login methoid cant be deleted.
added Rate Limits Unfourtanetly I can’t push the code right now cause of github having problems with their API. So but it did take very long cause im Albert himself. So first I tried hardcoding Rate Limits with timers and stuff like that and I very much had very dumb ways to deal with it. Then I found out that Flask actually has a own Libary just for Limits. So after failing doing it my own way I just sticked with that.
added Refund Handling (firs code) So I added Refund Handling for my Store. Unfourtanely I could’t finish it but I did get to finish the frontend. So what did I do. I updated the library page so its now easier to see that you can actually refund the game and how long you have until its not possible anymore. For the backend I currently have some problems with the real refund. You cant really get the money back because of how the buying of a game currently works. Especially automated refunding would be extremly hard in the current system.
fixed the backend So you can now buy games and should get the monopoly money back when refunding it. But if I wanted to make it for a real system I would have to save the payment_tenent_id which I cxurrently don’t. But that should be a easy fix.So it should work like in that cool drawing I made.
added backend for bundles Here a little code snippet. HTML will be finished tommorow. I hope
fixed backend added first HTML Page with bundles It willl look better tommorow (I PROMISE) But for now it looks like that. I also fixed the backend code so now you should actually be able to buy bundles. It will look more like the dev dashboard tommorow I just used the store.html as template.
updated my super dubba design So yeah it should look good now. see for yourself
fixed that fricking page(couldn’t buy something before) Yeah I just made a completly new route for buying bundles and also a completly new HTML page. For some reason I always find a way to make something extremly complicated
added cart system So for today I added a new cart system. I know I’ve done more than epic. You can now get games into your cart and buy them later. You will also get a warning if a game is cheaper in a bundle.HTML will be fixed tommorow
added honeypot and fixed this horrendeus cart UI So yeah I fixed the UI I had yesterday to make it look more like everything else on the store.
added library collections (tried) Yeah so I did get to add a good UI but currently it does not work to add a collection. I will have it fixed tommorow. Most likely a minor mistae breaking everything.
Fixed it ☺️ So now it’s totally possible to make new collections. No errors anymore. Also I fixed some more bugs. And tommorow I will begin cleaning up some of the code.
added gifting system and failed miserably (again) Yea I promised to make the code cleaner today. But I found out that doing that is boring. Thats why I added more features. Now I’m paying for it by having new errors pop up every few minutes. If I’d like to just feel some progress at cleaning this mess up I had to do it in small steps. (cause I ain’t fixing 3000 lines in one day) So tommorow I’ll at least try getting the first 1000 lines cleaned up again
fixed the gifting system (and beginning to clean up that code) So i fixed the gifting system and I also began my work on cleaning up all of this. And as you see it doesnt look beautyfull right now if someone gifts you something but I’ll make it better.
cleaned up all of the backend code So yeah I’ve done it! I cleaned up all of the code and now its much easier to get through all. It’s so much better now.
added profile badges It’s hard getting the badges right. Cause currently I’m only using Plain HTML and CSS for these badges. And I added the js to the HTML files. Thats much cleaner then in a seperate js file.
added Readme and fixed some visual bugs Yesterday the UI looked a bit off. Especially at the unlocking of the badges. It’s now looking good.
added messaging , updated UI Now users can message devlopers and other ussers. They can also include game Links and Update Links so you can discuss games.
added tip jar, fixed some UI bugs So now you can tip the game devs and they can see it on their dashboard and on the game detail page. You can also add a message to your donation. And I fixed the message button that hid under the profiles in the community tab.
fixed optimization and UI errors (and not ill anymore) So i fixed many Issues regarding the performance of the website Performance (Optimization) videos don’t get loaded instantly anymore (180ms cooldown) Search is done in memmory atribut caches and requestAnimationFrame. all countdown intervalls have been put into one. background image is done locally instead of GitHub Offscreen Cards now use content-visibility:auto. Database and Queries: SQLite changed to 64MB Cahe. made 10 indizes for Foreign Keys/Filter. Even the translator doesn’t wanna tell me what this means in English. You have to find out yourself. UI and Interaction errors js doesnt crash when pressing a button without being logged in (don’t ask how that happend) guest cart can now delete a game from their carts. when checking out and not being logged in you get forwarded to login. Didn’t actually happen before. Wishlist and card buttons now syncronize when a game is there two times or even more on the front page. It pissed me off before. collection badge gets added after animation. Thats all I wanna write for today
added roadmap So there is the list of what I have done: Public Roadmaps and Feature Voting the roadmaap can have the status (Planned/In Progress/Done) and the Types (Feature/Bug/Improvment) the dev can Drag and Drop the items into the status it is in and also mdelete it. Users can comment and upvote those Items Redesign of Game Detail site Its not 9 Buttons in one row anymore It’s seperatd into two sections. updated the sale section And I also added Unit Tests.
added dev cut and reworked Background Image I also added test Data. Thats entirely made by AI except some covers that were made by me. Cause I ain’t interactng thousands of times with my own platform. Also which background banner would you like more?
looked for errors and started website Today I overlooked the site one last time and fixed secruity issues and others. I fixed Email service added an option to change the background Image of the score and made my testdata a bit more secure (had my real emails in there before). I used AI for much of the progress cause it was my first time starting a server (see commits). I ran into many issues while setting everything up.
Didn’t know that I could format it at the shipment so there is the text again formatted. Also I fixed a little download error ( The Site didn’t have the test files in the folder) Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. Issues: The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. The good side: On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). What I didn’t do: My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git.
added Inventory, Card drops You can now get cards dropped by buying or reviewing games. There are 4 rarities you can get and you can also just test pull these (so you can try it out yourself). Also because of this new feature I found a Issue with the notification system I am gonna fix. You can also trade these card with others through the chat or the trade tab. And you can also forge cards together if you have to many duplicates. Because of this new feature I also found a issue with the notification system, Hopefully have it fixed tommorow.
added moderation Now I have an AI model that constantly scans new messages and searches for inappropriate content. If the AI finds such content the person that wrote it will be banned and every single message the user wrote will be checked for issues. Oh I forgot to mention that Copilot fixed some critical secruity vulnerabilitys for me. The user that got banned will also be put on the Wall of Shame where there is a record of every single banned Account ever on the Platform. Developers of games can also always search for not so cool content. And of course Admins can manually ban accounts. (Yeah your private messages are also getting scanned)
Ships:
Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git....
|
1792878701.8847983
|
1793742701.8847983
|
|
52025
|
MyOs by @Polar | Stardance
|
Polar
|
2
|
11.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:45:25Z", "hours": 2.0, "multiplier": 1.98, "payout": 3, "blessing": "neutral", "text": "This is the second version of PolarOs! I upgraded the system by adding 2 new applications, a bottom taskbar that displays all suspended apps, and interactive “be creative” button. Now the dragging system is now smoother, and the whole desktop experience feels much more complete and stable.", "repo": "https://github.com/Polar-404-exe/MyOs", "demo": "https://polar-404-exe.github.io/MyOs/"}, {"ship_num": 2, "ts": "2026-09-02T21:27:02Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a simulation of a WebOS called PolarOS! It features a clean Aero-style layout with a working top bar and a custom desktom wallpaper. I has a real-time clock and 3 draggable apps. Everything is fully responsive and interactive!!", "repo": "https://github.com/Polar-404-exe/MyOs", "demo": "https://polar-404-exe.github.io/MyOs/"}]...
|
[{"post_id": 64317, "ts": "202 [{"post_id": 64317, "ts": "2026-09-08T16:36:41Z", "hours": 1.5169, "text": "I finished “for now” PolarOS. There are 3 draggable apps, in the right bar there are 2 apps, in the bottom bar it visualises the suspended apps and you can interact to the be creative button"}, {"post_id": 60492, "ts": "2026-09-02T21:16:57Z", "hours": 5.0075, "text": "I’ve finished the frist preview, now there are 3 apps and cool draggable windows!"}, {"post_id": 54022, "ts": "2026-08-24T19:24:10Z", "hours": 2.2722, "text": "now you can drag, close, open the welcomewindow!"}, {"post_id": 53371, "ts": "2026-08-23T21:53:53Z", "hours": 1.4033, "text": "I’m working on a WebOS!"}]...
|
Title: MyOs by @Polar | Stardance
Devlogs:
I’m wo Title: MyOs by @Polar | Stardance
Devlogs:
I’m working on a WebOS!
now you can drag, close, open the welcomewindow!
I’ve finished the frist preview, now there are 3 apps and cool draggable windows!
I finished “for now” PolarOS. There are 3 draggable apps, in the right bar there are 2 apps, in the bottom bar it visualises the suspended apps and you can interact to the be creative button
Ships:
I built a simulation of a WebOS called PolarOS! It features a clean Aero-style layout with a working top bar and a custom desktom wallpaper. I has a real-time clock and 3 draggable apps. Everything is fully responsive and interactive!!
This is the second version of PolarOs! I upgraded the system by adding 2 new applications, a bottom taskbar that displays all suspended apps, and interactive “be creative” button. Now the dragging system is now smoother, and the whole desktop experience feels much more complete and stable....
|
1793091160.1170833
|
1793177560.1170833
|
|
53150
|
Yashiro's JSON by @pksmkwe26 | Stardance
|
pksmkwe26
|
1
|
14.0
|
48
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:31:26Z", "hours": 14.0, "multiplier": 3.54, "payout": 48, "blessing": "neutral", "text": "I made an Programming Language that uses JSON (You heard it right, JSON!!!) I initially showed the idea to my friend and he was traumatized as hell, So i decided to go with it. And i decided to write the interpreter with Dart to add more spice to the wound. It is a real sucess!! tho i faced many issues with variable declaration and parser, it was solved thankfully. It has two types of variable assigning let and lete, Lete being the executed variable. Loop and Networking were the hardest to do, It also has a tests section to see if something breaks something or not. It has custom function definations too and Math’s Bitwise Operators and stdin support as well. It also has an exception view to see the code crash and i plan to expand this project more. I hope you all like this project as much as my other ones.", "repo": "https://github.com/kwe26/yajson", "demo": "https://github.com/kwe26/yajson/releases/tag/1.0.0"}]...
|
[{"post_id": 64307, "ts": "202 [{"post_id": 64307, "ts": "2026-09-08T16:25:50Z", "hours": 2.0317, "text": "Devlog - 5 (Finale Before Shipping) An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language Networking Added net.server net.server As it suggests it can now open full HTTP Server at designated ports now! You can check out the example in server.yaj in root of the repository. The First Beta and Ship is now READY!!! https://github.com/kwe26/yajson/releases/tag/1.0.0 Test and tinker around with it, Let’s goo!! THANKS, I LOVE YOU ALL >3.!!!"}, {"post_id": 61675, "ts": "2026-09-04T18:22:33Z", "hours": 1.0083, "text": "Devlog - 4 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language Features added - Networking There are now Networking Modules too Networking Allows the User to do Networking tasks with --allow-network-access net.get net.post net.delete net.patch net.put It currently allows passing url, headers and body. Anyways, Thanks for reading Love you all 😘😘"}, {"post_id": 61002, "ts": "2026-09-03T18:17:09Z", "hours": 1.5583, "text": "Devlog - 3 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language New Features Loops Include Multiple .yaj files in one. io.rename <-> io.move More Tests added in tests/ Tests There are now more tests included such as Lists (add,remove,indexOf,getAt,removeAt,set, etc.) I/O Tests Include yaj files Switch Tests VarInVar Tests YaJSON [ { \"func\" : \"print\" , \"$1\" : \"Hello World, love you all!\" } ] Info YaJSON’s interpreter is written in dart, weird isn’t it? Future Goal Networking Shell Access GUI Visualizer . Cya, everyone Love you all ❤️ , Have a nice day/night ahead depending on your timezone and when you are reading right now.!!!"}, {"post_id": 60800, "ts": "2026-09-03T12:15:14Z", "hours": 6.6206, "text": "Devlog - 2 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language New Features Function Define and Calling Them Lists Manipulation File I/O Take Input from User Extended Permissions POE DUMP (Point of Execution my own term) Added Tests Changes lete can now execute and assign to variable and permissions of --allow-rw-access is required for File I/O Operations. The Variables can now be assigned like {hello: {b: 1}} and be accessed like ${hello.b} like this too. It’s too good looking now. - Variable Parser is now universal too. Tests It can conduct tests within the runtime and check for expected output. It also reports the pass percentage too. POE It’s an Counter of Total Executions Being made. It outputs the original parse value of the JSON so it could better used for predicting errors Thanks, Love you all"}, {"post_id": 54675, "ts": "2026-08-25T18:33:12Z", "hours": 2.4442, "text": "Devlog - 1 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language What is Currently Has? Print/Console Clear Basic Arithmatic Operations Declaring Variable and Constants Future Plans Make it to have Tests Making the Interpreter More Stable. Also, i think i can also make an Drag-an-drop Programming Interface. yeah, i created this to traumatize the Internet. And obv, The Interpreter is Writtern in Dart!!"}]...
|
Title: Yashiro's JSON by @pksmkwe26 | Stardanc Title: Yashiro's JSON by @pksmkwe26 | Stardance
Devlogs:
Devlog - 1 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language What is Currently Has? Print/Console Clear Basic Arithmatic Operations Declaring Variable and Constants Future Plans Make it to have Tests Making the Interpreter More Stable. Also, i think i can also make an Drag-an-drop Programming Interface. yeah, i created this to traumatize the Internet. And obv, The Interpreter is Writtern in Dart!!
Devlog - 2 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language New Features Function Define and Calling Them Lists Manipulation File I/O Take Input from User Extended Permissions POE DUMP (Point of Execution my own term) Added Tests Changes lete can now execute and assign to variable and permissions of --allow-rw-access is required for File I/O Operations. The Variables can now be assigned like {hello: {b: 1}} and be accessed like ${hello.b} like this too. It’s too good looking now. - Variable Parser is now universal too. Tests It can conduct tests within the runtime and check for expected output. It also reports the pass percentage too. POE It’s an Counter of Total Executions Being made. It outputs the original parse value of the JSON so it could better used for predicting errors Thanks, Love you all
Devlog - 3 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language New Features Loops Include Multiple .yaj files in one. io.rename <-> io.move More Tests added in tests/ Tests There are now more tests included such as Lists (add,remove,indexOf,getAt,removeAt,set, etc.) I/O Tests Include yaj files Switch Tests VarInVar Tests YaJSON [ { "func" : "print" , "$1" : "Hello World, love you all!" } ] Info YaJSON’s interpreter is written in dart, weird isn’t it? Future Goal Networking Shell Access GUI Visualizer . Cya, everyone Love you all ❤️ , Have a nice day/night ahead depending on your timezone and when you are reading right now.!!!
Devlog - 4 An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language Features added - Networking There are now Networking Modules too Networking Allows the User to do Networking tasks with --allow-network-access net.get net.post net.delete net.patch net.put It currently allows passing url, headers and body. Anyways, Thanks for reading Love you all 😘😘
Devlog - 5 (Finale Before Shipping) An Programming Language where Code is in JSON, YEAH LITERALLY JSON as a Programming Language Networking Added net.server net.server As it suggests it can now open full HTTP Server at designated ports now! You can check out the example in server.yaj in root of the repository. The First Beta and Ship is now READY!!! https://github.com/kwe26/yajson/releases/tag/1.0.0 Test and tinker around with it, Let’s goo!! THANKS, I LOVE YOU ALL >3.!!!
Ships:
I made an Programming Language that uses JSON (You heard it right, JSON!!!) I initially showed the idea to my friend and he was traumatized as hell, So i decided to go with it. And i decided to write the interpreter with Dart to add more spice to the wound. It is a real sucess!! tho i faced many issues with variable declaration and parser, it was solved thankfully. It has two types of variable assigning let and lete, Lete being the executed variable. Loop and Networking were the hardest to do, It also has a tests section to see if something breaks something or not. It has custom function definations too and Math’s Bitwise Operators and stdin support as well. It also has an exception view to see the code crash and i plan to expand this project more. I hope you all like this project as much as my other ones....
|
1793138343.7143443
|
1793224743.7143443
|
|
1983
|
rasterminal by @PavolUlicny | Stardance
|
PavolUlicny
|
1
|
470.39
|
8580
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:24:17Z", "hours": 449.0, "multiplier": 19.99, "payout": 8580, "blessing": "neutral", "text": "rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys.", "repo": "https://github.com/PavolUlicny/rasterminal", "demo": "https://github.com/PavolUlicny/rasterminal/releases/tag/v0.1.0-alpha.2"}]...
|
[{"post_id": 70278, "ts": "202 [{"post_id": 70278, "ts": "2026-09-18T21:10:51Z", "hours": 6.11, "text": "Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now."}, {"post_id": 68728, "ts": "2026-09-15T17:06:41Z", "hours": 6.6975, "text": "Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special."}, {"post_id": 66825, "ts": "2026-09-12T18:42:57Z", "hours": 8.5847, "text": "Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps"}, {"post_id": 64252, "ts": "2026-09-08T14:55:07Z", "hours": 2.3467, "text": "Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!"}, {"post_id": 63837, "ts": "2026-09-07T20:19:19Z", "hours": 10.4164, "text": "Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping."}, {"post_id": 62122, "ts": "2026-09-05T11:43:50Z", "hours": 9.5678, "text": "Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios."}, {"post_id": 59763, "ts": "2026-09-01T18:10:34Z", "hours": 4.3639, "text": "Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less."}, {"post_id": 58964, "ts": "2026-08-31T15:12:04Z", "hours": 3.8394, "text": "Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP."}, {"post_id": 58269, "ts": "2026-08-30T17:14:59Z", "hours": 8.6936, "text": "Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell."}, {"post_id": 56881, "ts": "2026-08-28T21:26:16Z", "hours": 9.6883, "text": "I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up."}, {"post_id": 55585, "ts": "2026-08-27T15:06:53Z", "hours": 8.8714, "text": "Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find."}, {"post_id": 54695, "ts": "2026-08-25T19:14:01Z", "hours": 10.7308, "text": "Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc."}, {"post_id": 53861, "ts": "2026-08-24T15:48:08Z", "hours": 10.9639, "text": "Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them."}, {"post_id": 53278, "ts": "2026-08-23T18:46:58Z", "hours": 13.1411, "text": "Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going."}, {"post_id": 52574, "ts": "2026-08-22T19:13:37Z", "hours": 11.0969, "text": "Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799"}, {"post_id": 51884, "ts": "2026-08-21T19:41:32Z", "hours": 6.9825, "text": "Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults."}, {"post_id": 51275, "ts": "2026-08-20T20:14:42Z", "hours": 6.7119, "text": "Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup"}, {"post_id": 50683, "ts": "2026-08-20T00:07:13Z", "hours": 12.3297, "text": "Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks."}, {"post_id": 49184, "ts": "2026-08-17T20:28:00Z", "hours": 14.5689, "text": "Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…"}, {"post_id": 48227, "ts": "2026-08-16T15:09:59Z", "hours": 3.5944, "text": "My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891"}, {"post_id": 48078, "ts": "2026-08-16T11:20:07Z", "hours": 11.47, "text": "Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can."}, {"post_id": 47112, "ts": "2026-08-14T19:18:15Z", "hours": 9.0333, "text": "Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance."}, {"post_id": 46486, "ts": "2026-08-13T18:38:49Z", "hours": 10.6753, "text": "Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging."}, {"post_id": 44676, "ts": "2026-08-10T16:23:20Z", "hours": 4.0767, "text": "Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well."}, {"post_id": 44513, "ts": "2026-08-10T09:59:08Z", "hours": 6.8483, "text": "Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719"}, {"post_id": 43513, "ts": "2026-08-08T20:35:37Z", "hours": 7.6361, "text": "Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that."}, {"post_id": 42752, "ts": "2026-08-07T17:00:51Z", "hours": 3.5125, "text": "Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)"}, {"post_id": 42161, "ts": "2026-08-06T19:24:06Z", "hours": 8.2153, "text": "Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome"}, {"post_id": 39599, "ts": "2026-08-02T18:05:04Z", "hours": 7.4436, "text": "Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \\n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!"}, {"post_id": 38478, "ts": "2026-07-31T21:36:35Z", "hours": 7.7572, "text": "Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode."}, {"post_id": 37806, "ts": "2026-07-30T19:08:29Z", "hours": 2.7436, "text": "Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things."}, {"post_id": 37656, "ts": "2026-07-30T15:25:21Z", "hours": 9.285, "text": "Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design."}, {"post_id": 36697, "ts": "2026-07-28T22:28:53Z", "hours": 9.9361, "text": "Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs."}, {"post_id": 35924, "ts": "2026-07-27T17:55:43Z", "hours": 8.7953, "text": "So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916"}, {"post_id": 33607, "ts": "2026-07-23T17:38:48Z", "hours": 4.5575, "text": "Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults."}, {"post_id": 32607, "ts": "2026-07-21T21:48:11Z", "hours": 4.4442, "text": "Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:"}, {"post_id": 30923, "ts": "2026-07-18T22:17:24Z", "hours": 8.6892, "text": "Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more."}, {"post_id": 29772, "ts": "2026-07-16T21:27:23Z", "hours": 0.7175, "text": "Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!"}, {"post_id": 29484, "ts": "2026-07-16T13:40:29Z", "hours": 4.9444, "text": "Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough."}, {"post_id": 28408, "ts": "2026-07-14T17:26:16Z", "hours": 9.2258, "text": "Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation."}, {"post_id": 27302, "ts": "2026-07-12T19:23:17Z", "hours": 10.3522, "text": "Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones."}, {"post_id": 24314, "ts": "2026-07-07T20:18:01Z", "hours": 5.1908, "text": "Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty."}, {"post_id": 23070, "ts": "2026-07-05T20:10:12Z", "hours": 10.4403, "text": "Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported."}, {"post_id": 19371, "ts": "2026-06-30T17:34:50Z", "hours": 5.1925, "text": "Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without."}, {"post_id": 18685, "ts": "2026-06-29T21:27:29Z", "hours": 13.4722, "text": "Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome."}, {"post_id": 17021, "ts": "2026-06-27T17:00:39Z", "hours": 5.7733, "text": "Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path."}, {"post_id": 16313, "ts": "2026-06-26T15:28:43Z", "hours": 5.1883, "text": "Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors)."}, {"post_id": 15932, "ts": "2026-06-25T21:35:36Z", "hours": 1.9053, "text": "Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better."}, {"post_id": 15741, "ts": "2026-06-25T16:48:43Z", "hours": 4.9903, "text": "Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features."}, {"post_id": 15551, "ts": "2026-06-25T08:50:38Z", "hours": 3.7597, "text": "Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds."}, {"post_id": 15117, "ts": "2026-06-24T15:43:58Z", "hours": 6.87, "text": "Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)"}, {"post_id": 13839, "ts": "2026-06-22T17:59:12Z", "hours": 5.2097, "text": "Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)"}, {"post_id": 12798, "ts": "2026-06-20T22:37:18Z", "hours": 7.6314, "text": "Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline."}, {"post_id": 12171, "ts": "2026-06-19T21:42:34Z", "hours": 6.6653, "text": "Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)"}, {"post_id": 10115, "ts": "2026-06-16T18:24:38Z", "hours": 4.0297, "text": "Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support."}, {"post_id": 9453, "ts": "2026-06-15T20:20:25Z", "hours": 4.6839, "text": "Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:"}, {"post_id": 8652, "ts": "2026-06-14T11:36:32Z", "hours": 5.2058, "text": "Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools."}, {"post_id": 8162, "ts": "2026-06-13T16:37:29Z", "hours": 2.8394, "text": "Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell."}, {"post_id": 7990, "ts": "2026-06-13T10:20:35Z", "hours": 2.4908, "text": "Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/"}, {"post_id": 7643, "ts": "2026-06-12T19:26:54Z", "hours": 8.7975, "text": "I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else."}, {"post_id": 6791, "ts": "2026-06-11T11:35:25Z", "hours": 3.6575, "text": "Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions."}, {"post_id": 5755, "ts": "2026-06-09T17:34:17Z", "hours": 4.1133, "text": "Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main."}, {"post_id": 4897, "ts": "2026-06-08T13:53:56Z", "hours": 3.2906, "text": "Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day."}, {"post_id": 4320, "ts": "2026-06-07T16:09:10Z", "hours": 6.2586, "text": "Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes."}, {"post_id": 3846, "ts": "2026-06-06T22:11:48Z", "hours": 3.5269, "text": "I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster."}, {"post_id": 3572, "ts": "2026-06-06T15:51:49Z", "hours": 2.4386, "text": "Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now."}, {"post_id": 2939, "ts": "2026-06-05T20:55:20Z", "hours": 3.9267, "text": "I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later."}, {"post_id": 2739, "ts": "2026-06-05T14:38:57Z", "hours": 1.3417, "text": "I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it."}, {"post_id": 2631, "ts": "2026-06-05T08:21:00Z", "hours": 3.3225, "text": "Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while."}, {"post_id": 2311, "ts": "2026-06-04T18:46:14Z", "hours": 3.1892, "text": "Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this."}, {"post_id": 386, "ts": "2026-06-01T18:58:14Z", "hours": 0.6783, "text": "I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal."}, {"post_id": 359, "ts": "2026-06-01T17:59:06Z", "hours": 4.5428, "text": "Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏"}]...
|
Title: rasterminal by @PavolUlicny | Stardance
De Title: rasterminal by @PavolUlicny | Stardance
Devlogs:
Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏
I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal.
Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this.
Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while.
I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it.
I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later.
Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now.
I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster.
Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes.
Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day.
Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main.
Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions.
I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else.
Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/
Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell.
Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools.
Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:
Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support.
Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)
Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline.
Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)
Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)
Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds.
Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features.
Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better.
Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors).
Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path.
Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome.
Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without.
Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported.
Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty.
Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones.
Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation.
Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough.
Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!
Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more.
Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:
Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults.
So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916
Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs.
Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design.
Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things.
Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode.
Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!
Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome
Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)
Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that.
Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719
Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well.
Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging.
Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance.
Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can.
My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891
Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…
Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks.
Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup
Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults.
Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799
Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going.
Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them.
Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc.
Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find.
I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up.
Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell.
Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP.
Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less.
Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios.
Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping.
Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!
Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps
Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special.
Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now.
Ships:
rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys....
|
1793105289.4980307
|
1793191689.4980307
|
|
32654
|
My personal site by @Pery | Stardance
|
Pery
|
4
|
10.0
|
59
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T15:44:08Z", "hours": 1.0, "multiplier": 3.54, "payout": 3, "blessing": "neutral", "text": "update is up and ready!", "repo": "https://github.com/davidperyro-stack/idontknowanything", "demo": "https://idontknowanything.vercel.app/"}, {"ship_num": 2, "ts": "2026-08-10T21:58:14Z", "hours": 4.0, "multiplier": 11.14, "payout": 48, "blessing": "neutral", "text": "Update finally done!", "repo": "https://github.com/davidperyro-stack/idontknowanything", "demo": "https://idontknowanything.vercel.app/"}, {"ship_num": 3, "ts": "2026-08-01T21:23:27Z", "hours": 3.0, "multiplier": 2.73, "payout": 8, "blessing": "neutral", "text": "Update is finally done!! since i improved the design, i think i can finally sleep well and actually show (flex) to my friends about this! (they will call me a nerd but whatever) hope yall like it and i will bring the blahaj back soon!!!", "repo": "https://github.com/davidperyro-stack/idontknowanything", "demo": "https://idontknowanything.vercel.app/"}, {"ship_num": 4, "ts": "2026-07-09T23:10:20Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My personal site is finally done. Because of this project im planning to do more projects because they kinda help me learn new things too! (like HTML and CSS)! hope yall like it! (im not really creative i know)", "repo": "https://github.com/davidperyro-stack/idontknowanything", "demo": "https://idontknowanything.vercel.app/"}]...
|
[{"post_id": 64283, "ts": "202 [{"post_id": 64283, "ts": "2026-09-08T15:42:52Z", "hours": 0.5419, "text": "devlog 4.2# Ive finally added stats about my site! how many days it was working and how many views it got! (special thanks to abacus.jasoncameron.dev for the how many people viewed my site thing)"}, {"post_id": 64253, "ts": "2026-09-08T14:57:39Z", "hours": 0.3589, "text": "devlog 4.1# Came back to my personal site (finally) to add my new projects! and since ive came back to this wonderful project of mine, im thinking to add new stuff too (photo album wont be updated for sure)"}, {"post_id": 44859, "ts": "2026-08-10T21:57:46Z", "hours": 0.7903, "text": "devlog 3.6# Finally finished the update (YES I DID IT. NO MORE PLOT TWISTS). added a button if you get bored of this site (if you get bored i will find you [im joking,please take it as joke]) and added a chess.html with my chess stats"}, {"post_id": 43995, "ts": "2026-08-09T14:09:08Z", "hours": 0.4147, "text": "devlog 3.5# Fixed something inside index.html. The “>|” thing was in middle of the site and his place was under everything added.because he was a bad boy i removed from the existence of this site. (also updated the clock and weather widget with more information)"}, {"post_id": 43268, "ts": "2026-08-08T13:02:35Z", "hours": 1.2294, "text": "devlog 3.4# Update is finally done! I fixed the layout of the about.html because the empty space made it ugly since i added the spotify API. Also added a steam API that shows if im online or if im playing something (of course everyday will appear CS2). The API`s chatGPT helped me to configure them and add them. In rest, in home page, ive added a clock that shows local time of my country and a weather widget that shows the weather of my city. For the weather i used openweather, i added the coordonates of the city and it shows. for the time i searched around the internet and found something simple. No API or anything, just external. edit This update ISNT done yet (because i said so :P)"}, {"post_id": 42548, "ts": "2026-08-07T11:14:28Z", "hours": 0.7089, "text": "devlog 3.3# _———– Wit the help of GPT i finally added the spotify thing. Ive used vercel site to deploy ( i removed the github pages so i have to update the project here too). now i have to change some stuff on css so it will be clean and no empty spaces"}, {"post_id": 42507, "ts": "2026-08-07T09:21:23Z", "hours": 0.4733, "text": "devlog 3.2# The photo album is done (sitll not showing what it looks like cuz i dont want to give any spoliers). Ive added the small story on every picture and a title for them. Now im working on about to make it richer. Ive added my fav quote and im thinking to add what song i listening in real time with spotify API (if i can)"}, {"post_id": 42491, "ts": "2026-08-07T08:10:38Z", "hours": 0.6497, "text": "Devlog 3.1# Updating the site agian. Im about to add a photo album. i wont show the site in this devlog and other devlogs so i wont make any spoiler :D. made a new .html. added to navbar the section easily (copy pasted and then added a link with photo-album.html). Now i added the pictures and im thinking to make it clickable so when you click it its bigger and a small story behind it"}, {"post_id": 39135, "ts": "2026-08-01T21:00:56Z", "hours": 0.4939, "text": "devlog 2.4# Update is done!!! added a a music (only in main page) and fixed the about page. because of “hero” section about page went crazy and renamed the section “about-page”"}, {"post_id": 38835, "ts": "2026-08-01T12:15:03Z", "hours": 0.9933, "text": "devlog 2.3# This is day 2 of updating my first project ever. So the terminal theme worked pretty well. just i needed help to the buttons by using AI cuz im dum. But everything worked fine!! Now (or later) i will add a contact section and probally add something with JS so it will be more interactive"}, {"post_id": 38494, "ts": "2026-07-31T22:05:25Z", "hours": 0.3558, "text": "devlog 2.2 finished index.html. Nothing else to say guys sorry… i will update project.html and about.html,probally i will add contacts too"}, {"post_id": 38427, "ts": "2026-07-31T19:48:14Z", "hours": 0.9778, "text": "Devlog 2.1: After the first ship. I came back to my very first project of mine to update it. Right now (in this picture) im updating the style. after it i will add my other projects. the design of this im trying to make like a terminal style. if it fails, i will try to do minimalistic or something else. right now i deleted everything for style.css and im making it start to finish. Also made some changes to index.html."}, {"post_id": 25589, "ts": "2026-07-09T22:45:39Z", "hours": 0.3631, "text": "update: my head hurts"}, {"post_id": 25576, "ts": "2026-07-09T22:17:45Z", "hours": 0.5833, "text": "FINALLY DID SOMETHING (still looks stupid but with style)"}, {"post_id": 25558, "ts": "2026-07-09T21:36:18Z", "hours": 0.9142, "text": "it looks sooooooooooo stupid qwq"}]...
|
Title: My personal site by @Pery | Stardance
Devl Title: My personal site by @Pery | Stardance
Devlogs:
it looks sooooooooooo stupid qwq
FINALLY DID SOMETHING (still looks stupid but with style)
update: my head hurts
Devlog 2.1: After the first ship. I came back to my very first project of mine to update it. Right now (in this picture) im updating the style. after it i will add my other projects. the design of this im trying to make like a terminal style. if it fails, i will try to do minimalistic or something else. right now i deleted everything for style.css and im making it start to finish. Also made some changes to index.html.
devlog 2.2 finished index.html. Nothing else to say guys sorry… i will update project.html and about.html,probally i will add contacts too
devlog 2.3# This is day 2 of updating my first project ever. So the terminal theme worked pretty well. just i needed help to the buttons by using AI cuz im dum. But everything worked fine!! Now (or later) i will add a contact section and probally add something with JS so it will be more interactive
devlog 2.4# Update is done!!! added a a music (only in main page) and fixed the about page. because of “hero” section about page went crazy and renamed the section “about-page”
Devlog 3.1# Updating the site agian. Im about to add a photo album. i wont show the site in this devlog and other devlogs so i wont make any spoiler :D. made a new .html. added to navbar the section easily (copy pasted and then added a link with photo-album.html). Now i added the pictures and im thinking to make it clickable so when you click it its bigger and a small story behind it
devlog 3.2# The photo album is done (sitll not showing what it looks like cuz i dont want to give any spoliers). Ive added the small story on every picture and a title for them. Now im working on about to make it richer. Ive added my fav quote and im thinking to add what song i listening in real time with spotify API (if i can)
devlog 3.3# _———– Wit the help of GPT i finally added the spotify thing. Ive used vercel site to deploy ( i removed the github pages so i have to update the project here too). now i have to change some stuff on css so it will be clean and no empty spaces
devlog 3.4# Update is finally done! I fixed the layout of the about.html because the empty space made it ugly since i added the spotify API. Also added a steam API that shows if im online or if im playing something (of course everyday will appear CS2). The API`s chatGPT helped me to configure them and add them. In rest, in home page, ive added a clock that shows local time of my country and a weather widget that shows the weather of my city. For the weather i used openweather, i added the coordonates of the city and it shows. for the time i searched around the internet and found something simple. No API or anything, just external. edit This update ISNT done yet (because i said so :P)
devlog 3.5# Fixed something inside index.html. The “>|” thing was in middle of the site and his place was under everything added.because he was a bad boy i removed from the existence of this site. (also updated the clock and weather widget with more information)
devlog 3.6# Finally finished the update (YES I DID IT. NO MORE PLOT TWISTS). added a button if you get bored of this site (if you get bored i will find you [im joking,please take it as joke]) and added a chess.html with my chess stats
devlog 4.1# Came back to my personal site (finally) to add my new projects! and since ive came back to this wonderful project of mine, im thinking to add new stuff too (photo album wont be updated for sure)
devlog 4.2# Ive finally added stats about my site! how many days it was working and how many views it got! (special thanks to abacus.jasoncameron.dev for the how many people viewed my site thing)
Ships:
My personal site is finally done. Because of this project im planning to do more projects because they kinda help me learn new things too! (like HTML and CSS)! hope yall like it! (im not really creative i know)
Update is finally done!! since i improved the design, i think i can finally sleep well and actually show (flex) to my friends about this! (they will call me a nerd but whatever) hope yall like it and i will bring the blahaj back soon!!!
Update finally done!
update is up and ready!...
|
1793080142.9759793
|
1793166542.9759793
|
|
51711
|
Pratyush's Personal Portfolio Project by @RedP Pratyush's Personal Portfolio Project by @RedPanda | Stardance...
|
RedPanda
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T15:40:53Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Personal Portfolio! It’s cute,full of red pandas and has some JS. It was quite fun making it and all the pixel art is handmade by yours truly!", "repo": "https://github.com/Pratyush-M-code/Pratyush-M-code.github.io", "demo": "https://pratyush-m-code.github.io/"}]...
|
[{"post_id": 64269, "ts": "202 [{"post_id": 64269, "ts": "2026-09-08T15:23:37Z", "hours": 3.1611, "text": "Final Devlog! Finished with the final touches and added all my own information! I’m going to ship it!"}, {"post_id": 53994, "ts": "2026-08-24T18:39:20Z", "hours": 2.4333, "text": "DevLog #3 What I did. Made a cute red panda and redrew the bamboo multiple times to make it fit continuously. Made said Bamboo, gave up and then proceeded to take the one good section and copy it to make the pole. Finally figured out how to use flex CSS and fixed the margins and padding to make it look smooth as pixels. FINALLY DEPLOYED IT :- https://pratyush-m-code.github.io/ What I learned. Classes and ids are infact ridiculous, i am not going insane. I would like to add that everything should be made into a class and ids should be ** abolished ** . Flex CSS is pretty cool and solves problems that I didn’t know existed like the margins of my tree-project div being too wide that the text cut off. Lorem ipsum text is a life saver. There is no such thing as too much organization. Things can always be over complicated. P.S. Operas while coding are fantastic. Design Ok the panda does not add much, but i expect with further additions, the pixel jungle theme will begin to shine. I might dial down the colours tho. TODO Fix the scroll wheel as it looks hideous Add a lil leaves falling off from the mouse animation Add text about me,myself and I. Fix the test header and footer"}, {"post_id": 51701, "ts": "2026-08-21T15:05:29Z", "hours": 1.1094, "text": "Added base HTML, CSS files and made pixelateCorner Function. Worked on the base of the CSS file,fixing the colour scheme and making a proper base for future stuff. Made the basic website HTML and finalized the ids and classes of the divs (yet to be added). And made a pixlateCorner function to make the divs look nicer and more on theme."}, {"post_id": 50946, "ts": "2026-08-20T12:41:46Z", "hours": 1.1494, "text": "Devlog #1 - Initalized html, fixed hackatime and fooled around with css to make a cohesive theme."}]...
|
Title: Pratyush's Personal Portfolio Project b Title: Pratyush's Personal Portfolio Project by @RedPanda | Stardance
Devlogs:
Devlog #1 - Initalized html, fixed hackatime and fooled around with css to make a cohesive theme.
Added base HTML, CSS files and made pixelateCorner Function. Worked on the base of the CSS file,fixing the colour scheme and making a proper base for future stuff. Made the basic website HTML and finalized the ids and classes of the divs (yet to be added). And made a pixlateCorner function to make the divs look nicer and more on theme.
DevLog #3 What I did. Made a cute red panda and redrew the bamboo multiple times to make it fit continuously. Made said Bamboo, gave up and then proceeded to take the one good section and copy it to make the pole. Finally figured out how to use flex CSS and fixed the margins and padding to make it look smooth as pixels. FINALLY DEPLOYED IT :- https://pratyush-m-code.github.io/ What I learned. Classes and ids are infact ridiculous, i am not going insane. I would like to add that everything should be made into a class and ids should be ** abolished ** . Flex CSS is pretty cool and solves problems that I didn’t know existed like the margins of my tree-project div being too wide that the text cut off. Lorem ipsum text is a life saver. There is no such thing as too much organization. Things can always be over complicated. P.S. Operas while coding are fantastic. Design Ok the panda does not add much, but i expect with further additions, the pixel jungle theme will begin to shine. I might dial down the colours tho. TODO Fix the scroll wheel as it looks hideous Add a lil leaves falling off from the mouse animation Add text about me,myself and I. Fix the test header and footer
Final Devlog! Finished with the final touches and added all my own information! I’m going to ship it!
Ships:
I made a Personal Portfolio! It’s cute,full of red pandas and has some JS. It was quite fun making it and all the pixel art is handmade by yours truly!...
|
1793065722.9233236
|
1793152122.9233236
|
|
59780
|
my first godot project by @Anway | Stardance
|
Anway
|
1
|
13.35
|
13
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T15:27:11Z", "hours": 12.0, "multiplier": 1.27, "payout": 13, "blessing": "neutral", "text": "i made my first 2d project i know i may be not as good as advanced develob but iam really proud to make something like this as i changed in the theme of game with my imagination any one can play it and also used right up left down button to move shift to run and space to jump double space to double jump", "repo": "https://github.com/Ahmedanwar45555555/Platformer-Adventure", "demo": "https://ahmedanwar45555555.itch.io/platformer-adventure"}]...
|
[{"post_id": 66992, "ts": "202 [{"post_id": 66992, "ts": "2026-09-13T00:22:47Z", "hours": 1.3469, "text": "I edited the map of the game and added some features to make it more advanced and different from other tutorials. This is a surprise. Please give me you opoinion"}, {"post_id": 64243, "ts": "2026-09-08T14:34:36Z", "hours": 12.1158, "text": "i made a hidden win point for my game to be excited"}]...
|
Title: my first godot project by @Anway | Stardanc Title: my first godot project by @Anway | Stardance
Devlogs:
i made a hidden win point for my game to be excited
I edited the map of the game and added some features to make it more advanced and different from other tutorials. This is a surprise. Please give me you opoinion
Ships:
i made my first 2d project i know i may be not as good as advanced develob but iam really proud to make something like this as i changed in the theme of game with my imagination any one can play it and also used right up left down button to move shift to run and space to jump double space to double jump...
|
1793055077.9368796
|
1793141477.9368796
|
|
56701
|
MIDL by @ibrahim- | Stardance
|
ibrahim-
|
2
|
14.0
|
228
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T15:22:22Z", "hours": 7.0, "multiplier": 16.78, "payout": 119, "blessing": "neutral", "text": "I present MIDL. I’ve always wanted to play old flash games from my childhood, but since 99% websites do not allow you to export save files, I would always lose my progress. MIDL aims to solve that. . All games were taken from InternetArchive, effort was made to ensure no site locked games were included (no site locks were bypassed). . Almost all of the features that the reviewers mentioned in the last ship have been implemented! . Features Flash emulation via Ruffle Downloading and loading of game save files Search function ANIMATIONS! Cloud save file storage (YOU CAN SAVE YOUR SAVE FILES IN THE CLOUD) Accounts system LEADERBOARD!! (with custom MIDL points, although not all games support our leaderboard) Player controls (play, pause fullscreen) Security (popup blocking) You can now upload your own SWF file! . Planned Features Game snapshot as a save file Emulators!", "repo": "https://github.com/ibfactor/midl", "demo": "https://midl.ibfr.org/"}, {"ship_num": 2, "ts": "2026-09-04T06:33:19Z", "hours": 7.0, "multiplier": 14.95, "payout": 109, "blessing": "neutral", "text": "I present MIDL. I’ve always wanted to play old flash games from my childhood, but since 99% websites do not allow you to export save files, I would always lose my progress. MIDL aims to solve that. . All games were taken from InternetArchive, effort was made to ensure no site locked games were included (no site locks were bypassed). . Features Flash emulation via Ruffle Downloading and loading of game save files Search function ANIMATIONS! Planned Features Saving game state (as it is) Cloud storage functionality Retro console emulators!", "repo": "https://github.com/ibfactor/midl", "demo": "https://midl.ibfr.org/"}]...
|
[{"post_id": 64264, "ts": "202 [{"post_id": 64264, "ts": "2026-09-08T15:19:16Z", "hours": 0.7286, "text": "Devlog #15 Added finishing touches, and more importantly (something I forgot to mention earlier), you can now upload and play your own .SWF files!"}, {"post_id": 64202, "ts": "2026-09-08T12:58:56Z", "hours": 0.4606, "text": "Devlog #14 Finally fixed the extra space issue and squashed a few visual bugs"}, {"post_id": 64107, "ts": "2026-09-08T09:34:56Z", "hours": 0.2803, "text": "Devlog #13 Need your advice I do not know what do to with this extra space. Experimented for like 15 minutes but idk atp, nothing looked good. or or or I could leave it as it is."}, {"post_id": 64061, "ts": "2026-09-08T06:07:13Z", "hours": 0.7936, "text": "Devlog #12 Leaderboards are here Fixed a bug that was introduced in the previous log (save feature was not working as expected)."}, {"post_id": 63710, "ts": "2026-09-07T17:24:51Z", "hours": 0.9033, "text": "Devlog #11 The my account page is finally complete. I also implemented max (high) score calculation, just need to make the leaderboard now. MP (MIDL points) are different from in-game points, and use a special algorithm for their calculation. (multiplying all high scores in all levels, by the number of levels, and multiplying that by the number of stars gained, all of these values depend on the game of course)"}, {"post_id": 63581, "ts": "2026-09-07T14:34:19Z", "hours": 0.2656, "text": "Devlog #10 I’ve added the following games (on the request of @NC and @Definitly-Not-Me ): Dragon Ball Z vs Naruto One Piece vs Naruto Learn to Fly"}, {"post_id": 63551, "ts": "2026-09-07T13:56:37Z", "hours": 1.4186, "text": "Devlog #9 Finally completed the cloud save feature! Used Express and LowDB in the backend. Next Up: add requested games, squash bugs, and most importantly, add a leaderboard!"}, {"post_id": 62212, "ts": "2026-09-05T14:01:31Z", "hours": 2.2394, "text": "Devlog #8 Finally created the authentication system using Express & LowDB, not committing to GitHub yet since I still have to set up the server. I’ve seen all the reviews and will implement them. Also added the close buttons to modals. The requested games will be added in the next devlog. :)"}, {"post_id": 60891, "ts": "2026-09-03T15:17:26Z", "hours": 0.3594, "text": "Devlog #7 Finally implemented the save manager"}, {"post_id": 60853, "ts": "2026-09-03T14:11:47Z", "hours": 2.2514, "text": "Devlog #6 I fixed a few bugs, added a few animations, and most importantly… Wasted 2 whole hours trying to get ruffle player state to restore after reloads…… which failed So plan B, we use the actual save files."}, {"post_id": 60299, "ts": "2026-09-02T16:00:31Z", "hours": 0.8422, "text": "Devlog #5 Done with the Ruffle player, added play/pause controls, fullscreen, and developed a custom solution for saving ruffle state (this is really exciting ), so now we can have flash games with cloud state saves :3"}, {"post_id": 60187, "ts": "2026-09-02T12:43:37Z", "hours": 1.2194, "text": "Devlog #4 Done with the game page and some animations <3 I need your help now, comment ANY obscure flash games you used to play so that they can be archived"}, {"post_id": 59766, "ts": "2026-09-01T18:13:57Z", "hours": 1.0086, "text": "Devlog #3 Finally done with some animations and the search bar"}, {"post_id": 59598, "ts": "2026-09-01T14:43:41Z", "hours": 1.3175, "text": "Devlog #2 Done with adding the games, the images, and styled the main home page. now I need your help, comment any obscure flash game you used to play so that it can be added and archived"}, {"post_id": 58977, "ts": "2026-08-31T15:32:12Z", "hours": 0.2656, "text": "I need YOUR help Do you know of any obscure flash games you used to play? Comment it so it can be added Done with the base styles and structure + created and filled the games database partially"}]...
|
Title: MIDL by @ibrahim- | Stardance
Devlogs:
I n Title: MIDL by @ibrahim- | Stardance
Devlogs:
I need YOUR help Do you know of any obscure flash games you used to play? Comment it so it can be added Done with the base styles and structure + created and filled the games database partially
Devlog #2 Done with adding the games, the images, and styled the main home page. now I need your help, comment any obscure flash game you used to play so that it can be added and archived
Devlog #3 Finally done with some animations and the search bar
Devlog #4 Done with the game page and some animations <3 I need your help now, comment ANY obscure flash games you used to play so that they can be archived
Devlog #5 Done with the Ruffle player, added play/pause controls, fullscreen, and developed a custom solution for saving ruffle state (this is really exciting ), so now we can have flash games with cloud state saves :3
Devlog #6 I fixed a few bugs, added a few animations, and most importantly… Wasted 2 whole hours trying to get ruffle player state to restore after reloads…… which failed So plan B, we use the actual save files.
Devlog #7 Finally implemented the save manager
Devlog #8 Finally created the authentication system using Express & LowDB, not committing to GitHub yet since I still have to set up the server. I’ve seen all the reviews and will implement them. Also added the close buttons to modals. The requested games will be added in the next devlog. :)
Devlog #9 Finally completed the cloud save feature! Used Express and LowDB in the backend. Next Up: add requested games, squash bugs, and most importantly, add a leaderboard!
Devlog #10 I’ve added the following games (on the request of @NC and @Definitly-Not-Me ): Dragon Ball Z vs Naruto One Piece vs Naruto Learn to Fly
Devlog #11 The my account page is finally complete. I also implemented max (high) score calculation, just need to make the leaderboard now. MP (MIDL points) are different from in-game points, and use a special algorithm for their calculation. (multiplying all high scores in all levels, by the number of levels, and multiplying that by the number of stars gained, all of these values depend on the game of course)
Devlog #12 Leaderboards are here Fixed a bug that was introduced in the previous log (save feature was not working as expected).
Devlog #13 Need your advice I do not know what do to with this extra space. Experimented for like 15 minutes but idk atp, nothing looked good. or or or I could leave it as it is.
Devlog #14 Finally fixed the extra space issue and squashed a few visual bugs
Devlog #15 Added finishing touches, and more importantly (something I forgot to mention earlier), you can now upload and play your own .SWF files!
Ships:
I present MIDL. I’ve always wanted to play old flash games from my childhood, but since 99% websites do not allow you to export save files, I would always lose my progress. MIDL aims to solve that. . All games were taken from InternetArchive, effort was made to ensure no site locked games were included (no site locks were bypassed). . Features Flash emulation via Ruffle Downloading and loading of game save files Search function ANIMATIONS! Planned Features Saving game state (as it is) Cloud storage functionality Retro console emulators!
I present MIDL. I’ve always wanted to play old flash games from my childhood, but since 99% websites do not allow you to export save files, I would always lose my progress. MIDL aims to solve that. . All games were taken from InternetArchive, effort was made to ensure no site locked games were included (no site locks were bypassed). . Almost all of the features that the reviewers mentioned in the last ship have been implemented! . Features Flash emulation via Ruffle Downloading and loading of game save files Search function ANIMATIONS! Cloud save file storage (YOU CAN SAVE YOUR SAVE FILES IN THE CLOUD) Accounts system LEADERBOARD!! (with custom MIDL points, although not all games support our leaderboard) Player controls (play, pause fullscreen) Security (popup blocking) You can now upload your own SWF file! . Planned Features Game snapshot as a save file Emulators!...
|
1793138350.413728
|
1793224750.413728
|
|
53310
|
Pulse_OS by @koumud | Stardance
|
koumud
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T15:06:37Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Pulse_OS is a simple Windows-style tab that lets you quickly access useful links and manage your workspace. It includes features like search, settings, themes, and a live clock in one clean interface.", "repo": "https://github.com/koumud/Pulse_OS", "demo": "https://pulse-os-roan.vercel.app/"}]...
|
[{"post_id": 55626, "ts": "202 [{"post_id": 55626, "ts": "2026-08-27T16:19:21Z", "hours": 0.6033, "text": "Finally completed the project worked and added new things to the tab"}, {"post_id": 55176, "ts": "2026-08-26T17:38:40Z", "hours": 0.9311, "text": "polished version"}, {"post_id": 55122, "ts": "2026-08-26T16:10:27Z", "hours": 1.0544, "text": "Added a tech new box down"}, {"post_id": 54603, "ts": "2026-08-25T17:03:05Z", "hours": 0.6175, "text": "polished version"}, {"post_id": 53191, "ts": "2026-08-23T17:05:28Z", "hours": 0.7197, "text": "made basics"}]...
|
Title: Pulse_OS by @koumud | Stardance
Devlogs:
m Title: Pulse_OS by @koumud | Stardance
Devlogs:
made basics
polished version
Added a tech new box down
polished version
Finally completed the project worked and added new things to the tab
Ships:
Pulse_OS is a simple Windows-style tab that lets you quickly access useful links and manage your workspace. It includes features like search, settings, themes, and a live clock in one clean interface....
|
1793062454.1615436
|
1793148854.1615436
|
|
48438
|
Kile-OS by @koumud | Stardance
|
koumud
|
1
|
3.85
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T15:04:20Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "KileOS is a web-based operating system with a modern desktop, apps, window management, settings, themes, and local data storage. It runs directly in the browser and is publicly available for anyone to try.", "repo": "https://github.com/koumud/kile-os", "demo": "https://kile-os.vercel.app/"}]...
|
[{"post_id": 64867, "ts": "202 [{"post_id": 64867, "ts": "2026-09-09T15:40:36Z", "hours": 1.8547, "text": "Stage 5 builds on Stage 4 by adding KileFlow, a workspace control system with saved desktop scenes, Activity Pulse, Desk Map, and the Ctrl + Space Command Rail. The code was newly written on top of KileOS Stage 4, while reference projects were used only for feature inspiration."}, {"post_id": 48133, "ts": "2026-08-16T12:53:57Z", "hours": 0.3081, "text": "the new stage add a polish version of stage 2"}, {"post_id": 48000, "ts": "2026-08-16T08:52:59Z", "hours": 0.3578, "text": "In the 2nd stage i worked on smoothness and added 2 more apps to the os but they need polishing"}, {"post_id": 47945, "ts": "2026-08-16T06:43:28Z", "hours": 1.0083, "text": "I am currently working on an simple os for the project and it is simple"}]...
|
Title: Kile-OS by @koumud | Stardance
Devlogs:
I Title: Kile-OS by @koumud | Stardance
Devlogs:
I am currently working on an simple os for the project and it is simple
In the 2nd stage i worked on smoothness and added 2 more apps to the os but they need polishing
the new stage add a polish version of stage 2
Stage 5 builds on Stage 4 by adding KileFlow, a workspace control system with saved desktop scenes, Activity Pulse, Desk Map, and the Ctrl + Space Command Rail. The code was newly written on top of KileOS Stage 4, while reference projects were used only for feature inspiration.
Ships:
KileOS is a web-based operating system with a modern desktop, apps, window management, settings, themes, and local data storage. It runs directly in the browser and is publicly available for anyone to try....
|
1793148515.1831996
|
1793234915.1831996
|
|
37303
|
Irina's birthday website by Necry by @Necry | Irina's birthday website by Necry by @Necry | Stardance...
|
Necry
|
2
|
10.0
|
63
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T14:42:16Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a page made for one of my dearest friends’ birthday. I am incredibly proud of doing this but I am kind of sad that I only posted only 4 web vlogs but I kept on putting it off. It only uses placeholders for messages and photos for privacy. This ship is only because I added the password which was way harder than I thought. The password is “password”", "repo": "https://github.com/necrymere/Irina-s-Birthday-Site-by-Necry", "demo": "https://necrymere.github.io/Irina-s-Birthday-Site-by-Necry/"}, {"ship_num": 2, "ts": "2026-07-24T15:01:19Z", "hours": 9.0, "multiplier": 7.4, "payout": 63, "blessing": "neutral", "text": "This is a page made for one of my dearest friends’ birthday. I am incredibly proud of doing this but I am kind of sad that I only posted only 4 web vlogs but I kept on putting it off. It only uses placeholders for messages and photos for privacy.", "repo": "https://github.com/necrymere/Irina-s-Birthday-Site-by-Necry", "demo": "https://necrymere.github.io/Irina-s-Birthday-Site-by-Necry/"}]...
|
[{"post_id": 64245, "ts": "202 [{"post_id": 64245, "ts": "2026-09-08T14:40:18Z", "hours": 1.455, "text": "I added a password screen so in the final publishing of the site(which includes all the photos and such) cannot be entered by just about anyone. Anyways this was really fun but I had this hour that was not logged so I am posting this."}, {"post_id": 34060, "ts": "2026-07-24T14:51:51Z", "hours": 0.4217, "text": "I got the spotify embed to work(yayyy) and finished placing placeholders and such. I think I am done"}, {"post_id": 33991, "ts": "2026-07-24T11:48:21Z", "hours": 3.0989, "text": "Once again I forgot to post but honestly this is almost done. I added a navigation bar, a home section with her image and her titles(instead of it being in the memories section) and a place to add notes from her friends. I am happy that I am starting to figure out and understand how all of this works. The spotify embeded player still does not work. Oh I also forgot that I added placeholders for images(and the project will be released publicly only with placeholders for privacy’s sake."}, {"post_id": 33458, "ts": "2026-07-23T13:09:34Z", "hours": 4.4525, "text": "Ok I just realised that I did not update this in such a long time. So I finished the photo gallery, refined the design and started the music library using Spotify embeded. I attached the photo gallery(the photos are yet to be added) also I need to add her photo there)"}, {"post_id": 32599, "ts": "2026-07-21T21:32:03Z", "hours": 0.5667, "text": "I worked on the first page of the website of my friend Irina. Luckily she has no way of finding this(I hope). Anyways this is an interactive question(“Are we your best friends”) and the “NO” button turns into “Yes” once clicked. Also I made a Figma page to maybe help with the design process. I still have a lot of work to do."}]...
|
Title: Irina's birthday website by Necry by @N Title: Irina's birthday website by Necry by @Necry | Stardance
Devlogs:
I worked on the first page of the website of my friend Irina. Luckily she has no way of finding this(I hope). Anyways this is an interactive question(“Are we your best friends”) and the “NO” button turns into “Yes” once clicked. Also I made a Figma page to maybe help with the design process. I still have a lot of work to do.
Ok I just realised that I did not update this in such a long time. So I finished the photo gallery, refined the design and started the music library using Spotify embeded. I attached the photo gallery(the photos are yet to be added) also I need to add her photo there)
Once again I forgot to post but honestly this is almost done. I added a navigation bar, a home section with her image and her titles(instead of it being in the memories section) and a place to add notes from her friends. I am happy that I am starting to figure out and understand how all of this works. The spotify embeded player still does not work. Oh I also forgot that I added placeholders for images(and the project will be released publicly only with placeholders for privacy’s sake.
I got the spotify embed to work(yayyy) and finished placing placeholders and such. I think I am done
I added a password screen so in the final publishing of the site(which includes all the photos and such) cannot be entered by just about anyone. Anyways this was really fun but I had this hour that was not logged so I am posting this.
Ships:
This is a page made for one of my dearest friends’ birthday. I am incredibly proud of doing this but I am kind of sad that I only posted only 4 web vlogs but I kept on putting it off. It only uses placeholders for messages and photos for privacy.
This is a page made for one of my dearest friends’ birthday. I am incredibly proud of doing this but I am kind of sad that I only posted only 4 web vlogs but I kept on putting it off. It only uses placeholders for messages and photos for privacy. This ship is only because I added the password which was way harder than I thought. The password is “password”...
|
1793109309.3641343
|
1793195709.3641343
|
|
30742
|
XacOS by @xacobema | Stardance
|
xacobema
|
2
|
19.96
|
11
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T14:18:45Z", "hours": 6.0, "multiplier": 1.98, "payout": 11, "blessing": "neutral", "text": "XacOS v1.0 [You will probably have to zoom out to see everything properly, I didn´t find a reliable and simple way to make everything fit every screen, altough there is probably a way] What’s new in 1.0 Fixed bugs, like the windows changing shape when dragged to the right corner of the screen Revamped settings: you can now add your own wallpaper, change the font of the whole OS and see some information about your PC Added very simple notes app Start menu: access it by clicking the XacOS logo in the corner of the taskbar, see and open all of your apps There was A LOT of debugging Honestly, since almost 2 months have passed since I made v0.1, and that being my first real experience with HTML, CSS and JavaScript, and also forgetting how I coded the project, this update was a little challenging. Obviously, a lot of googling and W3schools helped me. I still think that maybe in the future I will make a 1.1 or 2.0 with more interesting features, but as a first experience with web development, I think it was great. I would love to mke 1.1 now, but I start school tomorrow, so it’s going to be difficult… Also, thank you very much HackClub and all it’s volunteers for making these awesome projects, I hope summer next year I will be able to participate again, because it’s the last year before I turn 18 😭", "repo": "https://github.com/xacb33/XacOS", "demo": "https://xacb33.github.io/XacOS/"}, {"ship_num": 2, "ts": "2026-07-06T22:42:40Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I think I finally finished the first version of XacOS! It was quite challenging to fix up bugs, as I had never coded in HTML nor JavaScript", "repo": "https://github.com/xacb33/XacOS", "demo": "https://xacb33.github.io/XacOS/"}]...
|
[{"post_id": 71402, "ts": "202 [{"post_id": 71402, "ts": "2026-09-20T19:12:24Z", "hours": 3.0508, "text": "Let’s see if I remember everything: 1. Changed the default system font to one that I think fits better 2. Added paint.js as an app 3. Added user profile customization, with profile picture and username (for now it doesn’t do much, just show it in the start menu) 4. Now there’s a little indicator in the taskbar on what app is currently on top 5. Changed the buttons of the notes apps to icons 6. Setup now tells you to choose your favourite font 7. A little calendar will appear when hovering over the date and time on the taskbar 8. Made most settings persist between page refresh with localStorage and some minor bug-fixes, like the aboutMe screen not going to the top when it’s taskbar icon was clicked. I thinks that’s everything, I also plan on adding at least one or two more apps coded by me and maybe something like a launcher or app store for iframe/embeded stuff by other people"}, {"post_id": 70565, "ts": "2026-09-19T11:31:46Z", "hours": 2.4183, "text": "I added quite some new features, including: 1. Most setup/OOBE is done, but I will probably add the cusomization options in there. 2. Added a low graphics mode, as some reviewers pointed out that XacOS ran badly on their PC, wich disables animations and disables blur. 3.Compressed all images, wich will also help with performane. 4.Added a new wallpaper by NASA, to resemble StarDance. 5. Added a Security section in settings, wich checks for the URL to make sure it is “genuine XacOS” (It is just a gimmick, XacOS is still completly open source) 6. Added a factory reset option in settings, wich deletes all settings and files saved in localStorage. 7. Added a start-up sound. Still have some things that I want to add but I’m happy on how this is turning out, altough I lost my streak because of school…"}, {"post_id": 65495, "ts": "2026-09-10T17:53:35Z", "hours": 1.4144, "text": "Started adding quite some things, but more work is required. (I plan on adding more features, this is v2.0, not v1.1 ;) ) 1. Changed the old welcome window for a placeholder OOBE/Setup, 2. Started working on locally saving the notes to be persistant even when you close the browser, 3. Moved my personal projects to a separate folder inside of file explorer, 4. Added an outline to program names in the desktop, so it can work with both dark and light wallpapers, 5. Fixed the problem of when selecting an icon it would move slightly. Wish me luck, I have no idea why the local saving is working (Why does it need a random cryptographic ID?)"}, {"post_id": 64887, "ts": "2026-09-09T16:23:43Z", "hours": 0.5356, "text": "Sticky Notes now has more functions and windows are animated! I still have to code all the saving to localstorage when you click save and displaying them as openeable files, but for now you can export your note to a txt file to view whenever. Also, looking at the screenshot, looks like I made Settings not be a square anymore, probably when making the text centered with the icon… I will fix that too"}, {"post_id": 64864, "ts": "2026-09-09T15:38:39Z", "hours": 0.5381, "text": "I know I said that I was starting school, but the first days we aren’t having a lot of work, and I was dissapointed on only getting a x1.98 multiplier in v1, so I’ve decided to fix everything the reviewers have pointed out, starting by making everything smaller, and using relative percentages, instead of fixed px values both in HTML and in CSS. Secondly, I have added a little animation on the opening and closing of the Start Menu, turns out it was way easier than I thought, I thought that you had to code the animation by hand. I will also add animations to the other windows (probably easier since they all have a common css class). Lastly, I renamed the welcome screen to About Me, as I plan to do an onboarding foor the OS, and some reviewers pointed out that XacOS v1 seemed more like a personal website instead of a WebOS. As you can read, I am also giving more details in the devlog, and doing them more often."}, {"post_id": 64225, "ts": "2026-09-08T14:06:15Z", "hours": 0.2781, "text": "Updated GitHub and touched up some minor things before shipping!"}, {"post_id": 64215, "ts": "2026-09-08T13:37:40Z", "hours": 1.9003, "text": "I figured out how to make windows not do weird things when they are dragged to the right (It was a very simple solution), gave Settings more functions, like changing the font and uploading your own wallpaper, fixed a couple of bugs and made a very simple Sticky Notes app. I think I will update the repo, do some slight changes, and ship XacOS v1.0! (Previous was beta)"}, {"post_id": 63486, "ts": "2026-09-07T11:25:59Z", "hours": 0.7506, "text": "Found a way to preview the page without having to redownload the files every single time, wich was much needed. Added a working start menuthat opens when you click XacOS and closes by clicking it again, opening an app with it or clicking a window. I still have to fix the problem of windows deforming when they get to the right side of the screen…"}, {"post_id": 31831, "ts": "2026-07-20T15:00:58Z", "hours": 1.7636, "text": "Of course it didn’t work after reorganizing the code. After fixing it up I started implementing the Start Menu (still needs a lot of work) , and only had opened Welome Screen, so I din’t realise that every other window closed with the start Menu, so I started re-cheking the code and found nothing, changed a couple of things that I thought hat was causing that, nothing. I gave up and asked Github AI what was going on but it DIDN’T KNOW (and tried rewriting my code)… I ended up checking again the html….. there was a missing div ending declaration. AAAAAAAAA"}, {"post_id": 27254, "ts": "2026-07-12T17:27:11Z", "hours": 0.9331, "text": "Tidied up a lot the JavaScript code. Much needed! Now to try if it still works… fingers crossed"}, {"post_id": 23785, "ts": "2026-07-06T22:39:30Z", "hours": 0.5344, "text": "Fixing up the README and setting up github pages"}, {"post_id": 23772, "ts": "2026-07-06T22:06:57Z", "hours": 2.1356, "text": "Hooray! I think version 1 of XacOS is finished. It is still pretty barebones and the code is a mess (compared to what others have done this is worthless), but I hope I can polish everything in WebOS 2. All the basics are done and I added the feature of icons of open apps in the taskbar, and when you click it it brings the window to the top"}, {"post_id": 23673, "ts": "2026-07-06T19:43:09Z", "hours": 2.3122, "text": "Project is going great! Alough I’m going crazy trying to figure out why The pop up projects movat the same time as the main projects window…"}, {"post_id": 22881, "ts": "2026-07-05T14:44:56Z", "hours": 0.6561, "text": "I didn’t have Hackatime set up properly… But yesterday I locked in and did 71 different versions of XacOS (Each one with a little bit more things than the one before) Last thing I have done fllowing the guide was making the window openable and closable. I kinda panicked when tidying up the code a little bit all the JS stopped working, but it’s fixed now. (btw, I spent way more than 37min on this)"}]...
|
Title: XacOS by @xacobema | Stardance
Devlogs:
I Title: XacOS by @xacobema | Stardance
Devlogs:
I didn’t have Hackatime set up properly… But yesterday I locked in and did 71 different versions of XacOS (Each one with a little bit more things than the one before) Last thing I have done fllowing the guide was making the window openable and closable. I kinda panicked when tidying up the code a little bit all the JS stopped working, but it’s fixed now. (btw, I spent way more than 37min on this)
Project is going great! Alough I’m going crazy trying to figure out why The pop up projects movat the same time as the main projects window…
Hooray! I think version 1 of XacOS is finished. It is still pretty barebones and the code is a mess (compared to what others have done this is worthless), but I hope I can polish everything in WebOS 2. All the basics are done and I added the feature of icons of open apps in the taskbar, and when you click it it brings the window to the top
Fixing up the README and setting up github pages
Tidied up a lot the JavaScript code. Much needed! Now to try if it still works… fingers crossed
Of course it didn’t work after reorganizing the code. After fixing it up I started implementing the Start Menu (still needs a lot of work) , and only had opened Welome Screen, so I din’t realise that every other window closed with the start Menu, so I started re-cheking the code and found nothing, changed a couple of things that I thought hat was causing that, nothing. I gave up and asked Github AI what was going on but it DIDN’T KNOW (and tried rewriting my code)… I ended up checking again the html….. there was a missing div ending declaration. AAAAAAAAA
Found a way to preview the page without having to redownload the files every single time, wich was much needed. Added a working start menuthat opens when you click XacOS and closes by clicking it again, opening an app with it or clicking a window. I still have to fix the problem of windows deforming when they get to the right side of the screen…
I figured out how to make windows not do weird things when they are dragged to the right (It was a very simple solution), gave Settings more functions, like changing the font and uploading your own wallpaper, fixed a couple of bugs and made a very simple Sticky Notes app. I think I will update the repo, do some slight changes, and ship XacOS v1.0! (Previous was beta)
Updated GitHub and touched up some minor things before shipping!
I know I said that I was starting school, but the first days we aren’t having a lot of work, and I was dissapointed on only getting a x1.98 multiplier in v1, so I’ve decided to fix everything the reviewers have pointed out, starting by making everything smaller, and using relative percentages, instead of fixed px values both in HTML and in CSS. Secondly, I have added a little animation on the opening and closing of the Start Menu, turns out it was way easier than I thought, I thought that you had to code the animation by hand. I will also add animations to the other windows (probably easier since they all have a common css class). Lastly, I renamed the welcome screen to About Me, as I plan to do an onboarding foor the OS, and some reviewers pointed out that XacOS v1 seemed more like a personal website instead of a WebOS. As you can read, I am also giving more details in the devlog, and doing them more often.
Sticky Notes now has more functions and windows are animated! I still have to code all the saving to localstorage when you click save and displaying them as openeable files, but for now you can export your note to a txt file to view whenever. Also, looking at the screenshot, looks like I made Settings not be a square anymore, probably when making the text centered with the icon… I will fix that too
Started adding quite some things, but more work is required. (I plan on adding more features, this is v2.0, not v1.1 ;) ) 1. Changed the old welcome window for a placeholder OOBE/Setup, 2. Started working on locally saving the notes to be persistant even when you close the browser, 3. Moved my personal projects to a separate folder inside of file explorer, 4. Added an outline to program names in the desktop, so it can work with both dark and light wallpapers, 5. Fixed the problem of when selecting an icon it would move slightly. Wish me luck, I have no idea why the local saving is working (Why does it need a random cryptographic ID?)
I added quite some new features, including: 1. Most setup/OOBE is done, but I will probably add the cusomization options in there. 2. Added a low graphics mode, as some reviewers pointed out that XacOS ran badly on their PC, wich disables animations and disables blur. 3.Compressed all images, wich will also help with performane. 4.Added a new wallpaper by NASA, to resemble StarDance. 5. Added a Security section in settings, wich checks for the URL to make sure it is “genuine XacOS” (It is just a gimmick, XacOS is still completly open source) 6. Added a factory reset option in settings, wich deletes all settings and files saved in localStorage. 7. Added a start-up sound. Still have some things that I want to add but I’m happy on how this is turning out, altough I lost my streak because of school…
Let’s see if I remember everything: 1. Changed the default system font to one that I think fits better 2. Added paint.js as an app 3. Added user profile customization, with profile picture and username (for now it doesn’t do much, just show it in the start menu) 4. Now there’s a little indicator in the taskbar on what app is currently on top 5. Changed the buttons of the notes apps to icons 6. Setup now tells you to choose your favourite font 7. A little calendar will appear when hovering over the date and time on the taskbar 8. Made most settings persist between page refresh with localStorage and some minor bug-fixes, like the aboutMe screen not going to the top when it’s taskbar icon was clicked. I thinks that’s everything, I also plan on adding at least one or two more apps coded by me and maybe something like a launcher or app store for iframe/embeded stuff by other people
Ships:
I think I finally finished the first version of XacOS! It was quite challenging to fix up bugs, as I had never coded in HTML nor JavaScript
XacOS v1.0 [You will probably have to zoom out to see everything properly, I didn´t find a reliable and simple way to make everything fit every screen, altough there is probably a way] What’s new in 1.0 Fixed bugs, like the windows changing shape when dragged to the right corner of the screen Revamped settings: you can now add your own wallpaper, change the font of the whole OS and see some information about your PC Added very simple notes app Start menu: access it by clicking the XacOS logo in the corner of the taskbar, see and open all of your apps There was A LOT of debugging Honestly, since almost 2 months have passed since I made v0.1, and that being my first real experience with HTML, CSS and JavaScript, and also forgetting how I coded the project, this update was a little challenging. Obviously, a lot of googling and W3schools helped me. I still think that maybe in the future I will make a 1.1 or 2.0 with more interesting features, but as a first experience with web development, I think it was great. I would love to mke 1.1 now, but I start school tomorrow, so it’s going to be difficult… Also, thank you very much HackClub and all it’s volunteers for making these awesome projects, I hope summer next year I will be able to participate again, because it’s the last year before I turn 18 😭...
|
1793105544.842921
|
1793191944.842921
|
|
56220
|
xvcf.dev - my personal site! by @xvcf | Stardance
|
xvcf
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T14:10:50Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a new version of my personal website! It includes a section about the music I make, a section about my coding projects, as well as a footer with contact information. It also features two SoundCloud widgets, as well as a typewriter animation for the text. My CSS uses a custom font!", "repo": "https://github.com/RafaeloxMC/xvcf.dev-v5", "demo": "https://xvcf.dev"}]...
|
[{"post_id": 64223, "ts": "202 [{"post_id": 64223, "ts": "2026-09-08T14:04:15Z", "hours": 0.26, "text": "README and more URLs! Heya! Really short devlog, but it’s worth mentioning! I have made my README.md file for my GitHub repo, and I have added two more URLs to the projects section of the site! One is currently commented out in the code, due to the project still being in review on Modrinth. That’s it already!"}, {"post_id": 63195, "ts": "2026-09-06T21:17:05Z", "hours": 2.3881, "text": "Made the base site! This is the base site I made! I personally really like the design. It features a music section, as well as a code projects section. I also added a footer with a spam trap email (because bots kept spamming my old email )"}]...
|
Title: xvcf.dev - my personal site! by @xvcf | Sta Title: xvcf.dev - my personal site! by @xvcf | Stardance
Devlogs:
Made the base site! This is the base site I made! I personally really like the design. It features a music section, as well as a code projects section. I also added a footer with a spam trap email (because bots kept spamming my old email )
README and more URLs! Heya! Really short devlog, but it’s worth mentioning! I have made my README.md file for my GitHub repo, and I have added two more URLs to the projects section of the site! One is currently commented out in the code, due to the project still being in review on Modrinth. That’s it already!
Ships:
I made a new version of my personal website! It includes a section about the music I make, a section about my coding projects, as well as a footer with contact information. It also features two SoundCloud widgets, as well as a typewriter animation for the text. My CSS uses a custom font!...
|
1793116046.2167375
|
1793202446.2167375
|
|
59472
|
dee trivia bot by @dee27 | Stardance
|
dee27
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T13:37:55Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built dee bot, a trivia bot for slack. It uses the open trivia DB API to send questions, lets users answer them directly in Slack. bot keeps track of scores and accuracy too.", "repo": "https://github.com/deepakverma-afk/dee-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 63780, "ts": "202 [{"post_id": 63780, "ts": "2026-09-07T18:56:31Z", "hours": 0.8689, "text": "working on dee slack bot. deebot lets u play trivia, track ur score and compete on a leaderboard. currently working on getting it deployed on Nest."}]...
|
Title: dee trivia bot by @dee27 | Stardance
Devlo Title: dee trivia bot by @dee27 | Stardance
Devlogs:
working on dee slack bot. deebot lets u play trivia, track ur score and compete on a leaderboard. currently working on getting it deployed on Nest.
Ships:
I built dee bot, a trivia bot for slack. It uses the open trivia DB API to send questions, lets users answer them directly in Slack. bot keeps track of scores and accuracy too....
|
1793134235.2900171
|
1793220635.2900171
|
|
58994
|
the dumb assistant by @lahcen | Stardance
|
lahcen
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T13:06:57Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made the bare bones slack bot this is just to learn how to follow and ship a project my next one will be more creative hopefully", "repo": "https://github.com/lahcenkhmaissi/dumb-slack-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0C0G8PHK5X"}]...
|
[{"post_id": 64187, "ts": "202 [{"post_id": 64187, "ts": "2026-09-08T12:39:16Z", "hours": 0.2767, "text": "i made it finally 24/7"}, {"post_id": 63941, "ts": "2026-09-08T00:54:39Z", "hours": 0.3192, "text": "i made the bot im kinda stuck with the hosting if you can help me hit me up on slack"}]...
|
Title: the dumb assistant by @lahcen | Stardance
Title: the dumb assistant by @lahcen | Stardance
Devlogs:
i made the bot im kinda stuck with the hosting if you can help me hit me up on slack
i made it finally 24/7
Ships:
i made the bare bones slack bot this is just to learn how to follow and ship a project my next one will be more creative hopefully...
|
1793112447.0491302
|
1793198847.0491302
|
|
2937
|
Lexicon - Reading Tracker by @SilverCanvas | Stard Lexicon - Reading Tracker by @SilverCanvas | Stardance...
|
SilverCanvas
|
1
|
23.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:57:17Z", "hours": 23.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Lexicon - a reading tracking web app to keep track of books. This project allowed me to progress my python skills while also making an application accessible on the web by using the Streamlit python library. This was my first project that I used OOP in, with the use of books as objects of the book class. Additionally this was the first time I used an API, which is used to get the book data including name, author, publication year and cover image. If you want to test the app, head to the search page and add your favourite book. A books tags can be changed from the library page and books tagged as “reading” can have progress added from the homepage.", "repo": "https://github.com/SilverCanvas72/Lexicon-ReadingTracker", "demo": "https://lexiconreadingtracker.streamlit.app"}]...
|
[{"post_id": 41118, "ts": "202 [{"post_id": 41118, "ts": "2026-08-05T03:28:10Z", "hours": 5.2314, "text": "Ive been working on the library page and allowing the books to be filtered. This involved figuring out how to make images clickable which apparently is not a native feature with streamlit. The filtering now works for the book’s statuses but I am yet to fix an error meaning the wrong popup is displayed when clicking on the book from the library page"}, {"post_id": 38182, "ts": "2026-07-31T13:30:36Z", "hours": 6.0869, "text": "I have linked up the input widgets to actually save to the user’s local JSON file. The status input was not displaying properly and was showing the same status for each of the books no matter what was saved, after I fixed this I had a bug relating to the status and tag inputs that had to do with the save not writting properly before the popup was closed, resulting in the user having to double click everything. This is now fixed and the current inputs all work, save and reload properly!"}, {"post_id": 32724, "ts": "2026-07-22T01:45:23Z", "hours": 5.3981, "text": "Layouts for Popups and JSON Storage Functions. I have made the popups layout, though this data does not currently save anywhere. I have also setup the save and load functions so that the users data can be reloaded when they leave and re-enter the site."}, {"post_id": 18841, "ts": "2026-06-30T01:23:03Z", "hours": 1.4942, "text": "Test Data and Book Rendering I created some test data for developing the basic functionality of the app before I try to incorporate the Open Libraries API to import books. I then worked on rendering the books on the homepage how I plan to place them in the currently reading section, this included creating a method to display a books cover given its isbn."}, {"post_id": 17470, "ts": "2026-06-28T08:27:59Z", "hours": 4.485, "text": "Setup, Sidebar Navigation & Classes. I have setup my project and its pages. I am using Streamlit to make this website - something I have not used before. I have implemented a sidebar for navigation between the pages. I then planned out and wrote the basis for the classes and objects for the program. I also figured out how to inject the css to the python file so I can write the css for the application in a seperate file, as well as configuring the fonts for the headings."}]...
|
Title: Lexicon - Reading Tracker by @SilverCanvas Title: Lexicon - Reading Tracker by @SilverCanvas | Stardance
Devlogs:
Setup, Sidebar Navigation & Classes. I have setup my project and its pages. I am using Streamlit to make this website - something I have not used before. I have implemented a sidebar for navigation between the pages. I then planned out and wrote the basis for the classes and objects for the program. I also figured out how to inject the css to the python file so I can write the css for the application in a seperate file, as well as configuring the fonts for the headings.
Test Data and Book Rendering I created some test data for developing the basic functionality of the app before I try to incorporate the Open Libraries API to import books. I then worked on rendering the books on the homepage how I plan to place them in the currently reading section, this included creating a method to display a books cover given its isbn.
Layouts for Popups and JSON Storage Functions. I have made the popups layout, though this data does not currently save anywhere. I have also setup the save and load functions so that the users data can be reloaded when they leave and re-enter the site.
I have linked up the input widgets to actually save to the user’s local JSON file. The status input was not displaying properly and was showing the same status for each of the books no matter what was saved, after I fixed this I had a bug relating to the status and tag inputs that had to do with the save not writting properly before the popup was closed, resulting in the user having to double click everything. This is now fixed and the current inputs all work, save and reload properly!
Ive been working on the library page and allowing the books to be filtered. This involved figuring out how to make images clickable which apparently is not a native feature with streamlit. The filtering now works for the book’s statuses but I am yet to fix an error meaning the wrong popup is displayed when clicking on the book from the library page
Ships:
I made Lexicon - a reading tracking web app to keep track of books. This project allowed me to progress my python skills while also making an application accessible on the web by using the Streamlit python library. This was my first project that I used OOP in, with the use of books as objects of the book class. Additionally this was the first time I used an API, which is used to get the book data including name, author, publication year and cover image. If you want to test the app, head to the search page and add your favourite book. A books tags can be changed from the library page and books tagged as “reading” can have progress added from the homepage....
|
1793148697.8232949
|
1793235097.8232949
|
|
59352
|
slack bort by @Anastt | Stardance
|
Anastt
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:56:28Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made a slack bot named bort for the “make a slackbot” mission, pretty cool process overall. Ive never worked with vs code b4 so that was pretty fun. Its a really rewarding thing to see sth you made working. bort is running on the hackclub slack sever 24/7 through nest, go ping him!!", "repo": "https://github.com/Anastt77/stuff-for-stardance", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 64191, "ts": "202 [{"post_id": 64191, "ts": "2026-09-08T12:47:04Z", "hours": 0.3656, "text": "finished and tested the bot after deploying it with nest, rll enjoyed the whole process. gonna ship the project now “”"}, {"post_id": 63789, "ts": "2026-09-07T19:06:28Z", "hours": 0.825, "text": "Did the code for the bot, it works!!!!! now i need to wait for nest to get me approved to be able to run it 24/7 and complete the project"}, {"post_id": 63642, "ts": "2026-09-07T15:48:09Z", "hours": 0.4119, "text": "general topic research and downloading the necessary vs code stuff, as well as the first couple of steps. gonna continue w the code and track it with hackatime if i manage to figure out how that works"}]...
|
Title: slack bort by @Anastt | Stardance
Devlogs: Title: slack bort by @Anastt | Stardance
Devlogs:
general topic research and downloading the necessary vs code stuff, as well as the first couple of steps. gonna continue w the code and track it with hackatime if i manage to figure out how that works
Did the code for the bot, it works!!!!! now i need to wait for nest to get me approved to be able to run it 24/7 and complete the project
finished and tested the bot after deploying it with nest, rll enjoyed the whole process. gonna ship the project now “”
Ships:
made a slack bot named bort for the “make a slackbot” mission, pretty cool process overall. Ive never worked with vs code b4 so that was pretty fun. Its a really rewarding thing to see sth you made working. bort is running on the hackclub slack sever 24/7 through nest, go ping him!!...
|
1793130448.0519283
|
1793216848.0519283
|
|
59752
|
PDF-Toolkit by @Greg_ios | Stardance
|
Greg_ios
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:54:34Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "PDF Toolkit is a small Python CLI tool for common PDF operations, with a simple interactive interface.", "repo": "https://github.com/travletothefurureprogramming/PDF-Toolkit/", "demo": "https://github.com/travletothefurureprogramming/PDF-Toolkit/releases/tag/v1.0.0"}]...
|
[{"post_id": 64183, "ts": "202 [{"post_id": 64183, "ts": "2026-09-08T12:28:51Z", "hours": 0.4144, "text": "PDF Toolkit — DevLog 3 Text Extraction & Final Polish The PDF Toolkit is starting to feel like a real application now. After finishing the main PDF operations and the interactive CLI, I focused this time on adding text extraction and improving the overall reliability of the program. PDF → Text I added a new PDF → Text operation using PyMuPDF. The tool goes through the pages of a PDF, extracts the text and saves everything into a .txt file. This makes it possible to quickly get the text from a PDF without manually copying it page by page. The extracted text keeps the content from all pages in the document. CLI Improvements I also spent some time making the CLI more reliable. The program now handles common problems such as: Cancelled file selection Missing input files Missing output paths Invalid page numbers Invalid page ranges Errors during PDF operations Instead of crashing immediately, the CLI can display an error and return to the main menu. Better User Feedback The CLI now gives clearer feedback when an operation finishes. For example: ✓ PDF merged successfully! If an operation fails, the user gets an error message instead of being left with a Python traceback. This makes the tool much easier to use, especially for someone who doesn’t know how the code works internally. Command-Line Options I also added basic command-line options to make the program easier to use outside of the interactive menu. The application now supports: --help for displaying information about the available commands and options, and: --version for displaying the current version of PDF Toolkit. These are small additions, but they make the project feel much more like a proper command-line application. Current Features At this point, PDF Toolkit supports: Merge PDFs PDF → Image Split PDF Extract Pages PDF → Text Interactive CLI --help --version Input validation Error handling Cancel handling The project is now much more complete than when I started. Testing I’ve been testing the different operations both individually and through the CLI. The main goal is to make sure that the normal workflow works correctly while also handling common user mistakes without crashing the application. There are still things I want to test more thoroughly before calling the project finished, especially when packaging it for other computers. What’s Next The core functionality is now basically finished. The next step is no longer about adding lots of new features. I want to focus on actually shipping the project. The next stage will be: Final testing Packaging PDF Toolkit as a Windows .exe Cleaning up the project Final README updates Preparing the first release Next milestone: v1.0.0 🚀 The goal is to have a version that someone can download and use without needing to manually set up the Python environment."}, {"post_id": 64168, "ts": "2026-09-08T11:56:04Z", "hours": 0.5736, "text": "PDF Toolkit — Development Log 2 CLI Complete The first usable version of the PDF Toolkit CLI is now complete. I created cli.py and connected all of the PDF operations that were already implemented to a single interactive interface. The CLI is built using Questionary for the terminal menu and Tkinter file dialogs for selecting input and output files. Available Operations The CLI currently supports: Merge PDFs PDF → Image Split PDF Extract Pages Exit Each operation can now be selected directly from the terminal. File Selection Instead of requiring users to manually type file paths, the CLI uses Tkinter file dialogs to select files and folders. For example, when merging PDFs, the user can: Select multiple PDF files Choose the output location Create the merged PDF The same approach is used for the other operations where appropriate. PDF → Image The CLI asks the user for the page number and then allows them to choose where the generated image should be saved. Split PDF For splitting PDFs, the user can select: The input PDF The output folder The output filename prefix This keeps the generated files organized. Extract Pages The CLI also supports the page selection syntax implemented in the extraction function. For example: 1-5 or: 1,3,5-8 The selected pages are then saved into a new PDF. Current Status The core PDF operations are now implemented and accessible through the CLI. The project has moved from individual PDF functions to an actual usable command-line application. What’s Next The next step is to improve the CLI experience and make the tool more reliable. Possible improvements include: Better error handling Input validation Success/error messages Cleaner terminal output More tests Additional PDF operations Packaging the project for easier installation and distribution"}, {"post_id": 64153, "ts": "2026-09-08T11:14:47Z", "hours": 0.6161, "text": "PDF Toolkit — Devlog 1 Current Progress I’ve started building PDF Toolkit , a small Python command-line utility for working with PDF files. The goal is to keep it simple and modular, while gradually adding useful PDF operations. Project Structure PDF-Toolkit/ ├── main.py ├── requirements.txt ├── operations/ │ ├── __init__.py │ ├── merge.py │ ├── convert.py │ ├── split.py │ └── extract.py └── tests/ ├── __init__.py └── test_merge.py The PDF operations are separated into individual modules instead of putting everything into one file. Implemented Features Merge PDFs Added support for combining multiple PDF files into a single PDF. The merge operation uses PyMuPDF and accepts multiple input files. PDF → Image Added support for converting a specific PDF page into an image. Current options include: Selecting a specific page PNG output JPG output Custom DPI Split PDF Added support for splitting a PDF into individual pages. For example, a multi-page PDF can be split into separate files: page_1.pdf page_2.pdf page_3.pdf ... Extract Pages Added support for extracting selected pages into a new PDF. Pages can be specified individually or as ranges. Example: 2,5,8-10 This creates a new PDF containing pages 2, 5, 8, 9 and 10. CLI The next step is to connect all the existing operations through a simple CLI interface . The user will be able to start PDF Toolkit and select an operation from a menu: PDF Toolkit 1. Merge PDFs 2. PDF → Image 3. Split PDF 4. Extract Pages 5. Exit This will make the current features easier to use without having to call the Python functions manually. What’s Next After the CLI is working, I plan to continue expanding the toolkit with more PDF operations. Planned features: Rotate Pages Delete Pages Reorder Pages Images → PDF PDF information / metadata PDF compression Password protection For now, the focus is on getting the existing features working properly and making them easy to use through the CLI."}]...
|
Title: PDF-Toolkit by @Greg_ios | Stardance
Devlo Title: PDF-Toolkit by @Greg_ios | Stardance
Devlogs:
PDF Toolkit — Devlog 1 Current Progress I’ve started building PDF Toolkit , a small Python command-line utility for working with PDF files. The goal is to keep it simple and modular, while gradually adding useful PDF operations. Project Structure PDF-Toolkit/ ├── main.py ├── requirements.txt ├── operations/ │ ├── __init__.py │ ├── merge.py │ ├── convert.py │ ├── split.py │ └── extract.py └── tests/ ├── __init__.py └── test_merge.py The PDF operations are separated into individual modules instead of putting everything into one file. Implemented Features Merge PDFs Added support for combining multiple PDF files into a single PDF. The merge operation uses PyMuPDF and accepts multiple input files. PDF → Image Added support for converting a specific PDF page into an image. Current options include: Selecting a specific page PNG output JPG output Custom DPI Split PDF Added support for splitting a PDF into individual pages. For example, a multi-page PDF can be split into separate files: page_1.pdf page_2.pdf page_3.pdf ... Extract Pages Added support for extracting selected pages into a new PDF. Pages can be specified individually or as ranges. Example: 2,5,8-10 This creates a new PDF containing pages 2, 5, 8, 9 and 10. CLI The next step is to connect all the existing operations through a simple CLI interface . The user will be able to start PDF Toolkit and select an operation from a menu: PDF Toolkit 1. Merge PDFs 2. PDF → Image 3. Split PDF 4. Extract Pages 5. Exit This will make the current features easier to use without having to call the Python functions manually. What’s Next After the CLI is working, I plan to continue expanding the toolkit with more PDF operations. Planned features: Rotate Pages Delete Pages Reorder Pages Images → PDF PDF information / metadata PDF compression Password protection For now, the focus is on getting the existing features working properly and making them easy to use through the CLI.
PDF Toolkit — Development Log 2 CLI Complete The first usable version of the PDF Toolkit CLI is now complete. I created cli.py and connected all of the PDF operations that were already implemented to a single interactive interface. The CLI is built using Questionary for the terminal menu and Tkinter file dialogs for selecting input and output files. Available Operations The CLI currently supports: Merge PDFs PDF → Image Split PDF Extract Pages Exit Each operation can now be selected directly from the terminal. File Selection Instead of requiring users to manually type file paths, the CLI uses Tkinter file dialogs to select files and folders. For example, when merging PDFs, the user can: Select multiple PDF files Choose the output location Create the merged PDF The same approach is used for the other operations where appropriate. PDF → Image The CLI asks the user for the page number and then allows them to choose where the generated image should be saved. Split PDF For splitting PDFs, the user can select: The input PDF The output folder The output filename prefix This keeps the generated files organized. Extract Pages The CLI also supports the page selection syntax implemented in the extraction function. For example: 1-5 or: 1,3,5-8 The selected pages are then saved into a new PDF. Current Status The core PDF operations are now implemented and accessible through the CLI. The project has moved from individual PDF functions to an actual usable command-line application. What’s Next The next step is to improve the CLI experience and make the tool more reliable. Possible improvements include: Better error handling Input validation Success/error messages Cleaner terminal output More tests Additional PDF operations Packaging the project for easier installation and distribution
PDF Toolkit — DevLog 3 Text Extraction & Final Polish The PDF Toolkit is starting to feel like a real application now. After finishing the main PDF operations and the interactive CLI, I focused this time on adding text extraction and improving the overall reliability of the program. PDF → Text I added a new PDF → Text operation using PyMuPDF. The tool goes through the pages of a PDF, extracts the text and saves everything into a .txt file. This makes it possible to quickly get the text from a PDF without manually copying it page by page. The extracted text keeps the content from all pages in the document. CLI Improvements I also spent some time making the CLI more reliable. The program now handles common problems such as: Cancelled file selection Missing input files Missing output paths Invalid page numbers Invalid page ranges Errors during PDF operations Instead of crashing immediately, the CLI can display an error and return to the main menu. Better User Feedback The CLI now gives clearer feedback when an operation finishes. For example: ✓ PDF merged successfully! If an operation fails, the user gets an error message instead of being left with a Python traceback. This makes the tool much easier to use, especially for someone who doesn’t know how the code works internally. Command-Line Options I also added basic command-line options to make the program easier to use outside of the interactive menu. The application now supports: --help for displaying information about the available commands and options, and: --version for displaying the current version of PDF Toolkit. These are small additions, but they make the project feel much more like a proper command-line application. Current Features At this point, PDF Toolkit supports: Merge PDFs PDF → Image Split PDF Extract Pages PDF → Text Interactive CLI --help --version Input validation Error handling Cancel handling The project is now much more complete than when I started. Testing I’ve been testing the different operations both individually and through the CLI. The main goal is to make sure that the normal workflow works correctly while also handling common user mistakes without crashing the application. There are still things I want to test more thoroughly before calling the project finished, especially when packaging it for other computers. What’s Next The core functionality is now basically finished. The next step is no longer about adding lots of new features. I want to focus on actually shipping the project. The next stage will be: Final testing Packaging PDF Toolkit as a Windows .exe Cleaning up the project Final README updates Preparing the first release Next milestone: v1.0.0 🚀 The goal is to have a version that someone can download and use without needing to manually set up the Python environment.
Ships:
PDF Toolkit is a small Python CLI tool for common PDF operations, with a simple interactive interface....
|
1793055073.8170266
|
1793141473.8170266
|
|
12432
|
SlackyssaLiu - Slack Bot by @AidenHammy | Stardanc SlackyssaLiu - Slack Bot by @AidenHammy | Stardance...
|
AidenHammy
|
1
|
7.39
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:42:18Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Started as a standard “first Slack bot” with catfacts, jokes, quotes, the usual starter-project stuff. It was redesigned into something actually worth using. A space-themed bot that tracks the ISS in real time, counts down to the next rocket launch, posts NASA’s daily astronomy photo (with zero effort on your part) and pulls random Mars rover photos on demand. It also remembers things now. SQLite-backed mission logs per channel and custom callsigns per user and shows up uninvited with scheduled posts instead of only responding when poked. Built with Node.js + Slack Bolt (Socket Mode, no public URL needed), SQLite for persistence, node-cron for scheduling and free APIs (Open Notify, NASA, Launch Library 2) for the live data. Deployed and running 24/7 on Hack Club Nest.", "repo": "https://github.com/AidenHammy/SlackyssaLiu", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 67226, "ts": "202 [{"post_id": 67226, "ts": "2026-09-13T08:58:32Z", "hours": 3.3922, "text": "Devlog 3: Three Hours of My Life I’m Never Getting Back (And Slack’s Media Renderer Can Thank Me For It) The false confidence I thought the bot was done. I really did. The commands worked, the database was syncing, the cron jobs were firing. It was a fully functional space bot. I sat down to do what I thought would be a 15-min final polish before shipping. Three hours later, I was found questioning my reality and whether I should just delete the folder and take up farming. What started as a quick polish turned into a full-blown war against dead community APIs, Slack’s deeply picky Block Kit renderer and the absolute garbage fire that is Node.js DNS resolution on free hosting platforms. The dead API saga First, /skl-mars completely died. Not a graceful failure. Not a friendly JSON error. It just silently redirected to a GitHub Pages 404 HTML page. Axios, bless its optimistic little heart, tried to parse that HTML as JSON, choked and took the whole bot down with it. I made the executive decision to ditch that entirely. The rover is probably tired of taking photos anyway. I swapped it out for NASA’s EPIC API, which takes photos of Earth from the DSCOVR satellite. But EPIC had its own trap. If you just ask for the “most recent” photos, it returns a tiny array of about 13 photos from the last active day. The bot kept spamming the exact same image of Earth. I had to rewrite the endpoint to fetch the archive of all available dates, shuffle the entire history of the satellite and pull a random day from the past just to get some variety. Then, the Open Notify API (used for ISS location and crew data) went offline too. Same GitHub 404 redirect. I had to write nested try/catch fallbacks with 5-second timeouts to route requests to wheretheiss.at just to keep the telemetry commands alive. It was a war of attrition against community-run infrastructure. Slack Block Kit & the APOD nightmare Getting the APOD (/skl-apod) to actually render in the chat was an absolute nightmare. Originally, the bot just dropped a raw URL into the chat. Slack looked at it and said “Cool link, not displaying it” so I rebuilt the command using Slack’s Block Kit image block. That fixed images. But.. a video? Because of course, if you pass an .mp4 URL into an image block, Slack silently drops the message entirely. I had to write logic to check the media_type: if it was a YouTube link, I parsed the URL and rendered it using Slack’s native video block. If it was a raw .mp4, I had to stream the video file directly into Slack using filesUploadV2 so it would embed and play right in the chat. And to prevent the bot from OOM-crashing the server on large videos, I had to use responseType: \"stream\" so it chunked the download instead of loading a 50MB video into RAM all at once. The Nest hosting quirk Right when I thought I was victorious, APOD and Earth started failing with getaddrinfo ENOTFOUND api.nasa.gov . After staring at my screen wondering if I had forgotten how URLs work, I learned that Node.js 17+ defaults to IPv6 for DNS resolution and the hosting platform (Nest) doesn’t fully support IPv6 routing. The server literally couldn’t find NASA. Adding dns.setDefaultResultOrder('ipv4first') to the top of the service file fixed it instantly. Extremely normal behavior, I love computers. The actual architecture shift Amidst all the API firefighting, I also ripped out the hardcoded .env channel routing. Making someone edit a .env file just to move a bot to a new channel is a crime. I moved the scheduled announcements to a SQLite-backed system with /skl-setup and /skl-unset commands so the bot could support multiple servers dynamically without touching environment variables. What started as a simple script turned into a much more reliable bot with backup APIs, saved data, scheduled posts and the ability to handle images and videos directly in Slack. It was hella exhausting, my brain is completely fried but atleast it’s done."}, {"post_id": 64173, "ts": "2026-09-08T12:10:49Z", "hours": 2.9514, "text": "Devlog: SlackyssaLiu Went to Space (and I Forgot to Write Any of This Down) The itch SlackyssaLiu started as a pretty standard first Slack bot. Slash commands, a few API wrappers, the usual suspects: catfacts, jokes, quotes, echo, ping, some sneeze/wave filler commands for personality. It worked fine. It also looked exactly like every other “my first slackbot” project out there because it basically followed the same recipe everyone does. Integrate a joke API, integrate a weather-adjacent API, call it done. I wanted to know how to make it stand out so I asked around for ideas. The answer was pretty obvious in hindsight. Stop building the demo everyone builds and build something around an actual theme with actual state instead of a stateless command list wrapped around whatever free API came up first. I bounced between a few themes.. figure skating (RIP, no usable free API), medieval history (also no API, just Wikipedia scraping, hard pass) and space. Space won because it had exactly what I needed. Solid free APIs with no bureaucracy (Open Notify needs zero auth, NASA’s API just needs a free key) and enough surface area to build something that actually feels alive instead of just answering when poked. What actually changed This ended up being a full redesign not a patch job. Rough shape of it (RIP to /skl-achoo, you were doing your best). Killed the old command set! No more catfact/joke/quote/echo/achoo/wave. None of it fit the new direction and it was the generic stuff I was trying to get away from in the first place. A moment of silence for the bot that could sneeze but not tell you when a rocket was launching. New space-themed commands: /skl-iss and /skl-crew (Open Notify, no key needed), /skl-launch (Launch Library 2, with an actual countdown for maximum dramatic tension), /skl-apod and /skl-mars (NASA’s API, APOD + random Curiosity rover photos the rover did not consent to being featured but also cannot complain). Added actual persistence. SQLite via better-sqlite3. This was the real shift. The old bot had the memory of a goldfish with amnesia. It never remembered anything between requests. Now it tracks mission logs per channel, user callsigns and which launches it’s already announced (so it doesn’t spam the same countdown twice like an overeager intern). Added scheduled behavior. node-cron jobs that post NASA’s picture of the day every morning and ping the channel when a launch is within the hour. This is the part I think actually makes it feel like a running thing instead of a command list. It does stuff without being asked which is more initiative than I show most mornings. I gave it an actual personality module! pulled every joke/flavor line out of the command handlers and centralized them in personality.js. Went through two tone passes because apparently I couldn’t decide if the bot should sound like a stoic AI from a space movie or like it’s been on Twitter since 2019. It landed somewhere in between and honestly that’s a personality a lot of people have. Having it centralized meant the whole voice-swap was a single-file change instead of hunting through every command like a raccoon going through someone’s trash. Fixed real bugs from the original file along the way, typos that would’ve crashed the bot. cool, cool, very cool, glad I caught that before it caught me. Why I forgot to log any of this Short version, I was moving fast across a lot of files at once. db setup, service wrappers, command rewiring, personality, scheduler and treated it like “just get it working” instead of “document as I go”. I was working on a lot of projects at the same time and this was something I did just after finding about Stardance so I barely remembered to ship it. But I’m doing so now, several weeks late, riding in on a horse made of retroactive commit messages. I barely had any brainpower left for side projects at 1am because of my “awesome” uni."}, {"post_id": 5868, "ts": "2026-06-09T20:22:36Z", "hours": 1.3881, "text": "Devlog 1 — Building SlackyssaLiu (Slack Bot) What I set out to build: Create a simple Slack bot that can respond to slash commands in real time and make interactions inside a workspace more dynamic and useful. How I approached it: I started by following Stardance’s mission guide to understand how Slack apps connect to a backend and handle real-time events. After setting up the base bot with Socket Mode and environment variables, I focused on implementing slash commands and structuring them in a clean and scalable way. What I built: A deployed Slack bot running 24/7 with real-time command handling A working Slack bot using Node.js and the Bolt framework Multiple slash commands such as: /skl-ping for latency checking /skl-echo for message reflection /skl-time and /skl-date for utility /skl-help for command discovery API integrations: Cat facts using an external API Random jokes Inspirational quotes Basic error handling for API failures A consistent command-response structure using async functions Deployment: The bot is deployed and runs continuously 24/7, allowing it to respond to Slack commands in real time without requiring a local environment. This helped me understand how to keep services running beyond development and make the bot usable in a live workspace. What I learned: How Slack’s Bolt framework handles commands and events The importance of ack() in Slack interactions How to structure asynchronous command handlers How to integrate external APIs into a Node.js application How to handle failures gracefully using try-catch Challenges I faced: Understanding how Slack’s command lifecycle works Managing async responses correctly without breaking Slack’s timing requirements Debugging API responses and ensuring consistent formatting What I improved beyond the mission guide: While the initial setup followed Stardance’s mission guide, I expanded the bot by adding multiple custom commands and integrating external APIs to make it more interactive and useful. Future improvements: Add command history or logging Introduce smarter responses or context awareness Improve response formatting for better readability Expand the command set with more utility features Final thoughts: This project helped me understand how real-time systems work and how to build something that interacts with users in a live environment. It started with guided steps and evolved into a customizable and extendable Slack bot."}]...
|
Title: SlackyssaLiu - Slack Bot by @AidenHammy | S Title: SlackyssaLiu - Slack Bot by @AidenHammy | Stardance
Devlogs:
Devlog 1 — Building SlackyssaLiu (Slack Bot) What I set out to build: Create a simple Slack bot that can respond to slash commands in real time and make interactions inside a workspace more dynamic and useful. How I approached it: I started by following Stardance’s mission guide to understand how Slack apps connect to a backend and handle real-time events. After setting up the base bot with Socket Mode and environment variables, I focused on implementing slash commands and structuring them in a clean and scalable way. What I built: A deployed Slack bot running 24/7 with real-time command handling A working Slack bot using Node.js and the Bolt framework Multiple slash commands such as: /skl-ping for latency checking /skl-echo for message reflection /skl-time and /skl-date for utility /skl-help for command discovery API integrations: Cat facts using an external API Random jokes Inspirational quotes Basic error handling for API failures A consistent command-response structure using async functions Deployment: The bot is deployed and runs continuously 24/7, allowing it to respond to Slack commands in real time without requiring a local environment. This helped me understand how to keep services running beyond development and make the bot usable in a live workspace. What I learned: How Slack’s Bolt framework handles commands and events The importance of ack() in Slack interactions How to structure asynchronous command handlers How to integrate external APIs into a Node.js application How to handle failures gracefully using try-catch Challenges I faced: Understanding how Slack’s command lifecycle works Managing async responses correctly without breaking Slack’s timing requirements Debugging API responses and ensuring consistent formatting What I improved beyond the mission guide: While the initial setup followed Stardance’s mission guide, I expanded the bot by adding multiple custom commands and integrating external APIs to make it more interactive and useful. Future improvements: Add command history or logging Introduce smarter responses or context awareness Improve response formatting for better readability Expand the command set with more utility features Final thoughts: This project helped me understand how real-time systems work and how to build something that interacts with users in a live environment. It started with guided steps and evolved into a customizable and extendable Slack bot.
Devlog: SlackyssaLiu Went to Space (and I Forgot to Write Any of This Down) The itch SlackyssaLiu started as a pretty standard first Slack bot. Slash commands, a few API wrappers, the usual suspects: catfacts, jokes, quotes, echo, ping, some sneeze/wave filler commands for personality. It worked fine. It also looked exactly like every other “my first slackbot” project out there because it basically followed the same recipe everyone does. Integrate a joke API, integrate a weather-adjacent API, call it done. I wanted to know how to make it stand out so I asked around for ideas. The answer was pretty obvious in hindsight. Stop building the demo everyone builds and build something around an actual theme with actual state instead of a stateless command list wrapped around whatever free API came up first. I bounced between a few themes.. figure skating (RIP, no usable free API), medieval history (also no API, just Wikipedia scraping, hard pass) and space. Space won because it had exactly what I needed. Solid free APIs with no bureaucracy (Open Notify needs zero auth, NASA’s API just needs a free key) and enough surface area to build something that actually feels alive instead of just answering when poked. What actually changed This ended up being a full redesign not a patch job. Rough shape of it (RIP to /skl-achoo, you were doing your best). Killed the old command set! No more catfact/joke/quote/echo/achoo/wave. None of it fit the new direction and it was the generic stuff I was trying to get away from in the first place. A moment of silence for the bot that could sneeze but not tell you when a rocket was launching. New space-themed commands: /skl-iss and /skl-crew (Open Notify, no key needed), /skl-launch (Launch Library 2, with an actual countdown for maximum dramatic tension), /skl-apod and /skl-mars (NASA’s API, APOD + random Curiosity rover photos the rover did not consent to being featured but also cannot complain). Added actual persistence. SQLite via better-sqlite3. This was the real shift. The old bot had the memory of a goldfish with amnesia. It never remembered anything between requests. Now it tracks mission logs per channel, user callsigns and which launches it’s already announced (so it doesn’t spam the same countdown twice like an overeager intern). Added scheduled behavior. node-cron jobs that post NASA’s picture of the day every morning and ping the channel when a launch is within the hour. This is the part I think actually makes it feel like a running thing instead of a command list. It does stuff without being asked which is more initiative than I show most mornings. I gave it an actual personality module! pulled every joke/flavor line out of the command handlers and centralized them in personality.js. Went through two tone passes because apparently I couldn’t decide if the bot should sound like a stoic AI from a space movie or like it’s been on Twitter since 2019. It landed somewhere in between and honestly that’s a personality a lot of people have. Having it centralized meant the whole voice-swap was a single-file change instead of hunting through every command like a raccoon going through someone’s trash. Fixed real bugs from the original file along the way, typos that would’ve crashed the bot. cool, cool, very cool, glad I caught that before it caught me. Why I forgot to log any of this Short version, I was moving fast across a lot of files at once. db setup, service wrappers, command rewiring, personality, scheduler and treated it like “just get it working” instead of “document as I go”. I was working on a lot of projects at the same time and this was something I did just after finding about Stardance so I barely remembered to ship it. But I’m doing so now, several weeks late, riding in on a horse made of retroactive commit messages. I barely had any brainpower left for side projects at 1am because of my “awesome” uni.
Devlog 3: Three Hours of My Life I’m Never Getting Back (And Slack’s Media Renderer Can Thank Me For It) The false confidence I thought the bot was done. I really did. The commands worked, the database was syncing, the cron jobs were firing. It was a fully functional space bot. I sat down to do what I thought would be a 15-min final polish before shipping. Three hours later, I was found questioning my reality and whether I should just delete the folder and take up farming. What started as a quick polish turned into a full-blown war against dead community APIs, Slack’s deeply picky Block Kit renderer and the absolute garbage fire that is Node.js DNS resolution on free hosting platforms. The dead API saga First, /skl-mars completely died. Not a graceful failure. Not a friendly JSON error. It just silently redirected to a GitHub Pages 404 HTML page. Axios, bless its optimistic little heart, tried to parse that HTML as JSON, choked and took the whole bot down with it. I made the executive decision to ditch that entirely. The rover is probably tired of taking photos anyway. I swapped it out for NASA’s EPIC API, which takes photos of Earth from the DSCOVR satellite. But EPIC had its own trap. If you just ask for the “most recent” photos, it returns a tiny array of about 13 photos from the last active day. The bot kept spamming the exact same image of Earth. I had to rewrite the endpoint to fetch the archive of all available dates, shuffle the entire history of the satellite and pull a random day from the past just to get some variety. Then, the Open Notify API (used for ISS location and crew data) went offline too. Same GitHub 404 redirect. I had to write nested try/catch fallbacks with 5-second timeouts to route requests to wheretheiss.at just to keep the telemetry commands alive. It was a war of attrition against community-run infrastructure. Slack Block Kit & the APOD nightmare Getting the APOD (/skl-apod) to actually render in the chat was an absolute nightmare. Originally, the bot just dropped a raw URL into the chat. Slack looked at it and said “Cool link, not displaying it” so I rebuilt the command using Slack’s Block Kit image block. That fixed images. But.. a video? Because of course, if you pass an .mp4 URL into an image block, Slack silently drops the message entirely. I had to write logic to check the media_type: if it was a YouTube link, I parsed the URL and rendered it using Slack’s native video block. If it was a raw .mp4, I had to stream the video file directly into Slack using filesUploadV2 so it would embed and play right in the chat. And to prevent the bot from OOM-crashing the server on large videos, I had to use responseType: "stream" so it chunked the download instead of loading a 50MB video into RAM all at once. The Nest hosting quirk Right when I thought I was victorious, APOD and Earth started failing with getaddrinfo ENOTFOUND api.nasa.gov . After staring at my screen wondering if I had forgotten how URLs work, I learned that Node.js 17+ defaults to IPv6 for DNS resolution and the hosting platform (Nest) doesn’t fully support IPv6 routing. The server literally couldn’t find NASA. Adding dns.setDefaultResultOrder('ipv4first') to the top of the service file fixed it instantly. Extremely normal behavior, I love computers. The actual architecture shift Amidst all the API firefighting, I also ripped out the hardcoded .env channel routing. Making someone edit a .env file just to move a bot to a new channel is a crime. I moved the scheduled announcements to a SQLite-backed system with /skl-setup and /skl-unset commands so the bot could support multiple servers dynamically without touching environment variables. What started as a simple script turned into a much more reliable bot with backup APIs, saved data, scheduled posts and the ability to handle images and videos directly in Slack. It was hella exhausting, my brain is completely fried but atleast it’s done.
Ships:
Started as a standard “first Slack bot” with catfacts, jokes, quotes, the usual starter-project stuff. It was redesigned into something actually worth using. A space-themed bot that tracks the ISS in real time, counts down to the next rocket launch, posts NASA’s daily astronomy photo (with zero effort on your part) and pulls random Mars rover photos on demand. It also remembers things now. SQLite-backed mission logs per channel and custom callsigns per user and shows up uninvited with scheduled posts instead of only responding when poked. Built with Node.js + Slack Bolt (Socket Mode, no public URL needed), SQLite for persistence, node-cron for scheduling and free APIs (Open Notify, NASA, Launch Library 2) for the live data. Deployed and running 24/7 on Hack Club Nest....
|
1793145368.8166556
|
1793231768.8166556
|
|
19805
|
Tick Tock by @ryderklh | Stardance
|
ryderklh
|
5
|
85.0
|
988
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:39:47Z", "hours": 30.0, "multiplier": 12.69, "payout": 386, "blessing": "neutral", "text": "WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Timer and a Stopwatch. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Timer ⭐Mutiple timers at one page ⭐Keep going after refreshing website ⭐Circular progress bar ⭐Sortable timers ⭐Alarm and flash on completion ⭐Stopwatch ⭐Mutiple stopwatches at one page ⭐Keep going after refreshing website ⭐Sortable timers ⭐Able to lap and split ⭐Able to copy total time and laps info Time Progress Bar Export as image Switchable hide/show Pomodoro Timer Customable number of cycles Pause at any time Notification Sound Lightweight Light mode/Dark mode Quick link to other tools WHAT I LEARNT? A lot of new things about git How to write devlogs JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) ⭐Timer ⭐Stopwatch Time Progress Pomodoro Timer ⭐means new features of the previous ship", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 2, "ts": "2026-08-02T07:51:47Z", "hours": 22.0, "multiplier": 15.66, "payout": 346, "blessing": "neutral", "text": "WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Pomodoro Timer and a Time Progress Displayer. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Time Progress Bar ⭐Export as image ⭐Switchable hide/show ⭐Pomodoro Timer ⭐Customable number of cycles ⭐Pause at any time ⭐Notification Sound Lightweight ⭐Light mode/Dark mode ⭐Quick link to other tools ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about git JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) Time Progress Pomodoro Timer", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 3, "ts": "2026-07-15T07:24:47Z", "hours": 18.0, "multiplier": 7.76, "payout": 136, "blessing": "neutral", "text": "WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a beautiful, highly customizable Digital Clock. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features ⭐Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title ⭐Digital Clock ⭐12-hour / 24-hour format ⭐3 Font styles (Sans, Serif, Mono) ⭐Fullscreen mode (Header/Footer kept!) ⭐Smooth breathing colon animation automatically save in localStorage & url# Lightweight ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about Astro and NodeJS How to structure routes for multiple tools (Refactoring files) Advanced CSS (using global variables to adjust layout gaps dynamicly) REPLIES Thank you so much for the 115 stardust and the amazing feedback! I read every single review from Ship #2, and they helped me make this update so much better. 1. ABOUT MORE FEATURES Many suggested adding more tools or events. I turned the website into a Hub and built the Digital Clock as our second official tool! 2. ABOUT THE SCREENSHOT IN README Two reviewers mentioned adding screenshots. I’ve updated the README with fresh screenshots so people skimming through can see the UI instantly. TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif)", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 4, "ts": "2026-07-01T04:33:49Z", "hours": 13.0, "multiplier": 9.33, "payout": 115, "blessing": "neutral", "text": "WHAT I MADE/THINK? I made a long-term countdown timer for events. It’s really hard for me to build things in a way that is completely new to me. I’ve been stuck not only with programming languages but also with English. However, through this project (STARDANCE), though I didn’t create something really impressive, I think I learnt A LOT. Features Live Countdown Full mode ⭐Days mode Customizable ⭐Change Target Date ⭐Edit Event Title ⭐automatically save in localStorage & url# ⭐share btn Dark Mode UI ⭐means new features of the previous ship WHAT I LEARNT? basic GIT code basic HTML/CSS3/JS How to write DevLogs REPLIES I’ve read all the replies of the ship#1. And lots of them mentioned the same thing. Thanks to everyone who give me feedback. Hope there’s the better version of previous ships. 1. ABOUT CHANGEABLE TARGET Now you can pick any target date and even edit the event title right from the sidebar. 2. ABOUT LANGUAGE I’ve fully migrated the app to English now. 3. ABOUT DEVLOG I’ve leveled up my devlog game for this update—documented all the engineering details and bugs I fixed this time. TRY IT! 2027 New Year NC Finals Weekend US Open", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 5, "ts": "2026-06-16T15:10:14Z", "hours": 2.0, "multiplier": 2.98, "payout": 5, "blessing": "neutral", "text": "What I Made I made a Countdown Web App called “Tick Tock.” It shows the exact years, months, days, hours, minutes, and seconds left until January 1, 2027. What Was Challenging Calculating months and years was hard. Months have different days (28, 30, or 31), so I had to write smart JavaScript code to borrow days and keep the timer 100% accurate. What I Am Proud Of It Works!: Actually this is my first time using html to build a website. Clean Design: I fixed the layout bugs and made a dark-mode interface. How to Test It https://klhrd.github.io/TickTock/", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}]...
|
[{"post_id": 64186, "ts": "202 [{"post_id": 64186, "ts": "2026-09-08T12:37:49Z", "hours": 0.7658, "text": "Devlog 52: GitHub Pages Audio Path Resolution Fixes Absolute Repository Subpath Hardcoding Replaced environment variable dynamic paths ( import.meta.env.BASE_URL ) with direct base-path URLs ( '/TickTock/sounds/alarm.wav' ) in playAlarm() . i have no idea why that happened"}, {"post_id": 62827, "ts": "2026-09-06T11:02:52Z", "hours": 0.4825, "text": "Devlog 51: Asset Migration Asset Directory Migration Moved audio assets ( alarm.wav and notif.wav ) from the static /public/sounds/ directory into the source-managed asset pipeline at src/assets/sounds/ . Module Import & Bundler Integration Replaced hardcoded absolute URL paths ( \"/public/sounds/...\" ) with explicit ES module imports ( import alarmSoundUrl from '../assets/sounds/alarm.wav' and import notifSoundUrl from '../assets/sounds/notif.wav' ) across timer.js and pomodoro.js ."}, {"post_id": 62807, "ts": "2026-09-06T10:16:06Z", "hours": 1.0094, "text": "Devlog 50 Layout Refactoring Scroll Restructuring Shifted .stopwatch-container layout from vertical wrapping ( flex-wrap: wrap ) to a single-row horizontal scroll track ( flex-wrap: nowrap with overflow-x: auto )."}, {"post_id": 62744, "ts": "2026-09-06T08:02:07Z", "hours": 2.8789, "text": "Devlog 49: Lap Data Export Plaintext Lap Data Serialization formatLapsOutput : a dedicated text formatter that converts active stopwatch data into structured tab-separated values (TSV) suitable for copying. Async Clipboard Copy Logic Implemented an async wrapper using navigator.clipboard.writeText() with built-in error handling ( try/catch ) and user alerts for unsupported environments or clipboard permission rejections. Interactive Copy Feedback UI Wired copyBtn click events to trigger text copying and dynamically update the button icon ( check or error ) and theme accent color."}, {"post_id": 60192, "ts": "2026-09-02T12:48:53Z", "hours": 1.0839, "text": "Devlog 48: DOM Selector Bugfixes & Homepage Quick Access DOM Query Selector & Reference Repairs Updated querySelector in updateListedStopwatch from target class .listed-stopwatch-demo to parent wrapper .listed-stopwatch[data-id=\"...\"] , resolving element lookup failures during live updates. Homepage Integrated direct links and dedicated preview cards for the Stopwatch application into index.astro and BaseLayout.astro ."}, {"post_id": 59556, "ts": "2026-09-01T13:21:58Z", "hours": 0.6392, "text": "Devlog 47: Pause Compensation Pause Duration Offset Implemented pauseDuration calculation Date.now() - pauseStartTime during resume actions status === \"paused\" . Shifted all existing lap timestamps lap.endTime += pauseDuration forward to subtract paused time intervals. State-Aware Timestamp Resolution Standardized timestamp evaluation across renderers handleLap , renderListedStopwatch , updateListedStopwatch , and updateCardUI using ternary state checks: const now = stopwatch . status === \" running \" ? Date . now () : stopwatch . pauseStartTime ;"}, {"post_id": 58906, "ts": "2026-08-31T13:58:04Z", "hours": 1.9278, "text": "Devlog 46: UI Fine-tuning & Timing Logic Optimization Lap Calculations -Replaced laps.forEach with for (let j = 0; j <= i; j++) to ensure cumulative total times ( totalMS ) strictly correspond to the current lap index. Layout Enhanced formatTime() rendering logic by applying inline styles width , transform: scaleX(0.8) , text-align: center to dynamic span elements, preventing font-width shifting during rapid ticker updates. Dynamic Rendering Integrated updateListedStopwatch() into the global interval loop, enabling sidebar preview labels to tick synchronously with active main cards. Optimized state updates to target individual time elements instead of triggering full list re-renders on every ticker frame. Added optional chaining laps?.[0]?.startTime across rendering pipelines to prevent runtime exceptions when initializing empty stopwatches."}, {"post_id": 57947, "ts": "2026-08-30T08:58:55Z", "hours": 3.6403, "text": "Devlog 45: Initial Stopwatch Logic & Dynamic State Scaffolding Core State & Lap Data Architecture Designed a stopwatch schema tracking dynamic state ( idle | running | paused ) and an array of individual lap records ( laps ). Streamlined time calculation to compute elapsed milliseconds dynamically directly using timestamps ( Date.now() - lap.startTime ), eliminating redundant accumulator fields like startTime or elapsedTime . Interactive Handlers & Lifecycle Operations Implemented core lifecycle handlers: handleStart , handlePause , handleReset , handleLap , and handleDelete . Integrated updateCardUI and updateCardBtns to reflect running, paused, and idle UI visual feedback dynamically. Built active DOM updates for lap histories inside updateCardLapGrid using index-based duration summation for lap and total times. Enabled global runtime updates via startGlobalTick() timer intervals and list reordering via handleMoveStopwatch() ."}, {"post_id": 57110, "ts": "2026-08-29T06:40:01Z", "hours": 1.7286, "text": "Devlog 44: Stopwatch Layout Template & Layout Migration Ported side-menu and main container structures from Timer to Stopwatch layout ( index.astro ). Structured sidebar elements: .stopwatch-adding-action-btn and .stopwatch-list-container for dynamic item injection. Added template placeholders ( #listed-stopwatch-template and #stopwatch-card-template ). Stopwatch Card & Lap Data Display Integrated core display components: .stopwatch-text and .stopwatch-text-sub . Created interactive control group ( .stopwatch-card-action-btn ) supporting Start, Pause, Replay, and Lap actions. Designed a 3-column CSS Grid table ( .stopwatch-lap-container ) to organize lap metrics ( i , lap , total )."}, {"post_id": 55411, "ts": "2026-08-27T06:58:34Z", "hours": 0.3914, "text": "Devlog 43: Timer Integration & Navigation Update Navigation & Home Page Integration Added Timer card entry to the main landing page ( tool-card layout with hourglass Material symbol). Added direct Timer link to the global navigation bar in BaseLayout.astro . Feature Branch Merge Merged feature/timer-main into main , bringing in the new /timer page route, timer.js logic, sound assets ( alarm.wav ), and updated layout components. YEAYYY"}, {"post_id": 55007, "ts": "2026-08-26T13:10:35Z", "hours": 1.7997, "text": "Devlog 42: Timer Reordering & List Re-Sorting Reordering UI Controls Added .sort-action control group with .sort-up and .sort-down arrow buttons to the template layout. Dynamic Array Mutation & Re-rendering Implemented handleMoveTimer(id, direction) to handle array element swapping with upper and lower boundary bounds checks. Bound click handlers in renderListedTimer() to execute reordering operations, trigger LocalStorage updates, and instantly re-render the UI layout via renderAll() ."}, {"post_id": 54924, "ts": "2026-08-26T04:43:44Z", "hours": 0.4733, "text": "Devlog 41: Dual-Text Display & Running Animation Sub-Text Total Duration Display Added .timer-text-sub element inside the ring container to preserve and display the initial totalSeconds value. Styled sub-text using lighter font weights and var(--text-muted) . Dynamic Running Visual Effects Added .is-running state toggle based on timer.status === \"running\" . Implemented @keyframes timer-text-flash pulsing animation to provide continuous visual feedback while countdown is active."}, {"post_id": 54897, "ts": "2026-08-26T03:33:47Z", "hours": 1.2658, "text": "Devlog 40: Alarm Audio & LocalStorage Independent Alarm Audio Handling new Audio() allowing each finished timer to play independent looping sound effects concurrently. Bound alarm termination directly to handleReset() and handleDelete() . LocalStorage Serialization Fixes Sanitized timer state object before serialization in saveTimers() by stripping transient DOM/Audio references ( alarmAudio ) to prevent JSON stringification crashes. Added type validation ( typeof alarmAudio.pause === \"function\" ) inside stopAlarm() to prevent runtime TypeError issues during state rehydration. Post-Reload Alarm & Visual Sync Updated renderAll() to resume alarm sound playback and background pulse animation for ended timers across page reloads. Cleared endTime correctly during timer reset to normalize state lifecycle. alarm.wav Using LMMS to create alarm.wav for the alarming when timer.status===\"ended\" ."}, {"post_id": 54221, "ts": "2026-08-25T03:40:02Z", "hours": 0.5936, "text": "Devlog 39: Smooth Action Button Transitions Button Collapse & Spacing Animate Added max-width , margin: 0 , and padding: 0 constraints to .is-hidden to smoothly collapse hidden buttons without leaving blank layout gaps. Expanded base state with explicit max-width boundary to allow width-based CSS transitions. much smoother ♪(´▽`)"}, {"post_id": 53651, "ts": "2026-08-24T09:46:13Z", "hours": 4.4989, "text": "Devlog 38: Multi-Timer Logic & Bug Fixes JS Managed multi-timer state using plain object arrays. Implemented saveTimers() and loadTimers() for LocalStorage persistence. Linked input fields with setupArrowBtns() to handle unit value increment and decrement bounds. Cloned <template> elements to dynamically generate sidebar list items and main cards via renderAll() . Added item deletion logic via handleDelete() to update state and UI. Established a startGlobalTick() loop running every 200ms using endTime offsets to prevent background tab drift. Calculated SVG circle strokeDashoffset dynamically based on remaining time ratios. Debugging & UI Patching Placing <template> tags inside slot=\"template-content\" . Adding missing id=\"timer-container\" . .textContent.textContent to .textContent Data.now() to Date.now() . timers.status to timer.status . finally got multi-timer state and progress rings syncing properly… bugs fixed and back to smooth sailing…"}, {"post_id": 52458, "ts": "2026-08-22T16:09:04Z", "hours": 7.2022, "text": "Devlog 37: Multi-Timer UI Layout & Input Controls Form Inputs & Adjustments Built HH/MM/SS number input boxes with range limits and zero-padding logic on blur. Implemented stepper adjustment buttons for quick time value tweaking. Sidebar Timer List Layout Added sidebar timer list container to preview user-created countdown items. Integrated quick action delete buttons for item removal. Main Dashboard Circular Timer Constructed countdown card layout featuring SVG dynamic progress ring. Centered time readout using tabular-nums formatting to eliminate number jitter. Action Control Group Laid out card control buttons including play, pause, and replay. the ui was so tiring… i DID remember to open a new branch (feature/timer-main) …"}, {"post_id": 39335, "ts": "2026-08-02T07:50:09Z", "hours": 0.4922, "text": "Devlog 36: Update Docs & Merge Update Docs Readme: Add the links of the new tools Ship#4: Write Ship#4.md Merge!!!!! Merge feature/pomodoro into main Fortunately no error poping out!"}, {"post_id": 39323, "ts": "2026-08-02T07:15:21Z", "hours": 0.8742, "text": "Devlog 35: Pomodoro State Transition & Auto-Loop Refactoring Core Logic & State Fixes Auto-Phase Transition Fix : Resolved state lock ( status: 'running' ) preventing automatic transition from Focus to Break. Added explicit status resetting in handlePhaseEnd before invoking startTimer . Timer Precision : Replaced Math.round with Math.ceil in countdown logic to eliminate early sound triggers caused by rounding errors. Timestamp Recalibration : Implemented dynamic endTime re-calculation when switching modes ( work ↔ break ) to maintain state consistency."}, {"post_id": 39287, "ts": "2026-08-02T05:00:19Z", "hours": 2.2125, "text": "Devlog 34: Pomodoro Core Timer & Segmented Timeline Integration Features Implemented static audio notification system via HTML5 Audio API targeting public/sounds/notification.mp3 . Architecture & State Management Implemented timestamp delta verification ( endTime - Date.now() ) to maintain countdown accuracy during background tab throttling or page reloads. Decoupled primary control actions across main page and sidebar controls ( #menu-start-btn , #cycles-input ). Bug Fixes & Refactoring Fixed ReferenceError during event initialization by enforcing state argument scoping within bindEvents . Refactored loadStateFromLocalStorage parsing logic to filter \"undefined\" string literals and clear corrupted cache gracefully."}, {"post_id": 37493, "ts": "2026-07-30T08:56:03Z", "hours": 4.0386, "text": "Devlog 33: Pomodoro Segmented Timeline & Layout Integration Segmented Timeline Layout Integrated BaseLayout slots for the new Pomodoro page, separating sidebar settings from the main dashboard. Built a visual segmented timeline ( .timeline-track ) with flex-proportional work/break segments and a dynamic progress pin ( .timeline-pin ). Core Logic & State Setup Refactored state object fields ( workDuration , breakDuration , timeRemaining ) to ensure clean state initialization. Added timestamp delta checking on startup to preserve accurate remaining time across page reloads or background tabs."}, {"post_id": 36218, "ts": "2026-07-28T04:48:53Z", "hours": 0.3056, "text": "Devlog 32: Dynamic Canvas Aspect Ratio Calculation Features & Refactoring Implemented dynamic aspect ratio calculation for PNG exports ( Height = 140 * Count + 180 ). Applied responsive auto-scaling for .export-canvas to ensure optimal vertical spacing regardless of selected cards count. Merged feature/export-image branch into main after verifying clean template rendering and correct node referencing."}, {"post_id": 36205, "ts": "2026-07-28T04:19:06Z", "hours": 2.29, "text": "Devlog 31: Template Canvas Architecture & Reference Refactoring Independent Canvas Architecture Replaced direct DOM manipulation of live dashboard elements with a dedicated, off-screen template canvas ( .export-canvas ). Cloned active .progress-card elements into an isolated container ( .export-cards-holder ), ensuring the on-screen UI remains completely untouched and non-flickering during image generation. Moved aspect ratio, high-resolution dimensions (600x600), padding, and font-scaling rules directly into CSS for clean separation of concerns. Error Fixes & Cleanup Fixed ReferenceError caused by leftover references to targetContainer and stampEl inside initExportImageFeature . Updated html2canvas target from main dashboard container to the temporary canvasEl . Streamlined fallback DOM cleanup logic inside the try...catch block to guarantee off-screen elements are properly garbage collected."}, {"post_id": 35003, "ts": "2026-07-26T04:47:24Z", "hours": 1.3903, "text": "Devlog 30: Image Export Feature & Template Refactoring Image Export Feature Integrated html2canvas library to enable one-click PNG image export of the active progress dashboard. Added an “Export as Image” button inside the custom sidebar menu with dedicated styling. Handled theme-aware background rendering by dynamically querying computed global CSS variables ( --bg-app ). DOM Template & Dynamic Watermark Refactored dynamic watermark creation using the HTML <template> element ( #export-watermark-template ), cleanly separating DOM structure from JavaScript execution logic. Configured dynamic timestamps using now.toLocaleString() to inject real-time snapshot dates and times into exported images. Added ignoreElements filtering in html2canvas to prevent unchecked/hidden .progress-card elements from creating top/bottom visual gaps in exported images. Bug Fixes & Refactor Fixed a TypeError on insertBefore / appendChild by referencing clone.firstElementChild to extract the correct Element Node from DocumentFragment . Resolved HTML/JS ID typos ( export-watermark-template ) and method call mismatches to ensure reliable script execution."}, {"post_id": 33941, "ts": "2026-07-24T08:29:42Z", "hours": 0.9675, "text": "Devlog 29: URL Hash Sync, LocalStorage Persistence & Universal Share Event URL & State Persistence Integrated URL Hash ( #year,month,... ) and localStorage synchronization into time-progress.js to preserve users’ toggle preferences across reloads and shares. Added a hashchange event listener to ensure UI check states dynamically update when users use browser navigation (Back/Forward). Centralized Layout Share Event Refactored the #share-menu-btn event listener into BaseLayout.astro , eliminating duplicate share logic across individual tool pages. Leveraged document.title dynamically to provide clean, contextual titles for native Web Share API and clipboard copy fallbacks."}, {"post_id": 33891, "ts": "2026-07-24T05:26:11Z", "hours": 1.0658, "text": "Devlog 28: Layout Overflow Fixes and UI Polish Layout & Scrollbar Stability Added scrollbar-gutter: stable to html in global.css to reserve vertical scrollbar space, preventing horizontal overflow caused by layout reflow. Applied overflow-x: hidden to main containers and .progress-card to prevent percentage tags and thumbs from clipping past container edges at 100%. CSS Rule Corrections Fixed CSS property error by setting .track width to 100% instead of unitless value. Fine-tuned progress bar wrapper styles to ensure smooth visual layout under both dark and light themes."}, {"post_id": 33283, "ts": "2026-07-23T02:15:39Z", "hours": 4.0661, "text": "Devlog 27: Time Progress Bar Feature Porting and JS Modular Refactoring Astro Slot Architecture & CSS Variable Integration Ported the standalone Time Progress Bar tool into the Astro layout system using designated slots ( #head , #header-content , #custom-menu , and #main-content ). Converted hardcoded hex colors into semantic global theme CSS variables ( --accent-color , --component-bg-standard , --text-heading ), ensuring native support for Dark and Light mode toggling. Replaced the dropdown filter with sidebar multi-select checkboxes for custom control over visible time progress units. JavaScript Modular Refactoring & Bug Fixes Decoupled single-script logic into dedicated, single-responsibility functions ( initSidebarToggles , calculateTimeProgress , updateTicksUI , updateProgressCardUI , and updateSingleCardUI ). Resolved JavaScript syntax errors, including missing function keywords, JS Automatic Semicolon Insertion (ASI) line-break issues on return statements, and uncalled Date method parentheses. Streamlined animation frame rendering by passing structured data from math calculations directly into UI updater functions."}, {"post_id": 32236, "ts": "2026-07-21T08:41:47Z", "hours": 0.8689, "text": "Devlog 26: Typo Correction and Expandable Directory Menu Typo Correction Fixed property naming error from –accent-contract-text to –accent-contrast-text in global CSS. Expandable Tools Directory Converted static directory links into a native component with smooth arrow rotation styling. Enabled server-side open status via open={isHomePage} in BaseLayout, defaulting to expanded on the home hub and collapsed on sub-tool pages."}, {"post_id": 31792, "ts": "2026-07-20T13:53:15Z", "hours": 1.3728, "text": "Devlog 25: Theme Toggle Implementation with Dark and Light Modes Light Theme Tokens Override Added :root[data-theme=“light”] in global.css to swap semantic theme variables for light background, borders, and high-contrast amber accents. Preserved existing component styles while smoothly transitioning body colors on theme switch. Sidebar Toggle Component and Logic Integrated a theme toggle button (#theme-toggle-btn) inside the BaseLayout header actions. Built persistent theme state logic using localStorage and system prefers-color-scheme detection. Used textContent on icon elements to dynamically switch between dark_mode and light_mode icons without type errors."}, {"post_id": 31215, "ts": "2026-07-19T13:11:06Z", "hours": 2.2447, "text": "Devlog 24: Color Architecture Refactoring with Design Tokens Two-Tier CSS Variables Global Tokens: Extracted hardcoded hex colors into primitive color names inside global.css. Theme Tokens: Created a semantic layer mapping elements like –bg-app and –accent-color directly to global tokens. Clean Codebase Update Component Styles: Replaced absolute colors across the layout, dashboard hub, countdown, and clock templates with var() variables. Script Alignment: Updated dynamic checkmark colors in JavaScript to read –accent-color instead of raw hex values. Future Scope: The design is now fully abstracted, meaning light mode implementation will only require token swapping without editing individual component code."}, {"post_id": 28755, "ts": "2026-07-15T06:57:18Z", "hours": 0.2736, "text": "Devlog 23: Global Branding Relocation and Logo Navigation Moving Title Label to BaseLayout Unifying the brand and improving UX Header Linkification : Refactored the main title-label (“TickTock”) out of individual page templates and integrated it directly into the global BaseLayout.astro . Back-to-Home UX : Wrapped the brand title in an <a> tag. Now, clicking the brand logo on any sub-tool instantly routes the user back to the home dashboard Hub, offering an intuitive, web-app-like navigation experience."}, {"post_id": 28732, "ts": "2026-07-15T05:22:01Z", "hours": 0.4186, "text": "Devlog 22: F11-Equivalent Fullscreen via Root Element Standardizing Fullscreen to document.documentElement Fixing disappearing layout elements The Pitfall : Previously, calling requestFullscreen() on the individual #clock-screen container caused the browser to isolate it from the DOM layout. This triggered default browser styling which rendered a pitch-black backdrop, and completely hid crucial layout parts like the header, footer, and side menu buttons. The Solution : We shifted the fullscreen API target from the sub-container directly to document.documentElement (the global <html> node). This aligns the button’s behavior perfectly with standard keyboard F11 fullscreen events. The Result : All global UI elements (header, footer, navigation) now scale smoothly and remain perfectly visible and interactive without any layout shifts or z-index clashing."}, {"post_id": 28188, "ts": "2026-07-14T09:57:23Z", "hours": 1.1836, "text": "Devlog 21: Architecture Normalization and Layout Fine-Tuning Directory Restructuring & Future-Proofing Preparing for scalability Digital Clock Renaming : To prevent future routing conflicts as the project scales, we successfully renamed clock.js to digital-clock.js and adjusted the main page path to /src/pages/digital-clock/ . This cleanly isolates this feature from upcoming modules like World Clock or Pomodoro Timer. Dependency Clean-up : Updated all asset paths and module script injections across the hub, fully standardizing the multi-tool routing structure under the /TickTock/ basePath. Layout Fixes with Global CSS Variables Resolving invalid CSS properties via JS injection Replacing Non-Standard Styles : Fixed a crucial layout issue where arbitrary if(...) conditions inside CSS were breaking colon component constraints. Dynamic Width Injection : Migrated the layout parameters directly into digital-clock.js using the standard document.documentElement.style.setProperty API. The .colon element now seamlessly reads the responsive --clock-colon-width CSS variable, adapting perfectly across Sans, Serif, and Mono configurations without any jumping side effects."}, {"post_id": 28133, "ts": "2026-07-14T07:16:36Z", "hours": 2.5658, "text": "Devlog 20: Settings Memory and Dynamic Sharing Adding Setting Memory and URL Sync Keeping your clock layout saved Persistent settings : The clock now remembers your favorite layout. Your choice of time format (12/24h) and font style is instantly saved directly to your browser’s local storage. URL sync : We linked these settings directly to the URL hash (like #12hr&mono ). When you refresh or load the page, your exact preferred theme loads up right away. Smart Sharing and Hub Integration Spreading the time and completing the hub Dynamic sharing : Added a share button that grabs your exact custom clock URL. It uses the Web Share API when available, and easily falls back to copying the link to your clipboard with a smooth checkmark animation on success. Connecting the dashboard : Linked the completed clock page to our homepage hub grid and updated the site layout, officially making TickTock a multi-tool station."}, {"post_id": 27501, "ts": "2026-07-13T03:45:40Z", "hours": 3.5772, "text": "Devlog 19: Building the Adaptable Digital Clock Implementing Native Date Formatting Problem : The clock header needed to show the full current date (e.g., “Sunday, July 12, 2026”) dynamically without taxing browser performance or importing heavy external date libraries. Solution : Added a #date-label placeholder to the template and used the native JavaScript toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }) inside the main runtime loop to render lightweight, perfectly formatted timestamps on every update. Creating Fluid Visual Oscillations via Math.sin() Problem : Traditional blinking colons look rigid and distracting, failing to deliver a premium, organic feel for an active time-management tool. Solution : Avoided simple CSS toggles and leveraged a true trigonometric formula inside a requestAnimationFrame loop. By mapping high-precision timestamps through Math.sin() , the opacity gracefully curves between 0.2 and 1.0 , producing a perfectly smooth, wave-like breathing animation. Binding Custom Display and Layout Controls Problem : The interface required instant controls for 12/24-hour formats, font adjustments, and a standalone full-screen view while managing layout side effects. Solution : Wired up event listeners to modify global runtime states and inline CSS font families on the fly. Integrated the HTML5 Fullscreen API onto the #clock-screen element, backed by a global fullscreenchange listener to seamlessly catch manual ESC escapes and keep the toggle button states perfectly in sync."}, {"post_id": 26388, "ts": "2026-07-11T04:39:33Z", "hours": 0.4408, "text": "Devlog 18: Adding Hub Sharing Functionality Integrating Client-Side Script Safely Implementing the Homepage Share Button Problem : The dashboard needed a simple button to share the current hub URL, but running browser APIs directly could break Astro’s static site generation (SSG) compiler. Solution : Added an inline <script is:inline> block to the index page. This bypasses the server-side build process and safely binds the sharing and clipboard logic only when the page loads in the user’s browser."}, {"post_id": 25792, "ts": "2026-07-10T07:52:27Z", "hours": 1.6289, "text": "Devlog 17: Project Hub and README Expansion Moving from a Single Page to a Tool Hub Goal : Transformed TickTock from a single countdown page into a comprehensive time-management utility hub powered by Astro. Implementation : Created a main dashboard page ( src/pages/index.astro ) to serve as the gateway for current and future time tools, using a shared layout for a consistent user experience. Adding Future Roadmap and Project Documentation Goal : Wrote a complete README.md to document the new project architecture, local testing steps, and automated GitHub Pages deployment. Future Vision : Updated the repository roadmap to announce upcoming tools built for the Hack Club Stardance event, including a Pomodoro Timer, World Clock Board, Minimalist Timer, and Time Progress Bars."}, {"post_id": 24763, "ts": "2026-07-08T15:29:37Z", "hours": 1.7703, "text": "Devlog 16: Dashboard Layout Fixes Fixing Layout and Compression Issues Compressed Card Icons Problem : The card icons shrank and deformed when the screen size changed. Solution : Added flex-shrink: 0; to the icon class to force them to keep their correct size. Cards Stacking Vertically Problem : The tool cards unexpectedly stacked into a narrow, single column right in the middle of the screen. Even though there was plenty of empty space on both sides of the desktop browser, the grid refused to expand horizontally and display the cards side-by-side. Troubleshooting : The grid’s layout formula was correctly set to repeat(auto-fit, minmax(250px, 1fr)) , which should have allowed multiple columns. However, the parent container ( .home-container ) was set to display: flex with align-items: center . In a vertical Flexbox layout, this alignment forces child elements like the grid to shrink to their absolute minimum width based on content, instead of filling the screen. To make matters worse, a strict max-width: 300px; was hardcoded onto the .tool-grid . Since two cards plus their gaps required at least 525px to sit side-by-side, the 300px restriction made it mathematically impossible for the browser to create a second column. Solution : Removed the restrictive max-width: 300px; from the grid and replaced it with a generous max-width: 1200px; to allow proper breathing room on large screens. Added width: 100%; to the grid class, forcing the grid container to break out of the Flexbox compression and stretch completely across the parent container. This allowed the responsive auto-fit engine to finally see the available width and cleanly arrange the cards into multiple columns. Fixing Grid Spacing and Syntax Errors Layout Breaking Off-Screen Problem : The grid expanded past the screen edges and cut off the card content. Solution : Added box-sizing: border-box; to the main container so that padding is counted inside the total width. Broken Units and Side Scrollbars Problem : An annoying horizontal scrollbar appeared at the bottom of the page. Solution : Fixed a typo where width: 100sww; was written instead of 100svw , and added body { margin: 0; } to clear default browser spaces."}, {"post_id": 24045, "ts": "2026-07-07T10:37:16Z", "hours": 5.7283, "text": "Devlog 15 Phase 1: Creating the Skeleton and Splitting Components Overextending the Style Files The project started as a single page where all HTML, CSS, and JS lived together. When I created the unified BaseLayout.astro , I kept the old global.css . However, that file had specific styles just for the countdown page, which broke the layout of the new homepage. Cleaning Up Style Pollution To fix this, I moved the countdown-specific CSS directly into the <style> tag of the countdown page ( index.astro ). Astro automatically confines these styles to their own page, ensuring they no longer mess up the homepage layout. Phase 2: Fixing Astro’s Route Misinterpretation Keeping Scripts in the Wrong Folder I originally placed the logic script ( script.js ) inside the src/pages/countdown/ folder to keep it close to the page. During local testing, Astro threw an error saying there was no API route handler for that JavaScript file. Moving Scripts to a Dedicated Folder I learned that Astro treats every file inside src/pages/ as a public URL or an API route. To fix this, I moved the file to a new src/scripts/ folder and renamed it countdown.js , keeping the pages folder strictly for actual web pages. Phase 3: Resolving Build Crashes from File Names Using Special Characters in Names Inside my documentation folder, I named a development note file ship#2.md . When I ran npm run build , the entire build process crashed immediately with a path error. Removing the Broken Characters The build tool (Vite) treats the # symbol as a URL anchor link, which breaks file path reading. I renamed the file to ship2.md , and the system was able to parse the path and build successfully. Phase 4: Overcoming the Environment Conflict (Server vs. Client) Running Browser Code on the Server This was the biggest challenge. When I imported countdown.js into the page, the build failed multiple times, throwing errors like window is not defined and document is not defined . Protecting the Code with Environment Guards Astro runs pages on the server to generate static HTML during the build step. Because Node.js does not have browser features like window or document , the script crashed. I fixed this with two steps: I imported the script using the ?url suffix in Astro so the server only records its path instead of running it. I wrapped all the browser-specific logic inside a typeof window !== \"undefined\" check. This ensures the script stays quiet during the server build and only runs once it reaches the user’s browser."}, {"post_id": 19753, "ts": "2026-07-01T04:23:10Z", "hours": 0.8367, "text": "Devlog 14: Localization Migration and Pre-Ship Consolidation UI Text Internationalization Migrated all hardcoded multi-byte interface character arrays across template structures ( index.html ) and operational state modules ( script.js ) into standardized Western European typography strings. Refactored semantic definitions within input control placeholders and baseline reference containers to achieve uniform structural layout scaling under single-byte font rendering constraints. Documentation and Release Management Compiled a foundational system architectural reference ( README.md ) specifying setup logic, reactive routing hooks, and custom persistence implementations. Executed full client-side behavior validations on state-tracking components ahead of the definitive production deployment pipeline for Ship #2."}, {"post_id": 19164, "ts": "2026-06-30T12:38:15Z", "hours": 2.1061, "text": "Devlog 13: Native Sharing Integration and Address Synchronization Control Native Sharing and Fallback Mechanics Integrated a social propagation module ( #share-menu-btn ) inside the header actions block, utilizing the Web Share API to access native mobile distribution panels. Engineered an automated asynchronous clip fallback sequence that overrides processing blocks on unsupported desktop environments, programmatically duplicating host URL hashes via the navigator clipboard asset pool. Applied stateful visual interaction hints onto the interactive sharing interface, dynamically toggling system icons to verify action fulfillment before returning properties to base states. Hash Serialization and Router Interdependency Fixes Resolved an critical structural validation bug inside the initial state loader ( loadInitialState ) where an premature execution return statement truncated processing flows, preventing state restorations. Re-architected data assignment flows inside initialization cycles ( initTimer ), deploying window.history.replaceState() to inject fully compiled variable string parameters back into empty browser URI paths. Secured total address compliance across baseline entries, guaranteeing structural data layers are available to secondary network nodes even when sharing operations occur prior to custom value updates."}, {"post_id": 18227, "ts": "2026-06-29T09:35:11Z", "hours": 0.5422, "text": "Devlog 12: Fluid Typography and Viewport-Adaptive Interface Spacing Viewport-Proportional Layout Calibration Implemented fluid layout scaling mechanics across the primary text blocks utilizing the CSS clamp() function, anchoring layout metrics dynamically between absolute pixel boundaries and relative viewport height units ( vh ). Re-architected spacing margins below the core header display ( #event-label ) to smoothly scale inside an adaptive range ( clamp(5px, 2vh, 30px) ), optimizing structural vertical padding on shifting device orientations. Calibrated upper layout boundaries for the structural footer element ( #target-label ) using fluid scaling boundaries ( clamp(15px, 3vh, 40px) ), ensuring consistent geometric clear space relative to adjacent countdown blocks. Text Alignment and Flow Refactoring Transformed the target calendar description layer ( #target-label ) from inline formatting definitions into explicit block layout models ( display: block ), stabilizing custom spacing calculations and forcing uniform horizontal element boundaries. Enforced complete cross-axis block isolation by assigning absolute width restrictions ( width: 100% ) onto trailing description elements, smoothly pushing metadata strings down beneath the dynamic flexible tracking container."}, {"post_id": 18207, "ts": "2026-06-29T08:34:16Z", "hours": 1.9631, "text": "Devlog 11: Modular Display Mode Architecture and Layout Jitter Resolution Feature Implementation & State Persistence Introduced a feature toggle layout inside the sidebar control node, offering real-time transitions between comprehensive chronological breakdowns and solitary metric configurations. Wired state persistence modules utilizing the local browser data subsystem ( localStorage ) to preserve client display configurations across session cycles and application reboots. Updated the data ingestion routing logic ( loadInitialState ) to safely aggregate user layout states without stepping over parameter strings delivered via URL fragment references. Precision Calculation & Dynamic Interface Masking Integrated an isolated decimal extraction calculation routine within the interval processing tree ( updateTimer ) dedicated to managing strict single-unit tracking parameters. Configured programmatic style visibility switches across atomic timer components, enforcing clean element masking on non-applicable duration counters when single-unit modes trigger. Typographic Stabilization & Layout Shifting Mitigation Corrected a severe layout jitter anomaly inside flexible grid clusters caused by variable font character dimensions shifting container boundaries during fast string state invalidations. Implemented font-variant-numeric: tabular-nums to enforce strict monospaced numeral allocation, keeping external box dimensions static regardless of structural text mutations. Introduced a dynamic responsive structural modifier block ( .mode-single ) to adjust component paddings, implement generous baseline tracking, and elevate text sizing bounds when processing simplified metrics."}, {"post_id": 17619, "ts": "2026-06-28T14:25:59Z", "hours": 1.4517, "text": "Devlog 10: Structural File Extraction and Modular Synchronization Stability Code Base Decomposition and Externalization Refactored the unified codebase by isolating inline design frameworks and layout scripts into dedicated style.css and script.js internal resources. Streamlined index.html structure down to essential structural markup definitions, using external linkages to boost source reading efficiency and code maintainability. Character Processing and Stability Verification Verified text encoding boundaries across external routing changes to preserve multibyte text inputs (“目標日”, “目標”) without producing character distortion issues. Maintained responsive flex alignments and layout fluid bounds on smaller screens while decoupling runtime system layers."}, {"post_id": 16999, "ts": "2026-06-27T16:08:49Z", "hours": 1.4744, "text": "Devlog 09: Synchronization Bug Fixes and URL Component Decoding Argument Reference and Logic Rectification Corrected a ReferenceError inside the titleInput listener by swapping an un-sanitized token ( newDate ) with the valid, persistent variable targetString . Fixed an assignment error where a single operator ( if(newTitle=\"\") ) muted intended comparison logic, replacing it with a strict equality check ( newTitle === \"\" ). URL Normalization and Component Decoding Integrated decodeURIComponent() into loadInitialState() and the hashchange observer to prevent percent-encoded character corruption. Resolved text distortion for multibyte layouts (e.g., Chinese characters), ensuring continuous string fidelity across shared links. Established a default text fallback (“目標”) to secure interface rendering stability during empty input states."}, {"post_id": 14154, "ts": "2026-06-23T04:14:30Z", "hours": 0.9578, "text": "Devlog 08: Viewport Configuration and Responsive Layout Calibration Viewport Meta Integration and RWD Layering Integrated the standard responsive configuration tag <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> into the document structure header. Resolved a layout compression behavior where mobile rendering engines applied fallback desktop scaling parameters (typically a virtual width of 980px), forcing severe global downscaling on compact displays. Enabled native device pixel scale translations, forcing media container thresholds to evaluate against true hardware dimensions rather than high-density viewport projections. Fluid Grid and Token-Based Scaling Fixed an interface clipping issue where structural boundaries failed to dynamically contract on viewport widths below 600px. Activated the custom @media (max-width: 600px) breakpoint directives, downscaling internal flex container gaps from 15px to 10px and adjusting modular countdown component nodes for enhanced display symmetry. Re-calibrated proportional font metrics across mobile layouts, mapping secondary tracking units down to a structured 1.6rem baseline and bringing the primary title signature to an optimized 2rem boundary. Cross-Platform Interface Layout Fixes Restructured flex-wrap component mechanics within the core visualization container to smoothly adapt from unified desktop rows into multi-line mobile block grids. Eliminated persistent scrollbar overheads on handheld viewports by normalizing absolute coordinate assets and applying elastic percentage constraints across core elements."}, {"post_id": 13621, "ts": "2026-06-22T10:22:17Z", "hours": 0.3853, "text": "Devlog 07: URL Hash Routing Priority and Timer Encapsulation Debugging Feature and Priority Cascading Extended the state management architecture to support deep-linking properties using URL fragments (window.location.hash). Established a strict target resolution cascading hierarchy where URL fragment inputs take precedence over local user configuration memory, which in turn overrides the default fallback value (URL Hash > LocalStorage > “2027-01-01”). Implemented a regex filter pattern ( /^\\d{4}-\\d{2}-\\d{2}$/ ) to sanitize incoming window location string tokens prior to committing them to the execution state. Refactoring and State Synchronization Modularized individual timer logic fragments into a single initialization routine initTimer() . This routine synchronously updates text container parameters, binds default input values, clears residual interval clocks, and re-allocates tracking loops. Modified input element state transformation bindings to mirror newly elected target values into the URL fragment row (window.location.hash) concurrently with local system memory blocks. Resolution of Block Scope Diagnostics Scope Overlap Fix: Corrected a critical runtime ReferenceError located inside the initTimer() wrapper where repeating the let primitive on the timerId reference allocated a local block-scope variable that collided with pre-initialization clear routines. Removing the redundant declarative keyword reinstated proper execution. -Missing Invocation Fix: Appended an initial entry point declaration initTimer(targetString) to successfully boot up active countdown cycles on fresh page load sequences."}, {"post_id": 13112, "ts": "2026-06-21T13:27:59Z", "hours": 0.9197, "text": "Devlog 06: Sidebar Menu and Persistent LocalStorage Integration Requirements and Architecture Adopted the HTML5 semantic element to create a dedicated, off-screen sidebar panel for user controls, separating configuration options from the main countdown content. Integrated Google Material Icons stylesheet to render interactive trigger (“menu”) and dismissal (“close”) action elements. Implemented a native calendar interface using to capture target date modifications directly from the client view. Styling and Motion Mechanics Utilized fixed positioning (position: fixed) to pin the sidebar along the right viewport boundary, utilizing full height (100vh) to serve as a slide-out drawer. Applied transform: translateX(100%) to fully obscure the panel behind the right viewport edge by default, attaching a smooth CSS transition property (0.3s ease). Created a structural “.open” modifier class applied to the sidebar element (sidebar.open) that neutralizes the horizontal translation (translateX(0)) to bring the drawer into view upon click events. State Persistence via LocalStorage Refactored the global variable initialization to prioritize data retrieval from browser memory using localStorage.getItem(“targetDate”), ensuring fallback capability to the hardcoded default date string (“2027-01-01”) if empty. Bound a “change” event listener to the date input element. When a user updates the field, the new value is mirrored into localStorage under the unified key “targetDate”. Configured runtime updates where changing the input dynamically forces a complete recalculation of the timestamp integer and immediately restarts the global interval timer thread to prevent rendering stale countdown frames. Critical Bugs and Diagnostics Code Review Syntax Error Fix: Corrected an unescaped double-quote attribute typo inside the HTML element declaration where id=”“sidebar was breaking JavaScript’s DOM node selection lookup query. Selector Misalignment Fix: Resolved an animation breakdown where the “.open” conditional style rule was incorrectly targeted at the menu button instead of the sidebar wrapper element, preventing the slide-out sequence. Namespace Sync Fix: Addressed a string mismatch bug where initialization logic incorrectly requested the corrupted key string “targerDate” while event dispatchers stored mutations under “targetDate”, which consistently caused storage caching to break on reload."}, {"post_id": 13051, "ts": "2026-06-21T10:39:08Z", "hours": 0.5522, "text": "Devlog 05: Integrating Google Fonts Icons 1. Goal Implement a hamburger menu button by integrating Google Material Icons into the project. 2. Step 1 Implementation Added the Google Material Icons stylesheet link to the . Created a <button> containing a <span> with the material-icons class and the text “menu” to render the hamburger icon. Styled the button using CSS ( background: none , border: none ) to remove default browser styling and positioned it at the top-left corner using position: absolute ."}, {"post_id": 11692, "ts": "2026-06-19T01:41:54Z", "hours": 0.4172, "text": "Devlog 04: Dynamic Time Box VisibilityRequirement Hide time boxes that have a value of 0 to keep the UI clean, but prevent a box from hiding if a larger time unit still holds a value (e.g., if years > 0, months must not be hidden even if months == 0). Solution Implemented a cascading flag logic ( let hasValue = false ) executed from the largest unit (years) down to the smallest (minutes). Once any larger unit turns the flag true, all subsequent boxes remain visible regardless of their own value. Box elements are hidden dynamically using parentElement.style.display = \"none\" ."}, {"post_id": 10619, "ts": "2026-06-17T13:47:01Z", "hours": 0.6303, "text": "Devlog #2: Precision Countdown Algorithm Fixes Problem The previous countdown relied on dividing total seconds, which failed to calculate years and months accurately because real-world months have a variable number of days (28, 30, 31). Solution Shifted from pure division to a calendar-based object subtraction method. The system now calculates the differences for Y, M, D, H, M, S individually and applies a borrowing logic from the smallest unit up to the largest. It uses new Date(Y, M, 0).getDate() to dynamically fetch the exact number of days in the previous month when borrowing days. Logic Debunk: mo < 0 vs mo <= 0 The correct condition is mo < 0. The variable represents the difference between months. If mo equals 0, the target month and current month are the same, meaning no year needs to be borrowed. Using <= 0 would trigger a false borrow when months are identical, causing the month value to incorrectly jump by +12 and the year to decrease by 1. Bug Fixes Corrected the day borrowing condition from if (mo < 0) to if (d < 0). Fixed a typo where let m (minutes) was mistakenly subtracting now.getMonth() instead of now.getMinutes()."}, {"post_id": 10379, "ts": "2026-06-17T01:59:17Z", "hours": 0.3014, "text": "add some todos and changelog"}, {"post_id": 9955, "ts": "2026-06-16T14:11:15Z", "hours": 1.8083, "text": "the first project using html this year making a countdown timer"}]...
|
Title: Tick Tock by @ryderklh | Stardance
Devlogs Title: Tick Tock by @ryderklh | Stardance
Devlogs:
the first project using html this year making a countdown timer
add some todos and changelog
Devlog #2: Precision Countdown Algorithm Fixes Problem The previous countdown relied on dividing total seconds, which failed to calculate years and months accurately because real-world months have a variable number of days (28, 30, 31). Solution Shifted from pure division to a calendar-based object subtraction method. The system now calculates the differences for Y, M, D, H, M, S individually and applies a borrowing logic from the smallest unit up to the largest. It uses new Date(Y, M, 0).getDate() to dynamically fetch the exact number of days in the previous month when borrowing days. Logic Debunk: mo < 0 vs mo <= 0 The correct condition is mo < 0. The variable represents the difference between months. If mo equals 0, the target month and current month are the same, meaning no year needs to be borrowed. Using <= 0 would trigger a false borrow when months are identical, causing the month value to incorrectly jump by +12 and the year to decrease by 1. Bug Fixes Corrected the day borrowing condition from if (mo < 0) to if (d < 0). Fixed a typo where let m (minutes) was mistakenly subtracting now.getMonth() instead of now.getMinutes().
Devlog 04: Dynamic Time Box VisibilityRequirement Hide time boxes that have a value of 0 to keep the UI clean, but prevent a box from hiding if a larger time unit still holds a value (e.g., if years > 0, months must not be hidden even if months == 0). Solution Implemented a cascading flag logic ( let hasValue = false ) executed from the largest unit (years) down to the smallest (minutes). Once any larger unit turns the flag true, all subsequent boxes remain visible regardless of their own value. Box elements are hidden dynamically using parentElement.style.display = "none" .
Devlog 05: Integrating Google Fonts Icons 1. Goal Implement a hamburger menu button by integrating Google Material Icons into the project. 2. Step 1 Implementation Added the Google Material Icons stylesheet link to the . Created a <button> containing a <span> with the material-icons class and the text “menu” to render the hamburger icon. Styled the button using CSS ( background: none , border: none ) to remove default browser styling and positioned it at the top-left corner using position: absolute .
Devlog 06: Sidebar Menu and Persistent LocalStorage Integration Requirements and Architecture Adopted the HTML5 semantic element to create a dedicated, off-screen sidebar panel for user controls, separating configuration options from the main countdown content. Integrated Google Material Icons stylesheet to render interactive trigger (“menu”) and dismissal (“close”) action elements. Implemented a native calendar interface using to capture target date modifications directly from the client view. Styling and Motion Mechanics Utilized fixed positioning (position: fixed) to pin the sidebar along the right viewport boundary, utilizing full height (100vh) to serve as a slide-out drawer. Applied transform: translateX(100%) to fully obscure the panel behind the right viewport edge by default, attaching a smooth CSS transition property (0.3s ease). Created a structural “.open” modifier class applied to the sidebar element (sidebar.open) that neutralizes the horizontal translation (translateX(0)) to bring the drawer into view upon click events. State Persistence via LocalStorage Refactored the global variable initialization to prioritize data retrieval from browser memory using localStorage.getItem(“targetDate”), ensuring fallback capability to the hardcoded default date string (“2027-01-01”) if empty. Bound a “change” event listener to the date input element. When a user updates the field, the new value is mirrored into localStorage under the unified key “targetDate”. Configured runtime updates where changing the input dynamically forces a complete recalculation of the timestamp integer and immediately restarts the global interval timer thread to prevent rendering stale countdown frames. Critical Bugs and Diagnostics Code Review Syntax Error Fix: Corrected an unescaped double-quote attribute typo inside the HTML element declaration where id=”“sidebar was breaking JavaScript’s DOM node selection lookup query. Selector Misalignment Fix: Resolved an animation breakdown where the “.open” conditional style rule was incorrectly targeted at the menu button instead of the sidebar wrapper element, preventing the slide-out sequence. Namespace Sync Fix: Addressed a string mismatch bug where initialization logic incorrectly requested the corrupted key string “targerDate” while event dispatchers stored mutations under “targetDate”, which consistently caused storage caching to break on reload.
Devlog 07: URL Hash Routing Priority and Timer Encapsulation Debugging Feature and Priority Cascading Extended the state management architecture to support deep-linking properties using URL fragments (window.location.hash). Established a strict target resolution cascading hierarchy where URL fragment inputs take precedence over local user configuration memory, which in turn overrides the default fallback value (URL Hash > LocalStorage > “2027-01-01”). Implemented a regex filter pattern ( /^\d{4}-\d{2}-\d{2}$/ ) to sanitize incoming window location string tokens prior to committing them to the execution state. Refactoring and State Synchronization Modularized individual timer logic fragments into a single initialization routine initTimer() . This routine synchronously updates text container parameters, binds default input values, clears residual interval clocks, and re-allocates tracking loops. Modified input element state transformation bindings to mirror newly elected target values into the URL fragment row (window.location.hash) concurrently with local system memory blocks. Resolution of Block Scope Diagnostics Scope Overlap Fix: Corrected a critical runtime ReferenceError located inside the initTimer() wrapper where repeating the let primitive on the timerId reference allocated a local block-scope variable that collided with pre-initialization clear routines. Removing the redundant declarative keyword reinstated proper execution. -Missing Invocation Fix: Appended an initial entry point declaration initTimer(targetString) to successfully boot up active countdown cycles on fresh page load sequences.
Devlog 08: Viewport Configuration and Responsive Layout Calibration Viewport Meta Integration and RWD Layering Integrated the standard responsive configuration tag <meta name="viewport" content="width=device-width, initial-scale=1.0"> into the document structure header. Resolved a layout compression behavior where mobile rendering engines applied fallback desktop scaling parameters (typically a virtual width of 980px), forcing severe global downscaling on compact displays. Enabled native device pixel scale translations, forcing media container thresholds to evaluate against true hardware dimensions rather than high-density viewport projections. Fluid Grid and Token-Based Scaling Fixed an interface clipping issue where structural boundaries failed to dynamically contract on viewport widths below 600px. Activated the custom @media (max-width: 600px) breakpoint directives, downscaling internal flex container gaps from 15px to 10px and adjusting modular countdown component nodes for enhanced display symmetry. Re-calibrated proportional font metrics across mobile layouts, mapping secondary tracking units down to a structured 1.6rem baseline and bringing the primary title signature to an optimized 2rem boundary. Cross-Platform Interface Layout Fixes Restructured flex-wrap component mechanics within the core visualization container to smoothly adapt from unified desktop rows into multi-line mobile block grids. Eliminated persistent scrollbar overheads on handheld viewports by normalizing absolute coordinate assets and applying elastic percentage constraints across core elements.
Devlog 09: Synchronization Bug Fixes and URL Component Decoding Argument Reference and Logic Rectification Corrected a ReferenceError inside the titleInput listener by swapping an un-sanitized token ( newDate ) with the valid, persistent variable targetString . Fixed an assignment error where a single operator ( if(newTitle="") ) muted intended comparison logic, replacing it with a strict equality check ( newTitle === "" ). URL Normalization and Component Decoding Integrated decodeURIComponent() into loadInitialState() and the hashchange observer to prevent percent-encoded character corruption. Resolved text distortion for multibyte layouts (e.g., Chinese characters), ensuring continuous string fidelity across shared links. Established a default text fallback (“目標”) to secure interface rendering stability during empty input states.
Devlog 10: Structural File Extraction and Modular Synchronization Stability Code Base Decomposition and Externalization Refactored the unified codebase by isolating inline design frameworks and layout scripts into dedicated style.css and script.js internal resources. Streamlined index.html structure down to essential structural markup definitions, using external linkages to boost source reading efficiency and code maintainability. Character Processing and Stability Verification Verified text encoding boundaries across external routing changes to preserve multibyte text inputs (“目標日”, “目標”) without producing character distortion issues. Maintained responsive flex alignments and layout fluid bounds on smaller screens while decoupling runtime system layers.
Devlog 11: Modular Display Mode Architecture and Layout Jitter Resolution Feature Implementation & State Persistence Introduced a feature toggle layout inside the sidebar control node, offering real-time transitions between comprehensive chronological breakdowns and solitary metric configurations. Wired state persistence modules utilizing the local browser data subsystem ( localStorage ) to preserve client display configurations across session cycles and application reboots. Updated the data ingestion routing logic ( loadInitialState ) to safely aggregate user layout states without stepping over parameter strings delivered via URL fragment references. Precision Calculation & Dynamic Interface Masking Integrated an isolated decimal extraction calculation routine within the interval processing tree ( updateTimer ) dedicated to managing strict single-unit tracking parameters. Configured programmatic style visibility switches across atomic timer components, enforcing clean element masking on non-applicable duration counters when single-unit modes trigger. Typographic Stabilization & Layout Shifting Mitigation Corrected a severe layout jitter anomaly inside flexible grid clusters caused by variable font character dimensions shifting container boundaries during fast string state invalidations. Implemented font-variant-numeric: tabular-nums to enforce strict monospaced numeral allocation, keeping external box dimensions static regardless of structural text mutations. Introduced a dynamic responsive structural modifier block ( .mode-single ) to adjust component paddings, implement generous baseline tracking, and elevate text sizing bounds when processing simplified metrics.
Devlog 12: Fluid Typography and Viewport-Adaptive Interface Spacing Viewport-Proportional Layout Calibration Implemented fluid layout scaling mechanics across the primary text blocks utilizing the CSS clamp() function, anchoring layout metrics dynamically between absolute pixel boundaries and relative viewport height units ( vh ). Re-architected spacing margins below the core header display ( #event-label ) to smoothly scale inside an adaptive range ( clamp(5px, 2vh, 30px) ), optimizing structural vertical padding on shifting device orientations. Calibrated upper layout boundaries for the structural footer element ( #target-label ) using fluid scaling boundaries ( clamp(15px, 3vh, 40px) ), ensuring consistent geometric clear space relative to adjacent countdown blocks. Text Alignment and Flow Refactoring Transformed the target calendar description layer ( #target-label ) from inline formatting definitions into explicit block layout models ( display: block ), stabilizing custom spacing calculations and forcing uniform horizontal element boundaries. Enforced complete cross-axis block isolation by assigning absolute width restrictions ( width: 100% ) onto trailing description elements, smoothly pushing metadata strings down beneath the dynamic flexible tracking container.
Devlog 13: Native Sharing Integration and Address Synchronization Control Native Sharing and Fallback Mechanics Integrated a social propagation module ( #share-menu-btn ) inside the header actions block, utilizing the Web Share API to access native mobile distribution panels. Engineered an automated asynchronous clip fallback sequence that overrides processing blocks on unsupported desktop environments, programmatically duplicating host URL hashes via the navigator clipboard asset pool. Applied stateful visual interaction hints onto the interactive sharing interface, dynamically toggling system icons to verify action fulfillment before returning properties to base states. Hash Serialization and Router Interdependency Fixes Resolved an critical structural validation bug inside the initial state loader ( loadInitialState ) where an premature execution return statement truncated processing flows, preventing state restorations. Re-architected data assignment flows inside initialization cycles ( initTimer ), deploying window.history.replaceState() to inject fully compiled variable string parameters back into empty browser URI paths. Secured total address compliance across baseline entries, guaranteeing structural data layers are available to secondary network nodes even when sharing operations occur prior to custom value updates.
Devlog 14: Localization Migration and Pre-Ship Consolidation UI Text Internationalization Migrated all hardcoded multi-byte interface character arrays across template structures ( index.html ) and operational state modules ( script.js ) into standardized Western European typography strings. Refactored semantic definitions within input control placeholders and baseline reference containers to achieve uniform structural layout scaling under single-byte font rendering constraints. Documentation and Release Management Compiled a foundational system architectural reference ( README.md ) specifying setup logic, reactive routing hooks, and custom persistence implementations. Executed full client-side behavior validations on state-tracking components ahead of the definitive production deployment pipeline for Ship #2.
Devlog 15 Phase 1: Creating the Skeleton and Splitting Components Overextending the Style Files The project started as a single page where all HTML, CSS, and JS lived together. When I created the unified BaseLayout.astro , I kept the old global.css . However, that file had specific styles just for the countdown page, which broke the layout of the new homepage. Cleaning Up Style Pollution To fix this, I moved the countdown-specific CSS directly into the <style> tag of the countdown page ( index.astro ). Astro automatically confines these styles to their own page, ensuring they no longer mess up the homepage layout. Phase 2: Fixing Astro’s Route Misinterpretation Keeping Scripts in the Wrong Folder I originally placed the logic script ( script.js ) inside the src/pages/countdown/ folder to keep it close to the page. During local testing, Astro threw an error saying there was no API route handler for that JavaScript file. Moving Scripts to a Dedicated Folder I learned that Astro treats every file inside src/pages/ as a public URL or an API route. To fix this, I moved the file to a new src/scripts/ folder and renamed it countdown.js , keeping the pages folder strictly for actual web pages. Phase 3: Resolving Build Crashes from File Names Using Special Characters in Names Inside my documentation folder, I named a development note file ship#2.md . When I ran npm run build , the entire build process crashed immediately with a path error. Removing the Broken Characters The build tool (Vite) treats the # symbol as a URL anchor link, which breaks file path reading. I renamed the file to ship2.md , and the system was able to parse the path and build successfully. Phase 4: Overcoming the Environment Conflict (Server vs. Client) Running Browser Code on the Server This was the biggest challenge. When I imported countdown.js into the page, the build failed multiple times, throwing errors like window is not defined and document is not defined . Protecting the Code with Environment Guards Astro runs pages on the server to generate static HTML during the build step. Because Node.js does not have browser features like window or document , the script crashed. I fixed this with two steps: I imported the script using the ?url suffix in Astro so the server only records its path instead of running it. I wrapped all the browser-specific logic inside a typeof window !== "undefined" check. This ensures the script stays quiet during the server build and only runs once it reaches the user’s browser.
Devlog 16: Dashboard Layout Fixes Fixing Layout and Compression Issues Compressed Card Icons Problem : The card icons shrank and deformed when the screen size changed. Solution : Added flex-shrink: 0; to the icon class to force them to keep their correct size. Cards Stacking Vertically Problem : The tool cards unexpectedly stacked into a narrow, single column right in the middle of the screen. Even though there was plenty of empty space on both sides of the desktop browser, the grid refused to expand horizontally and display the cards side-by-side. Troubleshooting : The grid’s layout formula was correctly set to repeat(auto-fit, minmax(250px, 1fr)) , which should have allowed multiple columns. However, the parent container ( .home-container ) was set to display: flex with align-items: center . In a vertical Flexbox layout, this alignment forces child elements like the grid to shrink to their absolute minimum width based on content, instead of filling the screen. To make matters worse, a strict max-width: 300px; was hardcoded onto the .tool-grid . Since two cards plus their gaps required at least 525px to sit side-by-side, the 300px restriction made it mathematically impossible for the browser to create a second column. Solution : Removed the restrictive max-width: 300px; from the grid and replaced it with a generous max-width: 1200px; to allow proper breathing room on large screens. Added width: 100%; to the grid class, forcing the grid container to break out of the Flexbox compression and stretch completely across the parent container. This allowed the responsive auto-fit engine to finally see the available width and cleanly arrange the cards into multiple columns. Fixing Grid Spacing and Syntax Errors Layout Breaking Off-Screen Problem : The grid expanded past the screen edges and cut off the card content. Solution : Added box-sizing: border-box; to the main container so that padding is counted inside the total width. Broken Units and Side Scrollbars Problem : An annoying horizontal scrollbar appeared at the bottom of the page. Solution : Fixed a typo where width: 100sww; was written instead of 100svw , and added body { margin: 0; } to clear default browser spaces.
Devlog 17: Project Hub and README Expansion Moving from a Single Page to a Tool Hub Goal : Transformed TickTock from a single countdown page into a comprehensive time-management utility hub powered by Astro. Implementation : Created a main dashboard page ( src/pages/index.astro ) to serve as the gateway for current and future time tools, using a shared layout for a consistent user experience. Adding Future Roadmap and Project Documentation Goal : Wrote a complete README.md to document the new project architecture, local testing steps, and automated GitHub Pages deployment. Future Vision : Updated the repository roadmap to announce upcoming tools built for the Hack Club Stardance event, including a Pomodoro Timer, World Clock Board, Minimalist Timer, and Time Progress Bars.
Devlog 18: Adding Hub Sharing Functionality Integrating Client-Side Script Safely Implementing the Homepage Share Button Problem : The dashboard needed a simple button to share the current hub URL, but running browser APIs directly could break Astro’s static site generation (SSG) compiler. Solution : Added an inline <script is:inline> block to the index page. This bypasses the server-side build process and safely binds the sharing and clipboard logic only when the page loads in the user’s browser.
Devlog 19: Building the Adaptable Digital Clock Implementing Native Date Formatting Problem : The clock header needed to show the full current date (e.g., “Sunday, July 12, 2026”) dynamically without taxing browser performance or importing heavy external date libraries. Solution : Added a #date-label placeholder to the template and used the native JavaScript toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }) inside the main runtime loop to render lightweight, perfectly formatted timestamps on every update. Creating Fluid Visual Oscillations via Math.sin() Problem : Traditional blinking colons look rigid and distracting, failing to deliver a premium, organic feel for an active time-management tool. Solution : Avoided simple CSS toggles and leveraged a true trigonometric formula inside a requestAnimationFrame loop. By mapping high-precision timestamps through Math.sin() , the opacity gracefully curves between 0.2 and 1.0 , producing a perfectly smooth, wave-like breathing animation. Binding Custom Display and Layout Controls Problem : The interface required instant controls for 12/24-hour formats, font adjustments, and a standalone full-screen view while managing layout side effects. Solution : Wired up event listeners to modify global runtime states and inline CSS font families on the fly. Integrated the HTML5 Fullscreen API onto the #clock-screen element, backed by a global fullscreenchange listener to seamlessly catch manual ESC escapes and keep the toggle button states perfectly in sync.
Devlog 20: Settings Memory and Dynamic Sharing Adding Setting Memory and URL Sync Keeping your clock layout saved Persistent settings : The clock now remembers your favorite layout. Your choice of time format (12/24h) and font style is instantly saved directly to your browser’s local storage. URL sync : We linked these settings directly to the URL hash (like #12hr&mono ). When you refresh or load the page, your exact preferred theme loads up right away. Smart Sharing and Hub Integration Spreading the time and completing the hub Dynamic sharing : Added a share button that grabs your exact custom clock URL. It uses the Web Share API when available, and easily falls back to copying the link to your clipboard with a smooth checkmark animation on success. Connecting the dashboard : Linked the completed clock page to our homepage hub grid and updated the site layout, officially making TickTock a multi-tool station.
Devlog 21: Architecture Normalization and Layout Fine-Tuning Directory Restructuring & Future-Proofing Preparing for scalability Digital Clock Renaming : To prevent future routing conflicts as the project scales, we successfully renamed clock.js to digital-clock.js and adjusted the main page path to /src/pages/digital-clock/ . This cleanly isolates this feature from upcoming modules like World Clock or Pomodoro Timer. Dependency Clean-up : Updated all asset paths and module script injections across the hub, fully standardizing the multi-tool routing structure under the /TickTock/ basePath. Layout Fixes with Global CSS Variables Resolving invalid CSS properties via JS injection Replacing Non-Standard Styles : Fixed a crucial layout issue where arbitrary if(...) conditions inside CSS were breaking colon component constraints. Dynamic Width Injection : Migrated the layout parameters directly into digital-clock.js using the standard document.documentElement.style.setProperty API. The .colon element now seamlessly reads the responsive --clock-colon-width CSS variable, adapting perfectly across Sans, Serif, and Mono configurations without any jumping side effects.
Devlog 22: F11-Equivalent Fullscreen via Root Element Standardizing Fullscreen to document.documentElement Fixing disappearing layout elements The Pitfall : Previously, calling requestFullscreen() on the individual #clock-screen container caused the browser to isolate it from the DOM layout. This triggered default browser styling which rendered a pitch-black backdrop, and completely hid crucial layout parts like the header, footer, and side menu buttons. The Solution : We shifted the fullscreen API target from the sub-container directly to document.documentElement (the global <html> node). This aligns the button’s behavior perfectly with standard keyboard F11 fullscreen events. The Result : All global UI elements (header, footer, navigation) now scale smoothly and remain perfectly visible and interactive without any layout shifts or z-index clashing.
Devlog 23: Global Branding Relocation and Logo Navigation Moving Title Label to BaseLayout Unifying the brand and improving UX Header Linkification : Refactored the main title-label (“TickTock”) out of individual page templates and integrated it directly into the global BaseLayout.astro . Back-to-Home UX : Wrapped the brand title in an <a> tag. Now, clicking the brand logo on any sub-tool instantly routes the user back to the home dashboard Hub, offering an intuitive, web-app-like navigation experience.
Devlog 24: Color Architecture Refactoring with Design Tokens Two-Tier CSS Variables Global Tokens: Extracted hardcoded hex colors into primitive color names inside global.css. Theme Tokens: Created a semantic layer mapping elements like –bg-app and –accent-color directly to global tokens. Clean Codebase Update Component Styles: Replaced absolute colors across the layout, dashboard hub, countdown, and clock templates with var() variables. Script Alignment: Updated dynamic checkmark colors in JavaScript to read –accent-color instead of raw hex values. Future Scope: The design is now fully abstracted, meaning light mode implementation will only require token swapping without editing individual component code.
Devlog 25: Theme Toggle Implementation with Dark and Light Modes Light Theme Tokens Override Added :root[data-theme=“light”] in global.css to swap semantic theme variables for light background, borders, and high-contrast amber accents. Preserved existing component styles while smoothly transitioning body colors on theme switch. Sidebar Toggle Component and Logic Integrated a theme toggle button (#theme-toggle-btn) inside the BaseLayout header actions. Built persistent theme state logic using localStorage and system prefers-color-scheme detection. Used textContent on icon elements to dynamically switch between dark_mode and light_mode icons without type errors.
Devlog 26: Typo Correction and Expandable Directory Menu Typo Correction Fixed property naming error from –accent-contract-text to –accent-contrast-text in global CSS. Expandable Tools Directory Converted static directory links into a native component with smooth arrow rotation styling. Enabled server-side open status via open={isHomePage} in BaseLayout, defaulting to expanded on the home hub and collapsed on sub-tool pages.
Devlog 27: Time Progress Bar Feature Porting and JS Modular Refactoring Astro Slot Architecture & CSS Variable Integration Ported the standalone Time Progress Bar tool into the Astro layout system using designated slots ( #head , #header-content , #custom-menu , and #main-content ). Converted hardcoded hex colors into semantic global theme CSS variables ( --accent-color , --component-bg-standard , --text-heading ), ensuring native support for Dark and Light mode toggling. Replaced the dropdown filter with sidebar multi-select checkboxes for custom control over visible time progress units. JavaScript Modular Refactoring & Bug Fixes Decoupled single-script logic into dedicated, single-responsibility functions ( initSidebarToggles , calculateTimeProgress , updateTicksUI , updateProgressCardUI , and updateSingleCardUI ). Resolved JavaScript syntax errors, including missing function keywords, JS Automatic Semicolon Insertion (ASI) line-break issues on return statements, and uncalled Date method parentheses. Streamlined animation frame rendering by passing structured data from math calculations directly into UI updater functions.
Devlog 28: Layout Overflow Fixes and UI Polish Layout & Scrollbar Stability Added scrollbar-gutter: stable to html in global.css to reserve vertical scrollbar space, preventing horizontal overflow caused by layout reflow. Applied overflow-x: hidden to main containers and .progress-card to prevent percentage tags and thumbs from clipping past container edges at 100%. CSS Rule Corrections Fixed CSS property error by setting .track width to 100% instead of unitless value. Fine-tuned progress bar wrapper styles to ensure smooth visual layout under both dark and light themes.
Devlog 29: URL Hash Sync, LocalStorage Persistence & Universal Share Event URL & State Persistence Integrated URL Hash ( #year,month,... ) and localStorage synchronization into time-progress.js to preserve users’ toggle preferences across reloads and shares. Added a hashchange event listener to ensure UI check states dynamically update when users use browser navigation (Back/Forward). Centralized Layout Share Event Refactored the #share-menu-btn event listener into BaseLayout.astro , eliminating duplicate share logic across individual tool pages. Leveraged document.title dynamically to provide clean, contextual titles for native Web Share API and clipboard copy fallbacks.
Devlog 30: Image Export Feature & Template Refactoring Image Export Feature Integrated html2canvas library to enable one-click PNG image export of the active progress dashboard. Added an “Export as Image” button inside the custom sidebar menu with dedicated styling. Handled theme-aware background rendering by dynamically querying computed global CSS variables ( --bg-app ). DOM Template & Dynamic Watermark Refactored dynamic watermark creation using the HTML <template> element ( #export-watermark-template ), cleanly separating DOM structure from JavaScript execution logic. Configured dynamic timestamps using now.toLocaleString() to inject real-time snapshot dates and times into exported images. Added ignoreElements filtering in html2canvas to prevent unchecked/hidden .progress-card elements from creating top/bottom visual gaps in exported images. Bug Fixes & Refactor Fixed a TypeError on insertBefore / appendChild by referencing clone.firstElementChild to extract the correct Element Node from DocumentFragment . Resolved HTML/JS ID typos ( export-watermark-template ) and method call mismatches to ensure reliable script execution.
Devlog 31: Template Canvas Architecture & Reference Refactoring Independent Canvas Architecture Replaced direct DOM manipulation of live dashboard elements with a dedicated, off-screen template canvas ( .export-canvas ). Cloned active .progress-card elements into an isolated container ( .export-cards-holder ), ensuring the on-screen UI remains completely untouched and non-flickering during image generation. Moved aspect ratio, high-resolution dimensions (600x600), padding, and font-scaling rules directly into CSS for clean separation of concerns. Error Fixes & Cleanup Fixed ReferenceError caused by leftover references to targetContainer and stampEl inside initExportImageFeature . Updated html2canvas target from main dashboard container to the temporary canvasEl . Streamlined fallback DOM cleanup logic inside the try...catch block to guarantee off-screen elements are properly garbage collected.
Devlog 32: Dynamic Canvas Aspect Ratio Calculation Features & Refactoring Implemented dynamic aspect ratio calculation for PNG exports ( Height = 140 * Count + 180 ). Applied responsive auto-scaling for .export-canvas to ensure optimal vertical spacing regardless of selected cards count. Merged feature/export-image branch into main after verifying clean template rendering and correct node referencing.
Devlog 33: Pomodoro Segmented Timeline & Layout Integration Segmented Timeline Layout Integrated BaseLayout slots for the new Pomodoro page, separating sidebar settings from the main dashboard. Built a visual segmented timeline ( .timeline-track ) with flex-proportional work/break segments and a dynamic progress pin ( .timeline-pin ). Core Logic & State Setup Refactored state object fields ( workDuration , breakDuration , timeRemaining ) to ensure clean state initialization. Added timestamp delta checking on startup to preserve accurate remaining time across page reloads or background tabs.
Devlog 34: Pomodoro Core Timer & Segmented Timeline Integration Features Implemented static audio notification system via HTML5 Audio API targeting public/sounds/notification.mp3 . Architecture & State Management Implemented timestamp delta verification ( endTime - Date.now() ) to maintain countdown accuracy during background tab throttling or page reloads. Decoupled primary control actions across main page and sidebar controls ( #menu-start-btn , #cycles-input ). Bug Fixes & Refactoring Fixed ReferenceError during event initialization by enforcing state argument scoping within bindEvents . Refactored loadStateFromLocalStorage parsing logic to filter "undefined" string literals and clear corrupted cache gracefully.
Devlog 35: Pomodoro State Transition & Auto-Loop Refactoring Core Logic & State Fixes Auto-Phase Transition Fix : Resolved state lock ( status: 'running' ) preventing automatic transition from Focus to Break. Added explicit status resetting in handlePhaseEnd before invoking startTimer . Timer Precision : Replaced Math.round with Math.ceil in countdown logic to eliminate early sound triggers caused by rounding errors. Timestamp Recalibration : Implemented dynamic endTime re-calculation when switching modes ( work ↔ break ) to maintain state consistency.
Devlog 36: Update Docs & Merge Update Docs Readme: Add the links of the new tools Ship#4: Write Ship#4.md Merge!!!!! Merge feature/pomodoro into main Fortunately no error poping out!
Devlog 37: Multi-Timer UI Layout & Input Controls Form Inputs & Adjustments Built HH/MM/SS number input boxes with range limits and zero-padding logic on blur. Implemented stepper adjustment buttons for quick time value tweaking. Sidebar Timer List Layout Added sidebar timer list container to preview user-created countdown items. Integrated quick action delete buttons for item removal. Main Dashboard Circular Timer Constructed countdown card layout featuring SVG dynamic progress ring. Centered time readout using tabular-nums formatting to eliminate number jitter. Action Control Group Laid out card control buttons including play, pause, and replay. the ui was so tiring… i DID remember to open a new branch (feature/timer-main) …
Devlog 38: Multi-Timer Logic & Bug Fixes JS Managed multi-timer state using plain object arrays. Implemented saveTimers() and loadTimers() for LocalStorage persistence. Linked input fields with setupArrowBtns() to handle unit value increment and decrement bounds. Cloned <template> elements to dynamically generate sidebar list items and main cards via renderAll() . Added item deletion logic via handleDelete() to update state and UI. Established a startGlobalTick() loop running every 200ms using endTime offsets to prevent background tab drift. Calculated SVG circle strokeDashoffset dynamically based on remaining time ratios. Debugging & UI Patching Placing <template> tags inside slot="template-content" . Adding missing id="timer-container" . .textContent.textContent to .textContent Data.now() to Date.now() . timers.status to timer.status . finally got multi-timer state and progress rings syncing properly… bugs fixed and back to smooth sailing…
Devlog 39: Smooth Action Button Transitions Button Collapse & Spacing Animate Added max-width , margin: 0 , and padding: 0 constraints to .is-hidden to smoothly collapse hidden buttons without leaving blank layout gaps. Expanded base state with explicit max-width boundary to allow width-based CSS transitions. much smoother ♪(´▽`)
Devlog 40: Alarm Audio & LocalStorage Independent Alarm Audio Handling new Audio() allowing each finished timer to play independent looping sound effects concurrently. Bound alarm termination directly to handleReset() and handleDelete() . LocalStorage Serialization Fixes Sanitized timer state object before serialization in saveTimers() by stripping transient DOM/Audio references ( alarmAudio ) to prevent JSON stringification crashes. Added type validation ( typeof alarmAudio.pause === "function" ) inside stopAlarm() to prevent runtime TypeError issues during state rehydration. Post-Reload Alarm & Visual Sync Updated renderAll() to resume alarm sound playback and background pulse animation for ended timers across page reloads. Cleared endTime correctly during timer reset to normalize state lifecycle. alarm.wav Using LMMS to create alarm.wav for the alarming when timer.status==="ended" .
Devlog 41: Dual-Text Display & Running Animation Sub-Text Total Duration Display Added .timer-text-sub element inside the ring container to preserve and display the initial totalSeconds value. Styled sub-text using lighter font weights and var(--text-muted) . Dynamic Running Visual Effects Added .is-running state toggle based on timer.status === "running" . Implemented @keyframes timer-text-flash pulsing animation to provide continuous visual feedback while countdown is active.
Devlog 42: Timer Reordering & List Re-Sorting Reordering UI Controls Added .sort-action control group with .sort-up and .sort-down arrow buttons to the template layout. Dynamic Array Mutation & Re-rendering Implemented handleMoveTimer(id, direction) to handle array element swapping with upper and lower boundary bounds checks. Bound click handlers in renderListedTimer() to execute reordering operations, trigger LocalStorage updates, and instantly re-render the UI layout via renderAll() .
Devlog 43: Timer Integration & Navigation Update Navigation & Home Page Integration Added Timer card entry to the main landing page ( tool-card layout with hourglass Material symbol). Added direct Timer link to the global navigation bar in BaseLayout.astro . Feature Branch Merge Merged feature/timer-main into main , bringing in the new /timer page route, timer.js logic, sound assets ( alarm.wav ), and updated layout components. YEAYYY
Devlog 44: Stopwatch Layout Template & Layout Migration Ported side-menu and main container structures from Timer to Stopwatch layout ( index.astro ). Structured sidebar elements: .stopwatch-adding-action-btn and .stopwatch-list-container for dynamic item injection. Added template placeholders ( #listed-stopwatch-template and #stopwatch-card-template ). Stopwatch Card & Lap Data Display Integrated core display components: .stopwatch-text and .stopwatch-text-sub . Created interactive control group ( .stopwatch-card-action-btn ) supporting Start, Pause, Replay, and Lap actions. Designed a 3-column CSS Grid table ( .stopwatch-lap-container ) to organize lap metrics ( i , lap , total ).
Devlog 45: Initial Stopwatch Logic & Dynamic State Scaffolding Core State & Lap Data Architecture Designed a stopwatch schema tracking dynamic state ( idle | running | paused ) and an array of individual lap records ( laps ). Streamlined time calculation to compute elapsed milliseconds dynamically directly using timestamps ( Date.now() - lap.startTime ), eliminating redundant accumulator fields like startTime or elapsedTime . Interactive Handlers & Lifecycle Operations Implemented core lifecycle handlers: handleStart , handlePause , handleReset , handleLap , and handleDelete . Integrated updateCardUI and updateCardBtns to reflect running, paused, and idle UI visual feedback dynamically. Built active DOM updates for lap histories inside updateCardLapGrid using index-based duration summation for lap and total times. Enabled global runtime updates via startGlobalTick() timer intervals and list reordering via handleMoveStopwatch() .
Devlog 46: UI Fine-tuning & Timing Logic Optimization Lap Calculations -Replaced laps.forEach with for (let j = 0; j <= i; j++) to ensure cumulative total times ( totalMS ) strictly correspond to the current lap index. Layout Enhanced formatTime() rendering logic by applying inline styles width , transform: scaleX(0.8) , text-align: center to dynamic span elements, preventing font-width shifting during rapid ticker updates. Dynamic Rendering Integrated updateListedStopwatch() into the global interval loop, enabling sidebar preview labels to tick synchronously with active main cards. Optimized state updates to target individual time elements instead of triggering full list re-renders on every ticker frame. Added optional chaining laps?.[0]?.startTime across rendering pipelines to prevent runtime exceptions when initializing empty stopwatches.
Devlog 47: Pause Compensation Pause Duration Offset Implemented pauseDuration calculation Date.now() - pauseStartTime during resume actions status === "paused" . Shifted all existing lap timestamps lap.endTime += pauseDuration forward to subtract paused time intervals. State-Aware Timestamp Resolution Standardized timestamp evaluation across renderers handleLap , renderListedStopwatch , updateListedStopwatch , and updateCardUI using ternary state checks: const now = stopwatch . status === " running " ? Date . now () : stopwatch . pauseStartTime ;
Devlog 48: DOM Selector Bugfixes & Homepage Quick Access DOM Query Selector & Reference Repairs Updated querySelector in updateListedStopwatch from target class .listed-stopwatch-demo to parent wrapper .listed-stopwatch[data-id="..."] , resolving element lookup failures during live updates. Homepage Integrated direct links and dedicated preview cards for the Stopwatch application into index.astro and BaseLayout.astro .
Devlog 49: Lap Data Export Plaintext Lap Data Serialization formatLapsOutput : a dedicated text formatter that converts active stopwatch data into structured tab-separated values (TSV) suitable for copying. Async Clipboard Copy Logic Implemented an async wrapper using navigator.clipboard.writeText() with built-in error handling ( try/catch ) and user alerts for unsupported environments or clipboard permission rejections. Interactive Copy Feedback UI Wired copyBtn click events to trigger text copying and dynamically update the button icon ( check or error ) and theme accent color.
Devlog 50 Layout Refactoring Scroll Restructuring Shifted .stopwatch-container layout from vertical wrapping ( flex-wrap: wrap ) to a single-row horizontal scroll track ( flex-wrap: nowrap with overflow-x: auto ).
Devlog 51: Asset Migration Asset Directory Migration Moved audio assets ( alarm.wav and notif.wav ) from the static /public/sounds/ directory into the source-managed asset pipeline at src/assets/sounds/ . Module Import & Bundler Integration Replaced hardcoded absolute URL paths ( "/public/sounds/..." ) with explicit ES module imports ( import alarmSoundUrl from '../assets/sounds/alarm.wav' and import notifSoundUrl from '../assets/sounds/notif.wav' ) across timer.js and pomodoro.js .
Devlog 52: GitHub Pages Audio Path Resolution Fixes Absolute Repository Subpath Hardcoding Replaced environment variable dynamic paths ( import.meta.env.BASE_URL ) with direct base-path URLs ( '/TickTock/sounds/alarm.wav' ) in playAlarm() . i have no idea why that happened
Ships:
What I Made I made a Countdown Web App called “Tick Tock.” It shows the exact years, months, days, hours, minutes, and seconds left until January 1, 2027. What Was Challenging Calculating months and years was hard. Months have different days (28, 30, or 31), so I had to write smart JavaScript code to borrow days and keep the timer 100% accurate. What I Am Proud Of It Works!: Actually this is my first time using html to build a website. Clean Design: I fixed the layout bugs and made a dark-mode interface. How to Test It https://klhrd.github.io/TickTock/
WHAT I MADE/THINK? I made a long-term countdown timer for events. It’s really hard for me to build things in a way that is completely new to me. I’ve been stuck not only with programming languages but also with English. However, through this project (STARDANCE), though I didn’t create something really impressive, I think I learnt A LOT. Features Live Countdown Full mode ⭐Days mode Customizable ⭐Change Target Date ⭐Edit Event Title ⭐automatically save in localStorage & url# ⭐share btn Dark Mode UI ⭐means new features of the previous ship WHAT I LEARNT? basic GIT code basic HTML/CSS3/JS How to write DevLogs REPLIES I’ve read all the replies of the ship#1. And lots of them mentioned the same thing. Thanks to everyone who give me feedback. Hope there’s the better version of previous ships. 1. ABOUT CHANGEABLE TARGET Now you can pick any target date and even edit the event title right from the sidebar. 2. ABOUT LANGUAGE I’ve fully migrated the app to English now. 3. ABOUT DEVLOG I’ve leveled up my devlog game for this update—documented all the engineering details and bugs I fixed this time. TRY IT! 2027 New Year NC Finals Weekend US Open
WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a beautiful, highly customizable Digital Clock. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features ⭐Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title ⭐Digital Clock ⭐12-hour / 24-hour format ⭐3 Font styles (Sans, Serif, Mono) ⭐Fullscreen mode (Header/Footer kept!) ⭐Smooth breathing colon animation automatically save in localStorage & url# Lightweight ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about Astro and NodeJS How to structure routes for multiple tools (Refactoring files) Advanced CSS (using global variables to adjust layout gaps dynamicly) REPLIES Thank you so much for the 115 stardust and the amazing feedback! I read every single review from Ship #2, and they helped me make this update so much better. 1. ABOUT MORE FEATURES Many suggested adding more tools or events. I turned the website into a Hub and built the Digital Clock as our second official tool! 2. ABOUT THE SCREENSHOT IN README Two reviewers mentioned adding screenshots. I’ve updated the README with fresh screenshots so people skimming through can see the UI instantly. TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif)
WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Pomodoro Timer and a Time Progress Displayer. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Time Progress Bar ⭐Export as image ⭐Switchable hide/show ⭐Pomodoro Timer ⭐Customable number of cycles ⭐Pause at any time ⭐Notification Sound Lightweight ⭐Light mode/Dark mode ⭐Quick link to other tools ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about git JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) Time Progress Pomodoro Timer
WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Timer and a Stopwatch. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Timer ⭐Mutiple timers at one page ⭐Keep going after refreshing website ⭐Circular progress bar ⭐Sortable timers ⭐Alarm and flash on completion ⭐Stopwatch ⭐Mutiple stopwatches at one page ⭐Keep going after refreshing website ⭐Sortable timers ⭐Able to lap and split ⭐Able to copy total time and laps info Time Progress Bar Export as image Switchable hide/show Pomodoro Timer Customable number of cycles Pause at any time Notification Sound Lightweight Light mode/Dark mode Quick link to other tools WHAT I LEARNT? A lot of new things about git How to write devlogs JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) ⭐Timer ⭐Stopwatch Time Progress Pomodoro Timer ⭐means new features of the previous ship...
|
1793090988.3792284
|
1793177388.3792284
|
|
24308
|
Micro:bit radio security by @Maxwell-l-hack | Star Micro:bit radio security by @Maxwell-l-hack | Stardance...
|
Maxwell-l-hack
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:24:22Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a program for micro:bits that uses their radio to show how you could channel hop on their frequencies with a scrambled next channel number using a pre-shared key. It was fairly challenging to get the channel hopping working smoothly and having them communicate so that they would change channels together and avoid the headache of changing at separate times. By the end, however, I was really quite proud of getting the channel hopping working and doing something more advanced to showcase what the micro:bit can do. Anybody who wants to try this you’ll need two micro:bits and I’m not sure if it will work on v1s as I only have v2s.", "repo": "https://github.com/Maxwell-L-hack/microbit-radio-security", "demo": "https://github.com/Maxwell-L-hack/microbit-radio-security/blob/main/README.md#video"}]...
|
[{"post_id": 63241, "ts": "202 [{"post_id": 63241, "ts": "2026-09-06T23:01:21Z", "hours": 3.1089, "text": "Finally got the infinite channel jumping working along with scrambling the channel number for greater security during transmission. Also added security features explanation to the README. And made a logo."}, {"post_id": 26937, "ts": "2026-07-12T00:49:23Z", "hours": 1.1983, "text": "Got stuck when I tried to make it continuously channel hop and send a scrambled channel number, so I made the How to use section in the README along with a flowchart."}, {"post_id": 24195, "ts": "2026-07-07T16:37:16Z", "hours": 1.9306, "text": "The micro:bits finally channel hop, only once, however debugging took longer than I expected."}, {"post_id": 18714, "ts": "2026-06-29T21:55:23Z", "hours": 1.8039, "text": "I was having difficulty getting the ‘ready’ message to either broadcast or get received, maybe both, I’m not sure. I commented out those parts to test if the radio was working, and it did. It will also pick up the ready signal even if reset."}, {"post_id": 14000, "ts": "2026-06-22T23:35:04Z", "hours": 1.4194, "text": "Attempted to get the micro:bits channel hopping, however the confirmation is either not getting sent or received (maybe both), but I’m not getting any errors."}]...
|
Title: Micro:bit radio security by @Maxwell-l-hack Title: Micro:bit radio security by @Maxwell-l-hack | Stardance
Devlogs:
Attempted to get the micro:bits channel hopping, however the confirmation is either not getting sent or received (maybe both), but I’m not getting any errors.
I was having difficulty getting the ‘ready’ message to either broadcast or get received, maybe both, I’m not sure. I commented out those parts to test if the radio was working, and it did. It will also pick up the ready signal even if reset.
The micro:bits finally channel hop, only once, however debugging took longer than I expected.
Got stuck when I tried to make it continuously channel hop and send a scrambled channel number, so I made the How to use section in the README along with a flowchart.
Finally got the infinite channel jumping working along with scrambling the channel number for greater security during transmission. Also added security features explanation to the README. And made a logo.
Ships:
I made a program for micro:bits that uses their radio to show how you could channel hop on their frequencies with a scrambled next channel number using a pre-shared key. It was fairly challenging to get the channel hopping working smoothly and having them communicate so that they would change channels together and avoid the headache of changing at separate times. By the end, however, I was really quite proud of getting the channel hopping working and doing something more advanced to showcase what the micro:bit can do. Anybody who wants to try this you’ll need two micro:bits and I’m not sure if it will work on v1s as I only have v2s....
|
1793098118.8315597
|
1793184518.8315597
|
|
56232
|
Slack-Bot-NEWSFED by @TheDoctor19 | Stardance
|
TheDoctor19
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:15:57Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ready to try, leave some feedback", "repo": "https://github.com/TheDoctor200/Flux-Newsfeed", "demo": "https://hackclub.enterprise.slack.com/archives/D0BUL8R4XEH"}]...
|
[{"post_id": 64174, "ts": "202 [{"post_id": 64174, "ts": "2026-09-08T12:12:46Z", "hours": 0.3447, "text": "finished the bot and its now deployed to nest :)"}, {"post_id": 63264, "ts": "2026-09-07T00:07:22Z", "hours": 0.9419, "text": "The Bot is finished and searches top 5 news of different topics."}, {"post_id": 62558, "ts": "2026-09-06T00:27:56Z", "hours": 0.3706, "text": "Flux-Newsfeed is set up, pong received, now I begin with integrating news feature and summary for quick news all around tech and start designing a bot logo."}]...
|
Title: Slack-Bot-NEWSFED by @TheDoctor19 | Stardan Title: Slack-Bot-NEWSFED by @TheDoctor19 | Stardance
Devlogs:
Flux-Newsfeed is set up, pong received, now I begin with integrating news feature and summary for quick news all around tech and start designing a bot logo.
The Bot is finished and searches top 5 news of different topics.
finished the bot and its now deployed to nest :)
Ships:
ready to try, leave some feedback...
|
1793116061.721093
|
1793202461.721093
|
|
32022
|
TungstenScore by @triple-colons | Stardance
|
triple-colons
|
1
|
12.0
|
138
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T11:57:36Z", "hours": 12.0, "multiplier": 11.09, "payout": 138, "blessing": "neutral", "text": "TungstenScore (v0.5.1) TungstenScore is a lightweight, open-source security assessment tool for Windows. It checks important Windows security settings and gives your system a security score, making it easier to understand how well your PC is protected and what could be improved. One of the hardest parts of building TungstenScore was working with the Windows APIs and reading security-related information from the Windows Registry. Different security features expose their state in different ways, so figuring out how to reliably retrieve and interpret that information was one of the biggest challenges during development. What I’m most proud of, though, is the structure of the project. TungstenScore still has a relatively small set of features, but I focused on making its foundation small, solid, and extensible. New security checks and other features can be added without having to redesign the entire application. Building that solid foundation is probably the part of this project I’m most proud of. TungstenScore is still under development, and I plan to add more security checks and improve the scoring system over time. You can now try TungstenScore yourself! You can download a pre-built version from my website, or download the source code and build it yourself using Cargo. Language note: English is not my native language, and I’m not very confident writing in English yet. I originally wrote this devlog in Korean and used an AI tool to help translate it into English.", "repo": "https://github.com/dw1210/TungstenScore", "demo": "https://dw1210.github.io/TungstenScore-website/"}]...
|
[{"post_id": 64166, "ts": "202 [{"post_id": 64166, "ts": "2026-09-08T11:47:36Z", "hours": 0.3094, "text": "devlog #7 (v0.5.1) I fixed some bugs for my first release!"}, {"post_id": 46804, "ts": "2026-08-14T09:49:41Z", "hours": 3.4444, "text": "Devlog #6 (v0.5.0) [Project Summary] TungstenScore is a Windows security assessment tool built with Rust. It evaluates your Windows system’s security posture and generates an overall security score. [Project Plan] Add security checks a. Firewall (Done) b. UAC (Done) c. TPM 2.0 (Added Today!) d. System integrity e. Hidden accounts f. Disk encryption g. etc. Add an auto-fix feature Add a GUI And more… [What I Did] I decided to remove the Windows version check from the roadmap because I couldn’t find a reliable way to retrieve the latest update info locally. I also don’t want the app to connect to the internet, as users might prefer an offline tool and maintaining a dedicated version API server would add extra overhead. Today, I added the TPM 2.0 check. It took a while to implement because this check requires admin privileges. I had to investigate what was causing the permission errors and figure out how to handle them gracefully. As a solution, I added an option to relaunch the app as administrator: If you type “Y”, the program will restart with admin privileges. If you type “N”, the check will be marked as “Requires administrator privileges” and excluded from the scan score (as shown in the attached screenshot). [Next Version Plan] I’ll be adding a check for hidden accounts. [Repo Link] https://github.com/dw1210/TungstenScore [Website] https://dw1210.github.io/TungstenScore-website/"}, {"post_id": 34533, "ts": "2026-07-25T10:21:33Z", "hours": 2.4397, "text": "Devlog #5 (v0.4.0) [Project Summary] ‘TungstenScore’ is a Windows security assessment tool built with Rust. It evaluates your Windows system security and generates an overall security score. [Project Plan] (No changes today) 1.Add security checks a. Firewall (Done) b. UAC (Done) c. Windows version d. Hidden accounts e. Etc. 2.Add an auto-fix feature 3.Add a GUI 4.And more… [What I Did] I refactored the code structure! It was a bit challenging, but I’ve separated the codebase into multiple files, as shown in the attached screenshot. I decided not to release version 0.4.0 yet since there aren’t any major feature updates. Additionally, I fixed some typos. [Next Version Plan] I’ll add a check for hidden accounts. [Repo Link] https://github.com/dw1210/TungstenScore [Website] https://dw1210.github.io/TungstenScore-website/"}, {"post_id": 33911, "ts": "2026-07-24T06:32:03Z", "hours": 0.9403, "text": "Devlog #4 (v0.3.0) [Project Summary] ‘TungstenScore’ is a Windows security assessment tool built with Rust. It checks your Windows system security and generates an overall security score. [Project Plan] Add security checks a. Firewall (Added today) b. UAC (Done) c. Windows version d. Hidden accounts e. Etc. Add an auto-fix feature Add a GUI And more… [What I Did] I finally managed to build the Firewall checker! It reads directly from the Windows Registry. Since I worked on a different computer that didn’t have Hackatime installed, my development time was only partially logged. [Next Version Plan] In the next release, I’ll fix some typos (my English isn’t great yet! 😅) and refactor the code structure for better maintainability. [Repo Link] https://github.com/dw1210/TungstenScore [Website] https://dw1210.github.io/TungstenScore-website/"}, {"post_id": 28289, "ts": "2026-07-14T13:31:54Z", "hours": 0.8381, "text": "Devlog #3 I made the TungstenScore website! https://dw1210.github.io/TungstenScore-website/"}, {"post_id": 27017, "ts": "2026-07-12T04:57:02Z", "hours": 3.1203, "text": "Devlog #2 (v0.2.0) [Project summary] ‘TungstenScore’ is a Windows security assessment tool written in Rust. This app checks the security of your Windows computer and scores it. [Project plan] Add some checks a. Firewall b.»UAC« - I made this today. c.Windows version d.Etc 2.Add an auto-fix feature 3.Add GUI 4.And more… [What I did] Initially, I attempted to add a Windows version checker but ran into issues. I’m going to find a new way to make this later. So, I made UAC checker and score system today! [Next version plan] In the next version, I’m going to make a Windows version checker and a companion website for the project! [Repo link] https://github.com/dw1210/TungstenScore"}, {"post_id": 26531, "ts": "2026-07-11T12:12:39Z", "hours": 1.315, "text": "Devlog #1 (v0.1.0) Today, I started building TungstenScore, a Windows security assessment tool written in Rust. This app checks the security of your Windows computer and scores it. [Project plan] Add some checks a.Firewall b.UAC c.Windows version d.Etc. Add an auto-fix feature Add GUI And more… [What I did] I created a basic CLI structure, including the menu system and the ‘About’ screen. [What I’m going to do] In the next version, I will add some security checks, such as verifying the firewall status. [Repo link] https://github.com/dw1210/TungstenScore"}]...
|
Title: TungstenScore by @triple-colons | Stardance Title: TungstenScore by @triple-colons | Stardance
Devlogs:
Devlog #1 (v0.1.0) Today, I started building TungstenScore, a Windows security assessment tool written in Rust. This app checks the security of your Windows computer and scores it. [Project plan] Add some checks a.Firewall b.UAC c.Windows version d.Etc. Add an auto-fix feature Add GUI And more… [What I did] I created a basic CLI structure, including the menu system and the ‘About’ screen. [What I’m going to do] In the next version, I will add some security checks, such as verifying the firewall status. [Repo link] https://github.com/dw1210/TungstenScore
Devlog #2 (v0.2.0) [Project summary] ‘TungstenScore’ is a Windows security assessment tool written in Rust. This app checks the security of your Windows computer and scores it. [Project plan] Add some checks a. Firewall b.»UAC« - I made this today. c.Windows version d.Etc 2.Add an auto-fix feature 3.Add GUI 4.And more… [What I did] Initially, I attempted to add a Windows version checker but ran into issues. I’m going to find a new way to make this later. So, I made UAC checker and score system today! [Next version plan] In the next version, I’m going to make a Windows version checker and a companion website for the project! [Repo link] https://github.com/dw1210/TungstenScore
Devlog #3 I made the TungstenScore website! https://dw1210.github.io/TungstenScore-website/
Devlog #4 (v0.3.0) [Project Summary] ‘TungstenScore’ is a Windows security assessment tool built with Rust. It checks your Windows system security and generates an overall security score. [Project Plan] Add security checks a. Firewall (Added today) b. UAC (Done) c. Windows version d. Hidden accounts e. Etc. Add an auto-fix feature Add a GUI And more… [What I Did] I finally managed to build the Firewall checker! It reads directly from the Windows Registry. Since I worked on a different computer that didn’t have Hackatime installed, my development time was only partially logged. [Next Version Plan] In the next release, I’ll fix some typos (my English isn’t great yet! 😅) and refactor the code structure for better maintainability. [Repo Link] https://github.com/dw1210/TungstenScore [Website] https://dw1210.github.io/TungstenScore-website/
Devlog #5 (v0.4.0) [Project Summary] ‘TungstenScore’ is a Windows security assessment tool built with Rust. It evaluates your Windows system security and generates an overall security score. [Project Plan] (No changes today) 1.Add security checks a. Firewall (Done) b. UAC (Done) c. Windows version d. Hidden accounts e. Etc. 2.Add an auto-fix feature 3.Add a GUI 4.And more… [What I Did] I refactored the code structure! It was a bit challenging, but I’ve separated the codebase into multiple files, as shown in the attached screenshot. I decided not to release version 0.4.0 yet since there aren’t any major feature updates. Additionally, I fixed some typos. [Next Version Plan] I’ll add a check for hidden accounts. [Repo Link] https://github.com/dw1210/TungstenScore [Website] https://dw1210.github.io/TungstenScore-website/
Devlog #6 (v0.5.0) [Project Summary] TungstenScore is a Windows security assessment tool built with Rust. It evaluates your Windows system’s security posture and generates an overall security score. [Project Plan] Add security checks a. Firewall (Done) b. UAC (Done) c. TPM 2.0 (Added Today!) d. System integrity e. Hidden accounts f. Disk encryption g. etc. Add an auto-fix feature Add a GUI And more… [What I Did] I decided to remove the Windows version check from the roadmap because I couldn’t find a reliable way to retrieve the latest update info locally. I also don’t want the app to connect to the internet, as users might prefer an offline tool and maintaining a dedicated version API server would add extra overhead. Today, I added the TPM 2.0 check. It took a while to implement because this check requires admin privileges. I had to investigate what was causing the permission errors and figure out how to handle them gracefully. As a solution, I added an option to relaunch the app as administrator: If you type “Y”, the program will restart with admin privileges. If you type “N”, the check will be marked as “Requires administrator privileges” and excluded from the scan score (as shown in the attached screenshot). [Next Version Plan] I’ll be adding a check for hidden accounts. [Repo Link] https://github.com/dw1210/TungstenScore [Website] https://dw1210.github.io/TungstenScore-website/
devlog #7 (v0.5.1) I fixed some bugs for my first release!
Ships:
TungstenScore (v0.5.1) TungstenScore is a lightweight, open-source security assessment tool for Windows. It checks important Windows security settings and gives your system a security score, making it easier to understand how well your PC is protected and what could be improved. One of the hardest parts of building TungstenScore was working with the Windows APIs and reading security-related information from the Windows Registry. Different security features expose their state in different ways, so figuring out how to reliably retrieve and interpret that information was one of the biggest challenges during development. What I’m most proud of, though, is the structure of the project. TungstenScore still has a relatively small set of features, but I focused on making its foundation small, solid, and extensible. New security checks and other features can be added without having to redesign the entire application. Building that solid foundation is probably the part of this project I’m most proud of. TungstenScore is still under development, and I plan to add more security checks and improve the scoring system over time. You can now try TungstenScore yourself! You can download a pre-built version from my website, or download the source code and build it yourself using Cargo. Language note: English is not my native language, and I’m not very confident writing in English yet. I originally wrote this devlog in Korean and used an AI tool to help translate it into English....
|
1793148766.6962993
|
1793235166.6962993
|
|
57948
|
WHERE ON EARTH? by @ZadowCHI | Stardance
|
ZadowCHI
|
1
|
11.0
|
73
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T11:43:04Z", "hours": 11.0, "multiplier": 6.58, "payout": 73, "blessing": "neutral", "text": "What did you make? Made WHERE ON EARTH? , a GeoGuessr-style game where you get dropped somewhere random and have to figure out where you are. You get 5 rounds, guess on the map, and get points based on how close you were. What was challenging? Getting all the random locations, Street View, map, scoring and game logic to actually work together There were also a LOT of random bugs. What are you proud of? Mostly just how it turned out. I started with a pretty basic idea and somehow ended up with an actual game. I also learned a lot while making it, especially with maps and the Haversine formula. What should people know? It’s single-player for now, so give it a try and see how good your geography actually is Multiplayer is probably coming later.", "repo": "https://github.com/Zadow67/WHERE-ON-EARTH", "demo": "https://zadow67.github.io/WHERE-ON-EARTH/"}]...
|
[{"post_id": 64158, "ts": "202 [{"post_id": 64158, "ts": "2026-09-08T11:32:29Z", "hours": 1.7058, "text": "Finally completed the app This one took a LOT, and I mean A LOT, of time to finish. From building the game logic and map system to fixing random bugs, tweaking the UI, and making everything actually work together… it was definitely a journey I couldn’t get multiplayer added this time, but that’s something I’ll work on after I ship this version. For now, I’m calling it done and shipping it Really happy with how it turned out, especially considering how much I learned while building it. Next stop: multiplayer"}, {"post_id": 64025, "ts": "2026-09-08T04:19:04Z", "hours": 2.2969, "text": "Updates: Added this page telling about your Score. I am thinking to add multiplayer but i have to learn first how to added it i think ill ship it once with single player only and then later update and ship again"}, {"post_id": 62777, "ts": "2026-09-06T09:21:45Z", "hours": 1.8456, "text": "Soo, a lot has been done. First the UI is completed with the game logic aswell. There are a log of bugs also….. i am unable to remove the top thinggy on the street view which tells what location is that soo trying to find a way to hide it also have to add a restart system after 5 rounds."}, {"post_id": 62253, "ts": "2026-09-05T15:07:06Z", "hours": 1.9594, "text": "Made Whole JS file: Now there are 5 Rounds with all random locations points system and distance is your score soo yep that’s the progress till now"}, {"post_id": 61782, "ts": "2026-09-04T21:10:32Z", "hours": 0.6417, "text": "Made the core function work. Now whenever you play, you get placed at a random location on Earth and have to guess where you are. After you guess, it tells you the distance from your guess to the actual location. Pretty basic for now but the main thing is working."}, {"post_id": 61546, "ts": "2026-09-04T14:49:04Z", "hours": 0.5522, "text": "Yepeee, Came up with a method to get random locations + made a function to get the distance between the user’s guess and the location using the: Haversine formula Works SUPERRR great tbh, I didn’t know it would be this easy famm…"}, {"post_id": 61517, "ts": "2026-09-04T13:57:02Z", "hours": 1.0922, "text": "Google Maps API was lowkey confusing to understand, but I learned just enough to make my project work. Atm I’m using Google Street View + OpenStreetMap (bc it’s way easier to use but still so good). Thanks to @openstreetmap for making a free map API This is basically the structure so far. Next, I’m starting on the CSS for the game, then working on the score system and calculating exactly how far away the user’s guess was."}, {"post_id": 61113, "ts": "2026-09-03T20:55:45Z", "hours": 0.3003, "text": "This was the sketch I had in mind and this is the UI I built from it. I think it looks pretty cool so far, its just the landing page tho. I would love some suggestions on what I could improve . I still have to make the actual game UI so this is just the start."}, {"post_id": 61096, "ts": "2026-09-03T20:18:05Z", "hours": 0.7558, "text": "Started working on it like 1.5 hours ago. Got the concept clear and the theme too. Currently just making the basic functioning app, not focusing on the style that much. Once I have a working app ill focus more on the UI and all."}]...
|
Title: WHERE ON EARTH? by @ZadowCHI | Stardance
D Title: WHERE ON EARTH? by @ZadowCHI | Stardance
Devlogs:
Started working on it like 1.5 hours ago. Got the concept clear and the theme too. Currently just making the basic functioning app, not focusing on the style that much. Once I have a working app ill focus more on the UI and all.
This was the sketch I had in mind and this is the UI I built from it. I think it looks pretty cool so far, its just the landing page tho. I would love some suggestions on what I could improve . I still have to make the actual game UI so this is just the start.
Google Maps API was lowkey confusing to understand, but I learned just enough to make my project work. Atm I’m using Google Street View + OpenStreetMap (bc it’s way easier to use but still so good). Thanks to @openstreetmap for making a free map API This is basically the structure so far. Next, I’m starting on the CSS for the game, then working on the score system and calculating exactly how far away the user’s guess was.
Yepeee, Came up with a method to get random locations + made a function to get the distance between the user’s guess and the location using the: Haversine formula Works SUPERRR great tbh, I didn’t know it would be this easy famm…
Made the core function work. Now whenever you play, you get placed at a random location on Earth and have to guess where you are. After you guess, it tells you the distance from your guess to the actual location. Pretty basic for now but the main thing is working.
Made Whole JS file: Now there are 5 Rounds with all random locations points system and distance is your score soo yep that’s the progress till now
Soo, a lot has been done. First the UI is completed with the game logic aswell. There are a log of bugs also….. i am unable to remove the top thinggy on the street view which tells what location is that soo trying to find a way to hide it also have to add a restart system after 5 rounds.
Updates: Added this page telling about your Score. I am thinking to add multiplayer but i have to learn first how to added it i think ill ship it once with single player only and then later update and ship again
Finally completed the app This one took a LOT, and I mean A LOT, of time to finish. From building the game logic and map system to fixing random bugs, tweaking the UI, and making everything actually work together… it was definitely a journey I couldn’t get multiplayer added this time, but that’s something I’ll work on after I ship this version. For now, I’m calling it done and shipping it Really happy with how it turned out, especially considering how much I learned while building it. Next stop: multiplayer
Ships:
What did you make? Made WHERE ON EARTH? , a GeoGuessr-style game where you get dropped somewhere random and have to figure out where you are. You get 5 rounds, guess on the map, and get points based on how close you were. What was challenging? Getting all the random locations, Street View, map, scoring and game logic to actually work together There were also a LOT of random bugs. What are you proud of? Mostly just how it turned out. I started with a pretty basic idea and somehow ended up with an actual game. I also learned a lot while making it, especially with maps and the Haversine formula. What should people know? It’s single-player for now, so give it a try and see how good your geography actually is Multiplayer is probably coming later....
|
1793130488.2636392
|
1793216888.2636392
|
|
18435
|
HyprTools <\> by @THEbluefirestudios | Stard HyprTools <\> by @THEbluefirestudios | Stardance...
|
THEbluefirestudios
|
1
|
31.0
|
457
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T11:38:09Z", "hours": 31.0, "multiplier": 14.59, "payout": 457, "blessing": "neutral", "text": "WHAT DID I MAKE? I made HyprTools, an open source suite of tools made for the average Windows PC user, so they can get more done, in less time (Supports only windows 10/11) It contains a bunch of tools, including: One-click “Fix my PC Button” [SFC & DISM] PC Cache cleanser Wi-Fi Cache cleanser One-click “Update all apps and drivers” button Refresh Display Drivers PC stress test Startup app recommendations GUI for building and running terminal commands Folder organiser File converter Fast image editor Spotlight-search-style quick access bar Voice typing helper Image to text [OCR] Auto Typer Fast anywhere-on-screen color picker Web Apps Launcher Auto Clicker Image to ASCII art Webcam feed to ASCII art (you can use this in google meet, zoom, and while streaming!) Fake Windows update and error screen Each of them assists the user in some way WHAT WAS CHALLENGING? Well, a lot of stuff, firstly this app is made in tkinter, which is torture in itself but to make it look good, I needed ICONS, but that is so hard because then you need to download the icons, use Tk.Image and yk, actually place the icons in the final zip, which takes unnecessary space, eventually, I used EMOJIS TO ACCOMPLISH THIS, with the trade-off that now my code looks straight out of GPT-3 Also making the exes with pyinstaller is a hassle, you always forget smth small and have to change it all again. WHAT AM I PROUD OF? The thing I’m most proud of is HyprSearch. Its a spotlight seasrch like app and it is very impressive, I love how managed to handle the searching better than Windows search , because it dosen’t prioritise web search, and is really great when you need to locate something in a pinch. I spent a literal day in school, deciding how the fallback chain for a search string would be (I got punished for not paying attention in class, but WORTH IT). It is the largest tool outside of the launcher, and for good reason!, Also I think I did a good job with the GUI on this one. WHAT PREREQUISITES DO PEOPLE NEED TO KNOW BEFORE TESTING? Well, this suite is made for average windows users, who aren’t tech savvy, so almost all dependencies are bundled in the .zip file in releases. The only one you need to have is VLC Media Player, which most people have, and is only for the fake update screen. Thanks for reviewing my project, I spent a lot of thime on this, and i hope you like it! baiiiiiiiiiiiiiiiii", "repo": "https://github.com/THEbluefirestudios/hyprtools", "demo": "https://github.com/THEbluefirestudios/hyprtools/releases"}]...
|
[{"post_id": 64155, "ts": "202 [{"post_id": 64155, "ts": "2026-09-08T11:21:15Z", "hours": 1.0697, "text": "AAAAND ITS DONE the github is ready, I ahve committed all changes, you can download the releases, bugs fixed all done! Now i press ship! Hope it goes well"}, {"post_id": 62197, "ts": "2026-09-05T13:45:50Z", "hours": 0.8464, "text": "I just added a warning saying that you need vlc to use some tools. I need to add a log system. [image unrelated]"}, {"post_id": 62069, "ts": "2026-09-05T09:38:27Z", "hours": 5.2597, "text": "OH MY GOD I JUST SPENT 4 HOURS ON A LAUNCHER APP WTFFF"}, {"post_id": 56553, "ts": "2026-08-28T11:05:15Z", "hours": 0.9831, "text": "Ok I kinda feel ashamed yeah but…. I used AI In my defense it was for a bulk, tedious task - converting all tool.py files to .exes, and then because pyinstaller hates me, delete them and redo it with slightly diff settings for like an hour, so I installed opencode and made the AI go through the suffering, not me, But GLM did a good job with only like 3 prompts so I don,t care, but all works now! Now the only thing left is the main app that handles all tools, and like gives user easy toggle to turn on/turn off/ use all these tools baiiiiiiiiiiiiiii (avengers assemble! ahh screenshot)"}, {"post_id": 55449, "ts": "2026-08-27T09:17:22Z", "hours": 0.8467, "text": "Ok so I made the icons for Hyprtools and saved them, also for the tools that lived in the system tray, I replaced the temp icons with the actual thing, taking some help from my newly acquired github copilot for student! Also uhh, I forgot to down the icons as transparent images so i had to do that later. Lapse recording This is one of the icons, watch the timelapse for the full catalog!"}, {"post_id": 49625, "ts": "2026-08-18T14:46:20Z", "hours": 1.4628, "text": "YEAHH After quite the break, 1 hour, and 24 minutes, HyprOCR is ready! It just reads text from images (uses WindowsOCR engine in the background). There is not really anything special about it so well… baiiiiiiiiiii (image kinda unrelated)"}, {"post_id": 44538, "ts": "2026-08-10T11:26:29Z", "hours": 0.9542, "text": "Okie Hyprsearch is done! It can: Open apps and websites only with name Run commands Solve math Install apps Search for files Search engine query Wikipedia summary bangs for quick results In a very MacOS-like package! I have also started the startup time booster, which will list out all apps in your startup apps that you may or may not need and take action accordingly baiiiiiiiii"}, {"post_id": 43326, "ts": "2026-08-08T15:02:53Z", "hours": 1.1003, "text": "So I have started building the frontend for HyprSearch This is definitely the most largest hyprtool, as it needs the extra code for the titlebarless appearance, pystray integration, spawn on keyboard shortcut, settings, displaying of results, and the ROUNDED CORNERS (dont get me started, basically u need to chroma key out a specific color that is present on the edges of the screen Well, features: You can, via this tool, open websites with only name, search using search engine, fetch wiki summary, install apps, open apps, find files, tell the time, solve math, run commands from this little bar Each search can show multiple results in order of relevance, max five results, for example, searching “Minecraft” will pull up Open app: Minecraft, then open folder “.minecraft”, then open website “ minecraft.net “ then engine search “ minecraft “ Some basic keyboard shortcuts: Alt + Q for spawning the search bar, Esc for closing the search bar, Enter for well, yk (idk how to describe it), like entering the query? (also it automatically opens the top result), and Ctrl + <1 - 5 num row keys> for opening one of the results. It lives in ur system tray! (not a lot to say here) As of writing this devlog, I am just testing stuff, like UI jank, and stuff, ik the border is thick, I am working on it PS: IMPORTANT: im fucked. u see, i am using a python lib called AppOpener for opening apps, but it cannot detect UWP apps or apps in external drives, and I use a lot of UWP apps (yk, like minecraft) and apps on external drives, so I have to remake the entire app-opening part (also i am a responsible dev and i think abt other people’s setup while coding)"}, {"post_id": 39987, "ts": "2026-08-03T10:33:17Z", "hours": 2.8053, "text": "After 2 hours, and 44 minutes, HyprSearch’s backend logic is READYYYYYY!!! This did NOT need to take this less time, but I will briefly go over what it can do: Solve mathematical expressions Run terminal commands Open apps and websites by just their name (not even a URL domain like .com is required!) Install from winget (bang only) Tell the current time (bang only) Perform a file search Fetch a Wikipedia summary (largely bang only) Search on a search engine of your choice Then, there are !bangs - short keywords to put before your query to do a specific thing and a specific thing only: Current list of bangs include: bangs = [ ' !open ' , ' !app ' , ' !web ' , ' !websearch ' , ' !file ' , ' !wiki ' , ' !time ' , ' !install ' , ' !math ' , ' !cmd ' , ] This is kinda a massive shortcut library, disguised as a search bar! baiiiiiiiiiiiiii"}, {"post_id": 37546, "ts": "2026-07-30T10:59:53Z", "hours": 1.2281, "text": "Bruh, Idk what i have been doing lately, I have been sick lately sooo….. I was unable to code or even talk about my other project at the stardance AMA with Jared Isaacman (yes I was invited) The only thing I’ve really been doing, is aimlessly just make functions for a HyprSearch that I decided to revive, so far features are: File search App search Web search + open URL Quick install apps (uses winget ) The current time for some reason Math solver Run command !bangs as a cooler way to search, does the above functions but quicker a single covalent bond (inside joke) btw this is a spotlight search clone baiiiiiii"}, {"post_id": 34524, "ts": "2026-07-25T09:50:15Z", "hours": 1.3994, "text": "Did a BIG one today This is HyprPhotos, a basic, yet fast photo editor, crop images by just clicking on 2 points, rotate, sharpen, upscale, downscale and do so much more in a very short timespan! It just uses PIL s built in functions really, so it wasn’t hard to make the functioning for, and ik the UI looks bad ok baiiiiii"}, {"post_id": 32920, "ts": "2026-07-22T11:55:47Z", "hours": 0.5128, "text": "HyprPicker is done! Its yet again, an I had built before, just had to do some improvements like giving it system tray functionality via pystray , and giving it toast messages and a nice hovering tooltip ( the screenshot ) so that it dosent just give no feedback that it is working. If you are wondering how it works, I just take a screenshot of the full screen, make a tkinter fullscreen window that forces focus, use mouse coords and PIL to get the color at a particular coord, and the entire actual GUI the user sees is just 2 toasts, one spawned at the mouse previewing color and hex code, and a toast showing that the hex code was copied to clipboard As of now, I’m making basic icons with PIL again, but I will surely replace them! baiiiiiiiiiiiiiii"}, {"post_id": 32280, "ts": "2026-07-21T10:57:57Z", "hours": 0.3931, "text": "Hyprtools - Web apps is complete, alongside voice typing! The HyprVoice was almost done yesterday, I just needed to add a Tkinter GUI. As for web apps, it was a completely finished app I made a while ago, so I just had to rebrand it a little with the courier font and - HyprTools in the titlebar. Thats it for the day! baiiiiiiiiii"}, {"post_id": 31738, "ts": "2026-07-20T11:38:30Z", "hours": 1.3083, "text": "Today i made the backend for the voice typing ‘HyprVoice’ It just uses the python lib speech recognition so it wasnt that bad, but….. I spent SOOOOOOOOOOOO long debugging it because it couldn’t actually recognise….. and then I realised my microphone wire got pulled off. bye. (i feel ashamed) (The image is how I plan to make the GUI.)"}, {"post_id": 30751, "ts": "2026-07-18T16:08:50Z", "hours": 1.5092, "text": "Pretend to type is now TypeGhost! Its a better name tbh, as for its features, you can set a typing speed, and % change for a spelling error, when the ‘ghost’ accidentally presses an adjacent key, hits backspace, and corrects itself. There are 3 modes: Boilerplate : For repetitive paragraphs, or statements Code : For code snippets, it ‘thinks’ for a while after opening brackets or hitting enter. It also strips off tab-spaces as IDEs usually autoindent. Essay : For well… essays and large paras of English text, pauses after full stop, excalamation mark, question mark to ‘think’ and also after paragraphs (newlines) baiii for today!"}, {"post_id": 30055, "ts": "2026-07-17T10:29:08Z", "hours": 0.7131, "text": "YESS, vry usefule Today I made the Fileconverter, simple enough, as of now, it supports these filetypes cat_exts = { #cats such a cute shortform for 'category' ^owo^ ' image ' : [ ' jpg ' , ' jpeg ' , ' png ' , ' webp ' , ' bmp ' , ' gif ' , ' ico ' , ' tiff ' ], ' audio ' : [ ' mp3 ' , ' wav ' , ' flac ' , ' ogg ' , ' aac ' , ' m4a ' , ' wma ' ], ' video ' : [ ' mp4 ' , ' mkv ' , ' webm ' , ' avi ' , ' mov ' , ' flv ' , ' wmv ' ],} …and it just works, what can I say? baiiiiii"}, {"post_id": 29422, "ts": "2026-07-16T11:15:32Z", "hours": 0.6317, "text": "Its time i work on this again: Today I just spent some time making the terminal command generator, as of now, it supports 'shutdown', 'echo', 'cd', 'ping', 'mkdir', 'del', 'copy', 'ipconfig', 'dir', 'cls', 'tasklist', 'taskkill', 'netstat', 'systeminfo', 'whoami', 'tree', 'xcopy', 'timeout', 'start', 'attrib', commands, I should add more but this is it as of now! d=====( ̄▽ ̄*)b"}, {"post_id": 24770, "ts": "2026-07-08T15:50:11Z", "hours": 0.6406, "text": "Finally I started working on this again, I am currently working on other features like the Game prioritize, and made ASCII camera more customised and performant! Not a lot of coding as I distributed my time between Candela Shaders and Hyprtools (image unrelated)"}, {"post_id": 22598, "ts": "2026-07-05T04:12:41Z", "hours": 1.1097, "text": "So I am now working on the Pretend to Type autotyper (it needs a better name ik) and you don’t konow how much it escalated, just for some pretend typing, i made functions for calculating distance between keys on a keyboard, a function to do spelling mistakes/fat fingering on purpose, it detects the current window to strip chars like \\t if the curent window is an IDE, AND I decided to put a hard deadline of the 31st of July. I’m so cooked. Also due to copyright, bureaucracy, my incompetence in writing production-ready code, and my refusal to use AI, the features: Desktop Pet, HyprSearch, and ffmpeg GUI will not come in HyprTools. I’m sorry :((( (image unrelated)"}, {"post_id": 21419, "ts": "2026-07-03T11:01:29Z", "hours": 0.7481, "text": "Aaandd. I’m done with the ASCII Camera! Its really jank - you need to open the app, click start, the set the app as a window capture source in OBS, then turn on virtual camera, and then can you use the ASCII camera effect in your desired use case, its also fully local so very laggy, but this is the best I can do as pyvirtualcam refuses to work on my PC"}, {"post_id": 20831, "ts": "2026-07-02T15:15:41Z", "hours": 1.5925, "text": "I added the image to ASCII feature (sample below) and its really nice! Consequentially I am also working on the ASCII camera feature but thats going rough….. Hope I dont die from caffiene overdose…. and now I shall continue to work on it."}, {"post_id": 11885, "ts": "2026-06-19T11:26:34Z", "hours": 0.9511, "text": "I added the fake update and actually autosave for ms office! thats it… byeee…. (image unrelated)"}, {"post_id": 11189, "ts": "2026-06-18T09:37:53Z", "hours": 0.6556, "text": "As of now I have made the fake BSOD, VERY VERY CONVINCING. it has a counter that changes the percent text and it automatically locks your pc the moment it finishes, making it look like your pc just restarted. I am now working on the fake update screen"}, {"post_id": 10551, "ts": "2026-06-17T10:13:03Z", "hours": 0.5925, "text": "I shifted the architecture a little bit: tools that require to be GUIless and run in the background are now seperate .pyw files, so I have made edits to the wraparound feature and made it toggle on shortcut Ctrl (right) + Insert . I also added the fake error screen and it look really convincing! Other features i added include: update all apps, autoclicker, and the PC stress test (some of these were done before the previous devlog but I forgot to mention that). Sadly, my efforts on the Enable EU features and Reset PC are in vail so they may not be added."}, {"post_id": 9994, "ts": "2026-06-16T15:10:10Z", "hours": 0.7431, "text": "These are the features i have decided: Repair & Cleanup Fix my PC ⟵ done Reinstall Windows ⟵ use systemreset.exe or shutdown /r /o into WinRE Clear Cache & Temp Files Clean Registry Keys ⟵ scour Win11Debloat GitHub for safe list + reg files !! Memory Manager !! ⟵ use psutil Deep Uninstall !! Performance & Optimization Update Drivers & Apps ⟵ winget upgrade –all Startup Time Booster ⟵ winreg on Run keys + schtasks Gaming Mode !! ⟵ psutil process list matched against hardcoded game names, psutil.Process.nice() Refresh Display Drivers ⟵ done Stress Test (WinSat) ⟵ winsat subprocess call WiFi Reset ⟵ done Windows Customization Windows Debloat !! ⟵ Win11Debloat GitHub, ship their .reg files as toggles with undo pairs Remove All Windows AI Features ⟵ Win11Debloat GitHub, same .reg toggle approach Actually Autosave (Office) !! ⟵ interval mode: pyautogui.hotkey(‘ctrl’,‘s’) on timer, aggressive mode: watch ~$ temp file mtime with os.path.getmtime Find Similar Files !! ⟵ difflib.SequenceMatcher on filenames, group by similarity score File Management Downloads & Desktop Organizer !! ⟵ os/shutil + extension-to-folder mapping Bulk File Rename ⟵ regex pattern based os.rename loop Local File Converter ⟵ FFmpeg subprocess wrapper FFmpeg GUI ⟵ dropdown UI → FFmpeg subprocess HyprImage ⟵ Pillow wrapper with action picker Productivity Tools Voice Typing ⟵ speech_recognition + pyautogui to paste output OCR: Image to Text ⟵ pytesseract or easyocr Pretend to Type ⟵ pyautogui.typewrite() with interval, probably fold into Macro Creator Macro Creator ⟵ record: keyboard lib + pyautogui polling, playback: screen color check before each click HyprSearch !! ⟵ global hotkey via keyboard lib, fuzzy file search via os.walk + difflib Terminal Command Generator ⟵ dropdown UI → command string builder Colorpicker ⟵ pyautogui.pixel() grab + magnifier overlay Extras & Fun Hyprclicker ⟵ done (existing autoclicker) Mouse Wraparound ⟵ done Image to ASCII ⟵ same approach as Bad Apple project Camera to ASCII (Virtual Cam) ⟵ OpenCV capture → ASCII render → OBS virtual cam, hardest feature overall Desktop Pet !! ⟵ transparent tkinter window + sprite animation, WS_EX_LAYERED for click-through Fake Update Screen ⟵ fullscreen tkinter canvas + fake progress bar Fake Error Screen ⟵ same, BSOD-style overlay (raw list organised by Anything AI) I have finished the simpler features"}, {"post_id": 8654, "ts": "2026-06-14T11:37:44Z", "hours": 1.2525, "text": "Ok i have added the features: mouse wraparound, open Chris Titus Tools, Fix PC button and Reset WIFI button, will add more"}]...
|
Title: HyprTools <\> by @THEbluefirestudios Title: HyprTools <\> by @THEbluefirestudios | Stardance
Devlogs:
Ok i have added the features: mouse wraparound, open Chris Titus Tools, Fix PC button and Reset WIFI button, will add more
These are the features i have decided: Repair & Cleanup Fix my PC ⟵ done Reinstall Windows ⟵ use systemreset.exe or shutdown /r /o into WinRE Clear Cache & Temp Files Clean Registry Keys ⟵ scour Win11Debloat GitHub for safe list + reg files !! Memory Manager !! ⟵ use psutil Deep Uninstall !! Performance & Optimization Update Drivers & Apps ⟵ winget upgrade –all Startup Time Booster ⟵ winreg on Run keys + schtasks Gaming Mode !! ⟵ psutil process list matched against hardcoded game names, psutil.Process.nice() Refresh Display Drivers ⟵ done Stress Test (WinSat) ⟵ winsat subprocess call WiFi Reset ⟵ done Windows Customization Windows Debloat !! ⟵ Win11Debloat GitHub, ship their .reg files as toggles with undo pairs Remove All Windows AI Features ⟵ Win11Debloat GitHub, same .reg toggle approach Actually Autosave (Office) !! ⟵ interval mode: pyautogui.hotkey(‘ctrl’,‘s’) on timer, aggressive mode: watch ~$ temp file mtime with os.path.getmtime Find Similar Files !! ⟵ difflib.SequenceMatcher on filenames, group by similarity score File Management Downloads & Desktop Organizer !! ⟵ os/shutil + extension-to-folder mapping Bulk File Rename ⟵ regex pattern based os.rename loop Local File Converter ⟵ FFmpeg subprocess wrapper FFmpeg GUI ⟵ dropdown UI → FFmpeg subprocess HyprImage ⟵ Pillow wrapper with action picker Productivity Tools Voice Typing ⟵ speech_recognition + pyautogui to paste output OCR: Image to Text ⟵ pytesseract or easyocr Pretend to Type ⟵ pyautogui.typewrite() with interval, probably fold into Macro Creator Macro Creator ⟵ record: keyboard lib + pyautogui polling, playback: screen color check before each click HyprSearch !! ⟵ global hotkey via keyboard lib, fuzzy file search via os.walk + difflib Terminal Command Generator ⟵ dropdown UI → command string builder Colorpicker ⟵ pyautogui.pixel() grab + magnifier overlay Extras & Fun Hyprclicker ⟵ done (existing autoclicker) Mouse Wraparound ⟵ done Image to ASCII ⟵ same approach as Bad Apple project Camera to ASCII (Virtual Cam) ⟵ OpenCV capture → ASCII render → OBS virtual cam, hardest feature overall Desktop Pet !! ⟵ transparent tkinter window + sprite animation, WS_EX_LAYERED for click-through Fake Update Screen ⟵ fullscreen tkinter canvas + fake progress bar Fake Error Screen ⟵ same, BSOD-style overlay (raw list organised by Anything AI) I have finished the simpler features
I shifted the architecture a little bit: tools that require to be GUIless and run in the background are now seperate .pyw files, so I have made edits to the wraparound feature and made it toggle on shortcut Ctrl (right) + Insert . I also added the fake error screen and it look really convincing! Other features i added include: update all apps, autoclicker, and the PC stress test (some of these were done before the previous devlog but I forgot to mention that). Sadly, my efforts on the Enable EU features and Reset PC are in vail so they may not be added.
As of now I have made the fake BSOD, VERY VERY CONVINCING. it has a counter that changes the percent text and it automatically locks your pc the moment it finishes, making it look like your pc just restarted. I am now working on the fake update screen
I added the fake update and actually autosave for ms office! thats it… byeee…. (image unrelated)
I added the image to ASCII feature (sample below) and its really nice! Consequentially I am also working on the ASCII camera feature but thats going rough….. Hope I dont die from caffiene overdose…. and now I shall continue to work on it.
Aaandd. I’m done with the ASCII Camera! Its really jank - you need to open the app, click start, the set the app as a window capture source in OBS, then turn on virtual camera, and then can you use the ASCII camera effect in your desired use case, its also fully local so very laggy, but this is the best I can do as pyvirtualcam refuses to work on my PC
So I am now working on the Pretend to Type autotyper (it needs a better name ik) and you don’t konow how much it escalated, just for some pretend typing, i made functions for calculating distance between keys on a keyboard, a function to do spelling mistakes/fat fingering on purpose, it detects the current window to strip chars like \t if the curent window is an IDE, AND I decided to put a hard deadline of the 31st of July. I’m so cooked. Also due to copyright, bureaucracy, my incompetence in writing production-ready code, and my refusal to use AI, the features: Desktop Pet, HyprSearch, and ffmpeg GUI will not come in HyprTools. I’m sorry :((( (image unrelated)
Finally I started working on this again, I am currently working on other features like the Game prioritize, and made ASCII camera more customised and performant! Not a lot of coding as I distributed my time between Candela Shaders and Hyprtools (image unrelated)
Its time i work on this again: Today I just spent some time making the terminal command generator, as of now, it supports 'shutdown', 'echo', 'cd', 'ping', 'mkdir', 'del', 'copy', 'ipconfig', 'dir', 'cls', 'tasklist', 'taskkill', 'netstat', 'systeminfo', 'whoami', 'tree', 'xcopy', 'timeout', 'start', 'attrib', commands, I should add more but this is it as of now! d=====( ̄▽ ̄*)b
YESS, vry usefule Today I made the Fileconverter, simple enough, as of now, it supports these filetypes cat_exts = { #cats such a cute shortform for 'category' ^owo^ ' image ' : [ ' jpg ' , ' jpeg ' , ' png ' , ' webp ' , ' bmp ' , ' gif ' , ' ico ' , ' tiff ' ], ' audio ' : [ ' mp3 ' , ' wav ' , ' flac ' , ' ogg ' , ' aac ' , ' m4a ' , ' wma ' ], ' video ' : [ ' mp4 ' , ' mkv ' , ' webm ' , ' avi ' , ' mov ' , ' flv ' , ' wmv ' ],} …and it just works, what can I say? baiiiiii
Pretend to type is now TypeGhost! Its a better name tbh, as for its features, you can set a typing speed, and % change for a spelling error, when the ‘ghost’ accidentally presses an adjacent key, hits backspace, and corrects itself. There are 3 modes: Boilerplate : For repetitive paragraphs, or statements Code : For code snippets, it ‘thinks’ for a while after opening brackets or hitting enter. It also strips off tab-spaces as IDEs usually autoindent. Essay : For well… essays and large paras of English text, pauses after full stop, excalamation mark, question mark to ‘think’ and also after paragraphs (newlines) baiii for today!
Today i made the backend for the voice typing ‘HyprVoice’ It just uses the python lib speech recognition so it wasnt that bad, but….. I spent SOOOOOOOOOOOO long debugging it because it couldn’t actually recognise….. and then I realised my microphone wire got pulled off. bye. (i feel ashamed) (The image is how I plan to make the GUI.)
Hyprtools - Web apps is complete, alongside voice typing! The HyprVoice was almost done yesterday, I just needed to add a Tkinter GUI. As for web apps, it was a completely finished app I made a while ago, so I just had to rebrand it a little with the courier font and - HyprTools in the titlebar. Thats it for the day! baiiiiiiiiii
HyprPicker is done! Its yet again, an I had built before, just had to do some improvements like giving it system tray functionality via pystray , and giving it toast messages and a nice hovering tooltip ( the screenshot ) so that it dosent just give no feedback that it is working. If you are wondering how it works, I just take a screenshot of the full screen, make a tkinter fullscreen window that forces focus, use mouse coords and PIL to get the color at a particular coord, and the entire actual GUI the user sees is just 2 toasts, one spawned at the mouse previewing color and hex code, and a toast showing that the hex code was copied to clipboard As of now, I’m making basic icons with PIL again, but I will surely replace them! baiiiiiiiiiiiiiii
Did a BIG one today This is HyprPhotos, a basic, yet fast photo editor, crop images by just clicking on 2 points, rotate, sharpen, upscale, downscale and do so much more in a very short timespan! It just uses PIL s built in functions really, so it wasn’t hard to make the functioning for, and ik the UI looks bad ok baiiiiii
Bruh, Idk what i have been doing lately, I have been sick lately sooo….. I was unable to code or even talk about my other project at the stardance AMA with Jared Isaacman (yes I was invited) The only thing I’ve really been doing, is aimlessly just make functions for a HyprSearch that I decided to revive, so far features are: File search App search Web search + open URL Quick install apps (uses winget ) The current time for some reason Math solver Run command !bangs as a cooler way to search, does the above functions but quicker a single covalent bond (inside joke) btw this is a spotlight search clone baiiiiiii
After 2 hours, and 44 minutes, HyprSearch’s backend logic is READYYYYYY!!! This did NOT need to take this less time, but I will briefly go over what it can do: Solve mathematical expressions Run terminal commands Open apps and websites by just their name (not even a URL domain like .com is required!) Install from winget (bang only) Tell the current time (bang only) Perform a file search Fetch a Wikipedia summary (largely bang only) Search on a search engine of your choice Then, there are !bangs - short keywords to put before your query to do a specific thing and a specific thing only: Current list of bangs include: bangs = [ ' !open ' , ' !app ' , ' !web ' , ' !websearch ' , ' !file ' , ' !wiki ' , ' !time ' , ' !install ' , ' !math ' , ' !cmd ' , ] This is kinda a massive shortcut library, disguised as a search bar! baiiiiiiiiiiiiii
So I have started building the frontend for HyprSearch This is definitely the most largest hyprtool, as it needs the extra code for the titlebarless appearance, pystray integration, spawn on keyboard shortcut, settings, displaying of results, and the ROUNDED CORNERS (dont get me started, basically u need to chroma key out a specific color that is present on the edges of the screen Well, features: You can, via this tool, open websites with only name, search using search engine, fetch wiki summary, install apps, open apps, find files, tell the time, solve math, run commands from this little bar Each search can show multiple results in order of relevance, max five results, for example, searching “Minecraft” will pull up Open app: Minecraft, then open folder “.minecraft”, then open website “ minecraft.net “ then engine search “ minecraft “ Some basic keyboard shortcuts: Alt + Q for spawning the search bar, Esc for closing the search bar, Enter for well, yk (idk how to describe it), like entering the query? (also it automatically opens the top result), and Ctrl + <1 - 5 num row keys> for opening one of the results. It lives in ur system tray! (not a lot to say here) As of writing this devlog, I am just testing stuff, like UI jank, and stuff, ik the border is thick, I am working on it PS: IMPORTANT: im fucked. u see, i am using a python lib called AppOpener for opening apps, but it cannot detect UWP apps or apps in external drives, and I use a lot of UWP apps (yk, like minecraft) and apps on external drives, so I have to remake the entire app-opening part (also i am a responsible dev and i think abt other people’s setup while coding)
Okie Hyprsearch is done! It can: Open apps and websites only with name Run commands Solve math Install apps Search for files Search engine query Wikipedia summary bangs for quick results In a very MacOS-like package! I have also started the startup time booster, which will list out all apps in your startup apps that you may or may not need and take action accordingly baiiiiiiiii
YEAHH After quite the break, 1 hour, and 24 minutes, HyprOCR is ready! It just reads text from images (uses WindowsOCR engine in the background). There is not really anything special about it so well… baiiiiiiiiiii (image kinda unrelated)
Ok so I made the icons for Hyprtools and saved them, also for the tools that lived in the system tray, I replaced the temp icons with the actual thing, taking some help from my newly acquired github copilot for student! Also uhh, I forgot to down the icons as transparent images so i had to do that later. Lapse recording This is one of the icons, watch the timelapse for the full catalog!
Ok I kinda feel ashamed yeah but…. I used AI In my defense it was for a bulk, tedious task - converting all tool.py files to .exes, and then because pyinstaller hates me, delete them and redo it with slightly diff settings for like an hour, so I installed opencode and made the AI go through the suffering, not me, But GLM did a good job with only like 3 prompts so I don,t care, but all works now! Now the only thing left is the main app that handles all tools, and like gives user easy toggle to turn on/turn off/ use all these tools baiiiiiiiiiiiiiii (avengers assemble! ahh screenshot)
OH MY GOD I JUST SPENT 4 HOURS ON A LAUNCHER APP WTFFF
I just added a warning saying that you need vlc to use some tools. I need to add a log system. [image unrelated]
AAAAND ITS DONE the github is ready, I ahve committed all changes, you can download the releases, bugs fixed all done! Now i press ship! Hope it goes well
Ships:
WHAT DID I MAKE? I made HyprTools, an open source suite of tools made for the average Windows PC user, so they can get more done, in less time (Supports only windows 10/11) It contains a bunch of tools, including: One-click “Fix my PC Button” [SFC & DISM] PC Cache cleanser Wi-Fi Cache cleanser One-click “Update all apps and drivers” button Refresh Display Drivers PC stress test Startup app recommendations GUI for building and running terminal commands Folder organiser File converter Fast image editor Spotlight-search-style quick access bar Voice typing helper Image to text [OCR] Auto Typer Fast anywhere-on-screen color picker Web Apps Launcher Auto Clicker Image to ASCII art Webcam feed to ASCII art (you can use this in google meet, zoom, and while streaming!) Fake Windows update and error screen Each of them assists the user in some way WHAT WAS CHALLENGING? Well, a lot of stuff, firstly this app is made in tkinter, which is torture in itself but to make it look good, I needed ICONS, but that is so hard because then you need to download the icons, use Tk.Image and yk, actually place the icons in the final zip, which takes unnecessary space, eventually, I used EMOJIS TO ACCOMPLISH THIS, with the trade-off that now my code looks straight out of GPT-3 Also making the exes with pyinstaller is a hassle, you always forget smth small and have to change it all again. WHAT AM I PROUD OF? The thing I’m most proud of is HyprSearch. Its a spotlight seasrch like app and it is very impressive, I love how managed to handle the searching better than Windows search , because it dosen’t prioritise web search, and is really great when you need to locate something in a pinch. I spent a literal day in school, deciding how the fallback chain for a search string would be (I got punished for not paying attention in class, but WORTH IT). It is the largest tool outside of the launcher, and for good reason!, Also I think I did a good job with the GUI on this one. WHAT PREREQUISITES DO PEOPLE NEED TO KNOW BEFORE TESTING? Well, this suite is made for average windows users, who aren’t tech savvy, so almost all dependencies are bundled in the .zip file in releases. The only one you need to have is VLC Media Player, which most people have, and is only for the fake update screen. Thanks for reviewing my project, I spent a lot of thime on this, and i hope you like it! baiiiiiiiiiiiiiiiii...
|
1793087785.6960292
|
1793174185.6960292
|
|
59690
|
Prime OS by @Rafey | Stardance
|
Rafey
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T11:15:55Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a webOS named “Prime OS”.It was my fist time building an OS by myself, used AI to help me do critical thinking and solve a problem while coding whenever i faced any.", "repo": "https://github.com/Rafey47/prime-os", "demo": "https://rafey47.github.io/prime-os/?utm_source=chatgpt.com"}]...
|
[{"post_id": 64152, "ts": "202 [{"post_id": 64152, "ts": "2026-09-08T11:12:00Z", "hours": 0.2667, "text": "Making Prime OS Interactive,I continued working on Prime OS and added interaction to the desktop.The Notes, Files, and Settings windows can now be smoothly dragged around the screen, and each window has its own close button.A simple clock to the taskbar was also added.The main functionality of the OS is now working, so I’m moving on to final testing and cleanup."}, {"post_id": 64063, "ts": "2026-09-08T06:18:54Z", "hours": 0.2678, "text": "Started building Prime OS, a minimalistic web-based operating system.So far, I have created the basic desktop layout and added three windows: Notes, Files, and Settings.Also, set up the project with HTML, CSS, and JavaScript.Next, I’m working on making the windows draggable and finishing the basic functionality."}]...
|
Title: Prime OS by @Rafey | Stardance
Devlogs:
St Title: Prime OS by @Rafey | Stardance
Devlogs:
Started building Prime OS, a minimalistic web-based operating system.So far, I have created the basic desktop layout and added three windows: Notes, Files, and Settings.Also, set up the project with HTML, CSS, and JavaScript.Next, I’m working on making the windows draggable and finishing the basic functionality.
Making Prime OS Interactive,I continued working on Prime OS and added interaction to the desktop.The Notes, Files, and Settings windows can now be smoothly dragged around the screen, and each window has its own close button.A simple clock to the taskbar was also added.The main functionality of the OS is now working, so I’m moving on to final testing and cleanup.
Ships:
I made a webOS named “Prime OS”.It was my fist time building an OS by myself, used AI to help me do critical thinking and solve a problem while coding whenever i faced any....
|
1793051539.7573297
|
1793137939.7573297
|
|
59746
|
the future of travelling by @chestagahlawat06 | St the future of travelling by @chestagahlawat06 | Stardance...
|
chestagahlawat06
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T11:07:06Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Travelling in Future, an interactive future-travel simulator where users choose a year, destination, and mode of transportation, then experience a simulated journey to places like a future city, the Moon, or Mars. After arriving, users can explore different locations, interact with them, scan discoveries, learn whether technologies are realistic, possible, or speculative, and earn XP, making the project feel more like an interactive experience than a normal website. One of the biggest challenges was making the project feel like an interactive future-travel experience instead of just a normal website. I had to figure out how to create the travel animation and progress system, make different destinations and years affect the experience, and build interactive exploration where users could click locations, scan them, discover information, and earn XP. I also had to work through coding errors and make the interface responsive and easy to use. I’m really proud that I turned the idea of Travelling in Future into an actual interactive project rather than just a concept. I especially like that users can choose a year, destination, and transportation, experience the journey, and then explore and discover things after arriving. It taught me how to make a project feel more like an experience than a simple webpage. To test my project, people should open the live Vercel demo, choose a year, destination, and transportation method, start the journey, and then use the interactive locations after arriving to explore, scan discoveries, and earn XP. They should try different years and destinations to see how the experience changes, and they don’t need to install anything because it runs directly in a web browser.", "repo": "https://github.com/chestagahlawat6-maker/travelling-in-future-", "demo": "https://travelling-in-future-m937.vercel.app"}]...
|
[{"post_id": 64148, "ts": "202 [{"post_id": 64148, "ts": "2026-09-08T10:57:33Z", "hours": 3.6917, "text": "hi finnaly completed 1st code after so much hardwork and errors"}]...
|
Title: the future of travelling by @chestagahlawat Title: the future of travelling by @chestagahlawat06 | Stardance
Devlogs:
hi finnaly completed 1st code after so much hardwork and errors
Ships:
I made Travelling in Future, an interactive future-travel simulator where users choose a year, destination, and mode of transportation, then experience a simulated journey to places like a future city, the Moon, or Mars. After arriving, users can explore different locations, interact with them, scan discoveries, learn whether technologies are realistic, possible, or speculative, and earn XP, making the project feel more like an interactive experience than a normal website. One of the biggest challenges was making the project feel like an interactive future-travel experience instead of just a normal website. I had to figure out how to create the travel animation and progress system, make different destinations and years affect the experience, and build interactive exploration where users could click locations, scan them, discover information, and earn XP. I also had to work through coding errors and make the interface responsive and easy to use. I’m really proud that I turned the idea of Travelling in Future into an actual interactive project rather than just a concept. I especially like that users can choose a year, destination, and transportation, experience the journey, and then explore and discover things after arriving. It taught me how to make a project feel more like an experience than a simple webpage. To test my project, people should open the live Vercel demo, choose a year, destination, and transportation method, start the journey, and then use the interactive locations after arriving to explore, scan discoveries, and earn XP. They should try different years and destinations to see how the experience changes, and they don’t need to install anything because it runs directly in a web browser....
|
1793055070.0137572
|
1793141470.0137572
|
|
59735
|
scratch game by @juli13 | Stardance
|
juli13
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T10:52:08Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made my first scratch controls", "repo": "https://github.com/fueralles1233-sys/scratch-game", "demo": "https://scratch.mit.edu/projects/1379053351"}]...
|
[{"post_id": 64144, "ts": "202 [{"post_id": 64144, "ts": "2026-09-08T10:48:39Z", "hours": 0.5797, "text": "my scratch game has controls"}]...
|
Title: scratch game by @juli13 | Stardance
Devlog Title: scratch game by @juli13 | Stardance
Devlogs:
my scratch game has controls
Ships:
i made my first scratch controls...
|
1793055063.8675604
|
1793141463.8675604
|
|
59428
|
WebOS by @reaue | Stardance
|
reaue
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T10:41:15Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I created a website which works like an OS with openable and closeable windows that can be draggable. There is three apps, the first one is a welcom app which explains the project, the second one is a note app which retains what you have written in the localStorage and then a Rock Paper Scissors app where you play against the computer. What was challenging? The challenging part was the last app because, it’s totally my own idea so I had to search info and fix bugs by myself with google. What are proud of? I’m proud of the render of the translucent window effect, and the global design and features of the OS. I have learned a lot on web development. What should people know so they can test your project. If you want to try this project, it’s online here : https://reaue.github.io/WebOS/ .", "repo": "https://github.com/reaue/WebOS", "demo": "https://reaue.github.io/WebOS/"}]...
|
[{"post_id": 64134, "ts": "202 [{"post_id": 64134, "ts": "2026-09-08T10:29:06Z", "hours": 0.3222, "text": "Devlog 3 - The final one ! I added a README to explain and show all features of my personnal OS. I finished everything to be ready for the ship. Now let’s ship it !"}, {"post_id": 64112, "ts": "2026-09-08T09:45:58Z", "hours": 1.0883, "text": "Devlog 2 - Adding my own App ! I added a “Rock Paper Scissors Shoot” in the OS, you played against the computer (which select his move with Math.random()) and there is also a score."}, {"post_id": 64091, "ts": "2026-09-08T08:30:19Z", "hours": 3.9694, "text": "Devlog 1 - Working on the SpaceOS. I started the WebOS 1 mission to created my own OS. I did it in a space style. I very happy with the design and the actual way to open, drag and close windows. Now let’s start to create my own App."}]...
|
Title: WebOS by @reaue | Stardance
Devlogs:
Devlo Title: WebOS by @reaue | Stardance
Devlogs:
Devlog 1 - Working on the SpaceOS. I started the WebOS 1 mission to created my own OS. I did it in a space style. I very happy with the design and the actual way to open, drag and close windows. Now let’s start to create my own App.
Devlog 2 - Adding my own App ! I added a “Rock Paper Scissors Shoot” in the OS, you played against the computer (which select his move with Math.random()) and there is also a score.
Devlog 3 - The final one ! I added a README to explain and show all features of my personnal OS. I finished everything to be ready for the ship. Now let’s ship it !
Ships:
What did you make? I created a website which works like an OS with openable and closeable windows that can be draggable. There is three apps, the first one is a welcom app which explains the project, the second one is a note app which retains what you have written in the localStorage and then a Rock Paper Scissors app where you play against the computer. What was challenging? The challenging part was the last app because, it’s totally my own idea so I had to search info and fix bugs by myself with google. What are proud of? I’m proud of the render of the translucent window effect, and the global design and features of the OS. I have learned a lot on web development. What should people know so they can test your project. If you want to try this project, it’s online here : https://reaue.github.io/WebOS/ ....
|
1793130836.31405
|
1793217236.31405
|
|
59479
|
solary by @saidcim | Stardance
|
saidcim
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T10:15:34Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a space-themed New Tab page and styled it like a terminal. I hope you will like it ☺", "repo": "https://github.com/saidcim/solary", "demo": "https://saidcim.github.io/solary/"}]...
|
[{"post_id": 64093, "ts": "202 [{"post_id": 64093, "ts": "2026-09-08T08:34:28Z", "hours": 0.5239, "text": "The terminal can search with s, switch between Google, DuckDuckGo and Yahoo, and jump straight to Google, YouTube or GitHub with commands: g , yt , gh . I also added the readme"}, {"post_id": 63880, "ts": "2026-09-07T21:38:03Z", "hours": 1.0731, "text": "I added an info command that provides information about planets and an ls command that compares them."}, {"post_id": 63843, "ts": "2026-09-07T20:30:45Z", "hours": 1.1542, "text": "I’ve added the other planets too (I can’t upload all 7 planets)."}, {"post_id": 63749, "ts": "2026-09-07T18:23:04Z", "hours": 1.1383, "text": "Added an ASCII planet"}, {"post_id": 63698, "ts": "2026-09-07T17:06:25Z", "hours": 1.0833, "text": "Static terminal layout and input loop history on the arrow keys, and Tab completion. Commands register into a table so later work can add them without touching the dispatcher."}]...
|
Title: solary by @saidcim | Stardance
Devlogs:
St Title: solary by @saidcim | Stardance
Devlogs:
Static terminal layout and input loop history on the arrow keys, and Tab completion. Commands register into a table so later work can add them without touching the dispatcher.
Added an ASCII planet
I’ve added the other planets too (I can’t upload all 7 planets).
I added an info command that provides information about planets and an ls command that compares them.
The terminal can search with s, switch between Google, DuckDuckGo and Yahoo, and jump straight to Google, YouTube or GitHub with commands: g , yt , gh . I also added the readme
Ships:
I made a space-themed New Tab page and styled it like a terminal. I hope you will like it ☺...
|
1792878687.0332036
|
1793742687.0332036
|
|
59439
|
ShitOS by @StupendousMaker | Stardance
|
StupendousMaker
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T10:05:13Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So this is a web based os called ShitOS. It doesn’t have any purpose except helping me learn styling in html. I don’t even know who would use it and what would they even use it for????", "repo": "https://github.com/samratveer22-boop/ShitOS-GoldenGate", "demo": "https://samratveer22-boop.github.io/ShitOS-GoldenGate/index.html"}]...
|
[{"post_id": 63644, "ts": "202 [{"post_id": 63644, "ts": "2026-09-07T15:51:20Z", "hours": 0.3103, "text": "ShitOS’ Code is shit too!"}]...
|
Title: ShitOS by @StupendousMaker | Stardance
Dev Title: ShitOS by @StupendousMaker | Stardance
Devlogs:
ShitOS’ Code is shit too!
Ships:
So this is a web based os called ShitOS. It doesn’t have any purpose except helping me learn styling in html. I don’t even know who would use it and what would they even use it for????...
|
1793130838.0242136
|
1793217238.0242136
|