From b99c8ac6fe36bdda9470edfadf7f455afe8a72dc Mon Sep 17 00:00:00 2001 From: Orta Therox Date: Mon, 8 Apr 2024 21:08:10 -0400 Subject: [PATCH 1/9] WIP on the full tech blog --- content/posts/2023/12/22/q4-changelog/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/2023/12/22/q4-changelog/index.md b/content/posts/2023/12/22/q4-changelog/index.md index 00edc00..988b0d5 100644 --- a/content/posts/2023/12/22/q4-changelog/index.md +++ b/content/posts/2023/12/22/q4-changelog/index.md @@ -165,7 +165,7 @@ The "GitHub for Crosswords" mentioned earlier, is called the Submission Review a ![Puzzmo studio for my crossword](xword-editor.png) -_( This is the Crossword my wife, [Brooke Husic](https://www.brookehusic.com) and I made BTW - you can [play it here](https://www.puzzmo.com/play/crossword?puzzleSlug=vgn1l2ttp).)_ +_( This is the Crossword my wife (Danger), [Brooke Husic](https://www.brookehusic.com) and I made BTW - you can [play it here](https://www.puzzmo.com/play/crossword?puzzleSlug=vgn1l2ttp).)_ Submissions go through a ~12 step process, admittedly for a lot of our submissions, they start about a third of the way. We are often adding the hints, pipes to indicate word separators, metadata to describe related clues and some additional information for generating image thumbnails for completed puzzle shares. These are usually done in the Hint Editor section: From 207c854e660c783cb5e41375172898ad8ba20d55 Mon Sep 17 00:00:00 2001 From: orta Date: Mon, 15 Apr 2024 12:54:02 +0100 Subject: [PATCH 2/9] Overview --- content/posts/2023/12/22/q4-changelog/index.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/content/posts/2023/12/22/q4-changelog/index.md b/content/posts/2023/12/22/q4-changelog/index.md index 988b0d5..c140d63 100644 --- a/content/posts/2023/12/22/q4-changelog/index.md +++ b/content/posts/2023/12/22/q4-changelog/index.md @@ -1,6 +1,6 @@ +++ title = 'Puzzmo v1 tech deep-dive' -date = 2024-04-08T12:56:32Z +date = 2024-04-15T12:56:32Z authors = ["orta"] tags = ["tech", "launch"] theme = "outlook-hayesy-beta" @@ -187,9 +187,13 @@ Sometimes you just gotta enjoy your work. ### Team -I started going full-time on Puzzmo in Feb 2022, with Zach starting to go full-time after the release of [Knotwords](http://www.playknotwords.com/presskit/) in April 2022. Since then the team has grown to (almost!) this big: +I started going full-time on Puzzmo in Feb 2022, with Zach starting to go full-time after the release of [Knotwords](http://www.playknotwords.com/presskit/) in April 2022. For launch, everyone involved managed to fit into this photo: ![Almost the entire team (sans Gary)](puzzmo-team.jpg) -_( not fully representative, some people weren't at the Crossword Con 2024. )_ +And today we have more, both in the photo and missing from the photo! + +--- + +So, that's where we were with the "v1" of Puzzmo, we had a tight vision which took a few years to get right, then we joined up with Hearst to figure out how to scale and make it a "real business". From 98be5e9868d754f996eeb010f7a74e9fe0f85ed9 Mon Sep 17 00:00:00 2001 From: orta Date: Mon, 15 Apr 2024 13:03:34 +0100 Subject: [PATCH 3/9] Partner subsites mention --- .../2023/12/22/q4-changelog/app-embed.jpeg | Bin 0 -> 75186 bytes content/posts/2023/12/22/q4-changelog/index.md | 11 ++++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 content/posts/2023/12/22/q4-changelog/app-embed.jpeg diff --git a/content/posts/2023/12/22/q4-changelog/app-embed.jpeg b/content/posts/2023/12/22/q4-changelog/app-embed.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..44c8394c749f74a07c0019a12554604705249ade GIT binary patch literal 75186 zcmeFZ2UOGBwl^BVwn5y|rHN7{G${cA!A9r-frQZ60-*##3%!WCHweLi0RcnR009z; zv_NP!ij+_jdQqBmqzWqVvd=mDo_oi*_kG`a0Ibjc8Rm=!0BU0ZfQw`Q43l^X z0Q~v~06^*WyB~1>Zx3^l`OD(w1^{do0stH~004I%0KjJV*Mt5u??3zEzo_eFW*%W? zJ$;!UcYrql0k{k>1o!}4018Z`47dhR0;nC21MULY&YU@W<}};cvuD}a*x1isyl|d_ zW~qTK}>;ehc6{d-@j39_tA)01M{{R?ZX0EzAlq2lS~w2ll@?)|01B zpE=9&XRPA|zzJ3s78bU1%qp<5oMJfxIKlE~JSW$cGu%8%x6Lj6amoD3Dyp#i0goyw z`v>^M)YL7YfkDq-@k*c{r{upA2i&WD4auV~XP@XZn`3oN< zW2RL@+Fb4)xB1&t(6hH+@`S|uN%Qu&;x;E>nH4z-+5gV7u&6LT&_Q^n>T@jT^YARM7_c-LnJLnvCWtM&MY82v{XkoC-@PrHmtC4JEeltpa@z=-mlFNP z~QFbAe`>Rp=T^QT>c-g_rXre*+JVCZQf zWi+=UAtAZ&OOG>G%f73XHZSk>L3w*NS&!P^71(F8ZRWo5aP=IXb&gD&ae=|NWaTKe z4rTI%1N~TTBYl4mdyS7IiltN}@#?48n+cS~g)ilo-YiQEHr??|lxhsgzVi+w0#g?2 zg{T@dbnY{nlerF!6V~N}W88+}>~uj)S#vX^65P#Z?ry~8v9XR9|XGM!6? zP>CT0PgxaTRobTYpG+*Ut?zIi4=%u4mzfGzGKy^bVgAlpDN5&V@w0iM*K5^3=(D^N z1d?&dg<9VctslmIJk(ZWs@Wek82ph7Itb)2IO?qT<$<<|#o)R-=PH#tr8+ z#~Uxuoiu8bnm(nnv2y$Hgpe9?weCHYSex>KnOe&VZDdy%K z$qkufy3@v%XZSb15vABxsv8h@Eq6ivK8NA~$nE`3u1&32wM2ow6LyBi&#^YP!=O!a z#$$J|mkRJQdzoMXrt-&0%eGOmj?M)tNCD!s@(fS+E(k5lwlC`^CmaMfdENEu z&Deoa=aV^Gg>02f+J^3(aJ&4EfpH@GUGCI&6#nSB+^NA|CqCD}o5RM%GZyVz^u&M* zRDY5`Z=+A?Yg^f5DXYp&cglO5{Lt*C$7d%DV;VmVX18bOg6dV}Wpin$_BSkNX$YKp zzw}#O2@0oR-pU>5f|0-qPPuj`nC!>A9%@=s`RrCV3<;{!d9_G7;FqcZ&1Ic^GLC`{ zb!7#~KXQ@)QrqUBpP<97%@H}_K-(gq{CSestb?TOA3g=2y2K|%)`=NkYh?oPTW-lU zLE`=2X8jXmDQWl}#`(TJ?=X)qO*jr=Iwdo^lVLS)WE*3h zx`-z$_kyEU=CvP)zAT>Hc@1k0q`AaGcwG2%BdgXn=@We644jPwW+}L_x~9x44I$QW zs7|qo!*-i&90N@9&YRm^ElW%W?v&svsG}96p|&Yrn9`XBQ+=%n5KNJmAEOyA;8CiY z6jMcfT4l64H8;a3W>-SCth?E`HMv#T9yQ6Xk_D~GMhi<5(vmdYa})Fp#thR8)4rY7 zBh`QsNdfi2?@Qx58E70QT&|K9X+*q#THz6INneam4hAIEVcDKRka9%J)!=h_rhiYX zF4;7e2)32Y`F7r|w4o%TIMXr5&Ng_$rYzA>UW8k+-nq?~oq!b_lC5?eGR*%b9dBtN zouu+>1{?zXxJ!e#H)fqR1)7AUJ_rtXf|0MhryeCXmPC!Cf0}B4iC&GYu(b=KpnQ^U zCzPuOYJ8mUYDft^LBBfGUEO@o4E2Esl0jlI0KtQ0xDg7Jt%XF67I zx9R=%c>zN8*m8l>8c8kv7~rupMQ`YMYh7Hmf5wKgA$d2rWPjTy?14MRUNHneT}t)5 zZ#ubU*qAk%<2ww55n~5Y!^UQ%z4Ib%R^sT=wSqNHM}
    1|DG&Wbx}jdz_yB>MF# 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 Date: Mon, 15 Apr 2024 13:09:05 +0100 Subject: [PATCH 4/9] More writing --- content/posts/2023/12/22/q4-changelog/index.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/posts/2023/12/22/q4-changelog/index.md b/content/posts/2023/12/22/q4-changelog/index.md index 4ec6c56..39e4ee3 100644 --- a/content/posts/2023/12/22/q4-changelog/index.md +++ b/content/posts/2023/12/22/q4-changelog/index.md @@ -1,6 +1,6 @@ +++ title = 'Puzzmo v1 tech deep-dive' -date = 2024-04-15T12:56:32Z +date = 2024-04-13T12:56:32Z authors = ["orta"] tags = ["tech", "launch"] theme = "outlook-hayesy-beta" diff --git a/package.json b/package.json index fccdd1a..e52ad4b 100644 --- a/package.json +++ b/package.json @@ -2,4 +2,4 @@ "scripts": { "dev": "hugo server -D" } -} \ No newline at end of file +} From 429ee3455050430b60637c033831020b38d8e73d Mon Sep 17 00:00:00 2001 From: orta Date: Wed, 17 Apr 2024 15:14:26 +0100 Subject: [PATCH 5/9] Wrap up the changelog --- .../posts/2023/12/22/q4-changelog/index.md | 155 +++++++++++------- .../2023/12/22/q4-changelog/people-tags.png | Bin 0 -> 154196 bytes .../q4-changelog/puzzmo-invite-letters.jpeg | Bin 0 -> 372520 bytes 3 files changed, 97 insertions(+), 58 deletions(-) create mode 100644 content/posts/2023/12/22/q4-changelog/people-tags.png create mode 100644 content/posts/2023/12/22/q4-changelog/puzzmo-invite-letters.jpeg diff --git a/content/posts/2023/12/22/q4-changelog/index.md b/content/posts/2023/12/22/q4-changelog/index.md index 39e4ee3..28830b1 100644 --- a/content/posts/2023/12/22/q4-changelog/index.md +++ b/content/posts/2023/12/22/q4-changelog/index.md @@ -7,103 +7,128 @@ theme = "outlook-hayesy-beta" draft = true +++ -This post is trying to do a lot. There are a few ways which we split Puzzmo internally - both technically and culturally. For this post, I'm mainly going to be concentrating on "Puzzmo" the system, e.g. the bits which power game features like the website, leaderboards, scoring systems, groups, servers and that sort of thing. Internally, we generally call it either "App" _(the public facing website)_ or "API" _(the servers powering the website)_ stuff. +This blog post is trying to do a lot, I want to look back at the initial version of Puzzmo we shipped back in November and talk through what we built. It's a very long read, and sometimes doesn't flow too naturally - but it's comprehensive and a very useful reference for noting a little slice of time when Puzzmo's users were in the hundreds. -This conceptual framing kinda defines itself as not being "games" stuff like _"We changed Wordbind to use two words"_ or _"We used Redux Toolkit"_, the hows and whys for those sorts of things are not really my story to tell, and I have enough on my plate trying to keep on top of the technical architecture for Puzzmo. - -I'd like to try and give myself a bit of a look back at what we shipped back in November 2023 when Puzzmo first became publicly available. As I finish this writeup (started in December) in April, we're starting to look at shipping some of our first major systemic changes and it'd be good to have something which reminds us where we were. +I'm mainly going to be concentrating on "Puzzmo" the system, e.g. the bits which power features like the website, leaderboards, scoring systems, groups, servers and that sort of thing. Internally, we generally call these projects the "App" _(the public facing website for puzzmo.com)_ or the "API" _(the servers powering the website)_. In doing so, I will be omitting "games" topics like _"We changed Wordbind to use two words"_, _"Changes we made to games to make them fit Puzzmo"_. The hows and whys for those topics are not really my story to tell, and I have enough on my plate trying to keep on top of the technical architecture for Puzzmo. ![A picture of the main Puzzmo figma file](puzzmo-figma.png) -### What did it take to ship Puzzmo? +## What did it take to ship Puzzmo? + +We started off with a small jpg [and a general plan](https://www.youtube.com/watch?v=68TGvXlSSVY), and turned it into that Figma above over the course of two years. We were in a bit of a strange position with Puzzmo being a mix of "games" and "app" culturally, as well as being a tech startup I guess. This meant we could kind of pick and choose ideas from all of those cultures. -We started off with a small jpg [and a general plan](https://www.youtube.com/watch?v=68TGvXlSSVY), and turned it into that figma above over the course of two years. We were in a bit of a strange position as a mix of "games" and "app" culturally, as well as being a tech startup I guess. This meant we could kind of pick-and-choose ideas from all of those cultures. +Somewhere after the six months, we had a [really](./puzzmo-today-sept-2022.png) [solid]((./puzzmo-games-sept-2022.png)) ["vertical slice"](https://www.whatgamesare.com/vertical-slice.html) of what Puzzmo would be. We had folks playing daily, and you could see the skeleton of what we were trying pretty quickly. -I don't think we did a good job of either being a "lean product" nor a "minimum viable product", but we had a pretty strong idea of what we wanted to build and where the edges probably lay. Somewhere after the six months, we had a [really solid](./puzzmo-today-sept-2022.png) [vertical slice](./puzzmo-games-sept-2022.png) of what Puzzmo would be. We had folks playing daily, and you could see the skeleton of the whole thing pretty quickly. +Over the next ~18 months, we plodded on. While I don't think we did a good job of being a ["minimum viable product"](https://en.wikipedia.org/wiki/Minimum_viable_product#/media/File:From_minimum_viable_product_to_more_complex_product.png), we had a pretty strong vision of what we wanted to build and where the edges of that problem space lay`. ### How did we launch? -I guess this is as good a starting point as any. We launched puzzmo.com and what we shipped was a process where you needed to solve a puzzle within a certain time-frame to get an invite into the main site. Once you were in the main site, you had to create an account and you had full access to Puzzmo. This process lasted about a month, while we bug-fixed the app with those users and prepared for the public launch which included partner sub-sites. +To kick off Puzzmo, we wanted to build something which would be interesting to a general audience, and have a bit of FOMO mixed in. We came up with a plan which hit a few goals: -#### launch.puzzmo.com +- Be [worth reporting about](https://www.techradar.com/gaming/zach-gage-is-letting-500-people-into-his-new-puzzle-app-each-day-but-theres-a-catch) for games journalists +- Gate folks getting in, as we did not know the ordinal of our audience +- Let people bring their friends along +- Have a pretty small time window for being open, and a random timing aspect to work on all timezones +- Explore mixing digital and physical aspects of games +. +To make that happen, we created a completely separate website from puzzmo.com -The launch site we built as a separate website, on a separate domain. Keeping it there moved out complexity in the main app and allowed us to try a different technique of writing websites (next.js) than our current strategy for the app (described later) +## launch.puzzmo.com -We based the launch website based on a mix of one of our first strategies for "launching" Puzzmo: start by iterating through the games we have mixed with some ideas for ensuring we don't overwhelm our barely-load-tested servers. This meant creating a mix of only allowing 500 invites a day though the launch system, and then using the postal service to add some lag for American users. +The launch site. Keeping it on a separate domain removed complexity in the app and allowed us to try a different technique of writing websites (next.js) than our strategy for the app. + +The idea for the site was based on our first guess at what a launch could be: make a site which felt like a wordle-like (e.g. just played one game which refreshed daily) and then have that alternate between all of Puzzmo's games over time as a surprise. What we ended up with was a system which explained our plans a bit, and required being one of the first 500 people to completing a Puzzmo puzzle in a day: ![Puzzmo Launch site](launch-site.png) -This did mean for the first week or so, it was full of europeans who didn't get physical mail, which made for some interesting discussions on the Crossword's Americanness. +For folks in the US, we would then [send them a postcard](./puzzmo-invite-letters.jpeg) which included an invite code for puzzmo.com. Because mail takes time, this meant for the first week or so, puzzmo.com (and our discord) was full of europeans who didn't get physical mail, which made for some interesting discussions on the Crossword's Americanness. -During the launch period we offered lifetime accounts for Puzzmo. +During the launch period we offered lifetime accounts for Puzzmo, the launch site ran for about a month as the gateway to joining Puzzmo. #### Iframe Embeds -For games which don't require a virtual keyboard on mobile, we felt we could do a good job of making "puzzle previews" which can be embedded [inside articles](https://www.theverge.com/23929222/puzzmo-newspaper-games-crossword-zach-gage) or on blog posts, for example here it is in The Verge: +As you can see above, we relied on playing Puzzmo games as a part of the launch strategy. This meant we needed to allow our games to run outside of puzzmo.com! + +For games which don't require a virtual keyboard on mobile, we felt we could do a good job of making "puzzle previews" which can be embedded [inside articles](https://www.theverge.com/23929222/puzzmo-newspaper-games-crossword-zach-gage), the launch site or on blog posts like this eventually, for example here it is in The Verge: ![The Verge embedding Puzzmo](embed.png) The iframe embeds are a separate games runtime from our main application, it has less overhead and less features overall - but it's not supposed to be able to do so much anyway as they act more like a preview. This gave us a way to "show, not tell" when talking about Puzzmo to the press. +## puzzmo.com + +So, what was behind the curtain? + ### App -Hooo boy, ~25 screens, roughly 70k LOC and a whole world of spit-shine. The majority of it wrote by two folks (_Saman & I_). The app itself is largely a Relay application built in React but it also talks via a websocket to our multiplayer/social side making state management non-trivial. +At ~25 screens, roughly 70k lines of code and a whole world of spit-shine. The majority of the app which powered puzzmo.com was written by two folks (_Saman & Me_). The app itself is largely a conventional Relay application built in React, but it also talks, via a websocket, to our multiplayer/social side making state management non-trivial. -We do quite a lot of work in the application in terms of having layouts which differ on mobile vs desktop, which causes some interesting tension inside the codebase with state also. This approach is complex, but reviews of Puzzmo have often called it "native-like" which is high praise for a project based on web-tech. +We do quite a lot of work in the application in terms of having layouts which differ on mobile vs desktop, which causes some interesting tension inside the codebase. This approach is complex, but reviews of Puzzmo have often called it "native-like" which is high praise for a project based on web-tech. It's likely that the choice of using React Native Web via Expo at the start made this report a lot more likely to happen. -It's likely that the choice of using React Native Web via Expo at the start made this a lot more likely to happen. It also gave us a way to bet on having a native-like experience inside the app when we get Puzzmo on app stores also. This decision is something we've started to roll back on though, as the number of legally necessary third party systems and policy systems start to make maintaining one codebase across many platforms (each web browser, iOS and Android.) far less compelling in terms of inherent complexity for a small team. +Betting of React Native Web gave us an obvious way to have native app when we get start thinking about putting Puzzmo on app stores. -We host the app on Vercel, which is treated as effectively a SPA bundle (like you would for Create React App or Vite) which has gone pretty well. +This decision is something we've started to roll back on though, as the number of legally necessary third party systems and policy systems start to make maintaining one codebase across many platforms (each web browser, iOS and Android.) far less compelling. Part of the problem is that the complexity in managing all these constraints really requires at least one engineer's full time focus on each platform, and I'm not sure we're going to be there any time soon. + +We host the app on Vercel, where it is bundled as a Single Page App. Similar to techniques seen in Create React App, or Vite projects today. ### API -The API for this app is a pretty traditional RedwoodJS app, with a reasonable amount of built-in features replaced or dropped. The API is roughly 85k LOC mostly written by one person (_your truly_), and provides a GraphQL interface to the app and an admin dashboard. +The API for this app is a pretty traditional RedwoodJS app, with a reasonable amount of built-in features replaced or dropped. The API is roughly 85k lines of code mostly written by one person (_your truly_), and provides a GraphQL interface to the app and an admin dashboard. -A Redwood app provides both APIs and a web interface, we use the web parts of RedwoodJS for an admin dashboard we call "Studio." Studio powers all of the admin tools for managing dailies, puzzles, iframe embeds and offers a "GitHub for Crosswords" which is used to handle editing, reviewing and fact checking every crossword which is put on the daily. This clocks in at roughly 100k LOC, though a lot of it comes from our templating systems. We use react-bootstrap for the majority of the user interface, which is truly a "no-frills get stuff done" framework for writing reasonable code fast. +A Redwood app provides both APIs and a web interface, we use the web parts of RedwoodJS for an admin dashboard we call "Studio". Studio powers all of the admin tools for managing dailies, puzzles, iframe embeds and offers a "GitHub for Crosswords" which is used to handle editing, reviewing and fact checking every crossword which is put on the daily. This clocks in at roughly 100k lines of code, though a lot of it comes from our templating systems. We use react-bootstrap for the majority of the user interface, which is truly a "no-frills get stuff done" framework for writing reasonable code fast. -My opinions have a roughly 50% overlap on things that Redwood provides that we want, vs decisions they made which I don't really agree with. That number used to be higher, as they look to be prioritising the web parts over the API parts of Redwood in a way that means we need to start being careful about the future of the API's foundations. +My opinions have a roughly 50% overlap with Redwood's.That number used to be higher, as they look to be prioritising the parts we have little interest in over parts of Redwood we agree about. In a way that means we need to start being careful about the future of our API's foundations. -We host the API on Render, which occasionally has gone down on us, but not enough to warrant being an issue. Render has a great set of tools for building server-driven apps - we use a lot of their features. +We host the API on Render, which occasionally has gone down on us, but not enough to be a concern. Render has a great set of tools for building server-driven apps - we use a lot of their features and I've been really happy with that choice on the long-term. ![A screenshot of our Render Dashboard](render.png) -### Games +### Open Graph Thumbnail PNGs + +As we were a year and a half into Puzzmo, Wordle came out and introduced to a mass audience the idea of a text representation of a game. This approach did that game wonders! We had a few ideas similar, but had also been exploring the connection between a URL and the image preview that lots of sites/apps show. We wondered that maybe URLs could act as a conduit for doing image shares. -Heyyy, I thought we were defining this as not being about games! Well, I think the technical architecture is at least worth a mention. First up, we should answer to _"how do we run a game?"_ + When creating Puzzmo, we wanted to always have support for live thumbnails inside the site, and this code was re-used to generate custom image thumbnails for each puzzle being played on the server. At 2k lines of code, it's not a very big system because a lot of the hard work on making the thumbnails lives in the games repo. The thumbnail generator runs on Deno Deploy, which we've found to be pretty cool. -To run a game, we have a embedded game runner which communicates to an external system via JSON messages. For the app, we boot the game runner up inside an `