splash image

Writings

debug

user: anonymous

{
  "path": "/blog",
  "attrs": {
    "name": "Jürgen Leschner",
    "splash": {
      "image": "/images/bridge.jpg"
    },
    "title": "Jürgen Leschner - Writings",
    "sortby": "date",
    "layout": "BlogListLayout"
  },
  "md": "# Writings",
  "html": "<h1>Writings</h1>\n",
  "dir": [
    {
      "path": "/blog/ai-chat-with-cloudflare-durable-objects",
      "attrs": {
        "title": "AI chat with Cloudflare Durable Objects",
        "date": "2024-11-19",
        "layout": "BlogPostLayout"
      },
      "next": {
        "href": "/blog/on-demand-rendering-with-cloudfare-workers",
        "text": "On-demand rendering with Cloudflare Workers"
      },
      "prev": {
        "href": "/blog/why-the-web-needs-better-html-editing-components",
        "text": "Why the Web needs better HTML editing components"
      }
    },
    {
      "path": "/blog/on-demand-rendering-with-cloudfare-workers",
      "attrs": {
        "title": "On-demand rendering with Cloudflare Workers",
        "date": "2024-11-18",
        "layout": "BlogPostLayout"
      },
      "next": {
        "href": "/blog/cloudflare-pages-level-up",
        "text": "Vision for Cloudflare Workers Assets bindings"
      },
      "prev": {
        "href": "/blog/ai-chat-with-cloudflare-durable-objects",
        "text": "AI chat with Cloudflare Durable Objects"
      }
    },
    {
      "path": "/blog/cloudflare-pages-level-up",
      "attrs": {
        "title": "Vision for Cloudflare Workers Assets bindings",
        "date": "2024-10-24",
        "layout": "BlogPostLayout",
        "splash": {
          "image": "/images/chimneys.webp"
        }
      },
      "next": {
        "href": "/blog/editor-experience",
        "text": "Editor Experience"
      },
      "prev": {
        "href": "/blog/on-demand-rendering-with-cloudfare-workers",
        "text": "On-demand rendering with Cloudflare Workers"
      }
    },
    {
      "path": "/blog/editor-experience",
      "attrs": {
        "title": "Editor Experience",
        "date": "2024-10-22",
        "layout": "BlogPostLayout",
        "splash": {
          "image": "/images/red-white-flower.jpg"
        }
      },
      "next": {
        "href": "/blog/routing-emails-through-a-cloudflare-worker",
        "text": "Routing emails through a Cloudflare Worker"
      },
      "prev": {
        "href": "/blog/cloudflare-pages-level-up",
        "text": "Vision for Cloudflare Workers Assets bindings"
      }
    },
    {
      "path": "/blog/routing-emails-through-a-cloudflare-worker",
      "attrs": {
        "title": "Routing emails through a Cloudflare Worker",
        "date": "2024-10-16",
        "layout": "BlogPostLayout",
        "splash": {
          "image": "/images/red-flower.webp"
        }
      },
      "next": {
        "href": "/blog/no-code-authentication-with-cloudflare-zero-trust-access",
        "text": "No-code authentication with Cloudflare Zero Trust"
      },
      "prev": {
        "href": "/blog/editor-experience",
        "text": "Editor Experience"
      }
    },
    {
      "path": "/blog/no-code-authentication-with-cloudflare-zero-trust-access",
      "attrs": {
        "title": "No-code authentication with Cloudflare Zero Trust",
        "layout": "BlogPostLayout",
        "splashimage": "/images/autumn.webp",
        "date": "2024-10-12"
      },
      "next": {
        "href": "/blog/read-write-static-asset-bindings-for-cloudflare-workers",
        "text": "Read-write Static Assets bindings for Cloudflare Workers"
      },
      "prev": {
        "href": "/blog/routing-emails-through-a-cloudflare-worker",
        "text": "Routing emails through a Cloudflare Worker"
      }
    },
    {
      "path": "/blog/read-write-static-asset-bindings-for-cloudflare-workers",
      "attrs": {
        "title": "Read-write Static Assets bindings for Cloudflare Workers",
        "date": "2024-10-03",
        "splashimage": "/images/berries.webp",
        "layout": "BlogPostLayout"
      },
      "next": {
        "href": "/blog/building-a-static-site-with-cloudflare-workers",
        "text": "Building a mimimal static site with Cloudflare Workers"
      },
      "prev": {
        "href": "/blog/no-code-authentication-with-cloudflare-zero-trust-access",
        "text": "No-code authentication with Cloudflare Zero Trust"
      }
    },
    {
      "path": "/blog/building-a-static-site-with-cloudflare-workers",
      "attrs": {
        "title": "Building a mimimal static site with Cloudflare Workers",
        "layout": "BlogPostLayout",
        "splash": {
          "image": "/images/minimal-static-site.jldec.workers.dev.webp"
        },
        "date": "2024-09-27"
      },
      "next": {
        "href": "/blog/wishlist-for-cloudflare-workers",
        "text": "Friday afternoon @CloudflareDev vibes"
      },
      "prev": {
        "href": "/blog/read-write-static-asset-bindings-for-cloudflare-workers",
        "text": "Read-write Static Assets bindings for Cloudflare Workers"
      }
    },
    {
      "path": "/blog/wishlist-for-cloudflare-workers",
      "attrs": {
        "title": "Friday afternoon @CloudflareDev vibes",
        "layout": "BlogPostLayout",
        "date": "2024-08-30"
      },
      "next": {
        "href": "/blog/getting-started-i18n-with-paraglide-and-fink",
        "text": "Getting started with SvelteKit and paraglide-js"
      },
      "prev": {
        "href": "/blog/building-a-static-site-with-cloudflare-workers",
        "text": "Building a mimimal static site with Cloudflare Workers"
      }
    },
    {
      "path": "/blog/getting-started-i18n-with-paraglide-and-fink",
      "attrs": {
        "title": "Getting started with SvelteKit and paraglide-js",
        "author": "Jürgen Leschner",
        "splash": {
          "image": "/images/airport.webp"
        },
        "date": "2024-01-08",
        "layout": "BlogPostLayout",
        "excerpt": "First steps enabling i18n on a SvelteKit project.\n"
      },
      "next": {
        "href": "/blog/the-web-is-for-everyone",
        "text": "The Web is for Everyone"
      },
      "prev": {
        "href": "/blog/wishlist-for-cloudflare-workers",
        "text": "Friday afternoon @CloudflareDev vibes"
      }
    },
    {
      "path": "/blog/the-web-is-for-everyone",
      "attrs": {
        "title": "The Web is for Everyone",
        "author": "Jürgen Leschner",
        "splash": {
          "image": "/images/the-web-is-for-everyone.webp"
        },
        "date": "2024-01-05",
        "layout": "BlogPostLayout",
        "excerpt": "_\"It is not enough for everyone to be able to access the Web...\nIt is also essential that people are able to contribute to the Web.\nAnd right now that is too hard\"_ -- Rich Harris\n"
      },
      "next": {
        "href": "/blog/zaui-release",
        "text": "Zaui, our npm-installable SvelteKit toolchain"
      },
      "prev": {
        "href": "/blog/getting-started-i18n-with-paraglide-and-fink",
        "text": "Getting started with SvelteKit and paraglide-js"
      }
    },
    {
      "path": "/blog/zaui-release",
      "attrs": {
        "title": "Zaui, our npm-installable SvelteKit toolchain",
        "author": "Jürgen Leschner",
        "splash": {
          "image": "/images/daisy.jpg"
        },
        "date": "2023-12-10",
        "layout": "BlogPostLayout",
        "excerpt": "We are pleased to announce the open source release of [zaui](https://github.com/zeroasiccorp/zaui), our npm-installable SvelteKit toolchain for building websites from markdown.\n"
      },
      "next": {
        "href": "/blog/getting-started-with-python-packaging",
        "text": "Getting started with Python Packaging"
      },
      "prev": {
        "href": "/blog/the-web-is-for-everyone",
        "text": "The Web is for Everyone"
      }
    },
    {
      "path": "/blog/getting-started-with-python-packaging",
      "attrs": {
        "alias": "/getting-started-with-python",
        "title": "Getting started with Python Packaging",
        "splash": {
          "image": "/images/rockford-office.jpg"
        },
        "date": "2023-02-22",
        "layout": "BlogPostLayout",
        "excerpt": "From zero to publishing a Python module on pypi.org."
      },
      "next": {
        "href": "/blog/what-is-git-lfs",
        "text": "What is git LFS?"
      },
      "prev": {
        "href": "/blog/zaui-release",
        "text": "Zaui, our npm-installable SvelteKit toolchain"
      }
    },
    {
      "path": "/blog/what-is-git-lfs",
      "attrs": {
        "title": "What is git LFS?",
        "splash": {
          "image": "/images/station-clouds.jpg"
        },
        "date": "2022-02-08",
        "layout": "BlogPostLayout",
        "excerpt": "Git large file storage or LFS is a way to store binaries outside your git repo, but still work with them as if they were part of the repo."
      },
      "next": {
        "href": "/blog/first-impressions-of-the-new-github-projects-beta",
        "text": "First impressions of the new GitHub Projects Beta"
      },
      "prev": {
        "href": "/blog/getting-started-with-python-packaging",
        "text": "Getting started with Python Packaging"
      }
    },
    {
      "path": "/blog/first-impressions-of-the-new-github-projects-beta",
      "attrs": {
        "title": "First impressions of the new GitHub Projects Beta",
        "splash": {
          "image": "/images/red-autumn-leaves.jpg"
        },
        "date": "2021-10-31",
        "layout": "BlogPostLayout",
        "excerpt": "Project tables are spreadsheet-like views where each row is a real or a draft issue. Beta Projects also support kanban views. Task lists and draft issues can be converted into real issues.\n"
      },
      "next": {
        "href": "/blog/using-gitpod-to-create-a-pr",
        "text": "Using Gitpod to create a PR"
      },
      "prev": {
        "href": "/blog/what-is-git-lfs",
        "text": "What is git LFS?"
      }
    },
    {
      "path": "/blog/using-gitpod-to-create-a-pr",
      "attrs": {
        "title": "Using Gitpod to create a PR",
        "splash": {
          "image": "/images/fields-of-clouds.jpg"
        },
        "date": "2021-10-24",
        "layout": "BlogPostLayout",
        "excerpt": "Gitpod hosts workspaces for developers. Each workspace is a Linux container running in the cloud, with a fully functional development environment, and an instance of VS Code which you can open in your browser.\n"
      },
      "next": {
        "href": "/blog/preventing-concurrent-github-actions",
        "text": "Preventing concurrent GitHub Actions"
      },
      "prev": {
        "href": "/blog/first-impressions-of-the-new-github-projects-beta",
        "text": "First impressions of the new GitHub Projects Beta"
      }
    },
    {
      "path": "/blog/preventing-concurrent-github-actions",
      "attrs": {
        "alias": "/serializing-github-actions-with-workers-durable-objects",
        "title": "Preventing concurrent GitHub Actions",
        "splash": {
          "image": "/images/rose.jpg"
        },
        "date": "2021-06-13",
        "layout": "BlogPostLayout",
        "excerpt": "Learn how the new concurrency group feature for GitHub Actions prevents concurrent workflows."
      },
      "next": {
        "href": "/blog/getting-started-with-go-part-3-goroutines-and-channels",
        "text": "Getting started with Goroutines and channels"
      },
      "prev": {
        "href": "/blog/using-gitpod-to-create-a-pr",
        "text": "Using Gitpod to create a PR"
      }
    },
    {
      "path": "/blog/getting-started-with-go-part-3-goroutines-and-channels",
      "attrs": {
        "title": "Getting started with Goroutines and channels",
        "splash": {
          "image": "/images/grape-hyacinth.jpg"
        },
        "date": "2021-04-25",
        "layout": "BlogPostLayout",
        "excerpt": "Part 3 in my learning Go series, focusing on concurrency with Goroutines and channels."
      },
      "next": {
        "href": "/blog/getting-started-with-go-part-2-pointers",
        "text": "Getting started with Go pointers"
      },
      "prev": {
        "href": "/blog/preventing-concurrent-github-actions",
        "text": "Preventing concurrent GitHub Actions"
      }
    },
    {
      "path": "/blog/getting-started-with-go-part-2-pointers",
      "attrs": {
        "title": "Getting started with Go pointers",
        "splash": {
          "image": "/images/ladybug.jpg"
        },
        "date": "2021-04-18",
        "layout": "BlogPostLayout",
        "excerpt": "Part 2 of my experience as a new user of Go."
      },
      "next": {
        "href": "/blog/getting-started-with-go",
        "text": "Getting started with Go"
      },
      "prev": {
        "href": "/blog/getting-started-with-go-part-3-goroutines-and-channels",
        "text": "Getting started with Goroutines and channels"
      }
    },
    {
      "path": "/blog/getting-started-with-go",
      "attrs": {
        "title": "Getting started with Go",
        "splash": {
          "image": "/images/church-blossoms.jpg"
        },
        "date": "2021-04-03",
        "layout": "BlogPostLayout",
        "excerpt": "The [Go](https://go.dev/) programming language has become an important tool for developers, particularly around platforms like Kubernetes and Docker.\n"
      },
      "next": {
        "href": "/blog/extracting-an-esm-module-from-a-deno-script",
        "text": "Extracting an ESM module from a Deno script"
      },
      "prev": {
        "href": "/blog/getting-started-with-go-part-2-pointers",
        "text": "Getting started with Go pointers"
      }
    },
    {
      "path": "/blog/extracting-an-esm-module-from-a-deno-script",
      "attrs": {
        "title": "Extracting an ESM module from a Deno script",
        "splash": {
          "image": "/images/persewide.jpg"
        },
        "date": "2021-03-21",
        "layout": "BlogPostLayout",
        "excerpt": "How to extract an ESM module so that it can also be used with Node.js or in the browser.\n\nWill the NPM ecosystem evolve to support nested ESM modules, or will some other organization, with a workable trust model, emerge to replace it?\n"
      },
      "next": {
        "href": "/blog/running-a-compiled-deno-script-in-a-github-action",
        "text": "Running a compiled Deno script in a GitHub Action"
      },
      "prev": {
        "href": "/blog/getting-started-with-go",
        "text": "Getting started with Go"
      }
    },
    {
      "path": "/blog/running-a-compiled-deno-script-in-a-github-action",
      "attrs": {
        "title": "Running a compiled Deno script in a GitHub Action",
        "splash": {
          "image": "/images/first-blossoms-2021.jpg"
        },
        "date": "2021-03-14",
        "layout": "BlogPostLayout",
        "excerpt": "In this post I enhance a GitHub Action to invoke the compiled scan.js Deno script which scans for broken links in generated HTML pages.\n"
      },
      "next": {
        "href": "/blog/getting-started-with-deno",
        "text": "Getting Started with Deno"
      },
      "prev": {
        "href": "/blog/extracting-an-esm-module-from-a-deno-script",
        "text": "Extracting an ESM module from a Deno script"
      }
    },
    {
      "path": "/blog/getting-started-with-deno",
      "attrs": {
        "title": "Getting Started with Deno",
        "splash": {
          "image": "/images/clouds-trees.jpg"
        },
        "date": "2021-02-28",
        "layout": "BlogPostLayout",
        "excerpt": "The [Deno](https://deno.land/) executable is built in Rust. While this may seem like an implementation detail, you could also describe Deno as a tool to embed JavaScript inside Rust programs.\n"
      },
      "next": {
        "href": "/blog/calling-rust-from-a-cloudflare-worker",
        "text": "Calling Rust from a Cloudflare Worker"
      },
      "prev": {
        "href": "/blog/running-a-compiled-deno-script-in-a-github-action",
        "text": "Running a compiled Deno script in a GitHub Action"
      }
    },
    {
      "path": "/blog/calling-rust-from-a-cloudflare-worker",
      "attrs": {
        "title": "Calling Rust from a Cloudflare Worker",
        "splash": {
          "image": "/images/moonbird.jpg"
        },
        "date": "2021-02-14",
        "layout": "BlogPostLayout",
        "excerpt": "How to build a Worker which calls a WebAssembly library written in Rust."
      },
      "next": {
        "href": "/blog/fun-with-vercel",
        "text": "Fun with Vercel"
      },
      "prev": {
        "href": "/blog/getting-started-with-deno",
        "text": "Getting Started with Deno"
      }
    },
    {
      "path": "/blog/fun-with-vercel",
      "attrs": {
        "title": "Fun with Vercel",
        "splash": {
          "image": "/images/library.jpg"
        },
        "date": "2021-02-07",
        "layout": "BlogPostLayout",
        "excerpt": "How I deployed [jldec.fun](https://jldec.fun/) using the [Vercel platform](https://vercel.com/docs).\n"
      },
      "next": {
        "href": "/blog/first-steps-using-cloudflare-pages",
        "text": "First steps using Cloudflare Pages"
      },
      "prev": {
        "href": "/blog/calling-rust-from-a-cloudflare-worker",
        "text": "Calling Rust from a Cloudflare Worker"
      }
    },
    {
      "path": "/blog/first-steps-using-cloudflare-pages",
      "attrs": {
        "title": "First steps using Cloudflare Pages",
        "splash": {
          "image": "/images/small-clouds.jpg"
        },
        "date": "2021-01-31",
        "layout": "BlogPostLayout",
        "excerpt": "This is a walkthrough of my first Cloudflare Pages (Beta) site, and a comparison with GitHub Pages."
      },
      "next": {
        "href": "/blog/migrating-from-cjs-to-esm",
        "text": "Migrating from CommonJS to ESM"
      },
      "prev": {
        "href": "/blog/fun-with-vercel",
        "text": "Fun with Vercel"
      }
    },
    {
      "path": "/blog/migrating-from-cjs-to-esm",
      "attrs": {
        "title": "Migrating from CommonJS to ESM",
        "splash": {
          "image": "/images/calm.jpg"
        },
        "date": "2021-01-23",
        "layout": "BlogPostLayout",
        "excerpt": "How to migrate from CommonJS to EcmaScript Modules."
      },
      "next": {
        "href": "/blog/forays-from-node-to-rust",
        "text": "Forays from Node to Rust"
      },
      "prev": {
        "href": "/blog/first-steps-using-cloudflare-pages",
        "text": "First steps using Cloudflare Pages"
      }
    },
    {
      "path": "/blog/forays-from-node-to-rust",
      "attrs": {
        "title": "Forays from Node to Rust",
        "splash": {
          "image": "/images/fog.jpg"
        },
        "date": "2021-01-10",
        "layout": "BlogPostLayout",
        "excerpt": "This article covers the experience of buiding my first Rust crate."
      },
      "next": {
        "href": "/blog/github-actions-101",
        "text": "GitHub Actions 101"
      },
      "prev": {
        "href": "/blog/migrating-from-cjs-to-esm",
        "text": "Migrating from CommonJS to ESM"
      }
    },
    {
      "path": "/blog/github-actions-101",
      "attrs": {
        "title": "GitHub Actions 101",
        "splash": {
          "image": "/images/snowy-boathouse.jpg"
        },
        "date": "2020-11-27",
        "layout": "BlogPostLayout",
        "excerpt": "Not so mysterious after all 😀"
      },
      "next": {
        "href": "/blog/a-web-for-everyone",
        "text": "A Web for Everyone"
      },
      "prev": {
        "href": "/blog/forays-from-node-to-rust",
        "text": "Forays from Node to Rust"
      }
    },
    {
      "path": "/blog/a-web-for-everyone",
      "attrs": {
        "title": "A Web for Everyone",
        "splash": {
          "image": "/images/oldstreet.jpg"
        },
        "date": "2019-08-08",
        "layout": "BlogPostLayout",
        "excerpt": "Creating an open Web where anyone can put anything on the Internet is the future."
      },
      "next": {
        "href": "/blog/why-serverless-at-the-edge",
        "text": "Why Serverless at the Edge?"
      },
      "prev": {
        "href": "/blog/github-actions-101",
        "text": "GitHub Actions 101"
      }
    },
    {
      "path": "/blog/why-serverless-at-the-edge",
      "attrs": {
        "title": "Why Serverless at the Edge?",
        "splash": {
          "image": "/images/wires.jpg"
        },
        "date": "2019-07-11",
        "layout": "BlogPostLayout",
        "excerpt": "What makes Serverless at the edge useful in ways that more-centralized cloud services are not?"
      },
      "next": {
        "href": "/blog/spring-boot-101",
        "text": "Spring Boot 101"
      },
      "prev": {
        "href": "/blog/a-web-for-everyone",
        "text": "A Web for Everyone"
      }
    },
    {
      "path": "/blog/spring-boot-101",
      "attrs": {
        "title": "Spring Boot 101",
        "splash": {
          "image": "/images/boot1.jpg"
        },
        "date": "2017-06-28",
        "layout": "BlogPostLayout",
        "excerpt": "Spring Beans are magic - but what's behind them and why are they called beans?"
      },
      "next": {
        "href": "/blog/why-the-web-needs-better-html-editing-components",
        "text": "Why the Web needs better HTML editing components"
      },
      "prev": {
        "href": "/blog/why-serverless-at-the-edge",
        "text": "Why Serverless at the Edge?"
      }
    },
    {
      "path": "/blog/why-the-web-needs-better-html-editing-components",
      "attrs": {
        "title": "Why the Web needs better HTML editing components",
        "splash": {
          "image": "/images/bridge.jpg"
        },
        "date": "2015-08-13",
        "layout": "BlogPostLayout",
        "excerpt": "HTML, and it's siblings like CSS, with all their power and sophistication, have become so complex, that they are impossible to edit by anyone except experts. So, what's the answer?\n\nHow do people write and publish content in HTML?\n"
      },
      "next": {
        "href": "/blog/ai-chat-with-cloudflare-durable-objects",
        "text": "AI chat with Cloudflare Durable Objects"
      },
      "prev": {
        "href": "/blog/spring-boot-101",
        "text": "Spring Boot 101"
      }
    }
  ]
}