Author: Saadia

  • Upgrading GPT with Persistent Memory Using Cloudflare Workers

    Recently I experimented with equipping a custom GPT model with long-term memory, which persists between conversations.

    To do this, I used Cloudflare Workers. It’s a straightforward, (arguably) low-code, and entirely free method that can be easily replicated by anyone interested in enhancing their custom GPTs.

    Here’s how it works.

    Custom GPTs allow you to specify a set of actions. These are capabilities given to the GPT in the form of API requests. This means I can tell my GPT to remember something (a PUT request) or recall something (a GET request).

    So there are three parts of this which we need to create:

    1. The database that stores the memories
    2. The worker that handles API requests
    3. The GPT’s action definition

    🍱 Part 0: Compartmentalisation

    There’s a key insight I had which really shaped how I put this together.

    What I’d like to avoid is just dumping a whole heap of data into every chat context. We could do that – just make a long list of informational strings and make sure it’s always included. This approach runs into two problems.

    The first is that our KV store is going to get too large very quickly. The Value part of the KV store has an upper storage limit. If we have thousands of memories, that’s going to be too much.

    The second is that our GPT has a limited context window. If you just feed a bunch of information in up front, the conversation will have a very limited length, and the unrelated information will “dilute” the important parts.

    In order to avoid this, our “working memory” will be compartmentalised. That is, we will have a separate endpoints for each of the important topics we want to remember.

    In my case, I chose topics such as:

    • Music, for my music tastes
    • Home, for memories about where I live
    • Childhood, for memories about how I grew up
    • Tech, for data about the gadgets, devices, and software I use
    • Friends, for information about my friends and their families

    … as well as a separate topic for each of the most important people in my life.

    This allows our GPT to access memories contextually. If I ask about a particular band, the GPT might look up memories about my music tastes, and compare the band to others that I already know. If I ask for a monitor recommendation, the GPT can check for memories about my current screen, or the computers I might use it with. In these cases, we’re only loading in the memories relevant to the context.

    This contextual approach isn’t without flaws – if I ask about a trip to Melbourne, the GPT won’t lookup my childhood memories to know I lived there as a kid. Even so, I’ve found that having a persistent and contextual memory to be transformational in how I interact with my GPT.

    🧠 Part 1: The Database

    I decided to use Cloudflare Workers, which includes a Key Value store with very generous usage limits on the free plan. That’s where we’ll store memories.

    First, we setup the KV store. In your Cloudflare Dashboard, go to Workers & Pages > KV > Create a namespace. Give your namespace a name and save it.

    💁‍♀️ Part 2: The API Request Handler

    Next, setup your Worker. Go to Workers & Pages > Overview > Create application > Create worker. Give your worker a name (this will be the URL that your API is available at).

    Leave the worker.js file with its default value for now. Press Deploy, then Configure Worker.

    On the worker page there are some tabs – open Settings > Variables. Scroll down to KV Namespace Bindings, and Add binding. For the variable name, I simply chose KV, and then link your new KV namespace.

    Now that the KV namespace is bound, we’ll edit our worker. At the top of the worker page click Quick edit.

    Here’s the code I wrote for the worker.js file:

    addEventListener('fetch', event => {
      event.respondWith(handleRequest(event.request))
    })
    
    async function handleRequest(request) {
      const url = new URL(request.url);
    
      if (request.method === 'PUT') {
        return handlePutRequest(request, url.pathname);
      } else if (request.method === 'GET') {
        return handleGetRequest(request);
      } else {
        return new Response('Method not allowed', { status: 405 });
      }
    }
    
    async function handlePutRequest(request, path) {
      try {
        const requestData = await request.json();
        if (!requestData || !requestData.data) {
          return new Response('Bad Request: No data object in request', { status: 400 });
        }
    
        const memoriesJSON = await KV.get(path);
        const memory = requestData.data;
    
        if (!memoriesJSON) {
          KV.put(path, `[$memory]`);
          return new Response('Data added successfully', { status: 200 });
        }
    
        const memories = JSON.parse(memoriesJSON);
    
        if (!Array.isArray(memories)) {
          return new Response('Bad Request', { status: 400 });
        }
    
        memories.push(memory);
    
        await KV.put(path, JSON.stringify(memories));
        return new Response('Data updated successfully', { status: 200 });
      } catch (error) {
        console.error('Error in PUT request handling:', error);
        return new Response('Internal Server Error', { status: 500 });
      }
    }
    
    async function handleGetRequest(path) {
      const data = await KV.get(path);
      return new Response(data, {
        status: 200,
        headers: { 'Content-Type': 'application/json' }
      });
    }

    The worker is configured to receive requests to any endpoint. This setup means it can accept data via PUT requests on any path, storing it in Cloudflare’s KV store. It can also retrieve data from any GET request.

    If no data exists at a particular endpoint, we will create a new key for that endpoint, and initialise it with the data that was sent.

    I haven’t implemented auth yet, but there really should be some sort of auth here, too. If I were doing it, I’d probably just manually add a randomly generated API key as an environment variable, and modify my script to check that it’s included in the request header.

    🤖 Part 3: The GPT

    Last step – create the GPT. Once you’ve created and configured the basic description, instructions, etc., it’s time to add our action endpoints.

    Under the Configure tab of your custom GPT settings, choose Create new Action. Your schema is going to look something like this:

    {
      "openapi": "3.1.0",
      "info": {
        "title": "Memory.",
        "description": "Retrieves long-term persistent memories.",
        "version": "v1.0.0"
      },
      "servers": [
        {
          "url": "[YOUR CLOUDFLARE WORKER URL]"
        }
      ],
      "paths": {
        "/music": {
          "get": {
            "description": "Retrieves a list of memories about my taste in music.",
            "operationId": "GetMemoryMusic",
            "parameters": [],
            "deprecated": false
          },
          "put": {
            "description": "Store a single of memory about my taste in music.",
            "operationId": "SetMemoryMusic",
            "parameters": [],
            "requestBody": {
              "description": "A memory to store",
              "required": true,
              "content": {
                "application/json": {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "data": {
                        "type": "string",
                        "description": "A one or two sentence memory."
                      }
                    },
                    "required": ["data"]
                  }
                }
              }
            },
            "deprecated": false
          }
        }
      },
      "components": {
        "schemas": {}
      }
    }

    See the paths object? You can fill it out with as many “topics” for your memory as you like. I’ve just got the one in the example above – music. When you implement yours, just duplicate the /music path, and change the path and description.

    Don’t forget to use the Test button that will appear below your schema to test your various memory endpoints.

    I should mention that this setup isn’t limited to “memories”. I’ve also been using it to store my weekly calendar, a running list of reminders, my sleep data, and a bunch of other information about my life.

    💬 The Last Part: Chat with your GPT

    Great! Now it’s time to talk. Try asking your GPT to remember something about one of the topics. I’ve found that even being quite vague in my request gets good results. “The best music is from the 90s, don’t you think?”, or “I need some help with my phone – I use an iPhone 15 Pro.”

    After a while, you’ll start to notice that your GPT will naturally start accessing those memories when the context is right.

    🦾 The Next Part: Making it Better

    There are three obvious next steps. The first is to add some sort of API authentication. The second is to add a DELETE request type for forgetting memories (which may involve reformatting our memory arrays into keyed objects).

    The third is a little more complex. I’d like to use OpenAI’s Assistant API to create a separate API endpoint for interacting with my personal Assistant, rather than having to use the ChatGPT interface. There’s some tweaking required to transform the actions into functions – but it’s doable.

    This would allow me to add shortcuts to my phone that have access to the memory stores. Or I could ask my assistant to ask your assistant about what sort of things you like, so that it could provide birthday gift recommendation.

    Let me know what you think! Find me as @[email protected] on Mastodon.

  • Visitor Counter

    I added a visitor counter to my website this morning using the Cloudflare KV store. Easy, fun, fast, and old-school cool 😎.

    You can see all the code on GitHub, most of it is in +layout.server.js.

    What’s cool about this is that my entire homepage is technically static. It’s all served from the edge using Cloudflare Pages. However, Pages lets me send fetch requests from the edge too during page load.

    This isn’t an XHR request (the visitor doesn’t see the request in their browser), it’s sent directly from the server. That means I can authenticate my requests without having to be concerned about leaking api keys.

    So when the page loads, I retrieve the current page view count from Cloudflare KV, and increment it using the Cloudflare API, then pass the result on to the frontend.

    Cool, huh?

  • Protected: Plugin Ranking Algorithm

    This content is password protected. To view it please enter your password below:

  • GPT Time Poems

    In my office I have a Raspberry Pi running a DAKboard dashboard. It shows the time, the temperature, and my calendar.

    Inspired by this Twitter thread, my dashboard now also shows a poem!

    I’m using the GPT-3.5 model via the OpenAI API to create a short poem about the current time. It shows on my dashboard to brighten my day.

    In visions of the evening tide,
    The world takes on a softer side,
    As light begins to fade away,
    And 4:19 bring the end of day.

    ChatGPT 3.5 in the style of William Blake

    In the garden at half past four
    A sparrow chirps, then flies once more.
    The roses bloom, a symphony red,
    As the sun begins to dip its head.

    ChatGPT 3.5 in the style of William Blake

    The sun sets at 5:49,
    A time to end and to unwind.
    The day is done and so are we,
    Until tomorrow, we’ll be free.

    ChatGPT 3.5 in the style of William Blake

    At five to five the sun still sleeps
    The world outside is dark and deep
    The moon shines bright, a silver light
    As stars twinkle in the night.

    ChatGPT 3.5 in the style of William Blake

    It looks something like this:

    Ignore the mismatched times – I took this screenshot while overseas, so one time shows local and one time shows the time in my office. The background is a selection from my favourites album, in Apple Photos.

    How did I make this?

    I’m using this prompt to generate the poem:

    It’s ${currentTime}. Write a 4 line rhyming poem in the style of William Blake. The poem can be about anything except the passing of time, and it MUST include the current time in the format HH:MM.

    If you’d like to do something similar, you can view the code for it in this GitHub gist. It’s pretty straightforward to copy / paste that into a DAKboard HTML widget – you’ll just need to update the paragraph’s style tag to suit your dashboard.

    How much does something like this cost to run?

    • Each prompt / response requires about 100 tokens.
    • We run the request every minute of the day – 1,440 times.
    • That’s 144,000 tokens a day.
    • The Chat gpt-3.5-turbo model costs $0.002 / 1K tokens.
    • That makes $2.88 per day, around $85 / month.

    Careful prompt design would allow you to half this. For example, you could go with a two line poem instead:

    It’s ${currentTime}. Write a 2 line rhyming poem that includes the current time.

  • Danger

    I’d really like to be actively writing again.

    They say that the very act of writing helps you formulate better ideas, develop a point of view, problem solve.

    As Andrew Sharp put it on the Sharp Tech podcast (I’m paraphrasing here): Writing allows me to come up with “hot takes”.

    But be careful. There’s a danger to writing.

    Putting an idea out into the world does something to the ego. It’s a little pump… a little inflation. The act of publishing is an act of defiance — a dare to disagree.

    In a way, all creativity is the same. Deciding that you’re the best channel for the universe to flow through is an act for pure chutzpah.

    It’s easy to misidentify yourself as the creator. You’re the conduit.

    There’s another version of the previous sentence that goes:

    It’s easy for me to misidentify myself as the creator. I’m the conduit.

    See how I’m hedging there? I don’t want to assume I know everything, or what’s easy or difficult for YOU.

    But the writing isn’t as strong. It’s less convincing. Less certain. More ego.

    I think writing will change a lot in the next few years because of generative AI. Traditional rules and persuasive writing techniques will deprecate. Maybe writing will become more dithering and introspective. More unsure of itself. More human.

    Anyway, I’m just trying to figure it all out.

  • SIGH Zero

    Now that I’ve got a dedicated space to work from, I’ve started establishing some routines.

    It feels very zen / self-care to start every day with tefillin, meditation, yoga, and a bit of bass guitar practice.

    But when it’s time to work, I’ve been writing the acronym “SIGH” at the top of my to-do list.

    Inbox zero is not for everyone, but it’s definitely for me. As is Slack zero, and GitHub zero.

    S. I. GH.

    I just hope I don’t get dragged into any Figma projects. That would totally ruin my acronym.

  • New Mac Setup

    A list of things I install when getting started with a brand new Mac.

    for Everyday

    for General Dev

    for Web Dev

    Installing multiple PHP versions, including unsupported versions (Feb 2023):

    brew update
    brew tap shivammathur/php
    brew install shivammathur/php/[email protected]
    brew install shivammathur/php/[email protected]
    brew install shivammathur/php/[email protected]
    
    // Use PHP 7.2
    brew link shivammathur/php/[email protected]
    
    // Switch to PHP 7.4
    brew unlink php
    brew link shivammathur/php/[email protected]

    for App Dev

    for Safari

  • Inputs 2022

    Each year I round up the various forms of media that I’ve engaged with. Here’s what I’ve watched and read this year.

    I use a ⭐️⭐️⭐️ 3 star rating system – you could think of it as a “recommendation” rating system:

    ⭐️

    ⭐️⭐️

    ⭐️⭐️⭐️

    I don’t recommend this.

    It’s good. I might recommend it to some people.

    It’s great! You should definitely see this.

    Books

    I had a goal to read 52 books this year – one for every week. I reached it with a couple of weeks to go! I’m very proud of this achievement.

    Early in the year I finished reading the Foundation and Robots series by Asimov, and after that started reading Bernard Cornwell’s Sharpe series. With over 20 titles in this series, I expect it will take a few years to get through them all, but so far I’m really enjoying the character development.

    I also read through the “Remembrance of Earth’s Past” series by Liu Cixin. I didn’t rate this a full three stars, as it could be a little dry at some points – but it’s really lasted in my memory. I would recommend it as required reading for anyone who particularly enjoys science-fiction.

    Another title that I can’t forget is Earthlings. I’ve found that most Japanese fiction I’ve read is straight-up strange… and this is no exception. Not a title for the faint of heart, but if you don’t mind a disturbed mind… give this one a go.

    Another highlight was the Interactive Fiction title “Violet“. I had a great time reading and uncovering all the endings and easter eggs. It’s free to read, and short – took me about three hours to get through.

    TitleAuthorRatingFormat
    Second FoundationIsaac Asimov⭐️⭐️⭐️Audiobook
    The Midnight LibraryMatt Haig⭐️⭐️Ebook
    Alcatraz Versus the Evil LibrariansBrandon Sanderson⭐️⭐️⭐️Paperback
    Foundation’s EdgeIsaac Asimov⭐️⭐️⭐️Audiobook
    To Sleep in a Sea of StarsChristopher Paolini⭐️Audiobook
    SapiensYuval Noah Harari⭐️Paperback
    RecursionBlake Crouch⭐️⭐️⭐️Ebook
    The Three-Body ProblemLiu Cixin⭐️⭐️Audiobook
    Robots and EmpireIsaac Asimov⭐️⭐️⭐️Paperback
    Foundation and EarthIsaac Asimov⭐️⭐️⭐️Audiobook
    The Dark ForestLiu Cixin⭐️⭐️Audiobook
    Dark OneBrandon Sanderson⭐️⭐️Graphic Novel
    EarthlingsSayaka Murata⭐️⭐️Audiobook
    Death’s EndLiu Cixin⭐️⭐️Audiobook
    Elon MuskAshlee Vance⭐️⭐️Paperback
    Sharpe’s TigerBernard Cornwell⭐️⭐️⭐️Ebook
    Sharpe’s TriumphBernard Cornwell⭐️⭐️Paperback
    The AlchemistPaul Coelho⭐️⭐️⭐️Audiobook
    The History of the FutureBlake J. Harris⭐️⭐️⭐️Audiobook
    The Untethered SoulMichael A. Singer⭐️Audiobook
    Sharpe’s FortressBernard Cornwell⭐️⭐️⭐️Audiobook
    Snow CrashNeal Stephenson⭐️⭐️⭐️Ebook
    Sharpe’s TrafalgarBernard Cornwell⭐️⭐️Audiobook
    Sharpe’s PreyBernard Cornwell⭐️⭐️⭐️Audiobook
    VioletJeremy Freese⭐️⭐️⭐️IF
    Sharpe’s RiflesBernard Cornwell⭐️⭐️⭐️Audiobook
    The SilmarillionJ.R.R. Tolkien⭐️⭐️Paperback
    Sharpe’s HavocBernard Cornwell⭐️⭐️Audiobook
    Forget Me NotEllie Terry⭐️⭐️Audiobook
    Sharpe’s EagleBernard Cornwell⭐️⭐️⭐️Audiobook
    Red at the BoneJacqueline Woodson⭐️⭐️⭐️Audiobook
    Song of SolomonToni Morrison⭐️⭐️Audiobook
    The Scrivener’s BonesBrandon Sanderson⭐️⭐️⭐️Paperback
    The Knights of CrystalliaBrandon Sanderson⭐️⭐️⭐️Paperback
    Sharpe’s GoldBernard Cornwell⭐️⭐️Audiobook
    Sharpe’s EscapeBernard Cornwell⭐️⭐️⭐️Audiobook
    Free to LearnPeter O. Gray⭐️⭐️⭐️Paperback
    RedJohn Logan⭐️⭐️⭐️Audiobook
    Other HousesPaddy O’Reilly⭐️⭐️Audiobook
    LemonKwon Yeo-Sun⭐️Audiobook
    Scattered MindsGabor Matè⭐️⭐️Paperback
    Severance – The Lexington LetterBen Stiller, et. al.⭐️⭐️⭐️Ebook
    The Lost MetalBrandon Sanderson⭐️⭐️Audiobook
    Meditation & KabbalahAryeh Kaplan⭐️⭐️⭐️Paperback
    TefillinAryeh Kaplan⭐️⭐️⭐️Paperback
    NomadlandJessica Bruder⭐️⭐️Paperback
    Tzitzith: A Thread of LightAryeh Kaplan⭐️⭐️Paperback
    Princess Floralinda and the Forty-Flight TowerTamsyn Muir⭐️⭐️⭐️Audiobook
    Final SpinJocko Willink⭐️⭐️Audiobook
    The Stranger in the LifeboatMitch Albom⭐️⭐️⭐️Audiobook
    LegionBrandon Sanderson⭐️⭐️Audiobook
    Skin DeepBrandon Sanderson⭐️⭐️Audiobook
    Sharpe’s FuryBernard Cornwell⭐️⭐️Audiobook
    Trends
    • 52 Books
    • Formats Read
      • 11 audiobooks (62%)
      • 14 paperbacks (27%)
      • 6 other digital formats (11%)
    • Authors Read
      • 11 by Bernard Cornwell (21%)
      • 7 by Brandon Sanderson (13%)
    • Average Rating
      • 26 ⭐️⭐️⭐️ (50%)
      • 22 ⭐️⭐️ (42%)
      • 4 ⭐️(8%)
      • Average rating of 2.42 stars
    • Fiction vs Non-Fiction
      • 42 Fiction (81%)
      • 10 Non-Fiction (19%)
    • Compared to last year…
      • 216% more books read! (52 this year, 24 last year)
      • Many more paperbacks (I don’t think I read any hard copies last year)
    Book of the Year

    Unlike film and television, I don’t tend to read books the year they were released. In fact, the only book I’ve read this year that was also released this year is The Lost Metal. Because of this, I give the book of the year award to whichever book I recommend the most.

    This year’s Book of the Year is Recursion by Black Crouch.

    Film

    This year I intentionally took a step away from the cinema. Although I really enjoyed diving into the world of film last year, I didn’t think I’d be able to maintain my film diet while also pursuing my audacious one-per-week reading goal.

    Like last year, Talia and I decided on a date-night movie director theme. I’ve done Noah Baumbach, Ridley Scott, Quentin Tarantino, Wes Anderson, as well as series like the MCU and Bond. This year we watched the filmography of Guy Ritchie.

    TitleYearRatingFormat
    House of Gucci2021⭐️⭐️⭐️Cinema
    The Comeback2021⭐️⭐️⭐️Phone
    Moonfall2022⭐️Cinema
    The Sky is Everywhere2022⭐️⭐️⭐️TV
    Last Night in Soho2021⭐️⭐️TV
    Lock, Stock and Two Smoking Barrels1998⭐️⭐️⭐️TV
    Snatch2000⭐️⭐️⭐️TV
    The Batman2022⭐️⭐️⭐️Cinema
    Swept Away2002⭐️TV
    Turning Red2022⭐️⭐️⭐️TV
    Encanto2022⭐️⭐️⭐️TV
    Uncharted2022⭐️⭐️Cinema
    Revolver2005⭐️⭐️TV
    RocknRolla2008⭐️TV
    Sherlock Holmes2009⭐️⭐️TV
    Sherlock Holmes: A Game of Shadows2011⭐️⭐️⭐️TV
    Doctor Strange in the Multiverse of Madness2022⭐️⭐️⭐️Cinema
    The Man from U.N.C.L.E.2005⭐️⭐️⭐️TV
    Avatar2009⭐️⭐️⭐️TV
    King Arthur: Legend of the Sword2017⭐️⭐️TV
    The Gentlemen2019⭐️⭐️⭐️TV
    Operation Mincemeat2022⭐️⭐️Cinema
    Wrath of Man2021⭐️⭐️TV
    Top Gun1986⭐️⭐️iPad
    Spiderhead2022⭐️⭐️⭐️Laptop
    The French Dispatch2021⭐️⭐️⭐️TV
    Thor: Love and Thunder2022⭐️⭐️⭐️Cinema
    Everything Everywhere All at Once2022⭐️⭐️⭐️TV
    Lightyear2022⭐️⭐️TV
    Men2022⭐️⭐️TV
    Bullet Train2022⭐️Cinema
    Luck2022⭐️TV
    C’mon C’mon2021⭐️⭐️⭐️Plane
    Belfast2021⭐️⭐️⭐️Plane
    Werewolf by Night2022⭐️⭐️Phone
    Black Adam2021⭐️TV
    Wakanda Forever2022⭐️⭐️⭐️Cinema
    The Menu2022⭐️⭐️⭐️Cinema
    Cha Cha Real Smooth2022⭐️⭐️⭐️TV
    Weird: The Al Yankovic Story2022⭐️⭐️TV
    Avatar: The Way of Water2022⭐️⭐️⭐️Cinema
    Cool Runnings1993⭐️⭐️⭐️TV
    The Fabelmans2022⭐️⭐️⭐️TV
    Emancipation2022⭐️⭐️⭐️TV
    Trends
    • 44 Films
    • Formats Watched
      • 11 in the Cinema (25%)
      • 27 at home on the TV (61%)
      • 6 others (14%)
    • Average Rating
      • 26 ⭐️⭐️⭐️ (59%)
      • 12 ⭐️⭐️ (27%)
      • 6 ⭐️ (14%)
      • Average rating of 2.45 stars
    • Release Years
      • 25 released in 2022 (57%)
      • 7 released in 2021 (16%)
      • 12 released in other years (27%)
    • Compared to last year…
      • Total films only 58% of last year, down from 76 to 44
    Film of the Year

    My favourite film that was released in 2022 was The Fabelmans. I think this film will go down in history as an all time classic. It reminded a lot of Cinema Paradiso, which is another favourite classic of mine.

    I have to mention a close runner-up, though: The Menu. Loved the tension, humour, and social commentary here.

    Television

    My goal at the start of the year was to limit my TV to only Marvel series, Lord of the Rings series, and Star Trek series. This might seem limiting, but actually I knew there would be a lot of Marvel and Star Trek shows.

    In the end, I didn’t achieve this goal. I couldn’t help myself – I just had to see the final season of the Peaky Blinders (and I’m glad I did), plus it was nice to share a few evenings watching the new Only Murders in the Building season with Talia. Once I failed that, I decided to take up a couple of other recommendations from friends.

    TitleSeasonEpisodesRating
    Morning WarsSeason 210 Episodes⭐️⭐️
    Star Trek: ProdigySeason 110 Episodes⭐️⭐️
    HawkeyeSeason 16 Episodes⭐️⭐️
    Star Trek: DiscoverySeason 413 Episodes⭐️⭐️
    Moon KnightSeason 16 Episodes⭐️⭐️
    PicardSeason 28 Episodes⭐️
    Peaky BlindersSeason 66 Episodes⭐️⭐️⭐️
    Ms MarvelSeason 16 Episodes⭐️⭐️
    I Am GrootSeason 15 Episodes⭐️⭐️
    Only Murders in the BuildingSeason 210 Episodes⭐️⭐️
    The Lord of the Rings: Rings of PowerSeason 18 Episodes⭐️⭐️
    SeveranceSeason 19 Episodes⭐️⭐️⭐️
    She-Hulk: Attorney at LawSeason 19 Episodes⭐️
    The PeripheralSeason 18 Episodes⭐️⭐️
    Trends
    • 14 Seasons
    • 114 Episodes
      • If you allow for an average 40 minute episode, that’s 76 hours of television.
    • Average Rating
      • 2 ⭐️⭐️⭐️ (14%)
      • 10 ⭐️⭐️ (72%)
      • 2 ⭐️ (14%)
      • Average rating of exactly 2 stars
    • Compared to last year…
      • Much less TV this year
      • Down from 33 seasons to 14
      • Down from 387 episodes to 114
      • Down from ~258 hours to ~76 hours
    Television Season of the Year

    This one is no contest – Severance is by far the most engaging and excited series I’ve seen this year. I had it recommended to me from a few different folks who also liked Lost and Mr. Robot – and Severance is very much in the same vein. This is my kind of television.


    That’s my year of input! The short version is a lot more books, and a lot less screen time. I’m not sure I’ll target such an aggressive reading goal in the year to come… and I think I’ll try to enjoy a few more movies. As for TV, I’m actually pretty pleased with how little I saw in 2022. I might try to cut it back a fraction in 2023 – maybe one per month? Something like that.

  • How I Fell in Love with the Block Editor

    I used to be a diehard fan of the Classic Editor plugin

    I would never have thought that I would one day LOVE the Block Editor. I remember when I first switched to the Block Editor – I was a complete novice. I had no idea how to use it and found it really confusing. But I decided to give it a go, and I’m so glad I did!

    The Block Editor is now my absolute favourite way to edit my blog posts. I love how intuitive it is and how easy it is to use. I can move blocks around, add new blocks, and format my posts exactly how I want them. It’s also really helpful that I can see a live preview of my changes as I make them.

    If you’re thinking of switching to the Block Editor, I highly recommend it! You won’t regret it.

    It was tough getting used to working with blocks at first. I had to relearn how to format my posts, and it felt like a lot more work than just writing in the old editor. But then, I started to see the potential of the block editor. I could rearrange my content easily, and adding media was a breeze. Plus, there were so many more options for customization. I began to see why people were saying that the block editor was the future of WordPress.

    Now, I can’t imagine going back to the old editor. I’m a convert! The block editor is my new best friend.

    And I fell in love!

    It wasn’t love at first sight. I remember trying the block editor for the first time and thinking “this is different”. I wasn’t sure if I liked it or not. But I kept using it, and slowly but surely I started to really enjoy it. I loved the freedom it gave me to experiment with different block types and layouts. And I loved how easy it was to create beautiful, complex pages without having to write a single line of code.

    Over time, I came to appreciate the power of the block editor. It’s so much more than just a page builder. It’s a whole new way of creating content for the web. And I firmly believe it’s the future of WordPress.

    So if you’re not using the block editor yet, I urge you to give it a try. I think you’ll be surprised at how much you enjoy it.

    The Block Editor is so much more user-friendly and intuitive

    Since I switched to the block editor, writing posts has become a breeze. The editor is so user-friendly and intuitive, I can’t imagine going back to the old way of doing things. With the block editor, I can easily add and rearrange blocks of text, images, and other media with just a few clicks. Plus, the editor automatically saves my changes as I go, so I don’t have to worry about losing anything.

    It’s helped me to create better, more engaging content

    Since I started using the Block Editor, I’ve found that my content is noticeably more engaging. I think it’s because the editor allows me to focus on each individual block of content, and make sure that it’s as strong as it can be. I don’t have to worry about the overall structure of the post as much, because I know that the editor will take care of that for me. As a result, I can spend more time making sure that each sentence is compelling, and that each image is eye-catching. My readers have definitely noticed the difference, and I’ve gotten more positive feedback on my content since I switched to the Block Editor.

    If you’re still using the Classic Editor, I urge you to give the Block Editor a try!

    If you’re still using the Classic Editor on your WordPress site, I urge you to give the new Block Editor a try. I remember when I first switched to the Block Editor – I was skeptical. But after using it for a while, I quickly fell in love with it. Here are a few reasons why I think you’ll love it too:

    1. The Block Editor is more user-friendly and intuitive than the Classic Editor.
    2. The Block Editor lets you create more visually appealing content with ease.
    3. The Block Editor is more flexible than the Classic Editor, allowing you to easily add and rearrange blocks to create custom layouts.

    Give the Block Editor a try – I think you’ll be pleasantly surprised!


    You’ve made it this far? Did you guess that I didn’t write any of this?

    I’ve been messing with GPT-3 a lot lately. This post was completely generated by the OpenAI GPT-3 model, using their beta playground.

    I started by seeding it with 15 titles of recent posts that I actually did write, and asked it to generate some more. Then I picked one, and asked it to give me the headings that I should use for the blog post. Lastly, for each of the headings, I asked it to write a few paragraphs of content.

    I find the whole thing very fascinating. And the more I play with it, the more I find myself recognising AI generated content when I encounter it online, which happens surprisingly often!

  • Inputs 2021

    This year I’ve been keeping track of the books, films, and television I’ve been consuming. There’s a surprising amount!

    My goal for next year is to have a lot more output – so starting in January I’ll start tallying, somehow, the creative work I put out into the world, in addition to the art I’m inspired by.

    I use a ⭐️⭐️⭐️ 3 star rating system – you could think of it as a “recommendation” rating system:

    ⭐️

    ⭐️⭐️

    ⭐️⭐️⭐️

    I don’t recommend this.

    It’s good. I might recommend it.

    It’s great! You should definitely see this.

    Best of the Year

    My personal award for best new film and TV show for 2021 are:

    🏆 Best Television: Only Murders in the Building

    Quirky, funny, mysterious, and unique. Steve Martin and Martin Short make a great duo, but the real brilliance happens when you team them up with Selena Gomez! Put this down on your list as a much watch, especially if you’re a podcast lover like me.

    🥈Television Runner Up: Calls

    A strange, suspenseful, and sometimes scary sci-fi. The thing that makes Calls unique is that visually, each episode looks like a music visualiser. The visuals match the story, but the story is told primarily with audio. The short episodes make it easily bingable in a night or two. Calls pairs very nicely with the Spatial Audio feature on your AirPods.

    🏆 Best Film: Pig

    Nicholas Cage at his best. This film has been compared to John Wick, but Pig is in another league. It’s a gritty, unnerving, and heartfelt love story, not a cookie-cutter action flick. Definitely worth a watch – this movie stays with you.

    🥈Film Runner Up: Don’t Look Up

    The very last movie I saw this year was fantastic – at least I thought so. Apparently it’s doing very poorly with critics. Maybe I’m particularly partial to political satire and meta narratives. The film has a unique visual style, interjecting stock footage into the story in a way that, surprisingly, really works!

    Television

    There’s been a lot of TV this year – not just my personal viewing, but a whole lot of quality television shows released. It’s impossible to keep up with prime viewing. We’re certainly in a golden age of television, and peak “streaming wars”. It’s easy to predict a rise in content piracy as more and more streaming services continue to release amazing content.

    Despite this, I’ve pledged a television diet in 2022:

    • Finish the shows I’m still mid-way through
      • Morning Wars (Season 2)
      • See (Season 2)
      • Dickinson (Season 3)
    • Watch any new MCU television
    • Watch any new Star Trek television

    That’s it. Nothing else. I’ll miss out on The Expanse, The Marvelous Mrs. Maisel, and other favourites – but that’s a sacrifice I’ll happily make to make time for creative output.

    But that’s all in the year ahead. Let’s take a look back at the television I watched in 2021.

    ⭐️⭐️⭐️⭐️⭐️⭐️
    Mythic Quest (Season 2)Wandavision (Season 1)The Office (Season 1—9)
    Falcon and the Winter Soldier (Season 1)The Expanse (Season 5)
    Loki (Season 1)Morning Wars (Season 1)
    Black Space (Season 1)Calls (Season 1)
    Mr. Corman (Season 1)For All Mankind (Season 2)
    Ted Lasso (Season 2)Mare of Easttown (Season 1)
    Star Trek: Lower Decks (Season 2)Marvel’s What If… (Season 1)
    Dickinson (Season 1—2)Only Murders in the Building (Season 1)
    The Premise (Season 1)
    Invasion (Season 1)
    Foundation (Season 1)
    Dr. Brain (Season 1)
    • 33 total seasons of television
    • 387 total episodes
    • That’s slightly more than one episode for every day of the year!
    • If you allow for an average 40 minute episode, that’s 258 hours of television.
    • Most of that was binging The Office (the American version)

    Film

    I discovered a love for cinemas last year. “Me time”, for me, looks like sneaking out to a movie during the day, when the theatre is mostly empty, and seeing something on the big screen by myself.

    Unlike television, the amount of film I’ve seen this year really feels like time well spent. It fills me up, somehow, and gives me ideas. TV feels more braindead, more couch-stoned.

    One thing I did this year was to revisited the MCU (for the second time), but this time with my kids and Talia! They’ve loved it – it’s nice to have that shared context of a whole complicated fictional universe.

    That said, there’s a lot of rubbish film in the MCU. I expect that my list of films for 2022 will contain a lot less in the one star column.

    Talia and I also watched through all the Daniel Craig Bond films in the lead up to No Time to Die. I hope that, whoever the next Bond is, the “series” is imagined as a longer story from the beginning – it’s that shared world building that I love the best.

    ⭐️⭐️⭐️⭐️⭐️⭐️
    The Incredible Hulk (2008)The Courier (2020)Mortal Kombat (2021)
    Captain America The First Avenger (2011)Godzilla vs Kong (2021)Soul (2020)
    Thor (2011)Raya and the Last Dragon (2021)Promising Young Woman (2020)
    Thor: The Dark World (2013)Cherry (2021)The Mitchells vs the Machines (2021)
    Space Jam: A New Legacy (2021)Synchronic (2019)Nobody (2021)
    Gunpowder Milkshake (2021)Wrath of Man (2021)The Father (2020)
    Eternals (2021)A Quiet Place (2018)The Hitman’s Bodyguard (2017)
    Undergods (2021)Iron Man (2008)Luca (2021)
    Venom: Let There Be Carnage (2021)Moxie (2021)Black Widow (2021)
    Iron Man 2 (2010)Pig (2021)
    A Quiet Place Part II (2020)Death of a Ladies’ Man (2020)
    Cruella (2021)The Suicide Squad (2021)
    The Avengers (2012)Annette (2021)
    Escape Room (2019)Thor: Ragnarok (2017)
    Iron Man 3 (2013)Black Panther (2018)
    The Hitman’s Wife’s Bodyguard (2021)Shang-Chi and the Legend of the Ten Rings (2021)
    Captain America: The Winter Soldier (2014)Avengers: Infinity War (2018)
    Guardians of the Galaxy (2014)CODA (2021)
    Avengers: Age of Ultron (2015)Army of the Dead (2021)
    F9 (2021)The Green Knight (2021)
    Captain America: Civil War (2006)Free Guy (2021)
    Cleaner (2007)Army of Thieves (2021)
    Doctor Strange (2016) Venom (2018)
    In the Heights (2021)Avengers: Endgame (2019)
    Guardian of the Galaxy Vol. 2 (2017)Spider-Man: Far From Home (2019)
    Spider-Man: Homecoming (2017)Finch (2021)
    Slither (2006)Skyfall (2012)
    Ant-Man and the Wasp (2018)Spectre (2015)
    Casino Royale (2006)Home Alone (1990)
    Quantum of Solace (2008)Dune (2021)
    Captain Marvel (2019)Spider-Man: No Way Home (2021)
    The Harder They Fall (2021)The Matrix: Resurrections (2021)
    Red Notice (2021)Don’t Look Up (2021)
    No Time to Die (2021)
    • 76 total films
    • That’s around 1.5 movies each week
    • If you allow for an average 120 minute movie, that’s 152 hours
    • One-third of the films I saw this year were set in the Marvel Cinematic Universe
    • 37 of the movies I saw (about half) were released this year (2021)

    Books

    I didn’t award any book of the year, since I didn’t actually read any books that were released this year. So, instead, I’ll give an award to the best book I read this year.

    🏅Book of the Year: The Final Empire (Brandon Sanderson)

    The first of the excellent Mistborn series, by Brandon Sanderson. Whether the first or the third in the series is the better title could be referred to the DRS. Sanderson is a master of the fantasy genre, and his Mistborn series is masterclass on how to write, and evolve, magic systems. Most fantasy readers will have already read this, I imagine, but if you’re a fantasy fan and you haven’t – this absolutely belongs on your list.

    Speaking of Sanderson, the start of 2021 was spent finishing the reading list I started in 2020: all the books that take place in his “Cosmere” universe.

    I was a bit fantasied out after that – so I switched to my preferred genre of Science Fiction. Of course, no science fiction fan can truly call themselves that without having read the godfather of the genre – Asimov. So I put down the second Dune novel (it was a struggle anyway), and picked up everything in Asimov’s Robot, Foundation, and Empire series. I’m not quite through yet (only a couple of Foundation novels left), but I expect to finish with Asimov in early 2022.

    Asimov has been great to read. Truly an all-time literary master. He can spin together sentences that drop your jaw with their simple complexity, and has created a “future history” that spans literally millions of years. Unfortunately, almost all his work is sullied by a distasteful misogyny that makes Asimov hard to recommend to a modern audience.

    I must be a sucker for this shared universe business – between the MCU, Sanderson, and Asimov that’s the vast majority of my input this year.

    ⭐️⭐️⭐️⭐️⭐️⭐️
    Elantris (Sanderson)The Well of Ascension (Sanderson)The Final Empire (Sanderson)
    White Sand Volumes 1—3 (Sanderson)Warbreaker (Sanderson)The Hero of Ages (Sanderson)
    The Complete Robot (Asimov)The Alloy of Law (Sanderson)Prelude to Foundation (Asimov)
    The Stars, Like Dust (Asimov)Shadows of Self (Sanderson)Forward the Foundation (Asimov)
    The Bands of Mourning (Sanderson)The Midnight Library (Haig)
    The Way Back (Shavit)
    Nine Tomorrows (Asimov)
    Caves of Steel (Asimov)
    Dawnshard (Sanderson)
    The Naked Sun (Asimov)
    Foundation (Asimov)
    I, Robot (Asimov)
    Pebble in the Sky (Asimov)
    The Currents of Space (Asimov)
    Foundation and Empire (Asimov)
    • 24 total books
    • That 2 per month!
    • 20 were audiobooks
    • If you allow for an average 15 hour read / listen per book, that’s 360 hours

    Total Titles
    Total Stars
    Total Hours

    I’ve been asked how I possibly have time for such a long list. The answer is simple: I don’t have any social media habits. No Twitter, no Reddit, and definitely no Facebook or Instagram.

    Looking forward, I’d like 2022 to include less TV, about the same amount of Film, and more Books (with a higher percentage of reading vs listening). I’d also like to use some of the extra time I’ve saved by cutting out a lot of television to do more creative work.

  • What the FLoC?

    The WordPress community has been discussing a proposal to force disable FLoC on all websites. Unfortunately, it doesn’t look like it will lead anywhere.

    Unlike the WordPress leadership, the EFF have strongly rejected FLoC due its privacy risks, and individualised profiling. The Brave browsers position is that FLoC “materially harms user privacy”, and the Vivaldi browser accuses FLoC of “unwittingly give away [user] privacy for the financial gain of Google”. DuckDuckGo went so far as to create a FLoC blocking browser extension.

    Google seems to be having a hard time explaining that FLoC really isn’t as bad as it seems. When asked about the implications of FLoC in a Make WordPress Core chat on Slack, all we heard from Google representatives was political hedging and links to websites that didn’t answer our questions. And here’s a Twitter thread with the Google Chrome Developer Relations Lead that’s a microcosm of that experience.

    Please, let’s put away the “FLoC tries to make advertising more private” argument. No. FLoC makes fingerprinting easier than ever, not harder – your cohort ID is just another data point to help pick you out of a crowd.

    Worse – FLoC reveals interest data to websites who already have your personally identifiable information (wherever you’ve signed up with your email address, for example). The inevitable outcome is that your interest data will at some point be made public. Imagine a world where dark web markets sell databases of email addresses linked to their interests and the URLs they’ve visited!

    The issues with FLoC extend far beyond privacy. You think Twitter bubbles are a problem now? FLoC enables an entire web that’s bubbled specifically for you. News sites could show alternate versions of articles based on your cohort. Community groups might limit new memberships based on your algorithmically defined interests. Ecommerce stores will change their prices based on the websites you’ve visited recently.

    If there’s one thing we’ve learned over the past decade, it’s that perverse incentives have a habit of leading to perverse outcomes. Nobody wants to trust Google, or any other company with a business model rooted in manipulating you with personalised advertisements. Nobody is falling for the “Interest-based Targeting” parlance. It’s just a poor attempt at rebranding “Personalised Ads” after years of bad press.

    John Gruber puts it perfectly:

    Just because there is now a multi-billion-dollar industry based on the abject betrayal of our privacy doesn’t mean the sociopaths who built it have any right whatsoever to continue getting away with it. They talk in circles but their argument boils down to entitlement: they think our privacy is theirs for the taking because they’ve been getting away with taking it without our knowledge, and it is valuable.

    Here’s an idea, Google. Stop planning the future of the web on Zoom calls with your advertising tech mates. There’s a simpler solution. Give browser users the ability to choose exactly who they want to share their data with, and for what purposes, rather than going behind our backs to be neatly arrange us into cohort clusters for advertisers to conveniently target.

    If Google cared about user data privacy, they’d give users the agency to choose when and where to share it. You’ll never see this mockup implemented in Chrome, because it undermines the real goal: to sell more ads.

    Information used for tracking must belong to the users whose behavior and interests are being tracked, not to Google or advertisers, no matter how anonymous the data is made to be. Data ownership means the right to say who gets what data and when, as well as understanding what it’s going to be used for and how long it will be held. That basic right is one which Google, and its ad-tech buddies, aren’t willing to grant.

    Algorithmic profiles powering personalised ads might be good for business, but they’re bad for the web.

  • Blue Yeti Shock Mount Ikea Hack

    I’ve been shopping around for a microphone arm and shock mount for my Blue Yeti mic. The cheap ones don’t support the weight of the Yeti, and the expensive ones are expensive.

    So instead, I hacked an IKEA TERTIAL Work Lamp ($15 AUD), and with a few extra pieces, created my own.

    Rather than assembling the lamp, I took to it with scissors, chopping of the bulb fixture and unthreading the power cable. Then I threaded the USB cable for the microphone, ready to plug in.

    Next, I got to the 3D printing. This mount from Thingiverse did the trick very nicely. To “float” the microphone in the shock mount, I just clipped in black hair ties!

    Unfortunately, the standard springs on the TERTIAL weren’t quite up to the weight. After a little trial and error, I found that replacing just one of the top springs with a C-143 size extension spring (14.3 x 76.2 x 1.372mm) provided the perfect balance.

    As a bonus, my mic stand is now the exact same shade of grey as the HEKTAR work lamp on my desk.

  • Phygital

    By day, my Product Design work is purely digital. I work in the limitless realm of Software.

    By night, I’ve been experimenting with Physical Product Design, modelling and 3D printing all sorts of useful widgets.

    The cross-over between Digital and Physical worlds is lots of fun.

    So when Lior, my 8 year old son, presented me with a drawing of a character he imagined, I had the idea to try to bring it to life as a physical object!

    Lior’s Pokémon inspired character, based on a sunken treasure chest.

    I’ve tried modelling on a pancake screen, and for really technical designs with precise tolerances, that works great. But when it comes to quickly bringing to life a unique, messy, interesting character, I jump into VR.

    Using the Valve Index and Microsoft Maquette, I 3D modeled Lior’s flat drawings. Modeling in VR is a game changer. It allows me to design spatially, physically moving around my room and around the character, drawing and shaping in three dimensions.

    Then I export the model, and open it in Blender, to clean up and properly scale.

    The result gets exported as an .stl file, and sliced by UPStudio, before being sent to my Upbox to be made real!

    For the finishing touch, I wanted to paint it. To help me know which colours to use, Lior recreated his original drawing on his iPad.

    I’m not the world’s greatest painter, but I gave it a good go. Here’s how it turned out!

  • Grainy-Day Portraits

    These B&W portraits were shot in 2014, using the 1969 Minolta Hi-Matic 5. They’re super grainy, and a bit scratched up / dusty. This is because I developed them myself, in my wardrobe!

  • Rainforest Road

    Switching camera now. The Minolta Maxxum 5. This film camera was released in 2001! Can you believe new film cameras were still being produced in the 2000s?

    These are some photos I shot at our Rainforest Rd property, back in 2013. Notice the bokeh here, the stock lens was really something.

  • Greek Islands

    Some snaps from our 2013 Greece trip. 1968 Konica C35.

    Really love the muted tones this film captured. It did a great job of capturing the sunset (bottom left) and dusk (bottom right) colours. And doesn’t Talia look so cool, sitting there in that ISO grain, framed with a spectacularly soft focus blur.

  • Carrara Marble

    I don’t know exactly what it is about this photo that I love so much. Maybe it’s the straight lines cut into the stone, reminiscent of the Bauhaus architecture we’d witnessed in Jerusalem.

    This is a photo of a portion of the marble quarry in Carrara, Italy. Taken in 2013 on a 1968 Konica C35.

    Carrara Marble Quarry
  • Jerusalem Stone

    Here is series of photos I took in 2013, exploring the streets of Jerusalem. A lot of the work is done by the beautiful grain of the 800 ISO film capturing stone textures. The camera: a Konica C35, made in 1968, which was my first ever analog camera.

  • One Word at a Time: Update

    An update on my previous post about writing: In the spirit of making small steps toward fiction writing confidence, I’ve published an excerpt of my (unedited) novel here on my blog.

    Viewing the excerpt requires a password. I guess I’m not yet brave enough to make it fully public.

    Anyone can figure the password out. It’s the three-letter name of one of the book’s characters (all uppercase). It’s also the first letter of each paragraph in this post.

  • Protected: Plan C

    This content is password protected. To view it please enter your password below: