June 22, 2025
Of course there are also the classical radio button matrix'. I've took some time to style them so it's clear for users that don't dill surveys as often what they should do.
We all know and have seen matrix questions, input arranged in a table. But have you seen date matrix'? Because I haven't but they could be used for 1st / 2nd / 3rd preference or something like this. I might even add dropdowns in for such scenarios.
These 3h have been recorded over the last 3 days, so tbh I don't really know everything I've done anymore (I know I should devlog more frequently). Probably as I know myself jumped around a lot and did some small things here and there. I definitely did start on the matrix questions, as visible in the screenshot. And I think I did the mentioned options compile rework, as that doesn't seem to be covered in a previous devlog. For this rework, I've basicaly gone from a system that was robust at first, but fell apart when new things were just taped on to a new system built with all these improvements in mind already. Specifically, previously I was first replacing anything not fitting with special escape sequences (random uuid4s), but now I just go over it character by character and have variables for e.g. value enquoted, etc.
I first tried making an indicator for minlength and maxlength attributes of an input, but I didn't really know how to do that, so I switched over to styling the select/dropdown elements to look better on Chromium-based browsers. They were already looking well on Firefox, but not as much on mobile browsers and other desktop browsers (Chromium based center aligned the options in a really weird way).
Finished the first task, where my goal was to find out how many balls a school needs to buy, so that every student can have their own ball during all lessons. This was relatively straightforward, just reading the input and going through each time slot and noting how many balls are required and then compiling it into a beautiful output.
44th "Bundeswettbewerb Informatik" (Germany-wide informatics competition)
It took me way longer than it should to implement the aforementioned feature of passing attributes.
While trying to implement this, I noticed, that my new seemingly more robust option compiling system has had some unrobustnesses, for example not accepting equal signs, even when enquoted or not stripping attributes correctly.
Got text input fields up and running (again, bc compiler rework...)!
You can define a datalist, like I did here or just make a noral text input. Now to work on getting attributes conveyed to that input, so things like placeholders, etc. can be set up.
I honestly don't know what the 3h are for, they kinda just appeared (I did not hack), but I did some things after the last devlog:
I've been jumping around a lot from different pieces that need work, one of them being figuring out, why the elements of an optgroup don't render correctly (indented in FF), after a lot of trial and error, I finally found, that <hr> tags are allowed everywhere else in a select tag, but not there. And yeah, I did many of such smaller problems and the time stacked up.
So, this is a group project done at the Buildathon Berlin 2025, I only log my time, so development may appear fast. The others in my team already worked with the languages/tools/frameworks we're using for this project and were more experiences in programming in general, so I had a rather small role in development.
I was mainly responsible for the front-end in cooperation with another teammate. They coded the most parts and I researched and tested a bit. Things that I've researched and/or tested are how to hide the window titlebar in Tauri/Svelte, how to make the window appear as a popup (transparent background in our case) and I spent a lot of time just researching and looking up, how to get the window to resize using JS/TS based on content in the app, but ultimately did not find a solution.
This project was the group project from the group "Morelinq" at the Buildathon Berlin 2025. Caly is an AI-driven calendar interface, that has a clean, minimalist input where users can type in their events on the go, in natural language for a mix of a compiler and online AI services (Hackclub's AI) will convert it to a full, detailed calendar event. Additionally, you can chat with your calendar - Ask questions not only directly related to events. You could ask what to wear for an event and the AI will produce a smart answer based on multiple factors such as the type of event and even the weather during the event. AI was used for coding mindfully. We did not just copy-paste code from AIs and call it an innovative project. We understand what every single bit of this code does and just used AI for repetitive tasks or to be more efficient. --- Note: I can't compile this to any useable file on my machine, as I don't use Windows. Please build the project yourself.
I edited the none option from the last Devlog to have a customizeable text using an option as well as fixed a bug with the optgroups not wrapping correctly (essentially HR elements aren't allowed in an optgroup)
Added the beforementioned None option along some other bugfixes and minor improvements (I've gone through ./todo.md, but forgot what I did exactly). We also hit 60hrs already!
(img: I've kinda gone with the food example of my classmate, so here is another food question, this time with a none option and inside a select)
Added the next question type, dropdowns. It took me some time to figure out the best way for required/optional questions to work, but I've found a good way by auto-selecting an option that just says please select (that option is only there if nothing is preselected by the way). Another thing to do now, is add a none option for optional questions that don't have the please select element.
Today, one of my classmates wanted to see my code and what it does, so I coded a quick food quiz.
JS code is something for me that requires much time for less progress than Python. Not because I know Python better, but because JS is more often reviewed and edited by me. So this whole devlog is just covering one small JS feature, which was there previously, but recoded by me, as the previous implementation was bad.
It is the weird way to handle other input fields for radio buttons and checkboxes, as they are weird. I know have a solution I mostly like, except not automatically changing focus to the text field when clicking the label / radio button / checkbox. The solution is close to what Google Forms does, so if typing in the text field, the radio button gets selected.
50th devlog at nearly 60hrs!
I have continued some work on JS to make the form feel native and accessible. Todays improvement: Make the other input disappear and reappear depending on if the checkbox/radio button is checked or not. First I did it with localStorage, but then changed to a way smarter system. The input is there all the time, however with a CSS style of color: #00000000 (fully transparent) it appears invisible. Now it's time to think about and add the necessary JS so these inputs appear connected (e.g. selecting radio/checkbox when typing in text field)
I wasn't all too wrong, the checkbox was indeed just some copy/paste magic and it's finished already. One quick JS bug fix and it's fully finished and working!
I just now stumbled across my first devlog with the time estimation of around 10hrs, and I've nearly laughed out aloud. I've calculated the times of each devlog and now, with only radio buttons working again, I'm at 16hrs already! Took more time then I'd have liked, but the result is definitely way better.
I thought it was a super smart idea to combine radio inputs and checkbox inputs, then spend a lot of time doing this just to realize their fundamentally different in some cases (mainly name/value meanings and required meaning), so it's better to make them separately while copy/pasting some code (or even making new functions)
Then I moved some code around:
Previously my ./compiler.py was way to crowded and ./filter.py did nearly nothing, so ./filter.py now got the code for specific blocks and ./compiler.py the code for specific processing of blocks.
So 30mins pretty useless as most got reverted, so I had somewhat of a struggle to find a good image. So these are my current Python files (./compiler_old.py is the old version, bwfore I started rebuilding)
small fix: My ./main.py script I wrote at the beginning of fMD used a longer form to get the options, now it's way more compact.
Old Form:
try:
option = options[key]
except KeyError:
option = default
New Form:
options = options.get(key) if key in options else default
After adding a background image again (Wikimedia Commons Picture), I noticed the CSS needs additional changes, that everything is well visible. Additionally I've added the full valid/invalid colour scheme to the submit button as well as the fieldsets. While adding it to the submit button I noticed, how close I am to getting a Pages System working. I just need to use JS to only allow continuation to the next page when the current page is valid. I always thought it would involve custom validity checking.
Now first appearance, not just one but infinite other options for radio and/or checkbox questions! I did not see this on any other form builder service yet!
this was the main thing done it these 20mins, along with manditory bug fixes for this feature.
JS improvements and bug fixes...
One new feature I added, is the abbillity to automatically highlight the text input when clicking on the radio button or label. This is something I've wanted for some time now and just now came around and have done it.
My last devlog didn't post yesterday, so two devlogs in one:
I've made it look slightly more clean again discovering the use of fieldsets and legends for a cleaner group look (the fieldsets will get a custom styling soon™)
And I revisited my plan from the reading session to just use CSS properties :valid and :invalid to style the input accordingly.
And some quality of life improvements, such as finally selecting the radio when clicking the text field of the other option.
somewhere in between these devlogsI also moved from setting radio groups as optional to adding an option no answer, as optional radio groups are a joke (once one radio button is selected it can't be unselected).
Some new projects just appeared out of the wild. Mostly different projects from online research (Stack(overflow/exchange), etc.), so here is another hour!
Finished some last details with the multiple choice question. Although this question took a long time now, I think the rest of the compiler.py rework will be way faster as it's at least somewhat copy-paste stuff.
Important things I've learned:
- value if condition else value (e.g. True if answer == yes else False)
- crazy usefulness of f-strings (known them before, but not used as much)
»My alma mater was books, a good library…. I could spend the rest of my life reading, just satisfying my curiosity.« (Malcolm X, Muslim minister, human rights activist)
Well I continued reading myself into just <input>s of HTML. At the end of this project I'll be a master to create <input>s in HTML, but wouldn't know how to do cursive text (really don't know rn). The image shows the articles I want to read to code cool new stuff.
(Again notice for the approvers: I have Wakatime for Firefox installed, however set to only include sites I only visit when coding on this project. If I should, for some reason visit them outside this project, I'll make sure to open them in a Private Window, where extensions are disabled)
What I've learned:
- custom form validation (for pages system and css styling) doesn't need to be custom, there are already built in JS and CSS options!
- way more options to customize rules to values in a form than I thought, so these will be implemented as well.
I didn't do too much, as I was half-listening to class and half-coding, but I fixed some smaller bugs I have encountered, such as the options not compiling correctly (I've forgot to return the compiled options, duh) or replaced some statements, so the IDs are generated at the right time and not after markdown compiling hit in and made <p> tags around it.
After long work the first few question types compile again. I'm questioning how useful this rework really was, but just want to get over it, so I can start on the backend. I hope to get everything finished soon.
Continued in the rework of compiler.py with coding the function that compiles all answer lines into an answer HTML for the finished HTML. Additionally some smaller fixes of slight issues PyCharm showed, such as overshadowing and similar.
Wrote a function that generates a unique ID based on just some text. Even if the text is in there multiple times, it gives a unique ID to each. I'm kinda tired, so this took longer than expected.
Kind of long duration for a devlog, I forgot to post more...
I continued to improve the compiler.py rework, adding some new functions to make my life easier and code less repeated. Specific new things:
Compile Lines: Lines are now compiled for all questions in a function!
And another function I worked on, but then discarded, becuase it was kind of useless.
I have that weird thing, where I just can't leave my code even when it's running and I've heard never change a running system way too often. So, I decided to just rewrite my biggest python file, /core_convert/compiler.py, and have just reworked the options compile.
But every time I rework code, I make it better and more robust, so it's actually a good thing? This new options compile definetely is more robust already and other things should rely on functions way more.
Rough Time estimation:
I took 1hr for one function, so at least 6 more to go means 10hrs probably just for this.
Oh, and I decided to code my own backend, just waiting for hackclub.app to approve me. First something similar, than increase complexity.
Looked at different other backend options but found NONE! So, please if you have any... I need something free with no limitations and a good file support. I might need to code my own.
Btw, the image represents the nothingness I found...
I've done some smaller things here and there, as well as worked on some forms using this script which revealed some points where I'll need to improve my script.
Additionally after tons of work, I fixed a very minor bug where the inputs for multi-line labels would display at the bottom of the label instead of the top. That took me way too much time...
Anyways I though I'd explain the system on how I convert everything:
If you couldn't watch the vid of the last dev-log, here is the vid in mp4: (same vid)
Ok, the problem from yesterday aside, here is a first function video I didm showing the process of creating a form. I know it's kinda lenghty, I might cut this in the future.
Oh, and welcome to follower no 1! What do you think?
Tested for a really good Lego offer (2× Mindstorms NXT 2.0 for 30€ each)
I heavily tested my tool by making a complex form for a competition sign-up. While doing this I got some new things on my /todo.md list and discovered that file uploads already work really well, just some minor improvements, than it's done.
I only did code changes, so no good image.
I fixed a bug where checkboxes and radio buttons wouldn't auto-save properly as well as after I fixed that not auto-load properly.
As my /todo.md list was getting very short, that needed a fix, so I did a market research with the biggest competitors (Google & Microsoft Forms, Limesurvey), to find some new inspiration for different questions.
So here is a sneak-peak at what features are coming to fMD:
Added the big feature of matrix questions, to get quantity data from users. Often used in forms, this is essential for customer satisfaction surveys. A documentation entry is still due for this feature, but I'll need some sleep now.
Thanks for ×16 multiplier btw!
Fun Fact: I drank more than 3l of water during just this hour!
I have started by trying to make my website more mobile-friendly, but I'm horrible at doing a good website for mobile, so I just wrote it on my /todo.md list. However while going into CSS I changed some measurements from absolute to relative.
Then I did some work on form accessibillity:
- Labels for all questions
- Document Language
And yeah, I was tired, so that took longer than normal...
(I don't know about the image, I just added the little placeholder for some more accessibility)
That means only logic is marked as important on my todo list now.
Finally! After 1h 6min of cool coding time, I have done one of my features marked with IMPORTANT on my todo list:
Save between sessions, automatically! Using browser storage, entered data into any form is now saved and instantly re-loaded if you open the page again.
Fixed a bug where I forgot to convert the US $ prices into a float, this also needed some bug fixing. That is the line I changed if you're interested:
blsalesaverage = float(usdspecificprice.replace(',','').removeprefix(' '))
Fixed a minor bug where prices shown on BrickLink with the prefix US $ instead of USD $, as I expected it in my code, would crash the script. I just needed to build in one if-condition and that was it.
Changed from reading a file as the input for the Rebrickable API key to an input() statement, so it can be compiled into an .exe file.
I needed to fix a small bug. Thankfully I noticed it before shipping:
My /core_convert/filter.py was coded really weirdly (by me), so not every case was covered. I first didn't know what happened, but after I found the error it was a quite simple fix using some regex instead of the Python native str in str.
Additionally I created a new thumbnail to hopefully get more votes on this project!
I did some things from /todo.txt, to make the service a better product in general:
- complete CSS rework
- other text inputs only visible when other option is selected (may change to active in the future)
- filter.py full rework, as it was very bad code quality before.
This is also the release of v1.0, as I'm kinda afraid it wouldn't go through until end of August otherwise. So everything (should) work(s) now!
Added another API call: This time to get the information from Rebrickable as to how many alternate builds there are, so you can decide if you can build a lot with it or not.
This is now also v1 of this project. If you have any other ideas, please leave them in the comments, I can implement them in further versions.
I have worked around 2 weeks on this with a very bad internet connection (max. 8kB/s), so Summer of Making didn't load at all. Here is a devlog of these two weeks and 5½ hours of work:
This project is getting close to a production-ready state, however my to-do list of things I could somewhen do is incredibly loooong... I have, however managed to already publish one form with fMD, and it worked great!
Features added:
- DROPDOWN - select your element out of a dropdown
- DATALISTS - get context-based suggestions for text inputs - BROKEN (MD processing breaks everything there)
- GLOBAL OPTIONS - set preferred submit method, title, etc.
- WORKING SUBMIT - using different services (formsubmit, mailto: link, etc.) the form can FINALLY be submitted! using formsubmit, it is a clean user experience, as no mail program, etc. needs to be installed.
- probably more I forgot about
I have worked around 2 weeks on this with a very bad internet connection (max. 8kB/s), so Summer of Making didn't load at all. Here is a devlog of these two weeks and 1¾ hours of work:
As Rebrickable (https://rebrickable.com/) is one of my favorite brick-related platforms, I added two new integrations with Rebrickable!
1. if you're unsure about the number of pieces in the set, just ask the RB (Rebrickable) API
2. get build results from Rebrickable, i.e. how many parts you already own of the set - for that there is technically a third call that gets the user token if you haven't already
Additionally I tested it with all my recent brick purchases and it worked great, I corrected some typos and added a multiplier (e.g. selling it on BL gives you 5× the money)
(user-token was cropped out from image)
I have worked around 2 weeks on this with a very bad internet connection (max. 8kB/s), so Summer of Making didn't load at all. Here is a dev-log of these two weeks and 4½ hours of work:
This project has evolved significantly! What started as a simple number-guessing time, for when I want to code something more simple, no turned into The ULTIMATE BOREDOM KILLER! With 3 finished projects to play with if you're bored, you can check them out!
New features for number guessing:
1. counter - wow. just counts the questions you or the bot needed to ask to find the number
2. calculation to find the best n of guesses for the worst case (range = 2x+1-1, so log2(range+2))
New projects in this repo:
1. typing simulation - dynamically output text with variable speeds and automatic linebreaks
2. WISDOMS - user-profiling to display liked wisdoms and ignore disliked wisdoms based on wisdom topics
(for both projects see the project description for more information)
Both these projects were easily coded, with only minor difficulties.
I started the project including two checks already:
These needed to be done via website scraping since the BeickLink API has this data, however is just accessible by registered sellers, which I'm not (and technically can't, be ause I'm not 18 yet). I have written support about it, but they haven't responded yet. Maybe I can change it to API in the future.
Analyzes brick purchases before purchasing. Currently only sets are supported. Sets get analyzed on the following criteria: - BrickLink part out value (i.e. what the singular parts would cost / would sell at again) - BrickLink sales average (i.e. to which prices the set as a whole has been sold in the last 6 month - Price per piece (i.e. the average price of one piece) - Rebrickable build search (how many % of pieces you own in your Rebrickable collection) - Rebrickable alternate builds (how many other models you can build with that set on Rebrickable) Quick information for terms used in the script: - Set num: the LEGO set number, often visible on the front of the box or the instructions. This is also the one used at many Lego-sites, such as BrickLink - RB API key: Your Rebrickable API key, create a (free) account at https://rebrickable.com/, then head to your settings, API tab and create it - RB User Token: If you don't know what this is, just leave it blank. The tool will promt you to login using username and password --- Note: Online tools to execute this are not possible due to missing dependencies, the demo link is a Linux executable. As I don't have access to Windows I couldn't package it into an .exe file. If you want to run this on windows, clone the repo and run the python file. Installation instructions are only for Linux.
Continued on the documentation for a new feature I will reveal once implemented! As a small hint: It's included in the Syntax of the screenshot.
improved a lot on the documentation (GitHub wiki), made a doc page for every question type, currently working on global options.
Additionally made a getting started guide for new users.
Added docs for different question types, so users can easily review the syntax.
added 'other' field for checkbox and radio questions
Started work on the wiki, so anyone can understand and use this tool
Minor bug fixes, e.g. newline chars in textareas not being transmitted to the mailto: URL
small improvement: changed a more complicated while statement to a regex '-+', to turn multiple hyphens in a generated qid into 1.
New Feature!
textareas, now you can promt your users to submit longer feedback, by including a multi-line textarea, just like the one you write your DevLogs in.
Bug Fixes:
I've fixed many minor bugs, the biggest of them being MD in divs not being rendered. Using the Markdown extension mdinhtml, I was able to still have it rendered though.
I've finished the stylesheet to make it look good, I've used multiple variables, so I can update them via JS and global options in the document in future DevLogs.
Here is the link for the live prview: https://0yqc.github.io/formsMD/output/page1.html
I started some work on the CSS to not only make it functional but also visually appealing, this is not finished yet, I'll make it look more beautiful tomorrow.
What's planned already?
- Options for the result, e.g. some CSS colors, info about where to send emails, etc.
- logic support, e.g. dynamically hide or show questions/answers
and more...
Finished the whole project today, these are the features:
2 Different gamemodes
completly in-terminal
no dependencies
fun to play
This is a project still called 'number_guessing' on github for historic reasons, however it developed to so much more! A list of all projects: --- 1. NUMBER GUESSING - the original project with 2 gamemodes for additional fun! | - Normal: You need to guess the number the computer thought of, however you get hints! | - Reversed: Additional twist, the computer guesses the number with the best possible strategy in as few as 7 turn for a number between 1 and 255! --- 2. USER PROFILING WISDOM GENERATOR - generates wisdoms from a pre-defined list based on user's likings | - users can vote on wisdoms | - saves users preferences for different topics (e.g. AI, friendships or time management), based on votes | - displays wisdoms accordingly to only display liked ones --- 3. TYPING SIMULATION - bored of simple print() statements? Try this | - Importable - Just import the file and use typing_simulation.type_animation() to type text beautifully in the terminal! | - Natural - With a random duration between characters typed and a longer duration at spaces, it gives a natural feeling. | - Automatic Line Breaks - When the word doesn't fit it displays in the next line! The script must look ahead first to see if the word would fit. | - Variable - Adjust speed and the position for line breaks, directly from the function call. --- 4. TACTICAL SNAKE (canceled) - Snake fully in the terminal, w/o time, just input | - Finished modules: | . | - Board Drawing - Automatically draw the board, with: | . | . | - the snake and treats, passed as arguments | . | . | - automatic column- and row numeration | . | . | . | - Either every number of every 5th number depending on size
(In case you wonder, the submit action on the demo page doesn't work yet as the demo tool doesn't support JS)
(The currently generated page is just some random text and options I wrote to test everything out.)
first thing I did: added the support for all text input fields, as I started this yesterday it wasn't as difficult.
second thing: added a simple submit function with some JS cloning, I'll need to change it, since currently it always sends all form submissions to my personal email address. the plan is, to include these options at the top of the file:
- document name for the HTML title and email subject
- receiving email address for receiving all form submissions
I started to make the compiler for open-ended input questions (, etc.), however for that I needed to implement an options system where questions can implement options. And that took longer than expected...
So here I am after 1h37m and haven't finished text input yet, but am nearly done with the options, which will be a time-saver also for other question types.
If you wonder, why the code in the screenshot looks so short for that long coding time, it's because I tried a lot of other options before coming up with this complicated regex.
Added support for multiple-choice questions!
Now you can ask your survey or form participants a question where they need to decide themself.
It was basically just copying over the code from checkboxes and changing the generated HTML a bit to now include radio buttons.
Next up will be text input fields (+ email, etc.) and textareas.
Reworked Compiler!
Now I included more reusable code and made it cleaner in general by utilizing f-strings. Additionally the output now looks way cleaner and is even better styleable using CSS, since I used more IDs and classes.
with the new compiler I'll probably be able to do other question types in the near future...
finished up the checkbox conversion and fixing some bugs
added the markdown library to convert markdown to HTML (sudo apt install python-markdown-doc), so now I get the first outputs
as you can see on the screenshot, this project needs a lot of work to be competitive with the major forms platforms, but I'll maybe get there eventually
finished basic compiling for checkbox questions, the screenshot shows all the code I did for that.
is it the most efficient solutions? i don't think so
but does it work? yes, so I'm gonna keep it (at least for now)
next up will be multiple choice questions and then text input fields. In the end I would like logic and advanced options, let's what this project will evolve to...
Quick DevLog: Started to convert checkbox and multiple-choice questions to HTML elements
core conversion system: Big progress!
✅ open and process files for compiling
✅ filter out formsMD blocks for further compiling
⏳ compile fMD blocks into HTML elements
If you want to see this project process, consider following this project. If you have questions, just drop them in the comments or send them to [email protected]
If you like this project, you may want to visit the GitHub repository.
Don't have a new image, but I started to do some work on the Core Conversion system, which is written in Python.
I'm not as fast, so in this hour I've mainly set the files up and done some script, that they can open input files.
My Plan:
- Filter out lines that are from formsMD and not regular MD
- let them compile using a custom compiler I will write
- insert the compiled HTML
- a MD library will handle the rest
Started to work on how the markup syntax looks like. It may change in the future though :)
Basically this should in the end be a python tool that converts this Markdown to a HTML/JS site. If you have any ideas on how to save the results using only a front-end site (e.g open-source online-services), please send them to [email protected]. Thanks!
Ever wanted to easily create a form Without relying on big tech (like Google or Microsoft) or having absurdly low limits (like Limesurvey)? This is for you! Create your form for free and publish it on your favorite free hosting provider (like GitHub / GitLab / Cloudflare Pages). No limitations, no cost! Additionally this is an extension to Markdown! Write all the form elements in easy-to-write, easy-to-read format and include Markdown for styling everything! And you can edit it offline in your favorite text editor! This tool already includes many different question types to gather different kinds of insightful data: 🖹 Free Text (one or multi-line; optionally add auto-completion suggestions; different types: number, date, email, etc.) 🔘 Multiple Choice (Radio; optionally add an "other" answer to allow free text answers) ☑ Checkbox (optionally add an "other" answer to allow free text answers) 🌢 Dropdown (optionally add optgroups / non-selectable entries for categorization) --- Note: When clicking submit in the demo survey, make sure to open with a mail application (such as Outlook, GMail, etc.) when prompted. To submit the survey you need to send that email, so you need to have an email account set up in that mail application. (When doing your own forms you can choose alternative methods, which don't require this step)
Tested a bit around first as I'm not as comfortable with coding yet. I made some experiments with:
- multi-file python scripts (so useful btw)
- API requests (I did that before so not as hard)
- tkinter as a GUI tool
Additionally I enjoyed writing the README file and giving detailed instructions on how to install.
I probably won't continue this project though, as I don't really see a reason to make it offline. A full offlin version would be difficult (e.g. with Part Images), so I can just use the online (real) version.
⏸️ This project is currently paused, because I don't think it's as useful anymore. Using the Rebrickable API, I want to create an offline copy for searching the Lego database.
This was widely regarded as a great move by everyone.