Stats

15
Projects
73
Devlogs
110
Votes
5
Ships

Coding Time

All Time: 122h 45m
Today: 1h 54m

Member Since

June 18, 2025

Badges

2
🚢
Maiden Voyage
you shipped your first project! the journey begins...
Ballot Stuffer
vote 100 times.

Projects

15
🚀
5 devlogs • 15 days ago
orpheusmarket
12 devlogs • about 1 month ago
Markdown Converter for Raycast
5 devlogs • about 2 months ago
🚀
0 devlogs • about 2 months ago
another personal website
7 devlogs • about 2 months ago
🚀
6 devlogs • 2 months ago
🚀
1 devlog • 3 months ago
🚀
8 devlogs • 3 months ago
🚀
0 devlogs • 3 months ago
u-crawler

u-crawler

Shipped
10 devlogs • 3 months ago
🚀
5 devlogs • 3 months ago
🚀
7 devlogs • 3 months ago
🚀
5 devlogs • 3 months ago
🚀
1 devlog • 3 months ago
Read More

Read More

Shipped
1 devlog • 3 months ago

Activity

Earned sticker

I added a simple d6 dice roll that uses the random library, with logging and options to post in channel. I also created a boilerplate template that I can use for new commands that just requires changing a single variable (which is the command name). The dice roll firsts generates a random number between 1 and 6, checks the args (show in channel or visible to the user only) and if it contains true, it posts the random number in the channel. If it is anything else, it makes it so only the sender can see it (they're called ephemeral messages)

Earned sticker
obob
obob worked on orpheusmarket
1h 19m • 4 days ago

I made a way to collapse the options because they can get really messy and in the way on small screens. In theory, it should have been simple, it's a button that changes the css of the div holding the dropdowns. I also wanted to make it save whether or not it was visible, so if you reloaded the page, it would stay the same. However, Flask is really slow at updating the session (the cookie), so if you reloaded the page and pressed the button within around 3 seconds, it wouldn't update (since i was using a post route that only updates it after it returns and finishes). Fortunately, I found out you could use session.modified = True to make it change and that's why it took me so long lol :D

Earned sticker
obob
obob worked on orpheusmarket
1h 25m • 5 days ago

I added the time machine feature! Basically, my main function uses a helper script to get all of the backups in a directory (hosted in /static) and show them in a menu. You can select a date and it will save it in your session (or cookie) just like the shop and dates. Unfortunately, the older backups are not compatible as i used a different structure (hence why the 20th is empty in the video) but i'm slowly building up a catalog of backups. Also I learnt a really important lesson lol, i need to MAKE MY CODE MODULAR, because it took me an hour when it should have been 10 minutes to implement this 😭

Earned sticker

I tried to make a script that checks if a user is a channel manager but it turns out that there isn't a way to get this using documented apis unless you have slack enterprise, which Hack Club doesn't 😭 While doing this, I also moved the logic into modular programs, with commands being separate and a single main program that loads everything at once. This program handles environment variables and reduces the need to run multiple scripts at once. Also I found a message in the Slack about a method of finding channel managers involving an admin cookie, so I will try to implement that next, but for now, it only works if the id of the user running the commands is mine or the channel is #obobs-duck or #bot-spam

Update attachment
Earned sticker
obob
obob worked on orpheusmarket
20m • 11 days ago

I started to lay the foundations for the time travel / archive feature. I changed the backup script to not copy images anymore and instead save them directly to static (since there is no reason not to). I also created a new function in the helper program that gets the latest backups, which retrieves all of the existing backup apis in static, which I will use to show a dropdown to select a date

Update attachment
obob
obob worked on orpheusmarket
29m • 11 days ago

I made some small quality of life improvements including fixing the website title, adding a favicon and fixing some bugs (a result of using quotes inside of quotes). Finally, I added some meta and opengraph tags to the rendered html, so platforms like slack can preview orpheusmarket better, with a description, title and image! Check the image for a better idea of what I'm talking about :D I also made it so that the backup script deletes the oldest backups to keep the count within 30 (only on nest because i have only 15gb of storage, I will keep all of the old backups on my raspberry pi, for the future time travel feature).

Update attachment
Earned sticker
obob
obob worked on orpheusmarket
2h 39m • 12 days ago

wow! This took me a while, but basically all of the images are locally hosted instead of being on the hc cdn (in case it breaks again 😭)! I had to change all of the paths in the backups script (because it was originally made for my rasperry pi, which runs linux) using os so it works on any platform (Posix or NT). I also modified it to save a new JSON file named images.json which contains all of the data for the main flask application to find images and their location. Since I'll probably set a cron job to run the backup script every 12 hours, I added a fallback, so if the image doesn't exist, it just uses the cdn image. tysm for actually reading!

Earned sticker
obob
obob worked on orpheusmarket
42m • 13 days ago

Mahad changed the API a bit to account for the stickerlode so I had to fix my script (basically change if item["blackMarket"] == True to if item["shopType"] == "blackMarket). I also added another dropdown which allows you to browse the regular SOM shop in the same website (it's also much faster than the SOM website because most of the data is cached). I had to make some changes to the css, which involved a media query (@media (min-width: 768px) {} to make the dropdowns stacked because smaller screens can't accommodate the space needed for them being side by side. Next, I will probably either add support for stickerlode or have a time machine function where you can see stock for a particular date (courtesy of my backups lol). Thanks for reading :D

Update attachment
Earned sticker
obob
obob worked on orpheusmarket
2h 17m • 13 days ago

I implemented a backup system because last week, when I was testing this, both @mahad's api and the Hack Club cdn were down :( I originally had it running on my raspberry pi and it does something similar to the actual app. It makes a request to @mahad's api, iterates over everything and saves the images to a directory with a timestamped name. The helper script that actually gets the black market items checks if the api returns a abnormal HTTP code (anything other than 200) and if it does, it runs another function to get the path of the latest backup and then loads that!

Update attachment

I made the sticky note actually stick! Basically, it has a function that runs whenever a message is sent in a channel that it's in and the bot checks if there is a sticked message, then saves the text from it, deletes it and sends it again. The first implementation wasn't the best because it would be called multiple times on different threads so it would bug out, post the same message twice and just wasn't very efficient with a new thread for every message. To fix this, I used the threading library to implement locks for channels and a debounce of 1 second so if a channel is really busy it doesn't waste lots of resources and won't bug out! ty for reading :D

I started making the sticky notes feature which basically sticks a message to the bottom of your channel. Right now, though, it doesn't actually pin it (it just acts like a normal message and if another message is posted in the channel, it doesn't actually stick 😭), which will be what i do in the next devlog.

To actually make this feature, I created a slash command (/sticky-note) which has 3 actions, create, edit and delete. I used the Slack Bolt library with socket mode so i don't need a https endpoint and created a script that basically listens for the slash command. Then it splits the command into 2 parts, the action (the first keyword) and the message. If the action is valid (create, edit or delete) then it will do the action and if not, it will display an ephemeral message to the user with a usage guide. I also used sqlite3 to store the messages (channel_id and timestamp to be more specific because that's how slack keeps track of messages) in a database so it still remembers messages after a restart. and uhh sorry for this long devlog lol :D

I read the slack docs and created a simple script with the slack_bolt library to respond to the message hi in my testing channel

obob
obob created a project
14d ago

obob's duck - a slack bot

a slack bot that i'm making to help with some stuff

5 devlogs 0 followers
Anirudh
Anirudh Shipwright gave you feedback
22d ago

orpheusmarket

nice project works well, atleast I didn't actually bought something lol, but BM is for PIRATES, HAHAHAH c3

from Anirudh

I created a readme and banner using inkscape!

Update attachment
obob
obob worked on orpheusmarket
1h 12m • 23 days ago

I styled the button with css to make it bigger and put it into a card, like the items. I also added a picture of orpheus on the top bar, and some css (overflow-x: hidden; and max-width: 100vw;) to prevent horizontal scrolling, a really annoying issue that I have come across many times when scrolling through websites on a phone, which you can see near the end of the video. Also, the dropdown didn't appear in the video (it does appear in the actual website) for some reason, so ignore that

obob
obob worked on orpheusmarket
1h 58m • 23 days ago

I added lots of CSS to the cards and replicated the theme of heidimarket. Basically, I just have a variable where I add CSS and inject that into a <style> tag. I also added a region dropdown that allows you to get the correct cost for your region. When you change your selection on the dropdown, it adds ?region=regionhere and reloads the page. If the region is a valid region (US, EU, IN, CA, AU or XX) and then changes the items displayed to you and your cookie (so it stays persistent)

Update attachment

I created the basic webpage using Flask. It uses my script from the previous devlog (but modified to print anything) to get the items which are then iterated over and made into a card as seen on line 20-25. I just created a really simple boilerplate for the html and added {{card_html|safe}} in the body to render all of the cards. I had to use the safe option, else it would have been escaped by flask and wouldn't work. Right now, I have the images, buy links, title and description. However, I still need to add proper CSS because right now it looks like a webpage from the 2000s lol

I created the first basic script to get the items from @mahad's api, split them into blackmarket and the normal shop and display them with the shell count. I used the Colorama module for the colored output and the requests library to get the api. There is a spaces variable that is set to 5 and subtracted by the length of the shell cost. This just makes everything aligned and is by far the most overengineered part so far. The script also gets the regions from the api and puts it all in a set, so you can get accurate costs for your region

obob
obob created a project
34d ago

orpheusmarket

a fake blackmarket site with the actual stock and products in the real black market! built with flask and mahad's api!

orpheusmarket
12 devlogs 1 follower Shipped
obob
obob worked on shells
1h 5m • about 1 month ago

I created a simple AI detector that uses the features as described in the previous devlog. For now it works well for what I need it to, but I might change train a model if I need to in the future. There is a new script called getDevlogs which basically fetches the text from each devlog in a project (in my database, each project has an array of devlogs which I iterate over in the script). Then it runs my classifier which basically uses math to calculate the AI probability. Then the mean of the scores are calculated and that is the final percentage which you can see near the end of the video

obob
obob worked on shells
2h 7m • about 1 month ago

I created a python script that extracts the important features of the input text (either text or code). I will then later use this to calculate the probability of it being AI without using AI to calculate. So far it returns the number of words, number of sentences, mean sentence length (using numpy), buzzword ratio (using a list of buzzwords provided in a txt file) and the punctuation ratio

I wrote a readme with installation instructions and a demo video!

Update attachment

I added a better UX design for both modes and a HUD alert now shows when the extension has finished converting. When you open the extension, an interval shows a Loading clipboard message with the number of dots at the end changing. After your clipboard has loaded, then the output is saved to your clipboard, the window closes, and a small HUD alert will show (which you can see in the video)

This will probably be my final devlog for this, and it was very fun to make (my first time using react :D) Also side note, the raycast api is really easy to use (for some reason I was expecting it to be overly complex lol)

I implemented HTML to Markdown so now you can go both ways. Since marked can't convert HTML to Markdown, I am using turndown.

The extension also now copies the result to your clipboard, however that has the result of immediately closing it, so in the next devlog I will deal with that and make it look better

I implemented markdown to HTML conversion using the marked library. It first gets the clipboard using the raycast clipboard api, then it trims the result, checks if it isnt null or undefined and gives it to marked. Then it returns the original rendered markdown and the raw html output in a code block so you can actually see the tags

I created the basic function to get the contents of your clipboard using the Clipboard.readText() function from the Raycast API. It uses the useState and useEffect hooks and runs the Clipboard call in async so I can use await. It also handles abruptly exiting simply using a variable named cancelled. Next, I will convert the returned markdown in the clipboard, convert it into html and copy it to the clipboard, probably by using Clipboard.copy()

I added linux arm support to the prebuilt pyinstaller binaries so u-crawler can run on my raspberry pi :D

I also had to set the github actions runner to run bookworm instead of the latest debian version. Otherwise, older versions of debian distros wouldn’t work (see the attached image) as they are packaged with an older version of glibc (the c library that pyinstaller uses)

Update attachment

I fixed some errors that might have caused issues on other devices. For example, I changed the selenium headless flag to the older one that still works, disabled disable gpu and remade the spec file to be more efficient and only include modules that I actually need. The attached screenshot of it working on my device, and I also tested it on 2 other laptops so it should work now

Update attachment
obob
obob created a project
46d ago

Markdown Converter for Raycast

A Raycast extension that converts Markdown to HTML and vice versa. I used the marked.js and turndown libraries to convert the text into HTML and Markdown, and Clipboard.read() from the Raycast api to get the original text.

Markdown Converter for Raycast
5 devlogs 0 followers Shipped
obob
obob worked on shells
1h 9m • about 2 months ago

I created a program that searches the MongoDB database from my previous devlogs and prints out the results. It uses fuzzy search (the $search operator that can be seen in the code in the video) which basically also returns matches even if they aren't exactly the same as the query. It then sorts it by relevance and includes pagination using this line:

skipcount = (page - 1) * pagesize

which is then passed to the project_collection.find() method

obob
obob created a project
52d ago

tinypie

A tiny RP2040-based devboard

0 devlogs 0 followers
obob
obob worked on shells
4h 8m • about 2 months ago

I changed the script to use async which fetches data concurrently and is much faster! (30 minutes down to around 3 minutes!!!) It also now uses bulk_write with mongodb, which is much more efficient and reduces the amount of connections needed.

I also got a nest account, which is where I will be hosting the backend (my next step is to make the front end)

I deployed to github pages and fixed some hyperlink issues

Update attachment

I improved the css alot! I added a font from google fonts, a background and custom text formatting

Update attachment

I added a really really simple contact page

Update attachment

I added the projects page with a div for each project so you can simply copy and paste and have new card!

Update attachment

I finished making the homepage which shows some of my interests and projects

I created the first version of the homepage. It includes a footer, my profile picture as a clickable button and some info about me

Update attachment

I made a very simple 404 page (css coming soon)

Update attachment
obob
obob created a project
54d ago

another personal website

A personal website I made for the Swirl ysws, which features my projects and some cool stuff

another personal website
7 devlogs 0 followers Shipped
obob
obob worked on shells
43m • about 2 months ago

I added devlogs to the data that the script updates

Update attachment
obob
obob worked on shells
1h 28m • about 2 months ago

I created a python script that uses the SOM projects api (https://summer.hackclub.com/api/v1/projects) to update a MongoDB collection with information about every project in Summer of Making. This data in the data base will then be used to calculate the estimated shell profit

Update attachment
obob
obob created a project
60d ago

shells

A website that estimates how many shells you will get from a ship!

6 devlogs 0 followers
obob
obob worked on u-crawler
34m • 2 months ago

I added github actions support so i can build using pyinstaller for MacOS, Windows and Linux!

Update attachment
obob
obob worked on u-crawler
29m • 2 months ago

I added pyinstaller support which builds u-crawler into an exe that is easy to run, with no need to install dependencies or to even have python!

Update attachment
obob
obob worked on Chronotime
2h 51m • 2 months ago

I added a dialogue system using the dialogic plugin and a new movement system which has double jumps, slams and more!

obob
obob worked on Chronotime
2h 2m • 2 months ago

I added a health bar and an artifact bar that uses art I made in Aseprite. I also added helpful debugging messages and a base scene that contains all of the required components such as the health bar and killzone so I don't have to add them manually every time I create a new level

obob
obob worked on Chronotime
29m • 2 months ago

I made a gem that will be used to show the amount of artifacts collected like a health bar in game

Update attachment
obob
obob worked on Chronotime
50m • 2 months ago

I created a big todo markdown file to keep track of what I need to do. It includes stuff like health, music and level design

Update attachment
obob
obob worked on Chronotime
27m • 2 months ago

I created an option in the next_scene node to decide whether to check the amount of artifacts collected or not (it is only checked in the second level of a time period). I also made a second level to test it

Update attachment
obob
obob worked on Chronotime
1h 20m • 2 months ago

I added a scene that decides whether to move you to the next time period depending on the number of artifacts you have collected. Each time period will have 4 artifacts, and you only need 3 to progress

obob
obob worked on Chronotime
1h 31m • 3 months ago

I added a collectible system that can be used for artifacts in each time period.

Update attachment
obob
obob worked on Chronotime
1h 51m • 3 months ago

I created a basic movement script with coyote time and double jumps. It also features easily changeable variables (such as speed and jump strength) to customise the feel of movement later

obob
obob worked on hackpad
24m • 3 months ago

I just finished routing my pcb. Some traces got in the way of the ground fill, which took a while to fix, and on top of that there were so many silkscreen DRC violations :(

Update attachment
obob
obob worked on hackpad
16m • 3 months ago

I laid out the new pcb design

Update attachment
obob
obob worked on hackpad
16m • 3 months ago

I made the schematic a lot neater, fixed the oled pinout issues and made the rgbs reverse mount so they can be put under the keys. I also changed the matrix to include the rotary encoder and made it 2x3

Update attachment
obob
obob worked on spotify-mood
1h 55m • 3 months ago

I finished the login flow and the function to get user details

Update attachment
obob
obob created a project
80d ago

spotify-mood

A website that uses the spotify api to tell you the "mood" of your playlists

1 devlog 0 followers
obob
obob worked on u-crawler
32m • 3 months ago

Finished readme

Update attachment
obob
obob worked on u-crawler
40m • 3 months ago

I added error catching and logging in programs.py. Now I just need to write a readme

Update attachment
obob
obob worked on u-crawler
42m • 3 months ago

I implemented error catching and logging in categories.py

Update attachment
obob
obob worked on u-crawler
31m • 3 months ago

I implemented a robots.txt checker to make sure that it doesn't scrape forbidden pages

Update attachment
obob
obob worked on u-crawler
2h 18m • 3 months ago

Now my scraper uses the results of categories.json to crawl every program inside of that category. Instead of simply using requests and beautiful soup like I did for the category scraper, I had to use selenium to launch a headless browser, because the data for the programs is rendered with JavaScript. In the the screenshot below, you can see the format of the results with categories.json and the programs in each category as their own file and with some of the code on the right.

Update attachment
obob
obob created a project
83d ago

Chronotime

A 2D platformer where you go through time to collect artifacts

8 devlogs 0 followers
obob
obob created a project
83d ago

portfolio

a personal website I'm making to showcase my projects!

0 devlogs 0 followers
obob
obob worked on u-crawler
1h 11m • 3 months ago

I finished the code that gets all of the areas of interest on the home page and puts it in a json file

Update attachment
obob
obob created a project
83d ago

u-crawler

u-crawler is a web scraper that utilizes the BeautifulSoup, requests and selenium to collect data about courses and programs from the University of New South Wales. It adheres to robots.txt and outputs its results into a neatly formatted directory composed of json files. I created this for the Anansi YSWS and I learnt a lot about web scraping :D

u-crawler
10 devlogs 0 followers Shipped
obob
obob worked on treeboard
48m • 3 months ago

I added an idle animation that activates after 30 seconds of inactivity and a startup animation that activates when the board powers on.

I also added feedback to the reaction game, if you get < 230 ms, the LEDs will blink quickly, for < 350 ms they will blink normally and longer than that, they will blink slowly.

Update attachment
obob
obob worked on treeboard
1h 9m • 3 months ago

I added a new game-binary!

How it works:
- The LEDs will show a binary number for 5 seconds
- When they turn off, you have to input that value using the keyboard
- Pressing the top left button adds 1
- Pressing the top right button adds 5
- Pressing the bottom left button subtracts 1
- To submit your number, hold the bottom right button for 2 seconds
- If you got it correct, the LEDs will all flash twice
- If you got it wrong, they will flash one by one 2 times

Update attachment
obob
obob worked on treeboard
11m • 3 months ago

I added a bit more silkscreen

Update attachment
obob
obob worked on treeboard
2h 5m • 3 months ago

I wrote the firmware for the device and added some helpful silkscreen

Update attachment
obob
obob worked on treeboard
54m • 3 months ago

I created the schematic and made the pcb design

Update attachment
obob
obob created a project
91d ago

treeboard

a pcb with switches that you can fidget with

5 devlogs 0 followers
obob
obob worked on hackpad
1h 4m • 3 months ago

I finished routing the pcb! However, the OLED pins might be wrong so ill fix that later

Update attachment
obob
obob worked on hackpad
32m • 3 months ago

I made the PCB outline, and now I get to route everything.

Update attachment
obob
obob worked on hackpad
16m • 3 months ago

Schematic Done! I decided to change it to a 2x3 keyboard layout so I could use a pin for the OLED display (which will be used to display stats and info)

Update attachment
obob
obob worked on hackpad
19m • 3 months ago

I wired the key switches together. I'm planning on having a volume knob and an oled screen

Update attachment
obob
obob created a project
93d ago

hackpad

a macropad with an oled display and volume knob

7 devlogs 0 followers

I added more silkscreen art to the PCB, thank you solder people for helping

Update attachment

I made the circuit on a breadboard, and added a resistor to make the sensitivity potentiometer actually work. I'm probably ready to ship now!

Update attachment
obob
obob worked on pcb keychain
13m • 3 months ago

Added a keychain hole and some silkscreen art.

Update attachment
obob
obob worked on pcb keychain
43m • 3 months ago

I made the first version of my pcb design! it's supposed to be a cute duck keychain, but now that I think about it, I forgot the hole lol.

Update attachment
obob
obob worked on pcb keychain
1h 7m • 3 months ago

I finished my schematic! I'm planning on making it turn on in the dark (with the photoresistor) and off in the light.

Update attachment
obob
obob created a project
97d ago

pcb keychain

A PCB with lights that you can use as a keychain.

5 devlogs 1 follower
obob
obob worked on mirrored
17m • 3 months ago

I made the mirrored component and a simple level to test it out.

Update attachment
obob
obob created a project
98d ago

mirrored

A game where you control two characters whose movements are mirrored.

1 devlog 0 followers
obob
obob worked on Read More
1h 42m • 3 months ago

Finished making the core part of the userscript (finding comments and clicking on read more). Definitely took me way too long :(, but it now works with YouTube comments as well!

Update attachment
obob
obob created a project
98d ago

Read More

This is a userscript that automatically expands comments in Youtube and Reddit. Read More is a user script that automatically expands truncated comments in YouTube and Reddit, saving your time.

Read More
1 devlog 0 followers Shipped
obob
obob joined Summer of Making
100d ago

This was widely regarded as a great move by everyone.