10 interesting stories served every morning and every evening.

OpenTools / OpenPrinter

www.opentools.studio

is a re­pairable, com­pact, and ro­bust printer de­signed to last.

Fully re­pairable and equipped with a re­fill­able ink sys­tem, it adapts to your needs while re­duc­ing your print­ing costs.

Easy to main­tain, it of­fers a sus­tain­able, eco­nom­i­cal, and eco-friendly al­ter­na­tive to tra­di­tional print­ers.

With Openprinter, eas­ily re­fill your car­tridges.

Reduce your costs and limit the waste of con­sum­ables.

Take con­trol of your ink con­sump­tion

Master your ink con­sump­tion in a few steps.

Freedom to use your car­tridges

Use your black and/​or colour car­tridges in­de­pen­dently : print in black for es­sen­tials or in colour for your cre­ations.

No more frus­trat­ing block­ages like: Cannot print in black be­cause the yel­low is empty.”

1. Just the black car­tridge

Print a rich and deep black

2. Just the color car­tridge

Print vi­brant col­ors and a light black

3. Cartridges black & color

You have both op­tions

Free pa­per for­mat

With Openprinter, you are free to choose be­tween stan­dard sheets or a roll of ver­sa­tile pa­per.

Print not only in stan­dard

for­mats

, but also in

ban­ners

, strips

and com­pletely cus­tomized

for­mats.

Thanks to the in­te­grated cut­ter, un­leash your cre­ativ­ity.

Print also on sheets A4 and A3

Remove the roller eas­ily

to place pa­per’s sheets (A4, A3, Tabloid, Letter)

Flexible con­fig­u­ra­tions

To place on a desk or mount on a wall — you choose. Openprinter fits any­where.

Create a new work space that makes your ex­changes smoother and more mod­ern.

Compact

The most com­pact printer/​plot­ter on the mar­ket. Easy to move, it fits any­where and can be stored in an in­stant.

Robust. Repairable. Open. Durable.

Composed of stan­dard and open source com­po­nents, Openprinter is easy to as­sem­ble, main­tain, and re­pair, en­sur­ing longevity.

Keep your ma­chine and con­sum­ables for as long as pos­si­ble and help re­duce elec­tronic waste.

A self-as­sem­bly kit or al­ready as­sem­bled and ready to use.

Independent of op­er­at­ing sys­tems

Equipped with an open source print server (CUPS), Open Printer works with Windows, MacOS, Linux, Android, iOS.

It han­dles all your print­ing, both lo­cally and over the net­work, for a sim­ple, flex­i­ble, and dri­ver-free ex­pe­ri­ence.

Customize it

Choose the coloured ver­sion that re­sem­bles you. Thanks to open source, you can also print your own 3D parts to cre­ate a unique printer.

Technical spec­i­fi­ca­tions

Black and white : 600 dpi

Color : 1200 dpi

Speed : to be de­fined

European for­mats

Sheet : A4, A3

Paper roll : 29.7 cm (wide) 18 m or 37.5 m (long)

North American for­mats

Letter, Tabloid

Paper roll : 11 inch (wide)

Compatible car­tridges

HP 63 and HP 63 XL (US)

HP 302 and HP 302 XL (Europe)

HP 803 and HP 803 XL (Asia)

Rechargeable ink car­tridges (with the Inkit)

100ml ink bot­tles (Black, Magenta, Cyan, Yellow)

Vials

Modes of car­tridge use

sin­gle car­tridge (black or color)

or both (black and color)

USB Type-C (computer)

USB Type-A (USB flash drive / stor­age de­vice)

Wi-Fi 802.11ac (AirPrint)

Bluetooth 4.1

Main board : Raspberry Pi Zero W

Cartridge board : STM32 mi­cro­con­troller

Computer : Windows, ma­cOS, Linux,

Phone : iOS, Android

497 × 233 × 111 mm

19,5 × 9,2 × 4,4 in

On a desk

Mural (with the wall kit)

24 V DC, 2.1 mm con­nec­tor

TFT LCD 1.47 inch, 172 x 320 px

Pre-order cam­paign

To re­serve your ma­chine, fol­low our crowd­fund­ing cam­paign on Crowd­sup­ply.

Frequently Asked Questions

Cartridges

The car­tridges can be found in usual re­tail out­lets and on­line. This model is sold world­wide and widely dis­trib­uted.

Europe : HP 302, HP 302 XL

US : HP 63, HP 63XL

Asia : HP 803, HP 803XL

You can also find them at our sup­pli­ers: Printerre.

Paper roll

Paper roll (29.7 cm x 18 m) or (29.7 cm x 37.5 m) are eas­ily found on­line.

Ink

Open Tools will sell the Inkit :  4 x bot­tles (black, ma­genta, cyan, yel­low) and re­fill tools.

Two el­e­ments will help you save money :

Machine durable :

de­signed to be ro­bust and last a long time, all com­po­nents are re­pairable, and re­place­ment parts are avail­able in full for a long time.

By keep­ing your ma­chine over time, you save money.

Low ink and con­sum­able costs :

the car­tridges are re­fill­able with ink and with­out block­ing (no DRM).

Moreover, the ink sold by Open Tools al­lows you to achieve an eco­nom­i­cal cost per page.

With your phone

, you can scan all your doc­u­ments in high de­f­i­n­i­tion. The

It's not about physical vs digital games, it's about ownership

popcar.bearblog.dev

05 Jul, 2026

A few days ago, PlayStation an­nounced that they’ll stop pro­duc­ing disks for new games start­ing from January 2028, con­firm­ing what we al­ready felt was go­ing to hap­pen: con­soles are go­ing fully dig­i­tal, and the disk drive will cease to ex­ist.

I’ve seen a lot of great dis­cus­sions on the in­ter­net about this, but I can’t help but feel like peo­ple are mad about the wrong thing, or com­pletely mis­un­der­stand why this is an is­sue. They have the right idea, get­ting rid of disks is bad for every­one, but it’s not about the disk and putting your games on the shelf… it’s about Sony’s at­tempt to com­pletely kill own­er­ship. People keep com­par­ing this to PC get­ting rid of disk dri­ves, but these two sce­nar­ios are not com­pa­ra­ble at all. I’ll get to that later.

Ownership as in the abil­ity to trade

The biggest thing about own­ing some­thing is the abil­ity to trade it with who­ever you’d like. When I was younger, I used to con­stantly trade PS3 and PS4 games with my friends. Whether it was to loan them a copy of the Jak & Daxter tril­ogy or to sell a game to some­one I know, pass­ing around con­sole games is prac­ti­cally tra­di­tion at this point.

But com­pa­nies have al­ways been vo­cal about how much they de­spise used games. How could some­one pos­si­bly buy God of War for $20 from their friend in­stead of buy­ing it for $40 from the store?! Every dime spent on used games is a dime lost for the com­pany, right?!

The de­ci­sion to kill disks is­n’t some knee­jerk re­ac­tion to any­thing, it’s some­thing con­sole own­ers have been slowly build­ing up to for the last ~15 years. The en­tire rea­son Xbox One flopped so hard and be­came a laugh­ing stock was, among other things, be­cause they tried to kill the abil­ity to re-sell the disk you paid for, and forc­ing your con­sole to al­ways be on­line to ver­ify your games. Apparently, they were just too early to try this.

This also is­n’t spe­cific to video games. It’s some­thing lit­er­ally every in­dus­try has been ob­sessed with to max­i­mize prof­its. If any­thing, video games were late com­pared to some­thing like the mu­sic in­dus­try, where not own­ing your mu­sic has been the sta­tus quo for a while now!

And now that we’re catch­ing up, the con­cept of giving a game to some­one else” will cease to ex­ist. The next gen­er­a­tion of young games will just ac­cept buy­ing a dig­i­tal game off the store as just how games work now. You’ll be there ex­plain­ing to the young’uns how it used to be. How giv­ing your fa­vorite game to your best friend in school was the nor­mal thing that they will never get to ex­pe­ri­ence.

Sure, you could ar­gue that disks on mod­ern con­soles are prac­ti­cally just li­censes these days, but you could still pass that own­er­ship to some­one else, with­out it be­ing tied down to one spe­cific ac­count or con­sole.

Ownership as in preser­va­tion

Just a few days be­fore this an­nounce­ment, peo­ple in the gam­ing space were cel­e­brat­ing the re­lease of Omnidrive, a mod for op­ti­cal dri­ves that lets you eas­ily rip blu rays. That in­cludes, you guessed it, PS3/PS4/PS5 games (though they’re en­crypted, but that’s an is­sue that can be solved later).

Game preser­va­tion and em­u­la­tion has al­ways been an­other arch neme­sis of game com­pa­nies. They hate that you can ever play a game with­out be­ing tied to their ser­vice or con­sole, or even with­out tak­ing per­mis­sion from them! A lot of games have been de-listed for var­i­ous rea­sons, many of them le­gal, but most have been straight up be­cause the com­pany never both­ered to port them to mod­ern con­soles.

Most retro games would be lost me­dia if not for peo­ple pre­serv­ing them. This is a big­ger deal than peo­ple give it credit for. Imagine liv­ing in a world where most games be­fore 2014 have just been com­pletely lost for­ever. SNES games I loved. PlayStation 2 clas­sics. Even games that aren’t that old! PlayStation an­nounced that the PS3 and Vita stores will close next month, and there are tons of games there that you bet no com­pany will want to pre­serve.

Last year, I bought a Playstation Vita and re­ally en­joyed play­ing the games on it. You bet those games and ports will never be archived by Sony. Even PS3 games I loved like LittleBigPlanet and Asura’s Wrath and Infamous have never been ported, and are on the verge of be­ing lost for­ever if not for peo­ple spend­ing time and ef­fort grab­bing them via dump­ing disks or hacked con­soles!

My point: What hap­pens if the PlayStation 6 comes out and has no disk drive and has in­cred­i­bly strong se­cu­rity that makes dump­ing games im­pos­si­ble? Games could be lost for real this time. When PlayStation ever de­cides to make games stream­ing-only (more on that later), or de­cides to de-list a game, or de­cides to axe the PS6 servers? It would be a dis­as­ter. Imagine work­ing on a game for many years then be­ing told a cou­ple of years later that it does­n’t ex­ist any­more. Not own­ing your game means they can never be pre­served by the con­sumer.

Stop Killing Games is al­ready fight­ing for con­sumer rights to keep games playable af­ter be­ing shut down, but no­body own­ing their games means that no­body can fight back to keep the games they bought, even through more ex­treme means.

Ownership as in hav­ing op­tions

Even if you buy your games 100% dig­i­tally on con­soles, it’s still very com­fort­ing to know that phys­i­cal games are an op­tion should you ever want one. It’s good that you’re not to­tally trapped into buy­ing games from the PS Store with prices only dic­tated by Sony.

You could al­ways drive to a lo­cal store and buy a game that might be on sale. You have the op­tion of buy­ing a game used from some­one on the in­ter­net. You could al­ways go to that same store and trade your game for a small cash­back.

Hell, where I live, the most pop­u­lar game store has a rental sys­tem where you can rent a game and pay for each week you keep it. Some peo­ple still use that be­cause pur­chas­ing a game out­right is out of their price range. That too won’t ex­ist any­more. Your many op­tions are now lim­ited to one, whether you like it or not.

But PC is all dig­i­tal! They ac­cepted it with no is­sues!

Everyone who brings up the fact that PC has been dig­i­tal and how that turned out fine does­n’t re­ally un­der­stand what’s go­ing on.

Yes, PC is dig­i­tal, but there’s a mas­sive dif­fer­ence: we can still own our games on PC. You’re not trapped to one ecosys­tem or one dig­i­tal store, you have dozens of op­tions. Most im­por­tantly, there are tons of DRM-Free games and stores out there. Websites like GOG, Itch.io, etc. let you down­load and play games with­out be­ing tied to any ser­vice.

This means you can’t have your li­cense re­voked or worry about the game com­pletely dis­ap­pear­ing for any rea­son. You can back up the game, mod­ify it, play it on dif­fer­ent sys­tems, and gen­er­ally know that 10 years from now you can prob­a­bly get it to work and play it again.

But most peo­ple use Steam any­way, I hear you say. That’s true, but you can still own your games on Steam. Very eas­ily, in fact! Steam does­n’t ap­ply a hard DRM for games on their plat­form, you can by­pass it and play your games of­fline with­out the launcher if you know what you’re do­ing.

Because PC is an open plat­form, peo­ple have fig­ured this out and will con­tinue to fig­ure out by­passes in case things go south (which they haven’t so far, thank­fully). All you need is to get some­thing called the Goldberg Emulator, re­place the SteamAPI file, then add an ap­p_id.txt file. Done. You can play any Steam game of­fline (assuming the pub­lisher did­n’t put their own DRM like Denuvo). I’ve done this a lot, and it is le­gal as long as you don’t share your game to other peo­ple.

So no, plat­forms like PC los­ing out on phys­i­cal games is not com­pa­ra­ble to con­soles los­ing phys­i­cal games. PC gamers can still own and pre­serve their games through dig­i­tal means, and hon­estly, I think dig­i­tal is way bet­ter than hav­ing to use a disk. For con­sole gamers, you just lost your only way to ac­tu­ally own your games. Now you’re get­ting trapped in a walled gar­den with no other choice, un­less you aban­don the con­sole for­ever, which is a tough pill to swal­low for the av­er­age per­son be­cause they don’t want to lose all their games and friends they have on the plat­form to move to a new thing they don’t know or un­der­stand.

But this does­n’t af­fect me! I’m al­ready on PC or am buy­ing con­sole games 100% dig­i­tally!”

It will! That’s like say­ing Spotify get­ting pop­u­lar won’t af­fect you, be­cause your fa­vorite band is still putting out CDs you can buy. But now, so many songs are trapped be­hind a sub­scrip­tion ser­vice with no way to prop­erly own any of them. The in­dus­try mov­ing in a spe­cific di­rec­tion will af­fect you at some point. The movie in­dus­try is the same way, blu-rays will al­ways ex­ist”, but now so much con­tent is trapped be­hind sub­scrip­tion ser­vices.

In this case, the next step for con­sole mak­ers is ob­vi­ous. Everyone wants to be Netflix.

Everyone wants to be Netflix

Look, every­one! Netflix is rak­ing in bil­lions of dol­lars… Just by of­fer­ing a stream­ing ser­vice? People are will­ing to pay every sin­gle month for years at a time? And they can keep los­ing con­tent and peo­ple will stay sub­scribed? And they can keep rais­ing prices and peo­ple will con­tinue to sub­scribe? And every­one has to own an ac­count that can’t be shared to bor­row con­tent they can never own and is­n’t avail­able any­where else?!?!??! The line will al­ways go up!! Wow!!!! I need to be like Netflix!!!!

Look, every­one! Netflix is rak­ing in bil­lions of dol­lars… Just by of­fer­ing a stream­ing ser­vice? People are will­ing to pay every sin­gle month for years at a time? And they can keep los­ing con­tent and peo­ple will stay sub­scribed? And they can keep rais­ing prices and peo­ple will con­tinue to sub­scribe? And every­one has to own an ac­count that can’t be shared to bor­row con­tent they can never own and is­n’t avail­able any­where else?!?!??! The line will al­ways go up!! Wow!!!! I need to be like Netflix!!!!

- Every tech busi­ness ex­ec­u­tive in the last ~15 years

Okay, maybe it’s less about Netflix the com­pany and more about the gen­eral sen­ti­ment. Every in­dus­try is mov­ing to this holy grail of ex­tract­ing money from peo­ple, a ser­vice where they keep pay­ing you for the rest of their life (or un­til they get bored of your plat­form, I guess).

Xbox is crash­ing be­cause it at­tempted this, but my per­sonal the­ory is the same as the Xbox One gen­er­a­tion: they were just a lit­tle too early. Xbox Game Pass is re­port­edly do­ing well, but it’s not the sta­tus quo changer they prob­a­bly wanted it to be. PS and Xbox al­ready pro­vided yearly sub­scrip­tions to play mul­ti­player and un­lock more ad­vanced fea­tures, but damn it, that’s not enough. Because they still own their games (or had the op­tion to) and did­n’t fully de­pend on the ser­vice.

So the next log­i­cal step is pretty damn sim­ple. PlayStation and Xbox want to be Netflix. They want to make pur­chas­ing games hard or overly ex­pen­sive that the de facto way to play a game will be through a ser­vice. I’m will­ing to bet that in the next decade, Sony or Xbox will start mak­ing their games playable EXCLUSIVELY through a sub­scrip­tion, with no way to buy it. Of course, you’ll need a con­stant in­ter­net con­nec­tion too. Maybe with a scan of your face to con­firm you can never lend your ac­count to a friend. Uhh, I meant a face scan to pro­tect chil­dren from ever play­ing a 16+ game! It’s all about pro­tect­ing the chil­dren, of course.

And that af­fects you, too, smug PC users. When one com­pany gets away with it, other com­pa­nies will catch on and start fol­low­ing the leader. It’s al­ready get­ting nor­mal­ized with Game Pass on PC, but it’s just not big enough yet that they can start build­ing a walled gar­den and trap­ping peo­ple in yet. If it were pop­u­lar enough that they can get away with it, I’m will­ing to bet the next Elder Scrolls would be Game Pass ex­clu­sive.

So now what?

That’s not to say that gam­ing is doomed or what­ever. We will al­ways still have op­tions, and I doubt this sub­scrip­tion-only fu­ture is com­ing soon… But we’re get­ting there.

Even when we do reach the con­clu­sion, DRM-free stores will still ex­ist be­cause enough peo­ple care. Cool in­die de­vel­op­ers will still make awe­some games that won’t be tied down to one plat­form or ser­vice. The games in­dus­try is too var­ied and in­die-friendly that there is­n’t a huge risk of the in­dus­try be­ing to­tally mo­nop­o­lized by large com­pa­nies (looking at you, movie in­dus­try).

But if you care about these things (you clearly do since you read this far), please sup­port the cre­ators that are fight­ing against this fu­ture. Buy DRM-free stuff. Donate to an or­ga­ni­za­tion that pre­serves games & game-re­lated con­tent. Donate to em­u­la­tor de­vel­op­ers. Support your friendly neigh­bour­hood in­die devs. Make some noise on­line. We don’t want phys­i­cal me­dia, we want dig­i­tal own­er­ship rights! Don’t con­fuse the ar­gu­ment!

All of this stuff will make a dif­fer­ence, even if it does­n’t feel like it. So keep at it.

#gaming

#opinion

#tech

Chat Control 1.0: EU Council forces messenger scans via fast-track

www.heise.de

The dis­pute over dig­i­tal let­ter se­crecy in the EU is reach­ing a new level of es­ca­la­tion shortly be­fore the sum­mer break. After ne­go­ti­a­tions on Chat Control 2.0 — i.e., the manda­tory, sus­pi­cion­less scan­ning of en­crypted com­mu­ni­ca­tion — stalled due to per­sis­tent re­sis­tance in the EU Parliament, the Council of Ministers is now push­ing for­ward with a le­gal ma­neu­ver.

The mem­ber states want to re­ac­ti­vate the tran­si­tional reg­u­la­tion for vol­un­tary mon­i­tor­ing of mes­sages by tech­nol­ogy groups, which ex­pired on April 3, in an ex­pe­dited pro­ce­dure. The Council adopted a cor­re­spond­ing po­si­tion for a new” reg­u­la­tion on Thursday via writ­ten pro­ce­dure to close a loom­ing le­gal loop­hole and in­crease pres­sure on MEPs.

The rea­son for the trick: Since the end of 2020, in­ter­net-based, num­ber-in­de­pen­dent com­mu­ni­ca­tion ser­vices such as mes­sen­ger apps, web­mail, and VoIP tele­phony have been sub­ject to the strict pro­vi­sions of the European E-Privacy Directive. This pro­tects the fun­da­men­tal right to con­fi­den­tial­ity of com­mu­ni­ca­tion and pro­hibits unau­tho­rized in­ter­cep­tion or eval­u­a­tion of con­tent and traf­fic data. To still al­low tech­nol­ogy providers to vol­un­tar­ily search pri­vate chats us­ing AI and hash match­ing for known abuse ma­te­r­ial or groom­ing pat­terns, the EU law­mak­ers cre­ated a tem­po­rary ex­emp­tion in 2021. This reg­u­la­tion, re­ferred to as Chat Control 1.0, ex­pired in the spring, as the Council and Parliament could not agree on an ex­ten­sion.

Child Protection and Letter Secrecy

For the Council, the ex­piry of the dead­line is an un­ten­able sit­u­a­tion. The providers’ vol­un­tary de­tec­tion mea­sures are an in­dis­pens­able tool for iden­ti­fy­ing af­fected chil­dren early, res­cu­ing vic­tims from abuse sit­u­a­tions, and curb­ing the un­con­trolled fur­ther dis­sem­i­na­tion of il­le­gal im­age and video ma­te­r­ial on­line. Furthermore, the pro­ce­dure makes an im­por­tant con­tri­bu­tion to on­line law en­force­ment, even though re­ports con­tinue to flow de­spite the ex­pired norm. The new reg­u­la­tion aims to pre­vent frag­men­ta­tion through na­tional uni­lat­eral ac­tions.

Critics, how­ever, see the cho­sen pro­ce­dure as an at­tempt to cir­cum­vent de­mo­c­ra­tic con­trol bod­ies and to sur­prise Parliament. Since an al­ready ex­pired reg­u­la­tion can­not sim­ply be ex­tended in for­mal terms, the EU gov­ern­ments are re­sort­ing to a trick: Instead of an ex­ten­sion, they have put for­ward a leg­isla­tive pro­posal that is largely iden­ti­cal in con­tent but dif­fer­ent in form.

Tactical Timing Before the Summer Break

The draft is to be put on Parliament’s agenda as early as Tuesday as part of an ur­gent pro­ce­dure — im­me­di­ately be­fore the start of the sum­mer break. Should the ple­nary ses­sion ap­prove the ac­cel­er­ated pro­ce­dure, a vote threat­ens on the last day of ses­sion be­fore the hol­i­days, when many MEPs have his­tor­i­cally al­ready de­parted. Compounding the is­sue, the pro­ce­dure is al­ready in its 2nd read­ing. At this stage, the Council’s po­si­tion can only be stopped or mod­i­fied by amend­ments if an ab­solute ma­jor­ity of the rep­re­sen­ta­tives vote against it. A hur­dle that, in prac­tice, is con­sid­ered al­most in­sur­mount­able shortly be­fore the sum­mer break.

Although the Council em­pha­sizes that the scans will be lim­ited to the ab­solutely nec­es­sary ex­tent and that no gen­eral, in­dis­crim­i­nate sur­veil­lance will take place, the in­tru­sion into the pri­vacy of all users re­mains sig­nif­i­cant. The reg­u­la­tion stip­u­lates that the processed con­tent and traf­fic data must be ir­rev­o­ca­bly deleted no later than twelve months af­ter de­tec­tion, un­less a con­crete sus­pi­cion is con­firmed. A per­ma­nent, long-term le­gal frame­work for abuse pre­ven­tion, mean­while, moves fur­ther into the dis­tance.

(kbe)

Don’t miss any news — fol­low us on Facebook, LinkedIn or Mastodon.

This ar­ti­cle was orig­i­nally pub­lished in

German.

It was trans­lated with tech­ni­cal as­sis­tance and ed­i­to­ri­ally re­viewed be­fore pub­li­ca­tion.

The Future of Flipper Zero Development

blog.flipper.net

We’ve seen the strong re­ac­tion from the com­mu­nity over the idea that we’ve stopped de­vel­op­ing the Flipper Zero firmware. We want to ad­dress this and let you know that we’ve heard all your feed­back and have de­cided to re­think our ap­proach to main­tain­ing the pro­ject and en­gag­ing with the com­mu­nity.

TL;DR: We’ve al­lo­cated re­sources to main­tain Flipper Zero firmware and sup­port com­mu­nity con­tri­bu­tions. From now on, com­mu­nity re­quests and con­tri­bu­tions will be re­viewed un­der new rules: vot­ing for fea­ture re­quests in GitHub Discussions, clearer pull re­quest guide­lines, and manda­tory in­te­gra­tion test­ing.

How it all started — Kickstarter 2020

When Flipper Zero launched on Kickstarter, we were over­whelmed by the com­mu­ni­ty’s sup­port. That sup­port came with a re­spon­si­bil­ity to de­liver what we had promised. At the same time, we faced a wave of skep­ti­cism. We were called scam­mers and told the pro­ject would never ship.

A year and a half later, our en­tire team worked with the fear of let­ting our back­ers down and be­com­ing an­other crowd­fund­ing pro­ject re­mem­bered for tak­ing $5 mil­lion and never de­liv­er­ing. We were hit by post-COVID com­po­nent short­ages, soar­ing sup­ply chain costs, and po­lit­i­cal tur­moil. On top of that, we were still deal­ing with thou­sands of ac­cu­sa­tions, in­sults, and threats.

We worked as hard as we could while try­ing to ig­nore the con­stant storm of crit­i­cism around us. But we have to ad­mit that it was in­cred­i­bly dif­fi­cult. Today, we can look back and say that we made the right de­ci­sions: we planned our re­sources care­fully, took risks, and worked re­ally hard.

In the end, we made it through every chal­lenge: from hard­ware and man­u­fac­tur­ing to sup­ply chains, lo­gis­tics, firmware, and soft­ware de­vel­op­ment. We feel em­pa­thy for the teams be­hind crowd­fund­ing pro­jects that tried to copy Flipper Zero, but ended up ship­ping noth­ing. We could eas­ily have been one of them, but to­day we can say with con­fi­dence:

We de­liv­ered on all Kickstarter promises — every backer re­ceived the Flipper Zero they paid for, even if it took much longer than any­one had ex­pected.

All fea­tures were im­ple­mented — every­thing we stated in our Kickstarter cam­paign works as promised. This took us years of de­vel­op­ment.

We built a plat­form and in­fra­struc­ture — we’re proud that Flipper Zero has be­come a hard­ware plat­form with soft­ware tools, APIs, and an SDK that de­vel­op­ers gen­uinely en­joy us­ing. That’s ex­actly why there are so many com­mu­nity-dri­ven pro­jects around Flipper Zero: al­ter­na­tive firmware, apps, and scripts.

Flipper Zero is avail­able world­wide (almost) — it may not be the most vis­i­ble achieve­ment, but we in­vested an enor­mous amount of ef­fort into get­ting reg­u­la­tory cer­ti­fi­ca­tions, cus­toms ap­provals, and all the pa­per­work re­quired to of­fi­cially im­port Flipper Zero into most coun­tries. That’s why there are now so many de­vices in peo­ple’s hands.

Thanks to every­one who sup­ports us

We are deeply grate­ful to every­one who has sup­ported us since the Kickstarter cam­paign and be­lieved in our team. Without your sup­port back in 2020, Flipper Zero would prob­a­bly never have hap­pened. Together with you, we built some­thing far big­ger than we ever imag­ined.

Stable firmware 1.0

It’s im­por­tant to un­der­stand that Flipper Zero has only 700 KB of flash mem­ory avail­able for firmware. And we ran into this limit very quickly, mak­ing it im­pos­si­ble to add new fea­tures. To work around it, we came up with dy­namic apps load­ing from the mi­croSD card — it al­lowed us to move de­vice func­tions (including core fea­tures) out­side the firmware into apps.

This ar­chi­tec­ture be­came the foun­da­tion of the sta­ble firmware 1.0, which was re­leased in 2024 fol­low­ing the Apps Catalog launch. We pol­ished the user in­ter­face and doc­u­men­ta­tion. We also sta­bi­lized the firmware API and SDK for app de­vel­op­ers, so they no longer had to re­build their apps every month due to some API changes.

Since the firmware no longer re­quired ma­jor changes, we de­cided to limit our work to main­tain­ing the in­fra­struc­ture and fix­ing crit­i­cal bugs, while shift­ing our fo­cus to build­ing new de­vices (after all, we’re called Flipper Devices).

By that point, an en­tire ecosys­tem of al­ter­na­tive firmware pro­jects and com­mu­ni­ties had al­ready ex­isted, with peo­ple im­ple­ment­ing every fea­ture they could think of — even the weird­est ones. We con­sider our mis­sion ac­com­plished: we built an ac­ces­si­ble de­vel­op­ment plat­form, and com­mu­ni­ties can now shape it into what­ever they want.

We did­n’t ex­pect so many peo­ple to care so deeply about the de­vel­op­ment of the of­fi­cial Flipper Zero firmware. It’s gen­uinely mov­ing that this pro­ject and every­thing we’ve built to­gether mat­ters to you. That’s why we’re ready to re­visit some of our past de­ci­sions. We de­cided to al­lo­cate re­sources to con­tinue sup­port­ing com­mu­nity con­tri­bu­tions, but with a new ap­proach.

What this means in prac­tice:

Limited team re­sources — our team is still small, and all our at­ten­tion right now is on build­ing new DEVICES. We can no longer hang out in chats, jump on calls, and talk in real time the way we used to. From the out­side, it might look like we’re ig­nor­ing the com­mu­nity, but in re­al­ity, it’s just fo­cused work.

Async com­mu­ni­ca­tion only — from now on, all com­mu­ni­ca­tion with the de­vel­op­ment team will hap­pen through re­quests in GitHub Discussions. You can vote on top­ics, and we com­mit to re­view­ing the re­quests that get the most votes. But these have to be con­crete fea­ture re­quests, for­mat­ted ac­cord­ing to the rules. Abstract ques­tions, gen­eral dis­cus­sion, and help re­quests stay on Discord, Reddit, and so­cial me­dia.

New con­tri­bu­tion rules — we’ll now eval­u­ate pull re­quests more strictly, as re­flected in our up­dated con­tri­bu­tion guide. This ap­plies es­pe­cially to AI-generated code that touches low-level li­braries that is hard to ver­ify, as well as changes that af­fect the de­vice’s UI and re­quire ed­its in the doc­u­men­ta­tion.

Integration and re­gres­sion test­ing — it’s im­por­tant that code changes don’t break ex­ist­ing fea­tures. That’s why we’re mak­ing pub­lic the in­te­gra­tion test cases that our QA team used to test the firmware. These tests will need to be run for every change to the firmware code, and we’ll bring the com­mu­nity in to help with part of the re­gres­sion test­ing.

Feature re­quests now only via GitHub Discussions

Once the to­tal num­ber of Flipper Zero users passed one mil­lion, di­rect real-time com­mu­ni­ca­tion with the com­mu­nity be­came im­pos­si­ble. We re­ceive a huge num­ber of re­quests across every com­mu­ni­ca­tion chan­nel, to the point where we even­tu­ally had to dis­able di­rect mes­sages on our so­cial me­dia ac­counts.

At the same time, in all this noise, it be­came im­pos­si­ble to sep­a­rate what ac­tu­ally mat­ters. You can’t re­ally dis­tin­guish be­tween re­quests that re­flect real com­mu­nity needs and a sin­gle per­son’s niche re­quest — every­thing just blends into the same white noise.

Vote for what re­ally mat­ters

We’re mov­ing all re­quests from the Flipper Zero com­mu­nity to GitHub Discussions. Now you can 🤚 vote for fea­ture re­quests that re­ally mat­ter, so we can see what the com­mu­nity ac­tu­ally wants and pri­or­i­tize them.

Please stay on topic

We’d re­ally ask you to keep this space for gen­uinely im­por­tant re­quests — ones that can re­al­is­ti­cally be im­ple­mented and that you’re sure aren’t just some­thing you per­son­ally want, but some­thing oth­ers ac­tu­ally need too. Otherwise, it just turns into noise, spam, and end­less back-and-forth.

For dis­cus­sions that aren’t suit­able as fea­ture re­quests, there’s Discord, Reddit, Twitter, and our other so­cial chan­nels.

Summary

We’re al­lo­cat­ing re­sources to main­tain­ing the Flipper Zero firmware. Our team will go through com­mu­nity re­quests weekly.

Communication with the de­vel­op­ment team will now hap­pen only through GitHub Discussions. We’ll work on the fea­ture re­quests with the most votes.

Accepting PRs in the Apps Catalog will work as be­fore.

AMA with Flipper team

has_not_been_viewed_much — Will W.

iamwillwang.com

The

Art Institute of Chicago’s API in­cludes a has_not_been_viewed_­much field on art­work. It’s a boolean that de­scribes whether an art piece has­n’t been vis­ited on their web­site very much.

More specif­i­cally, per the

source code , has_not_been_viewed_­much means the art piece has been viewed fewer than 200 times on the web­site since January 1, 2010.

Of course, that still begs the ques­tion: what are these art­works? Why aren’t they be­ing viewed? I can’t an­swer the lat­ter, but, if you have a mo­ment for the for­mer, please take some time to browse.

Introduction to Compilers and Language Design

dthain.github.io

Prof. Douglas Thain at Notre Dame

This is a free on­line text­book: you are wel­come to ac­cess the chap­ter PDFs di­rectly be­low. If you pre­fer to hold a real book, you can also pur­chase a hard­cover or pa­per­back be­low. The text­book and ma­te­ri­als have been de­vel­oped by Prof. Douglas Thain as part of the CSE 40243 com­pil­ers class at the University of Notre Dame. Join our mail­ing list to re­ceive oc­ca­sional an­nounce­ments of new edi­tions and other up­dates.

A com­piler trans­lates a pro­gram writ­ten in a high level lan­guage into a pro­gram writ­ten in a lower level lan­guage. For stu­dents of com­puter sci­ence, build­ing a com­piler from scratch is a rite of pas­sage: a chal­leng­ing and fun pro­ject that of­fers in­sight into many dif­fer­ent as­pects of com­puter sci­ence, some deeply the­o­ret­i­cal, and oth­ers highly prac­ti­cal. This book of­fers a one se­mes­ter in­tro­duc­tion into com­piler con­struc­tion, en­abling the reader to build a sim­ple com­piler that ac­cepts a C-like lan­guage and trans­lates it into work­ing X86 or ARM as­sem­bly lan­guage. It is most suit­able for un­der­grad­u­ate stu­dents who have some ex­pe­ri­ence pro­gram­ming in C, and have taken courses in data struc­tures and com­puter ar­chi­tec­ture.

A com­piler trans­lates a pro­gram writ­ten in a high level lan­guage into a pro­gram writ­ten in a lower level lan­guage. For stu­dents of com­puter sci­ence, build­ing a com­piler from scratch is a rite of pas­sage: a chal­leng­ing and fun pro­ject that of­fers in­sight into many dif­fer­ent as­pects of com­puter sci­ence, some deeply the­o­ret­i­cal, and oth­ers highly prac­ti­cal. This book of­fers a one se­mes­ter in­tro­duc­tion into com­piler con­struc­tion, en­abling the reader to build a sim­ple com­piler that ac­cepts a C-like lan­guage and trans­lates it into work­ing X86 or ARM as­sem­bly lan­guage. It is most suit­able for un­der­grad­u­ate stu­dents who have some ex­pe­ri­ence pro­gram­ming in C, and have taken courses in data struc­tures and com­puter ar­chi­tec­ture.

Introduction to Compilers and Language Design, 2nd Edition

The au­thor grants per­mis­sion to down­load, print, and use these PDFs for per­sonal and aca­d­e­mic use. Commercial print­ing or dis­tri­b­u­tion is pro­hib­ited. Instead of copy­ing PDFs lo­cally, please point stu­dents to this page (compilerbook.org) so that they can ac­cess the lat­est ver­sion.

The au­thor grants per­mis­sion to down­load, print, and use these PDFs for per­sonal and aca­d­e­mic use. Commercial print­ing or dis­tri­b­u­tion is pro­hib­ited. Instead of copy­ing PDFs lo­cally, please point stu­dents to this page (compilerbook.org) so that they can ac­cess the lat­est ver­sion.

Code Resources. The com­piler­book-ex­am­ples github repos­i­tory con­tains ad­di­tional re­sources that cor­re­spond to the book, in­clud­ing sev­eral scan­ners and parsers, a starter code struc­ture for the pro­ject com­piler, and sam­ple test cases for each stage of the scan­ner, parser, type­checker, and code gen­er­a­tor.

Errata. Found a typo or mis­take? Please send an email to the au­thor `dthain@nd.edu` with the ti­tle Compiler Book Errata” and I’ll be happy to cor­rect it and ac­knowl­edge you in the next edi­tion.

reuters.com

www.reuters.com

Please en­able JS and dis­able any ad blocker

Starring the Computer

www.starringthecomputer.com

Acer

Acer Aspire 500LB

• Eraser (1996)

Acer Aspire 8930G

• Eu când vreau sa fluier, fluier (2010)

Acer Aspire R14

• Jessica Jones - Season 1 (2015)

Acer Aspire Z3 – 600

• Taken 3 (2014)

Acer Chromebook 11

• Knives Out (2019)

Acer Extensa 5620

• Bad Ass (2012)

Acer MPF-1

• Runaway (1984)

Acorn

Acorn A5000

• A Mind to Kill - Season 1, Episode 3, “Gameboys” (1994)

Acorn Archimedes

• Bergerac - Season 8, Episode 11, “There for the Picking” (1990) • Capital City - Season 1, Episode 2, “Insider Trading” (1989) • Dark Season - Season 1 (1991) • Doctor Who - Season 25, “Silver Nemesis” (1988) • Howard’s Way - Season 4, Episode 10, “Publish & Be Damned” (1988) • Howard’s Way - Season 4, Episode 11, “Screwdriver” (1988) • Minder - Season 9, Episode 7, “How to Succeed in Business Without Really Retiring” (1993) • Murder Story (1989) • Paddington (2014) • Rancid Aluminium (2000) • Strapless (1989) • Watt on Earth - Season 1, Episode 1 (1991)

Acorn Atom

• Micro Men (2009)

Acorn BBC Master

• Choose or Die (2022) • Code of a Killer - Season 1 (2015) • Micro Men (2009) • Only Fools and Horses - “The Frog’s Legacy” (1987) • Smart Money (1986)

Acorn BBC Micro

• Ashes to Ashes - Season 3, Episode 1 (2010) • Black Mirror: Bandersnatch (2018) • Clockwise (1986) • Code of a Killer - Season 1 (2015) • Damon and Debbie - Episode 1 (1987) • Dempsey and Makepeace - Season 2, Episode 1, “Silver Dollar” (1985) • Electric Dreams (1984) • The Fourth Protocol (1987) • Full House - Season 1, Episode 5, “Little Secrets” (1985) • Gabrielle and the Doodleman (1984) • Ghostbusters: Frozen Empire (2024) • Grange Hill - Season 11, Episode 5 (1988) • The IT Crowd - Season 1 (2006) • Loki - Season 2, Episode 5, “Science/Fiction” (2023) • Look Around You - Season 1 (2002) • Maths Counts - Season 1, Episode 3, “Orders is Orders” (1983) • Matt’s Millions - Season 1 (1996) • Micro Men (2009) • Out of This World - Season 1, Episode 5 (1995) • Secret Invasion - Season 1, Episode 6, “Home” (2023) • Supergirl (1984)

Acorn Communicator

• Bugs - Season 2, Episode 7, “Schrodinger’s Bomb” (1996)

Acorn Electron

• Bird of Prey 2 (1984) • Cruella (2021) • Girls on Top - Season 2, Episode 3, “Who’s Ya Uncle Shelley?” (1986) • Micro Men (2009)

Acorn Risc PC

• Black Mirror - Season 7, Episode 4, “Plaything” (2025)

Acorn System 1

• Blake’s 7 - Season 4 (1981)

Adage

Adage AGT/30

• Dark Star (1974)

Alienware

Alienware 13 R2

• A Murder at the End of the World - Episode 1, “Chapter 1: Homme Fatal” (2023)

Alienware 15

• Undercover Grandpa (2017)

Alienware 17 R5

• Devs - Season 1, Episode 2 (2020) • Hanna - Season 2, Episode 2, “The Trial” (2020)

Alienware Area 51 15mx

• Hot Tub Time Machine (2010)

Alienware Area 51-M

• Pursued (2004)

Alienware Area 51m 766

• Stay Alive (2006)

Amstrad

Amstrad ALT-286/386SX

• Inspector Morse - Season 5, Episode 4, “Greeks Bearing Gifts” (1991)

Amstrad CPC 464

• Bigbug (2022) • Doctor Who - “Wild Blue Yonder” (2023) • Dodger, Bonzo & the Rest - Season 2, Episode 5 (1986) • Eastenders - Season 1, Episode 194 (1986) • The IT Crowd - Season 3 (2008) • Micro Men (2009)

Amstrad CPC 6128

• According to Daisy (1988) • Commando Ninja (2018) • Damon and Debbie - Episode 2 (1987) • Dekalog - Season 1, Episode 1 (1988) • Dodger, Bonzo & the Rest - Season 2, Episode 5 (1986) • Eliminators (1986) • It’s Nice Up North (2006) • Krótki film o milosci (1988) • Only Fools and Horses - Season 6, Episode 1, “Yuppy Love” (1989) • Red Dwarf - Season 2, Episode 4, “Stasis Leak” (1988)

Amstrad PC 1512

• Jamon Jamon (1992) • Making Out - Season 1 (1989) • Out of This World - Season 1, Episode 5 (1995) • Press Gang - Season 1, Episode 6, “Interface” (1989)

Amstrad PC 2086

• The Full Monty (1997) • Press Gang - Season 3, Episode 5, “The Last Word: Part 2” (1991)

Amstrad PCW 8256

• Damon and Debbie - Episode 2 (1987) • Girls on Top - Season 2, Episode 3, “Who’s Ya Uncle Shelley?” (1986) • Good Omens (2019) • Grange Hill - Season 12, Episode 1 (1989) • Inspector Morse - Season 5, Episode 4, “Greeks Bearing Gifts” (1991) • Loki - Season 2, Episode 5, “Science/Fiction” (2023) • Micro Men (2009) • Pennyworth - Season 3, Episode 2, “Many Clouds” (2022)

Amstrad PCW 9512

• Colin’s Sandwich - Season 2 (1990) • Hetty Wainthropp Investigates - Season 1, Episode 5, “A High Profile” (1996) • Midsomer Murders - Season 14, Episode 8, “A Rare Bird” (2012) • Press Gang - Season 3, Episode 5, “The Last Word: Part 2” (1991) • The Steal (1995)

Amstrad PPC 512/640

• Atomic Blonde (2017) • Eternal Sunshine of the Spotless Mind (2004) • The Girl from Tomorrow - Season 1, Episode 7, “Stake-out” (1991) • Loki - Season 2, Episode 5, “Science/Fiction” (2023)

Apple

Apple 1 (Mimeo 1 re­pro­duc­tion)

• Jobs (2013)

Apple Aluminum iMac

• The 7th Dimension (2009) • Bedtime Stories (2008) • Boyhood (2014) • Chloe (2009) • The Descendants (2011) • Flickan som lekte med elden (2009) • Funny People (2009) • He’s Just Not That Into You (2009) • Luftslottet som sprängdes (2009) • Magpie Murders - Season 1, Episode 1 (2022) • The Mechanic (2011) • Over Kanten (2012) • The Proposal (2009) • The Rebound (2009) • The Spy Next Door (2010) • Stay Cool (2009) • The Stepfather (2009) • Tamara Drew (2010) • Trespass (2011)

Apple Clamshell iBook G3

• A Little Help (2010) • Big Fat Liar (2002) • Clockstoppers (2002) • Coyote Ugly (2000) • Crocodile Dundee in Los Angeles (2001) • Cubbyhouse (2001) • Domestic Disturbance (2001) • Femme Fatale (2002) • Friends - Season 9, Episode 2, “The One Where Emma Cries” (2002) • The Glass House (2001) • Good Advice (2001) • Jisatsu sâkuru (2001) • Just Married (2003) • Kill Daddy Goodnight (2009) • Legally Blonde (2001) • The Master of Disguise (2002) • Novocaine (2001) • The Princess Diaries (2001) • Sex and the City - Season 4, Episode 8, “My Motherboard, My Self” (2001) • Slap Her… She’s French (2002) • The Sleepover Club - Season 1 (2003) • Tadpole (2002) • The Tailor of Panama (2001) • Teknolust (2002) • Under the Tuscan Sun (2003) • Zac and Miri Make a Porno (2008)

Apple eMac

• Accepted (2006) • The Flash - Season 6, Episode 1, “Into the Void” (2019) • Freaky Friday (2003) • Halo - Season 2, Episode 4, “Reach” (2024) • Love and Other Impossible Pursuits (2009) • Mean Girls (2004) • Parallax - Season 1, Episode 3, “The Artful Dodger” (2004)

Apple eMate 300

• Batman and Robin (1997)

Apple iBook G3

• Catch That Kid (2004) • Confessions of a Teenage Drama Queen (2004) • It Runs in the Family (2003) • The Lizzie McGuire Movie (2003) • Old School (2003) • Picture This (2008) • Raising Helen (2004) • The Rules of Attraction (2002) • The Sopranos - Season 4, Episode 10, “The Strong, Silent Type” (2002) • Spy Kids 2: Island of Lost Dreams (2002)

Apple iBook G4

• Cake (2005) • Interview (2007) • John Tucker Must Die (2006) • Meet the Fockers (2004) • Miss Congeniality 2: Armed and Fabulous (2005) • Motherhood (2009) • One Day (2011) • Les poupées russes (2005)

Apple II

• 3 – 2-1 Contact (1980) • 3 – 2-1 Contact - Season 3, Episode 2 (1984) • Aces Go Places 5: The Terracotta Hit (1989) • Air (2023) • Armageddon Time (2002) • Bird of Prey (1982) • Bones and All (2022) • Creepshow (1982) • The Dead Zone (1983) • Der Stand der Dinge (1982) • Evilspeak (1981) • The Facts of Life - Season 5, Episode 10, “Store Games” (1983) • First Blood (1982) • Go For It (1983) • The Goldbergs - Season 2, Episode 4, “Shall We Play a Game?” (2014) • The Goldbergs - Season 4, Episode 4, “Crazy Calls” (2016) • Goremet, Zombie Chef from Hell (1986) • Hotel - Season 2, Episode 18, “Identities” (1985) • Iron Man (2008) • iSteve (2013) • Jobs (2013) • Klatwa doliny wezy (1987) • Knight Rider - Season 2, “Diamonds Aren’t a Girl’s Best Friend” (1984) • Knight Rider - Season 2, Episode 19, “Mouth of the Snake” (1984) • Las Vegas Weekend (1986) • Lost - Season 2 (2005) • Magnum, P.I. - Season 6, Episode 12, “Summer School” (1986) • The Man from U.N.C.L.E. (2015) • Miami Vice - Season 3, Episode 11, “Forgive Us Our Debts” (1986) • Micro Men (2009) • Mind Benders (1987) • Never Forget (1991) • Pirates of Silicon Valley (1999) • Quincy M.E. - Season 8, Episode 24, “The Cutting Edge” (1983) • Rock Jocks (2012) • The Royal Tenenbaums (2001) • The Russia House (1990) • Silver Spoons - Season 2, Episode 3, “A Fair to Remember” (1983) • Silver Spoons - Season 2, Episode 10, “Rick the Greek” (1984) • Simon and Simon - Season 1, Episode 3, “Trapdoors” (1981) • Smarkus and Company (1982) • Smiley’s People - Episode 1, “A Mother’s Assistance” (1982) • Spies Like Us (1985) • Take This Job and Shove It (1981) • Terminal Entry (1986) • Terminator Genisys (2015) • The Thing (1982) • TJ Hooker - Season 1, Episode 3, “God Bless the Child” (1982) • Today’s Special - Season 4, Episode 1, “Changes” (1984) • Vacation (1983) • Where the Buffalo Roam (1980) • White Noise (2022)

Apple IIc

• 2010: The Year We Made Contact (1984) • The Best of Times (1986) • Beyond - Season 1, Episode 4, “The Man in the Yellow Jacket” (2017) • Boyz n the Hood (1991) • Code of Silence (1985) • Explorers (1985) • Family Sins (1987) • Freeze Frame (1990) • Hot Tub Time Machine (2010) • iSteve (2013) • Lots of Luck (1985) • Miami Vice - Season 1, Episode 19, “The Home Invaders” (1985) • No (2012) • Real Genius (1985) • Scared Stiff (1987) • Tales from the Crypt - Season 2, Episode 7, “The Sacrifice” (1990) • A View to a Kill (1985) • Where Evil Lives (1991)

Apple IIe

• Aces Go Places 3 (1984) • Agents of S.H.I.E.L.D. - Season 4, Episode 9, “Broken Promises” (2017) • All the Money in the World (2017) • Batman Returns (1992) • Big Trouble (1986) • Bigbug (2022) • Black Fire (1985) • The Challenger Disaster (2019) • Chocky’s Children (1985) • Class of 1999 II: The Substitute (1994) • D.A.R.Y.L. (1985) • The Fall Guy - Season 4, Episode 20, “Spring Break” (1985) • Fraggle Rock - Season 1, Episode 14, “The Challenge” (1983) • Ghostbusters: Frozen Empire (2024) • Jobs (2013) • King of New York (1990) • Las Vegas Weekend (1986) • Love (2011) • Martyrs (2008) • Mr. Robot - Season 4, Episode 11, “eXit” (2019) • Not Quite Human (1987) • Patrik Pacard - Season 1 (1984) • Poltergeist III (1988) • The Protector (1985) • Small Wonder - Season 4, Episode 6, “Love at First Byte” (1988) • Young Sheldon - Season 3, Episode 7, “Pongo Pygmaeus and a Culture that Encourages Spitting” (2019) • Young Sheldon - Season 3, Episode 19, “A House for Sale and Serious Woman Stuff” (2020)

Apple IIGS

• Camp Nowhere (1994) • Desperate Hours (1990) • Hackers (1995) • Kindergarten Cop (1990) • The Laughing Dead (1989) • Trancers II (1991)

Apple III

• The Greatest American Hero - Season 2, Episode 2, “Operation Spoilsport” (1981) • Jobs (2013) • The Littlest Hobo - Season 5, Episode 13, “The Genesis Tapes” (1984) • Matt Houston - Season 1 (1982) • Night Shift (1982) • Pirates of Silicon Valley (1999) • Quincy M.E. - Season 8, Episode 24, “The Cutting Edge” (1983) • Remington Steele - Season 1 (1982) • Tron (1982) • Tron: Ares (2025)

Apple iMac G3

• 101 Reykjavík (2000) • 3rd Rock from the Sun - Season 6, Episode 12, “Dick’s Ark” (2001) • A Little Help (2010) • About A Boy (2002) • Absolutely Fabulous - Season 4 (2001) • Are We There Yet? (2005) • The Beach (2000) • Between Two Ferns: The Movie (2019) • The Big Short (2015) • Bigbug (2022) • Bounce (2000) • Boyhood (2014) • Boys and Girls (2000) • Bridget Jones’s Diary (2001) • The Cell (2000) • Clockstoppers (2002) • Crocodile Dundee in Los Angeles (2001) • Curb Your Enthusiasm - Season 1, Episode 4, “The Bracelet” (2000) • Der schöne Tag (2001) • Derailed (2006) • The Family Stone (2005) • Fast Food Nation (2006) • Freaky Friday (2003) • Friends - Season 7, Episode 13, “The One Where Rosita Dies” (2001) • Funny People (2009) • Get Carter (2000) • Ghost World (2001) • Glass (2019) • Godzilla 2000 (1999) • Groove (2000) • I Still Believe (2020) • Irresistible (2006) • It Runs in the Family (2003) • Jay and Silent Bob Strike Back (2001) • The Killer (2023) • Law & Order: Special Victims Unit - Season 6, Episode 1, “Birthright” (2004) • The Master of Disguise (2002) • Mean Girls (2004) • Men in Black II (2002) • The Midnight Club - Season 1, Episode 9, “The Eternal Enemy” (2022) • Mr. Robot - Season 4, Episode 12, “whoami” (2019) • My Family - Season 2, Episode 8, “Age of Romance” (2001) • Nerve (2017) • One More Time (2023) • Orange County (2002) • Les poupées russes (2005) • The Proposal (2009) • Quintuplets - Season 1 (2004) • Road Trip (2000) • Rosemary & Thyme - Season 2, Episode 1, “The Memory of Water” (2004) • Runaway Jury (2003) • Scream 3 (2000) • Slap Her… She’s French (2002) • The Sleepover Club - Season 1 (2003) • Steve Jobs (2015) • Training Day (2001) • Wasabi (2001) • The Wedding Planner (2001) • What Women Want (2000) • Women Talking Dirty (1999) • Zoolander (2001)

Apple iMac G4

• The Adventures of RoboRex (2014) • Cake (2005) • Catch That Kid (2004) • Clerks II (2006) • Cyborg She (2008) • Don’t Think Twice (2016) • Freaky Friday (2003) • Friends - Season 9, Episode 2, “The One Where Emma Cries” (2002) • Garfield (2004) • Good Boy! (2003) • How to Lose a Guy in 10 Days. (2003) • Hulk (2003) • Hustle - Season 1, Episode 5, “A Touch of Class” (2004) • King’s Ransom (2005) • Little Fockers (2010) • Love Actually (2003) • Meet the Fockers (2004) • Michael Clayton (2007) • Miss Congeniality 2: Armed and Fabulous (2005) • Never Back Down (2009) • Nim’s Island (2008) • One Day (2011) • The Pacifier (2005) • Raising Helen (2004) • School of Rock (2003) • Sex and the City - Season 6, Episode 15, “Catch-38” (2004) • Without a Paddle (2004)

Apple iMac G5

• Basic Instinct 2 (2006) • The Dead Zone - Season 2, Episode 4, “The Outsider” (2003) • The Dead Zone - Season 2, Episode 5, “Precipitate” (2003) • The Devil Wears Prada (2006) • Harold & Kumar Escape from Guantanamo Bay (2008) • Holiday in Handcuffs (2006) • Knives Out (2019) • The Last Kiss (2006) • The Last Mimzy (2007) • Man About Town (2006) • Modern Family - Season 2, Episode 14, “Bixby’s Back” (2011) • Night at the Museum (2006) • Revolution - Season 1, Episode 17, “The Longest Day” (2013) • Tomb Raider (2018) • Trust the Man (2005)

Apple Lisa

• Computer Ghosts (1988) • Jobs (2013) • The Littlest Hobo - Season 5, Episode 13, “The Genesis Tapes” (1984) • Meatballs III: Summer Job (1986) • Pirates of Silicon Valley (1999) • Steve Jobs (2015)

Completing A Computer Science Degree On Coursera

notesbylex.com

In September 2022, I im­pul­sively signed up for a Bachelor’s Degree in Computer Science af­ter see­ing an ad for it on Coursera. Getting a de­gree had been on my mind for quite some time, af­ter a long ca­reer with­out one, but I was­n’t sure how to go about it. And now, about 3 years and 9 months later (with the last 3 of those months spent wait­ing for my re­sults), I’ve fi­nally com­pleted my de­gree - en­tirely af­ter hours whilst work­ing full-time.

This ar­ti­cle is a brief write-up of my ex­pe­ri­ence.

My Background

My de­gree-less tech ca­reer spans nearly 21 years, with about 14 of those as a soft­ware de­vel­oper and MLE. I left high school early as a teenager; I was ready to en­ter the work­force and be­come in­de­pen­dent as early as pos­si­ble. I got into tech through cer­ti­fi­ca­tions like MCP, MCSA, and A+ (they were all the rage back then), which was enough to land a helpdesk job at 18. From there, I fol­lowed my in­ter­ests, which even­tu­ally led to soft­ware en­gi­neer­ing and, later, a fo­cus on ma­chine learn­ing.

So far, my lack of a de­gree has­n’t been a bar­rier to my ca­reer. I’ve heard from col­leagues that Australia tends to value ex­pe­ri­ence and at­ti­tude over for­mal ed­u­ca­tion, whereas the op­po­site can be true over­seas, so maybe I got lucky in that re­spect. I’d go as far as to say that be­ing self-taught” is typ­i­cally seen as a pos­i­tive by em­ploy­ers, pro­vided you ap­pear to have ac­tu­ally taught your­self the skills needed to do the job. That said, I’m not re­ally self-taught” - I think self-educated” is a bet­ter term. I’ve col­lected the skills I’ve needed for the jobs I wanted via MOOCs (shouts to David J. Malan’s CS50, Andrew Ng’s ML courses and Jeremy Howard’s fas­tai), cer­tifi­cates, books, and Kaggle. I’ve al­ways had some­thing to put in the Education sec­tion of my re­sume. I’ve writ­ten be­fore about my opin­ion that Software Development is a Trade, and that ed­u­ca­tion makes sense in­ter­spersed with work ex­pe­ri­ence. Of course, I ac­knowl­edge that my jour­ney makes me quite bi­ased here.

However, a lack of a de­gree has im­pacted my abil­ity to work over­seas. In my younger years, I made it to the fi­nal rounds of an in­ter­view with a US com­pany I was in­ter­ested in, only to learn that the E-3 visa, an Australia-US-specific agree­ment, re­quires at least a Bachelor’s Degree. Though I have no in­ten­tion of work­ing over­seas at the mo­ment, it’s nice to have the op­tion.

I also gen­uinely love learn­ing, and I was in­ter­ested in iden­ti­fy­ing my knowl­edge gaps. And it’s also an ex­cuse to test out the Zettelkasten Method on a real study prob­lem.

Finally, I’m not get­ting any younger. I some­times won­der if I should have got my de­gree in my 20s. Now, as I ap­proach my 40s, I don’t want to be say­ing the same thing about my 30s.

About The Degree

The de­gree is done 100% re­motely.

It’s hosted on Coursera - that’s where you watch the lec­tures, and where they host the class re­sources, such as lab note­books and quizzes. Coursera also pro­vides fo­rums to chat with teach­ing staff (which are rarely used), and this is how you up­load your as­sign­ments.

The pro­gram is run by the University of London Worldwide, its dis­tance-learn­ing arm. And Goldsmiths, University of London, marks the as­sign­ments and ex­ams.

The ex­ams them­selves are done re­motely us­ing Inspera proc­tor­ing soft­ware. I’ve heard from other stu­dents that be­fore COVID, peo­ple ac­tu­ally went to lo­cal teach­ing cen­tres for their ex­ams. There was also a short win­dow in 2022, where the ex­ams were un­proc­tored - you just had 4 hours to com­plete them once started, open web/​book. But I guess the suc­cess of LLMs forced their hand to add proc­tor­ing.

I’m sure there are sim­i­lar de­grees out there. I did­n’t shop around for al­ter­na­tives, I’ll be hon­est. But I was al­ready fa­mil­iar with the Coursera plat­form, and the of­fer­ing suited my lifestyle nicely.

Prerequisites and Performance-Based Admission

The course pre­req­ui­sites stip­u­late a high school diploma. However, they of­fer an al­ter­nate route called Performance-Based Admission (PBA). Basically, you sit two mod­ules (Introduction to Programming I, plus one of the math mod­ules), and if you pass them both, you’re al­lowed to en­ter the full de­gree. The mod­ules are counted to­wards your fi­nal grades, so it’s not wasted time, but you get a good sense of whether the pro­gram is for you.

Cost

Another thing that worked for me was pay­ing for the mod­ules as you go. For me in Australia, a mod­ule cur­rently costs £823 (about A$1,600), and the fi­nal pro­ject counts as a dou­ble mod­ule, with some small ex­tras.

The University pub­lishes the to­tal pro­gramme cost as rang­ing from £14,666 to £21,829, de­pend­ing on your coun­try of res­i­dence and pace of study. My to­tal comes to roughly £17,000, or around A$33,000, spread over 3.5 years. I was able to re­place 3 mod­ules with Coursera courses that re­quire only a sub­scrip­tion, fur­ther sav­ing money (see the Recognition of Prior Learning sec­tion be­low).

Since this is ed­u­ca­tion that’s di­rectly ap­plic­a­ble to my ca­reer, it’s also tax-de­ductible in my coun­try. The ATO al­lows you to claim self-ed­u­ca­tion ex­penses when the study maintains or im­proves the spe­cific skills or knowl­edge you re­quire for your cur­rent work ac­tiv­i­ties”. A Computer Science de­gree while work­ing as a soft­ware en­gi­neer clears that bar, at least ac­cord­ing to my ac­coun­tant.

Workload

Just be­cause it’s on­line does­n’t mean it’s easy. Even if you’re a soft­ware vet­eran, like my­self and many of the other stu­dents, fa­mil­iar­ity with the cor­pus helps, but you still have to do the work.

Each mod­ule has manda­tory midterm as­sign­ments, fol­lowed by ei­ther a fi­nal exam or a fi­nal as­sign­ment. The as­sign­ments are of­ten long and chal­leng­ing, and the ex­ams are pretty tough too.

They al­low you to take up to 4 mod­ules per ses­sion (or 2 plus the fi­nal pro­ject), plus a re­take, and you have to com­plete them in 6 years, which re­quires about 2 mod­ules per ses­sion. After com­plet­ing the PBA, I took an av­er­age of about 3 mod­ules per ses­sion, get­ting the RPL cer­tifi­cates (see be­low) in be­tween ses­sions. In the fi­nal ses­sions, I took on 4 mod­ules, which was a lot.

However, many stu­dents opt to com­plete 4 mod­ules straight through, and I think the fastest pos­si­ble time to com­plete the course is 3 years flat.

Generally, I found that dur­ing the weeks lead­ing up to midterms and ex­ams, the de­gree would con­sume most of my free time. The work­load ramped up sig­nif­i­cantly from the ear­lier to the later mod­ules, with the last 2 ses­sions eas­ily the hard­est. There were some re­ally in­tense pe­ri­ods of my life where I would wake up at 4am, com­plete a four-hour exam, work through the day, then work on an as­sign­ment at night.

Recognition of Prior Learning

The uni­ver­sity does of­fer Recognition of Prior Learning sub­sti­tutes if you’ve stud­ied equiv­a­lent mod­ules else­where. They also have a few Coursera cer­tifi­cates that can re­place en­tire mod­ules, which only re­quire a Coursera sub­scrip­tion. I re­placed three mod­ules this way:

How Computers Work, with the Google IT Support Professional Certificate

Data Science, with the IBM Data Science Professional Certificate

Machine Learning and Neural Networks, with the IBM AI Engineering Professional Certificate

I in­ter­spersed these with my reg­u­lar mod­ules. I fin­ished the Google cer­tifi­cate (about 3 months at 10 hours a week) in April 2023, just as my first ses­sion wrapped up. The two IBM cer­tifi­cates I com­pleted back-to-back in July 2024, in the lull af­ter midterms, while also tak­ing three reg­u­lar mod­ules. Together, they shaved a whole ses­sion off my de­gree. Note that the list of recog­nised qual­i­fi­ca­tions has changed since I did it, so check the cur­rent page.

Course Breakdown

The top­ics are pretty typ­i­cal of a Bachelor’s Degree in Computer Science, no sur­prises. Some math, al­though less than an en­gi­neer­ing de­gree, and most things are quite hands-on.

There were quite a few in­ter­est­ing pro­jects as course­work. Some high­lights in­clude some au­dio vi­su­alis­ers; a cou­ple of JavaScript games (including a pool sim­u­la­tion which you were en­cour­aged to put a twist on); a DJ sim­u­la­tor built with JUCE; an evo­lu­tion­ary al­go­rithms pro­ject in­spired by Karl Sims’ 1994 Evolving Virtual Creatures; an in­ter­est­ing col­lec­tion of sig­nal pro­cess­ing ex­er­cises; a few dif­fer­ent re­search pro­jects based around scrap­ing and analysing web data; and, fi­nally, the open-ended fi­nal pro­ject, where I built a breast-can­cer de­tec­tion mam­mog­ra­phy clas­si­fier that trains and runs end-to-end on Apple Silicon (see cm3070-fi­nal-pro­ject).

Here’s my vinyl DJ sim­u­la­tor in ac­tion:

And the pool table game with ro­dents that could be killed for bonus points (not some­thing I en­dorse in the real world):

Here’s the full path I took:

If you want to dig deeper into the mod­ules, the stu­dent com­mu­nity main­tains a cou­ple of great re­sources: world-class/​notes, a stu­dent-run repo where peo­ple post their course notes, and world-class/​REPL, a col­lec­tion of course ma­te­r­ial and re­sources. There’s also a spread­sheet some­one made that breaks down each mod­ule’s dif­fi­culty and other met­rics, as ranked by for­mer stu­dents.

The Best Parts

One of my favourite parts of the course was work­ing with the other stu­dents. Coursera in­vites you into a stu­dent Slack work­space, which is ba­si­cally a Lord of the Flies-style free-for-all, with no ap­par­ent of­fi­cial rep­re­sen­ta­tion of any kind.

Some stu­dents took it upon them­selves to run the Slack with an iron fist, rep­ri­mand­ing peo­ple for post­ing in the wrong chan­nel. Some alumni hang out on Slack, help­ing stu­dents and an­swer­ing ques­tions. Other for­mer stu­dents haunt the Slack chan­nels, post­ing in­ter­mit­tent trolls. It’s all pretty chaotic and hi­lar­i­ous.

On top of that, there’s a cul­ture of high-achiev­ing stu­dents shar­ing videos and screen­shots of their as­sign­ments, some of which were re­ally im­pres­sive, which would mo­ti­vate me to do my best work.

There are re­ally fas­ci­nat­ing peo­ple from all over the world, with in­ter­est­ing, round­about ca­reer sto­ries like mine. One fel­low stu­dent com­pleted her de­gree dur­ing the war in Ukraine. Another stu­dent taught her­self web de­vel­op­ment and ran her own stu­dio to self-fund her ed­u­ca­tion. Another stu­dent gave birth twice dur­ing the de­gree, man­aged to com­plete the BSc while work­ing a full-time job as a teacher, and some­how also com­pleted a mas­ter’s. And there’s my friend Django, who’s been com­plet­ing his de­gree from a refugee camp in Uganda, pow­er­ing his lap­top off a so­lar panel and study­ing on mo­bile data. His story turned into a saga of its own: Shipping a Laptop to a Refugee Camp in Uganda.

Whenever I felt like I was do­ing it tough, there were many peo­ple in much, much tougher cir­cum­stances to bring me down to earth.

The Worst Parts

My #1 com­plaint is how long it takes to get grades: about 3 months. So you’re usu­ally get­ting your midterm grades right around the time you’re about to sub­mit the fi­nals. Way too long to in­cor­po­rate the feed­back use­fully.

If you fail a mod­ule, you can re­sit just the part you failed. But be­cause fi­nal grades are re­leased well af­ter the next ses­sion has started, you might end up wait­ing an en­tire year be­fore you can re­sit. This has proved to be the biggest frus­tra­tion for course par­tic­i­pants.

Group pro­jects were also a com­mon source of com­plaints. You were ran­domly as­signed a group, but it was of­ten un­clear if the par­tic­i­pants were even do­ing the course - many peo­ple were in com­pletely ghost groups. I had a de­cent group for the one group pro­ject sub­ject I took. However, we did have the un­pleas­ant ex­pe­ri­ence of one of the mem­bers show­ing up in the last week, and we ba­si­cally had no choice but to cut him in with­out him do­ing any work. Although they’ve since changed the syl­labus, only one sub­ject has a manda­tory group pro­ject now, and it’s just the midterms - not too bad.

The Coursera plat­form could also use many qual­ity-of-life im­prove­ments. It’s of­ten out of sync with the ac­tual pro­gram and un­aware that ex­ams are com­pleted out­side Coursera. Submitting every­thing re­quires up­load­ing mul­ti­ple files, in­clud­ing videos, and there’s no way to edit your sub­mis­sion with­out re­u­pload­ing every­thing. So if you spend 30 min­utes up­load­ing a video and then find a typo in the re­port, you have to start again.

Inspera is also quite dif­fi­cult soft­ware, with many false pos­i­tives caus­ing it to sud­denly shut down mid­way through the exam. With only 4 hours to com­plete the exam and the threat of a one-year wait to try again, it’s a very anx­i­ety-in­duc­ing ex­pe­ri­ence.

They do have ex­tra sup­port peo­ple on dur­ing the exam, to help. But out­side of that, get­ting in touch with real peo­ple can be slow. I had a re­sult that did­n’t come through when every­one else’s did, and it took a few weeks to get re­solved. Not a ter­ri­ble turn­around, just one ex­tra thing to be anx­ious about.

Tips

A few things that worked for me:

Start early on your as­sign­ments, and sub­mit of­ten. I like to get a ver­sion of my as­sign­ment done end-to-end that could con­ceiv­ably be a pass, then just keep it­er­at­ing from there. As soon as I knew what the as­sign­ment was, I’d start mak­ing progress and sub­mit drafts as I went, which took a lot of the stress off the dead­line.

Check and triple-check your sub­mis­sions. A very com­mon mis­take peo­ple make is not to check that they sub­mit­ted every­thing cor­rectly. I would cre­ate a check­list for my pro­ject sub­mis­sions, take a screen­shot of the sub­mis­sion screen, and even log the S3 URLs for all up­loaded as­sets, just in case.

Find a study time that works for you and be con­sis­tent. For me, it’s the early morn­ing. I usu­ally had to work late, so I rarely found time to study af­ter work; in­stead, I’d go to bed early and get a few hours in be­fore the work­day started.

Do the blocker sub­jects first. Some sub­jects must be passed be­fore you can progress to the next level (at Level 5, the key ones are Object-Oriented Programming and Software Design and Development). You re­ally want to de-risk your stud­ies by get­ting these done early. If you’re forced to re­sit, it can re­ally block your progress and add wasted ses­sions to your de­gree.

Read the reg­u­la­tions closely. Especially the Admission Notice, which only comes via email: it in­cludes up­dated rules, exam dates and other im­por­tant in­for­ma­tion for each exam.

Read the pins in Slack. People have taken great care to share use­ful in­for­ma­tion, in­clud­ing a lot of guid­ance on what to do when some­thing goes wrong.

AI Policy and The Evolution of LLMs

I started my de­gree one month be­fore ChatGPT was launched, so it’s been quite in­ter­est­ing to watch the de­gree evolve as LLM ca­pa­bil­i­ties have changed. At the start of my de­gree, I wrote a lit­tle ar­ti­cle about Disputing a Parking Fine with ChatGPT, a few weeks into ChatGPT’s launch, which I thought was kind of cool at the time, but now it seems so pa­thet­i­cally triv­ial that it makes me laugh.

Firstly, they in­tro­duced exam proc­tor­ing and have pro­gres­sively locked it down, re­cently re­mov­ing cheat­sheets, pre­sum­ably to pre­vent peo­ple from gen­er­at­ing them with an LLM or smug­gling in a sec­ond screen. They used to al­low peo­ple to com­plete the exam at their con­ve­nience within a 24-hour win­dow, but re­cently changed that so that peo­ple in each hemi­sphere take the exam at the same time.

LLMs also had a no­tice­able ef­fect on the amount of con­ver­sa­tion in the course chan­nels. When I started, there was a lot of chat­ter, with peo­ple ask­ing ques­tions about the ma­te­r­ial and check­ing their un­der­stand­ing of top­ics, but that has no­tice­ably de­clined. It seems peo­ple pre­fer to ask their ques­tions to an LLM.

In Feb 2025, about 2.5 years into my de­gree, the uni launched an of­fi­cial AI pol­icy. Basically, sub­mit­ting LLM-generated work with­out ac­knowl­edge­ment is treated as con­tract cheat­ing, the same cat­e­gory as pay­ing some­one to write your es­say:

Submitting work which has been pro­duced by soft­ware, or as the re­sult of pro­vid­ing prompts or queries to any third-party ser­vice, ei­ther in full or in part and with­out ac­knowl­edge­ment, is a form of con­tract cheat­ing. This in­cludes the use of Large Language Model/AI chat­bots.” - General Regulation 7.9

Submitting work which has been pro­duced by soft­ware, or as the re­sult of pro­vid­ing prompts or queries to any third-party ser­vice, ei­ther in full or in part and with­out ac­knowl­edge­ment, is a form of con­tract cheat­ing. This in­cludes the use of Large Language Model/AI chat­bots.” - General Regulation 7.9

They also in­tro­duced a three-level frame­work for AI in as­sess­ment: Level Zero means no AI at all; Level One al­lows sup­port­ive use like brain­storm­ing and struc­tur­ing, as long as you de­clare it; and Level Two ac­tu­ally re­quires you to use AI, for ex­am­ple, gen­er­at­ing an out­put with it and then cri­tiquing the re­sult.

I can only imag­ine the dif­fi­culty of be­ing an ed­u­ca­tor in the age of AI - try­ing to strike a bal­ance be­tween pre­vent­ing stu­dents from out­sourc­ing their whole ed­u­ca­tion to an LLM, and the re­al­ity that AI is al­most cer­tainly go­ing to be part of their pro­fes­sional life.

Summary

While it’s been a hard 3 and a half years, par­tic­u­larly on my wife and friends, who were def­i­nitely ne­glected, it’s re­ally nice to fi­nally have a de­gree. Some of the top­ics, es­pe­cially the math sub­jects, I would never have stud­ied on my own. I’m glad I did. My other fel­low stu­dents were some of the most in­ter­est­ing peo­ple I’ve ever met, and I hope I’ve made some friends for life. Aside from a few mi­nor griev­ances (things that will hope­fully im­prove over time), I loved the ex­pe­ri­ence.

December — Mr. Baby Paint & accidentally discovering a new cellular automata & pixel-fattening

tekstien-marginaalien-keskus.aalto.fi

Heikki Lotvonen | writ­ten on 4.2.2026

I spent a bet­ter part of December on build­ing Mr. Baby Paint, a rad­i­cally sim­ple co-op draw­ing app for tod­dlers & ac­ci­den­tally dis­cov­er­ing a flood-fill cel­lu­lar au­tomata, plus de­vel­op­ing pixel-fat­ten­ing al­go­rithms for bitmap fonts.

Designing soft­ware for tod­dlers: Mr. Baby Paint

I also man­aged to make and re­lease a new ed­i­tor dur­ing December! It’s called Mr. Baby Paint [link: https://​glyph­draw­ing­club.itch.io/​mr-baby-paint].

My 3-year old kid wants to par­tic­i­pate in every­thing I do, in­clud­ing com­puter stuff. He en­joys press­ing the springy keys, wig­gling the mouse, mak­ing it do clicky sounds, and spin­ning the wheel. But with that kind of skillset, there’s not yet a lot he can do with the com­puter. All I could think of is two things: ex­per­i­men­tal key­board-smash­ing po­etry in a text ed­i­tor, or action paint” in a draw­ing app.

We tried both Wordpad and MS Paint. As sim­ple as it gets, I thought. While he did man­age to draw some beau­ti­ful but ran­dom scrib­bles and pro­duce in­ter­est­ing yet un­in­tel­li­gi­ble let­ter po­ems, over­all the ex­pe­ri­ence was more frus­trat­ing than fun. Because his mouse move­ments and clicks were hap­haz­ard and er­ratic, and key presses ran­dom, I had to con­stantly in­ter­vene to bring back the typ­ing or draw­ing mode af­ter he mis”clicked some ran­dom menu, tool­bar or taskbar item. And chang­ing col­ors, fonts or other op­tions also meant I had to take the mouse away from him for a bit. He found these in­ter­rup­tions an­noy­ing, be­cause he just wanted to keep play­ing. (But for some rea­son, when the com­puter is off, he’s not in­ter­ested in play­ing with them.)

So, Wordpad or MS Paint would­n’t do, and I could­n’t find any­thing else that would be sim­ple enough for our needs and his skillset. So, I had to make my own. And I wanted to tackle this task with the same se­ri­ous­ness that I would any other soft­ware pro­ject, and re­ally think how to de­sign a good soft­ware ex­pe­ri­ence for tod­dlers (in co-op with their car­ers).

The re­sult is a rad­i­cally sim­ple draw­ing app called Mr. Baby Paint. At first I thought be­cause the app is sim­ple, that it would be a sim­ple to do, but it turned out to be a much more in­ter­est­ing chal­lenge than I ex­pected, and it pro­duced some sur­pris­ing out­comes, like ac­ci­den­tally dis­cov­er­ing a flood fill based cel­lu­lar au­toma­ton.

Requirements

The min­i­mum vi­able prod­uct I en­vi­sioned for this draw­ing app is as fol­lows: a fullscreen blank can­vas with no menus or tool­bars, where click­ing and drag­ging the mouse draws di­rectly on the screen. My kid sits on my lap con­trol­ling the mouse while I han­dle key­board short­cuts with my left hand — CMD+S to save his draw­ings and CMD+E to clear the can­vas. The en­tire screen is the draw­ing area, and noth­ing breaks the ex­pe­ri­ence, not even if he smashes the key­board.

But, I also wanted the app to be slighlty more in­ter­est­ing and fun than that and re­ally en­cour­age draw­ing and cre­ative play. Every ac­tion should be re­ward­ing, whether they were in­ten­tional or not. So every ac­tion ei­ther makes a mark, pro­duces a sound ef­fect, vi­sual ef­fect, or a com­bi­na­tion of these. There’s no way to mess up”.

So, left-click draws, scroll drops sand and right-click paint­buck­ets. The faster you draw, the more paint splat­ter it pro­duces.

One of the prob­lems I had was that when you move the mouse re­ally fast, the com­puter does­n’t ac­tu­ally reg­is­ter the move­ment as a fluid con­tin­u­ous curve, but as dis­crete points in space cap­tured every few mil­lisec­onds. This is fine for nor­mal com­puter use, but un­use­able for a draw­ing app where you want to draw a con­tin­u­ous line. Most draw­ing apps solve this by con­nect­ing each point with a line, which works great for mod­er­ately fast mouse move­ments. But, tod­dler mouse move­ments can be re­ally fast, so the dis­tance be­tween the cap­tured mouse po­si­tions can be tens or hun­dreds of pix­els apart, mak­ing the sup­pos­edly fluid curve look very an­gu­lar. I solved this by us­ing a Catmull-Rom spline to con­nect the points, which cre­ates a smooth con­tin­u­ous curve be­tween points. Then, I just stamp the brush tex­ture along the curve every 1px. This ap­proach was laggy for larger brushes, so I had to limit the stamp­ing dis­tance for them.

The UI

Instead of re­quir­ing pre­cise mouse con­trol, I made use of the er­ratic mouse move­ment: mov­ing the cur­sor any­where on the screen edges changes some set­ting:

Left edge of the screen is di­vided into 16 seg­ments, which con­trols the brush size AND the se­lected font.

Bottom edge of the screen is also di­vided into 16 seg­ments, for se­lect­ing one of 16 col­ors.

Top edge is di­vided into 64, for se­lect­ing one of the fol­low­ing char­ac­ters: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 ! ?”. One of the fonts is a set of icons and shapes in­stead.

Right edge is di­vided into just two: cir­cle and square brush.

Co-op paint

In re­al­ity, it’s not re­ally meant for tod­dlers to use all by them­selves, but the idea is to (of course) do this ac­tiv­ity to­gether with a tod­dler — so it’s more like a co-op paint for par­ents (or other car­ers) and tod­dlers. All of the more com­plex func­tion­al­i­ties are meant to be ac­ti­vated with a key­board short­cut by the par­ent while the tod­dler can fo­cus on the main thing, draw­ing, with­out any un­nec­ces­sary in­ter­rup­tions. For ex­am­ple, it can be dif­fi­cult for young kids to ac­tu­ally hold down the left mouse but­ton, so a par­ent can hold down the Alt (or Option on Mac) key to trig­ger the draw func­tion while their child just moves the mouse around. Other key­board short­cuts in­clude:

Draw with Left-Click or hold down Option/Alt

Fill with Right-Click or Cmd/Ctrl + X

Pour sand with Mouse Scroll or hold down Enter

Pause fill and sand falling with Spacebar

Save the draw­ing with Cmd/Ctrl + S

Erase the draw­ing with Cmd/Ctrl + E

Undo with Cmd/Ctrl + Z

Redo with Cmd/Ctrl + Shift + Z

Close a stroke (drawn line) with Cmd/Ctrl + C

Select cir­cle brush with Cmd/Ctrl + B

Select square brush with Cmd/Ctrl + R

Change color with Alt + Number and Cmd/Ctrl + Number

Open/close menu with ESC

Fill tool & ac­ci­den­tally dis­cov­er­ing a sort of cel­lu­lar au­tomata

In most draw­ing apps the fill tool is in­stant, but I was in­spired by Mario Paint [1] where you can ac­tu­ally see the fill hap­pen slowly in real time. It’s sat­is­fy­ing to watch it go. In Mario Paint, fill­ing starts at the cur­sor po­si­tion, fill­ing line by line in both up­wards and down­wards di­rec­tion. In Mr. Baby Paint the flood fill also grows left and right.

In Mario Paint you have to wait for the fill to fin­ish be­fore you can start an­other one. However, I found that to be un­in­tu­itive and un­fun in my app. I did­n’t want any ac­tion to block draw­ing, I wanted mul­ti­ple fills and draw­ing to hap­pen si­mul­ta­ne­ously.

But when I im­ple­mented that func­tion, I ac­ci­den­tally dis­cov­ered a flood fill based cel­lu­lar au­tomata. And by discovered”, I mean it lit­er­ally: I was just test spam­ming the flood fill un­til pat­terns started to emerge!

Here’s how: I started a new flood fill near the in­side edge of an­other grow­ing flood fill. Because the growth bud­get” for flood fills is shared among all flood fills, and are capped at grow­ing 1000 pix­els per frame, newer flood fills grow faster than older ones be­cause they are smaller. So, the smaller fill started col­lid­ing with the still-grow­ing edge of the older fill. And then, I placed yet an­other flood fill with the same color as the first one, they all started col­laps­ing into each other, form­ing very or­ganic look­ing pat­terns that rip­ple and shift. It’s semi-sta­ble: they can go for thou­sands of gen­er­a­tions be­fore set­tling into a sta­ble os­cil­lat­ing pat­tern, or some­times one flood wins” and the oth­ers dis­ap­pear. It’s a fun glitch so I left it in.

(Technical side­note: I do every­thing on the CPU in one thread, so cal­cu­la­tions are se­quen­tial, which is re­quired for the flood fill au­tomata to work. I did try a GPU ver­sion with a com­pute shaders, but while it’s faster and pro­duces no lag, it’s some­how more bor­ing. The in­her­ent slow­ness of CPU based cal­cu­la­tions is a de­lib­er­ate de­sign choice, al­though I did my best to keep every­thing run­ning at rea­son­able fram­er­ates.)

My friend Adel also sug­gested I try dif­fer­ent fill pat­terns, so I made a lit­tle demo where the fill color au­to­mat­i­cally changes be­tween black and white, so the glitch is su­per easy to achieve.

Instructions: Click to start a fill, and then im­me­di­ately start an­other fill close to the in­ner edge of the first fill. Patterns should start to emerge. You can also click the Auto” but­ton” and wait un­til pat­terns emerge. You can de­sign and cus­tomize the fill pat­terns, and even change them mid-fill. Download the im­age by right-click­ing on the can­vas, then Save Image As…

Mr. Baby Paint is also the first app I sell. Just wanted to see what that en­tails. I’ve sold about 30 copies so far! It’s avail­able for Mac, Windows and Linux and you can get it on itch.io for 4.99$.

Pixel fat­ten­ing

Mr. Baby Paint has 16 fonts. Most of them are from var­i­ous old school com­put­ers, like the orig­i­nal Apple Macintosh. I sourced them from Rob Hagemans’ Hoard of bit­fonts [2]. But I wanted to also make a few of my own, so I used my sin­gle stroke font ed­i­tor for that. It al­ready had a bitmap ren­derer, which draws the fonts with 1px strokes, which I could use for the tex­tures. But 1px stroke is aw­fully thin and I wanted some­thing thicker, and be­cause I did­n’t want to do it by hand, I made a dozen ex­per­i­men­tal pixel-fat­ten­ing scripts that could do it for me.

Here’s the orig­i­nal I wanted thicker, straight from my sin­gle stroke vec­tor font ed­i­tor:

The first idea was ex­tremely sim­ple: sam­ple each pixel, and place a big­ger square at every black pixel. This was of course not great, be­cause it would fill in im­por­tant de­tails in let­ter­shapes and gen­er­ally look quite clunky:

So I tried to pre­serve the de­tails and gaps, while in­creas­ing the line width…

I tried Jump flood­ing al­go­rithm (JFA) dis­tance field with sec­ond-near­est com­po­nent dis­tance to stop ex­pan­sion at the mid­point be­tween com­po­nents:

Which did­n’t work so well, so then I tried JFA dis­tance field with an­gu­lar gap de­tec­tion (finds black pix­els in op­pos­ing di­rec­tions >90° apart) to es­ti­mate and pre­serve gaps:

Which looked promis­ing, so then I tried the same as #2 but adding a post-pro­cess­ing hole-fill pass that fills white pix­els sur­rounded in all 4 car­di­nal di­rec­tions:

Which was even more promis­ing, so then I tried JFA dis­tance field with white-space skele­ton (medial axis ridge) de­tec­tion (pixels near the skele­ton are masked to pre­serve gaps):

Which was al­ready pretty good… but I just had to keep go­ing, so then I tried adap­tive per-pixel ra­dius, which uses JFA to com­pute dis­tance to the near­est dif­fer­ent com­po­nent, then shrinks each pix­el’s ex­pan­sion ra­dius to main­tain a min­i­mum gap:

I should have stopped at #4, but had to then try the same an­gu­lar gap method as #2 but with a di­ag­o­nal tol­er­ance off­set and a post-process pass that fills iso­lated white pix­els sur­rounded by 7+ black neigh­bors:

Then I got the itch to try a signed dis­tance field (SDF) via JFA com­bined with 16-direction ray-cast­ing to com­pute per-pixel max­i­mum safe ex­pan­sion be­fore hit­ting an op­pos­ing gap bound­ary:

…and then I tried a SDF via JFA with per-pixel 8-direction ray-cast­ing nar­row-gap de­tec­tion at ren­der time (so it skips pix­els found to be in the mid­dle of a nar­row gap):

…and a JFA dis­tance field with 8-direction ray-cast gap de­tec­tion us­ing a dis­tance-ra­tio thresh­old be­tween the two near­est com­po­nents:

…and Meijster’s ex­act Euclidean dis­tance trans­form with Union-Find CCL and Voronoi bound­ary gap de­tec­tion:

…and an it­er­a­tive 1px di­la­tion with col­li­sion de­tec­tion which locks pix­els where two dif­fer­ent com­po­nents would meet, con­trolled by a gap-width de­lay pa­ra­me­ter:

…and a topol­ogy-pre­serv­ing it­er­a­tive di­la­tion which af­ter each 1px ex­pan­sion backs out any pixel that would merge sep­a­rate white re­gions. Or that’s the the­ory, but it failed com­pletely and just re­sulted in the orig­i­nal crude ver­sion:

…and fi­nally, be­fore snap­ping out of it, a JFA Voronoi bound­aries as wa­ter­shed lines that can never be crossed, plus a white-re­gion merge check as a sec­ond guard:

All pretty in­ter­est­ing, but none that were per­fect. I set­tled with method #4:

…which I man­u­ally edited and cleaned up in Aseprite:

And here’s how it all looks in Mr. Baby Paint. The big­ger font is an­other ver­sion with same skele­ton, just dif­fer­ent size and dif­fer­ent stroke ap­plied.

Overall, I’m pretty happy about it! It’s chunky, fun and fits Mr. Baby Paint quite well. And now I have a full bitmap based font pipeline that pro­duces dif­fer­ent weights and styles quite eas­ily from the same source.

Here’s a few ex­tra tests I made. The de­tails are weird, but over­all they’re sur­pris­ingly leg­i­ble!

Then I have a few of the failed” tests, but even they’re quite leg­i­ble and could be used ef­fec­tively in some sit­u­a­tions:

And, it works for draw­ings too! Or any im­age ba­si­cally.

And here I’ve used it for some Ruusut pro­mo­tional ma­te­r­ial:

Links

Mario Paint game­play: https://​youtu.be/​MX3HERvqHwI?t=312

https://​github.com/​rob­hage­mans/​hoard-of-bit­fonts

To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".

10HN is also available as an iOS App

If you visit 10HN only rarely, check out the the best articles from the past week.

Visit pancik.com for more.