You are browsing as a guest. Sign up (or log in) to start making projects!

nicholas1023

@nicholas1023

Joined June 18th, 2026

  • 18Devlogs
  • 3Projects
  • 4Ships
  • 15Votes
Ship

This ship focuses more on the firmware and documentation of my project! For this ship, I made a PC-like system for my microcontroller, including a DOS-like firmware which boots from a BIOS I written myself. The effect of the BIOS made my device look really like an actual usable computer from the 80’s and the DOS allows it to be used as a PC! After this, I would try to implement a filesystem, so that it can actually be used to store files, as it has 15 MB of extra flash!

Here is the DOS demo video: https://nicholas1023.github.io/macro-microcontroller-2/assets/dos-demo.mp4

  • 5 devlogs
  • 8h build
  • 5.00x multiplier
  • 41 Stardust
Video of Project → See source code →
Open comments for this post

38m 12s logged

Added new guide and modified the directory of the documentation site!

In this devlog, I added a new page for the DOS setup and usage guide!

As the pages in my documentation site are getting more and more, I decided to create a folder, and move the guides in, so the navbar would be less cluttered.

One problem I faced though was the CSS and icons not loading in the guide, as the directories were getting a little complicated, given that I am using the /docs directory in my repo for the site, which makes URLs without the full path returning 404. After a few commits (localhost was not using /docs as the root of the site), I finally found the right URL!

0
0
54
Open comments for this post

30m 23s logged

Organised the repo, README and docs!

In this devlog, I updated the README.md contents as it was a little outdated due to the new firmware revision.

I also just realised I didn’t link the datasheet for my board in the README, so that is also one of the changes I made.

Additionally, I created a 404 page for my docs, and I will be making my second ship soon!

0
0
36
Open comments for this post

2h 25m 38s logged

New Commands for DOS!

In this devlog, I added new commands for my OS:

  • CALCULATE: Performs basic operations on 2 numbers. Usage: CALCULATE [Number] [+ - * / ^ root] [Number]
  • GPIO: Turns on a specified GPIO for 1 second. Usage: GPIO [LED# IO# BELL MOTOR]
  • VERSION: Shows the release version.
  • REBOOT: Reboots the system. Usage: REBOOT -m [BASIC BOOTSEL]*
  • INFO: Displays device and memory information.
  • UPTIME: Shows device uptime.

I took quite a while to find out how to make the CALCULATE command work. Initially, 1/3 was returning 0. Turns out the problem was due to me using integers instead of doubles!

Here’s a demo video of the OS!

0
0
15
Open comments for this post

30m 21s logged

Some updates to the documentation site!

Since I added a new firmware, I have to update the downloads section of my site! It took me quite a while to organise my repo a little bit, as the firmware files were getting a little messier and releases getting more complicated as I have 2 firmware now!

Next, I’ll be working on the DOS, adding more commands to the system!

0
0
27
Open comments for this post

4h 6m 46s logged

New firmware update!

Previously, I was asking myself: How can I make my device look more like an old computer?

When I was turning on an old desktop I have at home, I saw the BIOS screen due to CMOS errors, and this was where I got an inspiration for a new firmware update.

In this devlog, I redid the firmware, added a BIOS-like CLI, while still keeping the original BASIC interpreter as a fallback if no bootable “OS” was found. Here’s what it looks like:

 _  _
| \/ | Macro Microcontroller BIOS Version 0.0.1.
|_\/_| Copyright (C) 2025-2026 Nicholas Lim.

Device: Macro Microcontroller 2 (RP2040 @ 125MHz)
Serial Number: ************
RAM Free: 254K OK
Serial Status: Connected

Press SW1 to enter Macro Microcontroller BASIC.
Press SW2 to enter BOOTSEL mode.

Booting system...

The UI was inspired by the old BIOS POST screens from the 1980s. As I wanted a retro feel to my microcontroller, I thought that a BIOS-like system would look nice to it!

Thanks for reading!

0
0
17
Ship

I made a custom new tab which uses NASA’s APOD API as the wallpaper which refreshes everyday. It allows you to select a search engine for your queries with just a click. For example, you could select Google, Bing or DuckDuckGo for daily searches and GitHub to search for repositories. You can also add frequently visited URLs to the pin section which will store them in localStorage. It looks much like a normal new tab page, but it aims for a simple and minimalistic page without clutters that built-in new tab pages have with automatically added bookmarks. One feature I’m proud of is the search engine selection dropdown. Most browsers only allow you to change that in their settings, but mine can be switched easily to fit the context of your search! You can try it out at https://nicholas1023.github.io/new-tab/!

Try project → See source code →
Open comments for this post

2h 23m 2s logged

Added URL Pin function to my new tab site!

What’s New

Added a function to pin your favourite URLs for easier access with localSotrage to ensure they stay even after reloads. Instead to showing the website’s name, it displays it’s favicon for a simpler UI.

Problems I’ve Faced

It took me quite a while to debug the localStorage function. It turned out that the issue was the parsing and storing URLs as an array.

0
0
15
Open comments for this post

3h 0m 21s logged

Finished the basic functions of my APOD new tab page!

What I’ve done in this devlog

  • Set up the API Key for APOD
  • Create the basic UI and functionality for the new tab page.

Problems I faced

My site was initially deploying via pages-build-and-deployment, which led to the API not working. After some time and many git commit --allow-empty -m "Trigger pages build", I finally found out what the problem was! I didn’t change it to build via GitHub Actions. After changing that, it worked quite well. Another problem I faced was the timezone difference with my country and APOD’s API. I received 500 errors when calling them. It worked in the end when i used yesterday’s date!

What’s next

I’ll be thinking of what other features I should add to my new tab page, and implement them in the next devlog!

0
0
4
Ship

I’ve made Macro Microcontroller 2, a microcontroller development board and macropad with a custom BASIC interpreter firmware created in C from scratch! I’m proud of the PCB itself as I was surprised my board works well physically, as it was my first attempt creating one with a bare MCU chip on it! TO accompany the firmware and hardware, I created a documentation site to share more details as well!

Documentation: https://nicholas1023.github.io/macro-microcontroller-2/

  • 8 devlogs
  • 10h build
  • 5.00x multiplier
  • 52 Stardust
Video of Project → See source code →
Open comments for this post

3h 40m 21s logged

Finally received the board and soldered the parts on!

In this devlog, I made some changes to the firmware and released v0.0.3 that adds support for comments:

10 REM This is a comment that will be ignored!
20 PRINT "Hello world!"

I’ve also added a more detailed programming guide for my custom BASIC Interpreter.

Difficulties I’ve faced

I had some trouble soldering the keyboard switches on as it was moving everywhere. I’ve attempted applying tape, but it did not work as the temperature was too high.

I’ll be tidying up the repo and get ready to finally ship🚢 my project!

0
0
9
Open comments for this post

2h 55m 43s logged

Updated the firmware and ordered my PCB and parts!

In this devlog, I’ve added a new function to my custom BASIC interpreter for my development board, and finally sent my PCB for manufacturing!

It took me quite a while to write the random number function that the old BASIC interpreters used to have: RND. I did many rounds of trial and error to finally create a working code (the previous code was returning either nothing or throwing compiler errors due to data types):

printf("%f\n", (float)rand() / (float)RAND_MAX);

Here’s a sample program you could run that generates a random number, stores it in a variable and prints it:

10 let x = rnd
20 lsvar
30 print x

Now, I’ll be working on support for comments in my interpreter and wait for my parts to come. I can’t wait to assemble my macropad + dev board!

0
0
7
Open comments for this post

1h 15m 23s logged

More updates to the documentation site!

Today, I changed the layout and content of the documentation website and made it responsive for mobile devices! I initially wanted to add a 3D viewer to display the .glb file for rendering, but it did not output the result I wanted. (The silkscreen was not appearing!) I’ll read up on more about it, and hopefully, I would be able to add the 3D model into my documentation!

0
0
4
Open comments for this post

2h 35m 8s logged

Created a documentation site for my microcontroller!

In this devlog, I improved the documentation of my project by creating a simple website to share specifications, schematics, and provide a direct link to download firmware and 3D print files. You may view it at https://nicholas1023.github.io/macro-microcontroller-2!

What I’ll be doing next

Next, I will be ordering the PCB and electronic components and finally solder them together!

0
0
3
Ship

I made a web-based OS that includes a panel with a clock and power off button, a file viewer, a terminal version of my personal website, and a web app installer that allows you to install websites that are not web app as well. The most challenging part was the web app installer as I needed to develop the logic to integrate the website as an app and allow them to have a top bar as well. I was quite surprised with the result, as it was able to make a website look like a native app (In fact, the terminal is a web app!) and the power off button made it really look like a real low level OS running on a computer. One thing to note is that the installer is not able to launch sites that disallow 3rd party embedding.

Try project → See source code →
Open comments for this post

2h 24m 34s logged

New app installer for my OS!

In this devlog, I have created an app installer that installs a website as an app, much like how a web app works. However, this function only works for URLs that allow embedding.

I have also solved a bug where apps dragged past the viewport creates a scrollable viewport by adding this:

overflow-y: hidden;
overflow-x: hidden;

I’ll be shipping it soon! Try my OS out at https://nicholas1023.github.io/Nicholas-OS/!

Here’s a demo video of the installer installing hackclub.com as an app!

0
0
4
Open comments for this post

2h 22m 28s logged

Added new apps to my OS!

I’ve added a file viewer and terminal app to my operating system!

What’s new?

  • Window dragging finally works!
  • Windows are able to move to the front!

Problems I’ve faced

I had issues making a window come to the front when clicked or move. Initially, I was using .style.zIndex++, but it did not seem to work when a window was clicked multiple times. To solve this, I changed all the z-index of all windows when one is clicked, to ensure all of the values sync.

The buttons on the top bar are currently text-based, so I’ll be creating icons for them, and to declutter the buttons top bar on apps.

0
0
3
Open comments for this post

2h 1m 42s logged

Finished the windowing system and a bottom panel!

What’s new

  • Loading screen
  • Windows with maximise, minimise and close buttons
  • Bottom panel with time and power off button

What I’ll be working on next

Next, I will be making the windows draggable, and creating icons for the apps.

I’ll also be improving the loading screen, which currently only consists of the following code.

<div id="boot">
    <div style="text-align: center;">
        <h1>Nicholas' Operating System</h1>
        <p id="loading">Loading...</p>            
    </div>
</div>

Problems I faced

When creating the window functions, which manages maximise, minimise and close buttons, it did not seem to work. I realised later that the function name was actually overwriting a built-in function as it was initially named close()! In the end I renamed it to closeW(), where W stands for window.

I also faced issues with the height of the <main>. Initially, the height of main was set to 100%, which failed to work. After some searches online, I tried replacing 100% with 100dvh, which worked perfectly!

0
0
2
Open comments for this post

3h 1m 13s logged

Finished the enclosure and organised the repository!

Today, I have completed the 3D case for Macro Microcontroller 2 and did some minor bug fixes for the BASIC Interpreter. I needed to reassign the GPIO pins from the first revision of the board.

Although the interpreter is currently still basic, it supports 4 BASIC statements and 4 custom statements for controls.

What’s new in this devlog

  • Text and key labels for enclosure with cover
  • Organised repository
  • New KEY statement for hardware GPIO control
0
0
3
Open comments for this post

2h 4m 14s logged

Halfway through my PCB’s case!

What I’ve done in this devlog

For the first-half, I added silkscreen text to the PCB for the IO components (GPIO Pins, Keyboard switches, LEDs…). Next, I moved on to designing the enclosure. It took a while for me to get used to using a new app to design it.

Modifications to the PCB

  • Added screw mounting pads for easier mounting.
  • LEDs moved closer to each other for space to add silkscreen designs.

Problems I’ve faced

The screw holes were not appearing during the first few attempts, but it worked in the end when I placed it manually, instead of using the move function.

Creating the cutout for the USB connector took me about 15 mins as I needed to measure the length and clearance needed for a micro-USB plug and create another sketch before extruding it as a cutout.

What I’ll be working on next

Next, I’ll be continuing with the enclosure design, adding a cover with a keyboard plate, and finally moving on to the BASIC interpreter firmware for it!

0
0
4
Loading more…

Followers

Loading…