{"name":"Justin Gu","url":"https://justin.brogu.ca","tagline":"This portfolio site shows the work of Justin Gu, *Electrical Engineering* student at the University of Waterloo and project lead of *Bakfiets* at Electrium Mobility.","intro":"Circuit boards, 3D printed parts and software, shown with the *calculations* and *test pieces* behind them.","hero_layers":{"src":"/media/pcb-ldo/layers.glb","traces":"/media/pcb-ldo/traces.json","poster":"/media/pcb-ldo/render.png","caption":"The 3.3 V regulator board, separated into five of its fabrication layers. The readings are its calculated full-load design values.","hint":"Scroll to take it apart, or grab a layer","readout":[["in","5.0 V"],["out","3.3 V"],["load","500 mA"],["junction","116 °C"]]},"profile":{"lead":"First-year Electrical Engineering student at the University of Waterloo, class of 2031, and project lead of Bakfiets at Electrium Mobility.","stats":[["25","people on the Bakfiets team I lead"],["1st","of 20 teams at IDEA-X","with a $10","000 prize"],["40/45","on the IB Diploma"],["1 of 6","academic reps elected by about 150 classmates"]],"shelf":[{"project":"ldo-board","src":"/media/pcb-ldo/board.glb","type":"glb","label":"3.3 V regulator board"},{"project":"r2r-dac","src":"/media/r2r/board.glb","type":"glb","label":"R-2R DAC concept board"},{"project":"rolling-wheel","src":"/media/physics/insert.stl","type":"stl","label":"Wheel insert"},{"project":"3d-printing","src":"/media/printing/switch-fidget-exploded.stl","type":"stl","label":"Switch fidget"}],"timeline":[{"when":"Jun 2023 to Jan 2025","what":"Junior Robotics Coach, Zebra Robotics","detail":"Coached robotics classes in Scratch and Python for 19 months."},{"when":"2024","what":"IB Paper Organizer, first version","detail":"A single HTML page that sorted my past papers. It is now a desktop app.","project":"ib-paper-organizer"},{"when":"2025","what":"Started 3D printing","detail":"Parts in Fusion 360, then generated with Python, including the wheel for my Physics IA.","project":"3d-printing"},{"when":"2026","what":"First place at IDEA-X","detail":"AI-Phillic, built with three classmates, won first of 20 teams and $10,000.","project":"ai-phillic"},{"when":"2026","what":"IB Diploma, 40 out of 45","detail":"In Langley, BC."},{"when":"Jun to Sept 2026","what":"UI/UX Designer, ForgeX Trading","detail":"Designed and shipped the landing page for a trading replay platform, from Figma to production.","link":"https://forgextrading.com/"},{"when":"Sept 2026","what":"Electrical Engineering at Waterloo","detail":"Project lead of Bakfiets at Electrium Mobility, and one of six academic reps for my class.","project":"bakfiets"}],"skills":[["Hardware",["Altium Designer","KiCad","Schematic capture","2-layer PCB layout","SPICE","Oscilloscope","Fusion 360","3D printing"]],["Analysis",["Thermal budgeting","Datasheet review","Capacitor derating"]],["Software",["Python","TypeScript","JavaScript","HTML and CSS","React","React Native","Electron"]],["Tools",["Git","GitHub","Figma","Supabase"]]]},"about":"Before Waterloo, I completed the IB Diploma in Langley, BC, with a score of 40 out of 45. I coached robotics at Zebra Robotics, where classes were mostly in Scratch and Python, and spent the summer of 2026 as the UI/UX designer at ForgeX Trading.\n\nThis term I lead Bakfiets, a 25-person team within Electrium Mobility building an electric cargo bike. I was also elected by the roughly 150 students in my Electrical Engineering class as one of six academic representatives, and I am completing the admission assignment for WATonomous's Humanoid Electrical team.\n\nIf you would like to discuss a co-op position or any of the projects here, contact me at gujustin1@gmail.com.","now":{"when":"Fall 2026","items":["Leading the Bakfiets team at Electrium Mobility","Completing the WATonomous Humanoid Electrical admission assignment","Academic representative for my Electrical Engineering class"]},"links":[{"label":"GitHub","url":"https://github.com/Quaot"},{"label":"LinkedIn","url":"https://www.linkedin.com/in/gujustin/"},{"label":"Email","url":"mailto:gujustin1@gmail.com"}],"categories":[{"id":"hardware","title":"Hardware","projects":[{"title":"Bakfiets","category":"Team Leadership","color":"#10545a","summary":"Bakfiets is Electrium Mobility's electric cargo bike. This term I lead the 25-person team finishing it, one of\nseveral projects in a club of about 100 members.\n\nThe bike was designed by the 2024 team in SolidWorks, and the pictures here are their model: a normal back half\njoined to a long, low frame that carries a wooden cargo box in front of the rider. The third picture sets the\n2024 assembly beside the rebuild the 2025 co-op students started.\n\nMy work so far has been getting a new team going. I gathered the 2024 and 2025 files from old branches into one\nrepository, wrote an onboarding guide and 30 GitHub issues across the mechanical, electrical and firmware\nsubteams, and drew the diagrams the team plans its work from: the labelled bike, the onboarding path and the\npower flow from the battery through the motor controller.\n","links":[{"label":"github.com/Electrium-Mobility/Bakfiets-F26","url":"https://github.com/Electrium-Mobility/Bakfiets-F26"}],"cover":{"src":"/media/bakfiets/bike-render.jpg"},"media":[{"type":"image","src":"/media/bakfiets/bike-render.jpg","alt":"SolidWorks render of the full bakfiets, a green cargo bike with a wooden box between the seat and the front wheel","caption":"The full bike as modelled in SolidWorks by the 2024 team.","aspect":1.5006},{"type":"image","src":"/media/bakfiets/bike-labelled.jpg","alt":"The same render with each part labelled, and a list of the parts not yet in the model","caption":"The same render, labelled, with the parts not yet in the model listed on the right.","aspect":1.5004},{"type":"image","src":"/media/bakfiets/assemblies.jpg","alt":"Two SolidWorks assemblies of the full bike, the 2024 model on the left and the 2025 co-op rebuild on the right","caption":"The 2024 assembly, left, and the rebuild the 2025 co-op students started, right.","aspect":1.4995},{"type":"image","src":"/media/bakfiets/onboarding-path.jpg","alt":"Onboarding path diagram, from setup through each subteam's stages to the term projects","caption":"The onboarding path I drew for new members.","aspect":1.5},{"type":"image","src":"/media/bakfiets/power-flow.jpg","alt":"Power flow diagram of the bike, from charger and battery through the motor controller to the electronics","caption":"How power moves from the charger and battery through the motor controller.","beside":true,"aspect":1.5}],"id":"bakfiets","cover_aspect":1.5006},{"title":"3.3 V regulator board","category":"PCB Design","color":"#1e6b4f","summary":"A two-layer board that takes 5 V in and gives 3.3 V out, built around the LM1117. It is my admission assignment\nfor WATonomous's Humanoid Electrical team.\n\nEach part choice is worked out from its datasheet in the repository README. A 162 Ω and 267 Ω divider sets the\noutput and keeps the regulator above its 5 mA minimum load from 0 to 125 °C. With every tolerance at its worst,\nthe output stays between 3.20 and 3.44 V. At 500 mA on a 45 °C day, the calculated junction temperature is\n116 °C, under the 125 °C recommended maximum, with 194 mm² of copper on the regulator tab.\n\nThe board measures 17 by 28 mm. Assignments are reviewed as design files, so it has not been manufactured. The\n3D model is built from my Gerbers and the Altium STEP export.\n","links":[{"label":"github.com/Quaot/2-layer-PCB-LDO","url":"https://github.com/Quaot/2-layer-PCB-LDO"}],"media":[{"type":"glb","src":"/media/pcb-ldo/board.glb","alt":"Interactive 3D model of the assembled regulator board","caption":"The assembled board, modelled from my Gerbers and the Altium STEP export.","aspect":1.5},{"type":"image","src":"/media/pcb-ldo/render.png","alt":"3D render of the regulator board from Altium","caption":"Altium's render. The board is 17 by 28 mm.","aspect":0.8676},{"type":"image","src":"/media/pcb-ldo/schematic.png","alt":"Altium schematic of the LM1117 regulator circuit, with input and output connectors, divider resistors, capacitors and a power LED","caption":"The schematic: the LM1117, the 162 Ω and 267 Ω divider, and a power LED.","beside":true,"aspect":2.2667},{"type":"image","src":"/media/pcb-ldo/process/window.svg","alt":"Chart of the worst-case output voltage window, 3.20 to 3.44 V, around the 3.3 V target","caption":"Worst-case output with every tolerance against me.","aspect":2.1429},{"type":"image","src":"/media/pcb-ldo/process/thermal.svg","alt":"Junction temperature of 116 °C at 45 °C ambient, 9 °C under the 125 °C limit","caption":"Calculated junction temperature at 500 mA on a 45 °C day.","beside":true,"aspect":2.1429},{"type":"image","src":"/media/pcb-ldo/layout.png","alt":"PCB layout of the regulator board, labelled JUSTIN LDO V1","caption":"The two-layer layout.","aspect":0.5808},{"type":"image","src":"/media/pcb-ldo/process/layers.png","dark":true,"alt":"The board separated into its fabrication layers, bottom copper, board, top copper, solder mask and silkscreen","caption":"The board split into its fabrication layers, from the Gerbers.","beside":true,"aspect":1.0667}],"id":"ldo-board","cover_aspect":1.3333},{"title":"3D printing","category":"Product Design","color":"#e27396","summary":"Parts printed in PLA on an Anycubic Mega Pro. The earlier ones were modelled in Fusion 360, including the wheel\nfor my rolling wheel experiment. The newer ones are generated by Python scripts using build123d, so a dimension\ncan be changed in one place.\n\nThe switch fidget is a pocket toy built around a mechanical keyboard switch. Test coupons for the switch cutout,\nfrom 13.8 to 14.3 mm, and for the keycap stem come first, and the fidget itself has not been printed yet.\n\nThe enclosure generator reads a KiCad board file and builds a case with standoffs under each mounting hole and\nopenings for chosen connectors.\n","links":[{"label":"github.com/Quaot/3d-printing","url":"https://github.com/Quaot/3d-printing"}],"media":[{"type":"stl","src":"/media/printing/switch-fidget-exploded.stl","alt":"Interactive 3D model of the switch fidget, bottom cap, housing and keycap","caption":"The switch fidget, exploded: cap, housing and keycap.","aspect":1.5},{"type":"image","src":"/media/printing/process/switch-coupons.png","alt":"A strip of six switch cutouts and a strip of six keycap sockets, each marked with notches","caption":"Test coupons for the switch cutout, 13.8 to 14.3 mm, and the keycap stem.","aspect":2.5},{"type":"image","src":"/media/printing/process/switch-parts.png","alt":"The fidget's cap, housing and keycap","caption":"The three fidget parts. Not printed yet.","beside":true,"aspect":2.2222},{"type":"stl","src":"/media/printing/enclosure-base.stl","alt":"Interactive 3D model of an enclosure base generated from a KiCad board","caption":"An enclosure base generated from a KiCad board file.","aspect":1.5},{"type":"image","src":"/media/printing/process/enclosure-base.svg","alt":"Line drawing of an enclosure base generated from a KiCad board","caption":"The same base as a drawing, with a standoff under each mounting hole.","beside":true,"aspect":0.9373}],"id":"3d-printing","cover_aspect":1.3333},{"title":"R-2R DAC","category":"Electronics","color":"#e0a526","summary":"A 4-bit digital-to-analogue converter made only from 10k and 20k resistors.\n\nI drew the schematic in KiCad, simulated all 16 codes in SPICE, and checked each step on an oscilloscope in the\nE2 lab at the University of Waterloo. Looking back toward the terminating resistor, every node sees 2R, so each\nbit adds half as much voltage as the bit above it. In theory the output rises from 0 to 3.09 V in steps of\n0.206 V.\n\nThe 33 by 20 mm circuit board shown first is a concept layout and has not been made.\n","links":[{"label":"github.com/Quaot/R-2R_DAC","url":"https://github.com/Quaot/R-2R_DAC"}],"media":[{"type":"glb","src":"/media/r2r/board.glb","alt":"Interactive 3D model of a concept two-layer board for the ladder, with eight 0805 resistors and two pin headers","caption":"A concept layout for the ladder on a 33 by 20 mm board. Not manufactured.","aspect":1.5},{"type":"image","src":"/media/r2r/schematic-clean.svg","alt":"Schematic of the 4-bit R-2R ladder, four 20k legs from B0 to B3 into a chain of 10k resistors, RT to ground, output at VOUT","caption":"The 4-bit ladder: four 20k legs into a chain of 10k resistors.","aspect":2.1429},{"type":"image","src":"/media/r2r/process/steps.svg","alt":"Step line of output voltage for all 16 input codes, from 0 V up to 3.09 V","caption":"The ideal output for all 16 codes, 0.206 V apart.","aspect":2.1429},{"type":"image","src":"/media/r2r/process/layers.png","dark":true,"alt":"The concept board separated into its layers","caption":"The concept board split into its layers.","beside":true,"aspect":1.2308}],"id":"r2r-dac","cover_aspect":1.3333},{"title":"Rolling wheel experiment","category":"Physics Experiment","color":"#6b4fd8","summary":"My IB Physics internal assessment asked whether moving mass away from a wheel's axle makes it lose more energy\nrolling down a ramp.\n\nI designed the wheel in Fusion 360 and printed it in PLA: a 97 mm hollow shell with a spoked insert that holds\ntwelve steel dowels. Two inserts with offset holes give 16 dowel positions, from 7.5 to 45 mm out from the axle,\nwhich sets the moment of inertia anywhere from 1.13 to 1.92 × 10⁻⁴ kg·m². The insert went through five versions,\nwith thin test strips printed to check the fit first.\n\nEach position was rolled 30 times down a 1.5 m ramp at 8°, 480 rolls in all, filmed at 120 frames per second\nand tracked frame by frame in Tracker. The energy lost is the drop in potential energy minus the kinetic energy\nat the bottom, with every measurement uncertainty carried through to the result.\n\nThe result was inconclusive. The line of best fit has a slope of 100 ± 400 J per kg·m², with R² = 0.07. The\nrange of moments of inertia was too narrow, the printed shell was up to 0.5 mm out of round and wobbled, and the\ncentre mark used for tracking was slightly off. Next time I would use heavier dowels and print the shell\noversize, then sand it round.\n","cover":{"src":"/media/physics/wheel.jpg"},"media":[{"type":"image","src":"/media/physics/wheel.jpg","alt":"The printed wheel, a white hollow shell with twelve perforated spokes, shown empty and with steel dowels near the axle","caption":"The printed wheel, empty and with the twelve steel dowels near the axle.","aspect":1.5},{"type":"pages","caption":"Three pages from the IA: the theory, the data analysis and the conclusion. Click to read.","pages":[{"src":"/media/physics/pages/beginning.jpg","label":"Beginning","alt":"Page from the Physics IA, beginning"},{"src":"/media/physics/pages/middle.jpg","label":"Middle","alt":"Page from the Physics IA, middle"},{"src":"/media/physics/pages/end.jpg","label":"End","alt":"Page from the Physics IA, end"}],"aspect":0.7075},{"type":"image","src":"/media/physics/model.jpg","alt":"Drawing of the wheel on the ramp, labelling the hollow shell, the spokes and the steel dowels","caption":"The wheel as modelled: shell, spokes and dowels.","aspect":1.1729},{"type":"image","src":"/media/physics/setup.jpg","alt":"Drawing of the experiment, the wheel released against a straight edge at the top of a wooden ramp and filmed by a camera beside a ruler at the bottom","caption":"Released against a straight edge, filmed at the bottom beside a ruler.","beside":true,"aspect":1.8188},{"type":"image","src":"/media/physics/beams.jpg","alt":"The two spoke designs, with holes 5 mm apart starting 7.5 mm and 10 mm from the centre","caption":"The two spoke designs, offset so the dowels can sit at 16 distances.","aspect":2.5321},{"type":"image","src":"/media/physics/insert.jpg","alt":"One complete insert, six spokes fused at the centre","caption":"One insert: six spokes fused at the centre.","aspect":1.0858},{"type":"stl","src":"/media/physics/insert.stl","alt":"Interactive 3D model of the final spoked insert","caption":"The final insert as printed. Drag to rotate.","beside":true,"aspect":1.5},{"type":"image","src":"/media/physics/process/insert-versions.png","alt":"Four insert designs side by side, versions 2 to 5","caption":"Insert versions 2 to 5.","aspect":2.6316},{"type":"image","src":"/media/physics/process/fit-tests.png","alt":"Thin test strips and a short test ring","caption":"Test strips and a ring, printed to check the fit first.","beside":true,"aspect":2.2222},{"type":"image","src":"/media/physics/result.jpg","alt":"Graph of energy loss against moment of inertia for the 16 dowel positions, with error bars, a nearly flat line of best fit and the steepest and shallowest lines the error bars allow","caption":"Energy loss against moment of inertia. The steepest and shallowest lines allowed by the error bars cross, so there is no clear trend.","aspect":1.5901}],"id":"rolling-wheel","cover_aspect":1.5},{"title":"Chess mobility","category":"Math Modelling","color":"#4ea8de","summary":"My IB Math HL exploration asked how much room a chess piece has to move, on average, as the board empties.\n\nI treated every other piece as placed at random and worked out how far a piece could go from each square before\nsomething stopped it. For the rook, bishop and queen that is a probability along each direction, where a friendly\npiece blocks its square and an enemy piece can be captured. For the knight and king only the destination squares\nmatter. Averaging over all 64 squares gives the expected number of moves for each piece.\n\nWorked out for a standard board as pieces come off two at a time, the queen always has the most moves and gains\nthem fastest, because clearing one square can open a whole line. The king beats the knight at every stage, since\nso many of the knight's jumps land off the board. The model leaves out check, pins and the shape of real games,\nwhich is its main limit.\n","cover":{"src":"/media/chess/rook-board.jpg"},"media":[{"type":"image","src":"/media/chess/rook-blocked.jpg","alt":"The rook's four directions to the edge of the board, and the same rook stopped by pieces in its way","caption":"The rook's four directions, and the same rook stopped by pieces in its way.","aspect":2.2891},{"type":"pages","caption":"Three pages from the exploration: the introduction, the probability and the conclusion. Click to read.","pages":[{"src":"/media/chess/pages/beginning.jpg","label":"Beginning","alt":"Page from the Math IA, beginning"},{"src":"/media/chess/pages/middle.jpg","label":"Middle","alt":"Page from the Math IA, middle"},{"src":"/media/chess/pages/end.jpg","label":"End","alt":"Page from the Math IA, end"}],"aspect":0.7075},{"type":"image","src":"/media/chess/rook-board.jpg","alt":"A rook near the centre of an empty board, with the 14 squares it can reach shaded","caption":"On an empty board a rook reaches 14 squares.","aspect":1.0},{"type":"image","src":"/media/chess/rook-anywhere.jpg","alt":"Rooks in a corner, on an edge and in the centre, each reaching the same 14 squares on an empty board","caption":"From a corner, an edge or the centre, it is still 14.","beside":true,"aspect":2.2925},{"type":"image","src":"/media/chess/ray-friendly.jpg","alt":"A rook's path along one line, stopping before the first square held by a friendly piece","caption":"A friendly piece in the way: the rook stops before it.","aspect":1.7566},{"type":"image","src":"/media/chess/ray-enemy.jpg","alt":"A rook's path along one line, ending by capturing the first enemy piece","caption":"An enemy in the way: the rook can capture it.","beside":true,"aspect":1.7566},{"type":"image","src":"/media/chess/knight-edge.jpg","alt":"A knight near the edge of the board, with several of its moves falling off the board","caption":"Near the edge, many of a knight's jumps land off the board.","aspect":1.1394},{"type":"image","src":"/media/chess/king-edge.jpg","alt":"A king near the edge of the board, with all of its moves still on the board","caption":"A king near the edge keeps all of its moves.","beside":true,"aspect":1.1775},{"type":"image","src":"/media/chess/mobility.jpg","alt":"Graph of expected mobility for king, knight, bishop, rook and queen as the number of pieces falls from 32 to 2, with the queen highest and rising fastest","caption":"Expected moves for each piece as the board empties, from 32 pieces down to 2.","aspect":1.6311}],"id":"chess-mobility","cover_aspect":1.0}]},{"id":"software","title":"Software","projects":[{"title":"AI-Phillic","category":"App Design","color":"#c8643b","summary":"AI-Phillic was our entry to IDEA-X 2026, a school district challenge on AI and critical thinking, made by four\ngrade 12 students. My part was the app, and the rest of the team prepared the presentation. Of the 20 teams that\nentered, 8 reached the final, and AI-Phillic won first place and $10,000.\n\nThe app teaches students to check what they read online. Each lesson is a short illustrated story, and students\ntap the claims they think were made up. A separate service splits a claim into single statements, searches the\nweb and scholarly sources, and marks each source as supporting, contradicting or neutral.\n\nThe screens here are the app running on my computer, signed in as a sample student. The lessons, quiz and\nprogress can be tried in the browser. The scanner needs its own server, so it is not part of that demo.\n","links":[{"label":"Try the lessons: quaot.github.io/ai-phillic","url":"https://quaot.github.io/ai-phillic/"},{"label":"github.com/Quaot/ai-phillic","url":"https://github.com/Quaot/ai-phillic"},{"label":"IDEA-X announcement","url":"https://www.sd35.bc.ca/idea-x-challenges-students-to-explore-ai-solutions.22609"}],"cover":{"src":"/media/ai-phillic/award-cover.jpg"},"media":[{"type":"image","src":"/media/ai-phillic/screens/lesson.jpg","alt":"Three AI-Phillic screens, the river map of lessons, an illustrated story page and a quiz that rebuilds the lesson's key sentence from tiles","caption":"The river of lessons, a story page and the quiz.","aspect":1.5004},{"type":"image","src":"/media/ai-phillic/screens/teaching.jpg","alt":"Three AI-Phillic screens, a teaching page on strong and weak evidence, a reflection prompt and the source scanner","caption":"A teaching page, the reflection prompt and the source scanner.","aspect":1.5004},{"type":"image","src":"/media/ai-phillic/screens/progress.jpg","alt":"Three AI-Phillic screens, progress by topic, the lesson cards along the river and the welcome screen","caption":"Progress by topic, the lesson cards and the welcome screen.","beside":true,"aspect":1.5004},{"type":"image","src":"/media/ai-phillic/award.jpg","alt":"The glass IDEA-X Outstanding Solution award from Langley Schools, held in one hand","caption":"The Outstanding Solution award, IDEA-X 2026.","aspect":0.75},{"type":"image","src":"/media/ai-phillic/lesson-001-b2.jpg","alt":"Illustration of a duckling on a log reading a tablet, from lesson one","caption":"From lesson one.","beside":true,"aspect":1.3393},{"type":"image","src":"/media/ai-phillic/lesson-002-b3.jpg","alt":"Illustration of a beaver with a magnifying glass studying a map on a barrel","caption":"From lesson two.","aspect":1.3393},{"type":"image","src":"/media/ai-phillic/lesson-003-b2.jpg","alt":"Illustration of two frogs on a dock holding up maps","caption":"From lesson three.","beside":true,"aspect":1.3393}],"id":"ai-phillic","cover_aspect":1.3342},{"title":"IronLog","category":"App Design","color":"#cfe84a","summary":"IronLog is an offline gym tracker for iPhone and the web. Weight and reps are set on scrolling sliders designed\nfor one hand, and each set is filled in ahead of time with a suggested weight and the plates to load.\n\nIt follows a ten-day training split, tracks each exercise across splits, and shows progress over a month or a\nyear. All data stays on the phone, with no account required. The screens here show the app's built-in sample\ndata.\n","links":[{"label":"Try it: quaot.github.io/ironlog","url":"https://quaot.github.io/ironlog/"},{"label":"github.com/Quaot/ironlog","url":"https://github.com/Quaot/ironlog"}],"cover":{"src":"/media/ironlog/screens/overview.jpg"},"media":[{"type":"image","src":"/media/ironlog/screens/overview.jpg","alt":"Three IronLog screens, today's plan, a workout in progress with weight and rep sliders, and the progress charts","caption":"Today's plan, a workout in progress and the month's progress.","aspect":1.5004},{"type":"image","src":"/media/ironlog/screens/workout-history.jpg","alt":"Two IronLog screens, a workout in progress and the history of past sessions","caption":"A set being logged, and the history of past sessions.","aspect":1.5004}],"id":"ironlog","cover_aspect":1.5004},{"title":"Youtonomous","category":"Desktop App","color":"#c8323c","summary":"Youtonomous is a small Windows app for YouTube videos watched more than once. It downloads the video, remembers\nwhere the content starts, and opens it there every time.\n\nYouTube chapters become bookmarks, shown as ticks on the seek bar, and more can be added with a label. Keyboard\nshortcuts move between bookmarks and set the start point. Videos are downloaded with yt-dlp and played with\nlibVLC.\n","links":[{"label":"github.com/Quaot/youtonomous","url":"https://github.com/Quaot/youtonomous"}],"cover":{"src":"/media/youtonomous/screens/player.jpg"},"media":[{"type":"image","src":"/media/youtonomous/screens/player.jpg","alt":"The Youtonomous window playing a saved video, with chapter ticks on the seek bar and a list of bookmarks","caption":"A saved video, its chapters as ticks on the seek bar and the bookmarks on the right.","aspect":1.5004}],"id":"youtonomous","cover_aspect":1.5004},{"title":"IB Paper Organizer","category":"Desktop App","color":"#1f4fa3","summary":"IB Paper Organizer turns a folder of several hundred IB past papers into a searchable library. Each filename is\nread into subject, year, session, timezone, level and paper number, and every paper is paired with its mark\nscheme on the same row.\n\nPapers are filtered by what they are, not by reading filenames. A paper or its mark scheme opens in a preview\npane inside the app, which can go fullscreen or save a copy elsewhere. The exam page in the last picture is\nblurred because IB papers are under copyright.\n\nIt started as a single HTML page in 2024 and has been maintained since, now at version 2.1.2.\n","links":[{"label":"github.com/Quaot/ib-paper-organizer","url":"https://github.com/Quaot/ib-paper-organizer"}],"cover":{"src":"/media/ib-paper-organizer/screens/library.jpg"},"media":[{"type":"image","src":"/media/ib-paper-organizer/screens/library.jpg","alt":"The IB Paper Organizer library, a list of past papers with filters for subject, year, session and level","caption":"My library of 188 past papers.","aspect":1.5004},{"type":"image","src":"/media/ib-paper-organizer/screens/search.jpg","alt":"The library filtered by a search for physics 2024","caption":"A search for physics 2024.","aspect":1.5004},{"type":"image","src":"/media/ib-paper-organizer/screens/viewer.jpg","alt":"A paper open in the app's preview pane, with the exam page blurred","caption":"A paper open in the preview pane, blurred because IB papers are under copyright.","beside":true,"aspect":1.5004}],"id":"ib-paper-organizer","cover_aspect":1.5004}]}],"order":["ldo-board","ai-phillic","bakfiets","r2r-dac","ironlog","rolling-wheel","3d-printing","chess-mobility","ib-paper-organizer","youtonomous"],"images":{"/media/ai-phillic/award-cover.jpg":{"w":1086,"h":814,"set":[["/media/ai-phillic/award-cover.640.webp",640],["/media/ai-phillic/award-cover.1086.webp",1086]]},"/media/ai-phillic/award.jpg":{"w":1086,"h":1448,"set":[["/media/ai-phillic/award.640.webp",640],["/media/ai-phillic/award.1086.webp",1086]]},"/media/ai-phillic/lesson-001-b2.jpg":{"w":1200,"h":896,"set":[["/media/ai-phillic/lesson-001-b2.640.webp",640],["/media/ai-phillic/lesson-001-b2.1200.webp",1200]]},"/media/ai-phillic/lesson-002-b3.jpg":{"w":1200,"h":896,"set":[["/media/ai-phillic/lesson-002-b3.640.webp",640],["/media/ai-phillic/lesson-002-b3.1200.webp",1200]]},"/media/ai-phillic/lesson-003-b2.jpg":{"w":1200,"h":896,"set":[["/media/ai-phillic/lesson-003-b2.640.webp",640],["/media/ai-phillic/lesson-003-b2.1200.webp",1200]]},"/media/ai-phillic/screens/lesson.jpg":{"w":1880,"h":1253,"set":[["/media/ai-phillic/screens/lesson.640.webp",640],["/media/ai-phillic/screens/lesson.1280.webp",1280],["/media/ai-phillic/screens/lesson.1880.webp",1880]]},"/media/ai-phillic/screens/progress.jpg":{"w":1880,"h":1253,"set":[["/media/ai-phillic/screens/progress.640.webp",640],["/media/ai-phillic/screens/progress.1280.webp",1280],["/media/ai-phillic/screens/progress.1880.webp",1880]]},"/media/ai-phillic/screens/teaching.jpg":{"w":1880,"h":1253,"set":[["/media/ai-phillic/screens/teaching.640.webp",640],["/media/ai-phillic/screens/teaching.1280.webp",1280],["/media/ai-phillic/screens/teaching.1880.webp",1880]]},"/media/bakfiets/assemblies.jpg":{"w":1429,"h":953,"set":[["/media/bakfiets/assemblies.640.webp",640],["/media/bakfiets/assemblies.1280.webp",1280],["/media/bakfiets/assemblies.1429.webp",1429]]},"/media/bakfiets/bike-labelled.jpg":{"w":1814,"h":1209,"set":[["/media/bakfiets/bike-labelled.640.webp",640],["/media/bakfiets/bike-labelled.1280.webp",1280],["/media/bakfiets/bike-labelled.1814.webp",1814]]},"/media/bakfiets/bike-render.jpg":{"w":1190,"h":793,"set":[["/media/bakfiets/bike-render.640.webp",640],["/media/bakfiets/bike-render.1190.webp",1190]]},"/media/bakfiets/onboarding-path.jpg":{"w":1773,"h":1182,"set":[["/media/bakfiets/onboarding-path.640.webp",640],["/media/bakfiets/onboarding-path.1280.webp",1280],["/media/bakfiets/onboarding-path.1773.webp",1773]]},"/media/bakfiets/power-flow.jpg":{"w":1788,"h":1192,"set":[["/media/bakfiets/power-flow.640.webp",640],["/media/bakfiets/power-flow.1280.webp",1280],["/media/bakfiets/power-flow.1788.webp",1788]]},"/media/chess/king-edge.jpg":{"w":1028,"h":873,"set":[["/media/chess/king-edge.640.webp",640],["/media/chess/king-edge.1028.webp",1028]]},"/media/chess/knight-edge.jpg":{"w":1120,"h":983,"set":[["/media/chess/knight-edge.640.webp",640],["/media/chess/knight-edge.1120.webp",1120]]},"/media/chess/mobility.jpg":{"w":2184,"h":1339,"set":[["/media/chess/mobility.640.webp",640],["/media/chess/mobility.1280.webp",1280],["/media/chess/mobility.1920.webp",1920]]},"/media/chess/pages/beginning.jpg":{"w":1241,"h":1754,"set":[["/media/chess/pages/beginning.640.webp",640],["/media/chess/pages/beginning.1241.webp",1241]]},"/media/chess/pages/end.jpg":{"w":1241,"h":1754,"set":[["/media/chess/pages/end.640.webp",640],["/media/chess/pages/end.1241.webp",1241]]},"/media/chess/pages/middle.jpg":{"w":1241,"h":1754,"set":[["/media/chess/pages/middle.640.webp",640],["/media/chess/pages/middle.1241.webp",1241]]},"/media/chess/ray-enemy.jpg":{"w":1400,"h":797,"set":[["/media/chess/ray-enemy.640.webp",640],["/media/chess/ray-enemy.1280.webp",1280],["/media/chess/ray-enemy.1400.webp",1400]]},"/media/chess/ray-friendly.jpg":{"w":1400,"h":797,"set":[["/media/chess/ray-friendly.640.webp",640],["/media/chess/ray-friendly.1280.webp",1280],["/media/chess/ray-friendly.1400.webp",1400]]},"/media/chess/rook-anywhere.jpg":{"w":2077,"h":906,"set":[["/media/chess/rook-anywhere.640.webp",640],["/media/chess/rook-anywhere.1280.webp",1280],["/media/chess/rook-anywhere.1920.webp",1920]]},"/media/chess/rook-blocked.jpg":{"w":2241,"h":979,"set":[["/media/chess/rook-blocked.640.webp",640],["/media/chess/rook-blocked.1280.webp",1280],["/media/chess/rook-blocked.1920.webp",1920]]},"/media/chess/rook-board.jpg":{"w":1225,"h":1225,"set":[["/media/chess/rook-board.640.webp",640],["/media/chess/rook-board.1225.webp",1225]]},"/media/ib-paper-organizer/screens/library.jpg":{"w":1880,"h":1253,"set":[["/media/ib-paper-organizer/screens/library.640.webp",640],["/media/ib-paper-organizer/screens/library.1280.webp",1280],["/media/ib-paper-organizer/screens/library.1880.webp",1880]]},"/media/ib-paper-organizer/screens/search.jpg":{"w":1880,"h":1253,"set":[["/media/ib-paper-organizer/screens/search.640.webp",640],["/media/ib-paper-organizer/screens/search.1280.webp",1280],["/media/ib-paper-organizer/screens/search.1880.webp",1880]]},"/media/ib-paper-organizer/screens/viewer.jpg":{"w":1880,"h":1253,"set":[["/media/ib-paper-organizer/screens/viewer.640.webp",640],["/media/ib-paper-organizer/screens/viewer.1280.webp",1280],["/media/ib-paper-organizer/screens/viewer.1880.webp",1880]]},"/media/ironlog/screens/overview.jpg":{"w":1880,"h":1253,"set":[["/media/ironlog/screens/overview.640.webp",640],["/media/ironlog/screens/overview.1280.webp",1280],["/media/ironlog/screens/overview.1880.webp",1880]]},"/media/ironlog/screens/workout-history.jpg":{"w":1880,"h":1253,"set":[["/media/ironlog/screens/workout-history.640.webp",640],["/media/ironlog/screens/workout-history.1280.webp",1280],["/media/ironlog/screens/workout-history.1880.webp",1880]]},"/media/pcb-ldo/layout.png":{"w":960,"h":1653,"set":[["/media/pcb-ldo/layout.640.webp",640],["/media/pcb-ldo/layout.960.webp",960]]},"/media/pcb-ldo/process/layers.png":{"w":1600,"h":1500,"set":[["/media/pcb-ldo/process/layers.640.webp",640],["/media/pcb-ldo/process/layers.1280.webp",1280],["/media/pcb-ldo/process/layers.1600.webp",1600]]},"/media/pcb-ldo/render.png":{"w":616,"h":710,"set":[["/media/pcb-ldo/render.616.webp",616]]},"/media/pcb-ldo/schematic.png":{"w":1020,"h":450,"set":[["/media/pcb-ldo/schematic.640.webp",640],["/media/pcb-ldo/schematic.1020.webp",1020]]},"/media/physics/beams.jpg":{"w":2170,"h":857,"set":[["/media/physics/beams.640.webp",640],["/media/physics/beams.1280.webp",1280],["/media/physics/beams.1920.webp",1920]]},"/media/physics/insert.jpg":{"w":1050,"h":967,"set":[["/media/physics/insert.640.webp",640],["/media/physics/insert.1050.webp",1050]]},"/media/physics/model.jpg":{"w":1214,"h":1035,"set":[["/media/physics/model.640.webp",640],["/media/physics/model.1214.webp",1214]]},"/media/physics/pages/beginning.jpg":{"w":1241,"h":1754,"set":[["/media/physics/pages/beginning.640.webp",640],["/media/physics/pages/beginning.1241.webp",1241]]},"/media/physics/pages/end.jpg":{"w":1241,"h":1754,"set":[["/media/physics/pages/end.640.webp",640],["/media/physics/pages/end.1241.webp",1241]]},"/media/physics/pages/middle.jpg":{"w":1241,"h":1754,"set":[["/media/physics/pages/middle.640.webp",640],["/media/physics/pages/middle.1241.webp",1241]]},"/media/physics/process/fit-tests.png":{"w":2000,"h":900,"set":[["/media/physics/process/fit-tests.640.webp",640],["/media/physics/process/fit-tests.1280.webp",1280],["/media/physics/process/fit-tests.1920.webp",1920]]},"/media/physics/process/insert-versions.png":{"w":2000,"h":760,"set":[["/media/physics/process/insert-versions.640.webp",640],["/media/physics/process/insert-versions.1280.webp",1280],["/media/physics/process/insert-versions.1920.webp",1920]]},"/media/physics/result.jpg":{"w":2110,"h":1327,"set":[["/media/physics/result.640.webp",640],["/media/physics/result.1280.webp",1280],["/media/physics/result.1920.webp",1920]]},"/media/physics/setup.jpg":{"w":1797,"h":988,"set":[["/media/physics/setup.640.webp",640],["/media/physics/setup.1280.webp",1280],["/media/physics/setup.1797.webp",1797]]},"/media/physics/wheel.jpg":{"w":1800,"h":1200,"set":[["/media/physics/wheel.640.webp",640],["/media/physics/wheel.1280.webp",1280],["/media/physics/wheel.1800.webp",1800]]},"/media/printing/process/switch-coupons.png":{"w":2000,"h":800,"set":[["/media/printing/process/switch-coupons.640.webp",640],["/media/printing/process/switch-coupons.1280.webp",1280],["/media/printing/process/switch-coupons.1920.webp",1920]]},"/media/printing/process/switch-parts.png":{"w":2000,"h":900,"set":[["/media/printing/process/switch-parts.640.webp",640],["/media/printing/process/switch-parts.1280.webp",1280],["/media/printing/process/switch-parts.1920.webp",1920]]},"/media/r2r/process/layers.png":{"w":1600,"h":1300,"set":[["/media/r2r/process/layers.640.webp",640],["/media/r2r/process/layers.1280.webp",1280],["/media/r2r/process/layers.1600.webp",1600]]},"/media/youtonomous/screens/player.jpg":{"w":1880,"h":1253,"set":[["/media/youtonomous/screens/player.640.webp",640],["/media/youtonomous/screens/player.1280.webp",1280],["/media/youtonomous/screens/player.1880.webp",1880]]},"/media/pcb-ldo/process/thermal.svg":{"w":1200,"h":560,"set":[]},"/media/pcb-ldo/process/window.svg":{"w":1200,"h":560,"set":[]},"/media/printing/process/enclosure-base.svg":{"w":77,"h":82,"set":[]},"/media/r2r/process/steps.svg":{"w":1200,"h":560,"set":[]},"/media/r2r/schematic-clean.svg":{"w":1200,"h":560,"set":[]}}}