[{"content":"I\u0026rsquo;ve been using Neovim for years. It\u0026rsquo;s fast, extensible, and there\u0026rsquo;s a plugin for everything. But lately (actually, for quite a while now), I\u0026rsquo;ve been experimenting with Zed, and I have some thoughts.\nWhy Zed caught my attention 🤩 Zed is fast. Like, really fast. But so is Neovim, so that\u0026rsquo;s not the selling point.\nWhat made me curious:\nSimpler config - No more debugging why a plugin broke after an update Great vim emulation - Actually usable, not an afterthought Built-in features - Remote dev via SSH, REPL integration, debugging - all just work AI integration - Native, not bolted on through five different plugins Collaborative coding - Finally, pair programming without screen sharing lag The development pace is impressive. New releases with meaningful content every week. And it\u0026rsquo;s open source.\nWhere Zed falls short (for now) 🥲 Moving from Neovim, there are gaps. Some are Zed-specific issues, others are missing plugin equivalents.\nDealbreakers for some:\nNo persistent undo history - Close a buffer, lose your undo history Fuzzy finder lacks power - Not Telescope-level yet, but there\u0026rsquo;s a promising PR Terminal is tied to the editor - New instance = lost terminal session. Not ideal for long-running processes Missing Neovim goodies:\nflash.nvim - Quick navigation is part of my muscle memory dial.nvim - Incrementing true to false with \u0026lt;C-a\u0026gt; is surprisingly useful cmp-calc / cmp-path - Calculator and path completion in the completion menu TODO comment highlighting Some language-specific plugins are better maintained in Neovim Polish needed:\nGit conflict resolution could be better No undo for file deletions Image previews don\u0026rsquo;t work in terminal apps like yazi No recent project search command Project search could use prefiltering (ctrl+g) and current directory scope Jupyter notebook integration would be nice The good news? Zed\u0026rsquo;s team ships fixes fast. Issues that annoyed me before are already resolved: window resize with keyboard, terminal splits, completion menu scrolling, diff view, slow Neovim in Zed terminal, and vim marks as bookmarks.\nThe real problem with Neovim 💔 It\u0026rsquo;s not Neovim itself. It\u0026rsquo;s the ecosystem.\nThe LazyVim distribution is great, but you\u0026rsquo;re at the mercy of individual plugin authors. Sometimes, for example, folke disappears for months - and he alone maintains the majority of plugins that most modern Neovim configurations depend on. One person maintaining critical infrastructure is a single point of failure. This is absolutely no shame on folke - he\u0026rsquo;s doing amazing work for free - but this is just how open source works.\nPlugin updates break things. You spend time maintaining your config instead of actually coding. Debugging and task running still feel like second-class citizens compared to IDEs.\nSome pain points that IDEs handle better:\nDebugging experience Collaborative coding UI flexibility (terminal constraints are real) Long-term maintenance by dedicated teams vs. solo maintainers My verdict 📔 Both are great. Both are fast. Both are open source.\nZed is easier to use and maintain. Neovim is more powerful and customizable.\nFor now, I\u0026rsquo;m using both. Doing quick edits still feels easier in Neovim. Zed when I want to spend a bigger chunk of time on a codebase. I try to keep my LazyVim and Zed keymaps similar, so I don\u0026rsquo;t have to think too much about which editor I\u0026rsquo;m using.\nThe best editor is the one that gets out of your way. Sometimes that\u0026rsquo;s Neovim. Sometimes it\u0026rsquo;s Zed.\nFor my configurations, check out:\nZed config Neovim config ","permalink":"https://joelazar.dev/posts/zed-vs-neovim/","summary":"\u003cp\u003eI\u0026rsquo;ve been using Neovim for years. It\u0026rsquo;s fast, extensible, and there\u0026rsquo;s a plugin for everything. But lately (actually, for quite a while now), I\u0026rsquo;ve been experimenting with \u003ca href=\"https://zed.dev/\"\u003eZed\u003c/a\u003e, and I have some thoughts.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"why-zed-caught-my-attention-\"\u003eWhy Zed caught my attention 🤩\u003c/h2\u003e\n\u003cp\u003eZed is \u003cstrong\u003efast\u003c/strong\u003e. Like, really fast. But so is Neovim, so that\u0026rsquo;s not the selling point.\u003c/p\u003e\n\u003cp\u003eWhat made me curious:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSimpler config\u003c/strong\u003e - No more debugging why a plugin broke after an update\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGreat vim emulation\u003c/strong\u003e - Actually usable, not an afterthought\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuilt-in features\u003c/strong\u003e - Remote dev via SSH, REPL integration, debugging - all just work\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAI integration\u003c/strong\u003e - Native, not bolted on through five different plugins\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollaborative coding\u003c/strong\u003e - Finally, pair programming without screen sharing lag\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe development pace is impressive. New releases with meaningful content every week. And it\u0026rsquo;s open source.\u003c/p\u003e","title":"Zed vs Neovim - A personal take"},{"content":"Last week I made a ⚡️ talk at Remix Copenhagen meetup. I thought I make a short blog post about the content if I already gather the material for it.\nThere is a mistake in this code. Can you find it? 🔍 import type { Note } from \u0026#39;@prisma/client\u0026#39;; import { useCatch, useLoaderData } from \u0026#39;@remix-run/react\u0026#39;; import type { LoaderFunction } from \u0026#39;@remix-run/server-runtime\u0026#39;; import { json } from \u0026#39;@remix-run/server-runtime\u0026#39;; import { prisma } from \u0026#39;~/db.server\u0026#39;; /* export type Note = { id: string title: string body: string createdAt: Date updatedAt: Date } */ type LoaderData = { notes: Note[]; }; export const loader: LoaderFunction = async () =\u0026gt; { const notes = await prisma.note.findMany({}); return json({ notes }); }; export default function Problem() { const { notes } = useLoaderData\u0026lt;LoaderData\u0026gt;(); return ( \u0026lt;\u0026gt; {notes.map((note) =\u0026gt; ( \u0026lt;div key={note.id} className=\u0026#34;p flex flex-auto flex-col p-4 sm:p-6 lg:p-8\u0026#34; \u0026gt; \u0026lt;h2 className=\u0026#34;text-2xl font-bold\u0026#34;\u0026gt;{note.title}\u0026lt;/h2\u0026gt; \u0026lt;ul className=\u0026#34;text-lg\u0026#34;\u0026gt; \u0026lt;li\u0026gt; Created at: {Intl.DateTimeFormat(\u0026#39;en-US\u0026#39;).format(note.createdAt)} \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt; Updated at: {Intl.DateTimeFormat(\u0026#39;en-US\u0026#39;).format(note.updatedAt)} \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;Body: {note.body}\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; ))} \u0026lt;/\u0026gt; ); } ⚠️ Solution The problem is with the following lines:\n\u0026lt;li\u0026gt; Created at: {Intl.DateTimeFormat(\u0026#34;en-US\u0026#34;).format(note.createdAt)} \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt; Updated at: {Intl.DateTimeFormat(\u0026#34;en-US\u0026#34;).format(note.updatedAt)} \u0026lt;/li\u0026gt; Here, note.createdAt and note.updatedAt will have the type string instead of Date.\nExplanation 📜 At page navigation The client gets the code-split bundle for that page, and at time same time, the loader for that route gets evaluated, which is a Fetch request to the server. The response body of that request will be encoded in JSON, so it has to be serializable. Date and some other types don\u0026rsquo;t have a native JSON representation.\n┌────────────┐ ┌─────────────┐ │ 🖥️ ◄───code split bundle───┤ ☁️ │ │ browser ◄───data from loader────┤ server │ └────────────┘ └─────────────┘ At full reload A full reload on the same route will do a full server render, and the data will be just embedded in the HTML. Loaders will be evaluated on the server side, but the data still has to be serializable there too.\n┌────────────┐ ┌─────────────┐ │ 🖥️ ◄───full code bundle────┤ ☁️ │ │ browser ◄────prefilled html─────┤ server │ └────────────┘ └─────────────┘ OK types ✅ string ✅ number ✅ boolean ✅ null ✅ Array ✅ Object Problematic types ❌ Date ❌ BigInt ❌ Set ❌ Map ❌ RegExp ❌ undefined ❌ Error ❌ NaN At least we get a linter warning since remix 1.6.5 How to solve it - stupid solution Convert the strings to Dates. For this type, it will work fine, as the Date\u0026rsquo;s constructor accepts strings:\n\u0026lt;li\u0026gt; Created at: {Intl.DateTimeFormat(\u0026#34;en-US\u0026#34;).format(new Date(note.createdAt))} \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt; Updated at: {Intl.DateTimeFormat(\u0026#34;en-US\u0026#34;).format(new Date(note.updatedAt))} \u0026lt;/li\u0026gt; However, there are types in which this method won\u0026rsquo;t work. We need a more generic solution for this.\nHow to solve it - the proper solution New features since remix 1.6.5 \u0026ldquo;We enhanced the type signatures of loader and useLoaderData to make it possible to infer the data type from the return type of its related server function. To enable this feature, you will need to use the LoaderArgs type from your Remix runtime package instead of typing the function directly:\u0026rdquo;\nimport type { LoaderFunction } from \u0026#39;@remix-run/[runtime]\u0026#39;; // --\u0026gt; import type { LoaderArgs } from \u0026#39;@remix-run/[runtime]\u0026#39;; export const loader: LoaderFunction = async (args) =\u0026gt; { return json\u0026lt;LoaderData\u0026gt;(data); }; // --\u0026gt; export async function loader(args: LoaderArgs) { return json(data); } \u0026ldquo;Then you can infer the loader data by using typeof loader as the type variable in useLoaderData:\nlet data = useLoaderData() as LoaderData; // --\u0026gt; let data = useLoaderData\u0026lt;typeof loader\u0026gt;(); With this change, you no longer need to manually define a LoaderData type (huge time and typo saver!), and we serialize all values so that useLoaderData can\u0026rsquo;t return types that are impossible over the network, such as Date objects or functions.\u0026rdquo;\nReference: Remix 1.6.5 release note\nremix-typedjson Drop in replacement for useLoaderData/json calls \u0026ndash;\u0026gt; it will automatically convert your non-serializable types back and forth.\nconst loaderData = useLoaderData\u0026lt;typeof loader\u0026gt;(); // --\u0026gt; const loaderData = useTypedLoaderData\u0026lt;typeof loader\u0026gt;(); and\nreturn json({...}) // --\u0026gt; return typedjson({...}) Adding these two together:\nimport type { LoaderArgs } from \u0026#39;@remix-run/server-runtime\u0026#39;; import { typedjson, useTypedLoaderData } from \u0026#39;remix-typedjson\u0026#39;; import { prisma } from \u0026#39;~/db.server\u0026#39;; export const loader = async (_: LoaderArgs) =\u0026gt; { const notes = await prisma.note.findMany({}); return typedjson({ notes }); }; export default function Problem() { const { notes } = useTypedLoaderData\u0026lt;typeof loader\u0026gt;(); return ( \u0026lt;\u0026gt; {notes.map((note) =\u0026gt; ( \u0026lt;div key={note.id} className=\u0026#34;p flex flex-auto flex-col p-4 sm:p-6 lg:p-8\u0026#34; \u0026gt; \u0026lt;h2 className=\u0026#34;text-2xl font-bold \u0026#34;\u0026gt;{note.title}\u0026lt;/h2\u0026gt; \u0026lt;ul className=\u0026#34;text-lg\u0026#34;\u0026gt; \u0026lt;li\u0026gt; Created at: {Intl.DateTimeFormat(\u0026#39;en-US\u0026#39;).format(note.createdAt)} \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt; Updated at: {Intl.DateTimeFormat(\u0026#39;en-US\u0026#39;).format(note.updatedAt)} \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;Body: {note.body}\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; ))} \u0026lt;/\u0026gt; ); } This works now as we are sending a __meta__ object with the original JSON content, so on the client side the necessary data could be converted to the right type.\nWhat about other Remix API? Actions and fetchers are affected as well, but remix-typedjson handles them.\nconst actionData = useTypedActionData\u0026lt;typeof action\u0026gt;(); and\nconst fetcher = useTypedFetcher\u0026lt;typeof action\u0026gt;(); Could it be solved with superjson? Yes, of course.\nimport { deserialize, serialize } from \u0026#34;superjson\u0026#34;; ... export const loader: LoaderFunction = async () =\u0026gt; { const notes = await prisma.note.findMany({}); return json(serialize({ notes })); }; export default function Problem() { const { notes } = deserialize( useLoaderData() as SuperJSONResult ) as LoaderData; ... } However, remix-typesjson\u0026rsquo;s API is much more comfortable to use, not to mention that it\u0026rsquo;s faster and more lightweight than superjson.\nLink for the presentation and code examples.\n","permalink":"https://joelazar.dev/posts/lost-in-translation/","summary":"\u003cp\u003eLast week I made a ⚡️ talk at \u003ca href=\"https://www.meetup.com/remix-copenhagen/events/285981900/\"\u003eRemix Copenhagen\u003c/a\u003e meetup. I thought I make a short blog post about the content if I already gather the material for it.\u003c/p\u003e\n\u003cfigure class=\"center-aligned\"\u003e\n    \u003cimg loading=\"lazy\" src=\"/lost-in-translation/lost_in_translation.gif\"\n         alt=\"Lost in translation movie\"/\u003e \n\u003c/figure\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"there-is-a-mistake-in-this-code-can-you-find-it-\"\u003eThere is a mistake in this code. Can you find it? 🔍\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eNote\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@prisma/client\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003euseCatch\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003euseLoaderData\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@remix-run/react\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eLoaderFunction\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@remix-run/server-runtime\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@remix-run/server-runtime\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003eprisma\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;~/db.server\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eexport type Note = {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e  id: string\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e  title: string\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e  body: string\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e  createdAt: Date\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e  updatedAt: Date\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003eLoaderData\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003enotes\u003c/span\u003e: \u003cspan class=\"kt\"\u003eNote\u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eloader\u003c/span\u003e: \u003cspan class=\"kt\"\u003eLoaderFunction\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003enotes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003eprisma\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efindMany\u003c/span\u003e\u003cspan class=\"p\"\u003e({});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003enotes\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eProblem() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003enotes\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003euseLoaderData\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eLoaderData\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003enotes\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003ekey\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"na\"\u003eclassName\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;p flex flex-auto flex-col p-4 sm:p-6 lg:p-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e \u003cspan class=\"na\"\u003eclassName\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-2xl font-bold\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;{\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh2\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e \u003cspan class=\"na\"\u003eclassName\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text-lg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"nx\"\u003eCreated\u003c/span\u003e \u003cspan class=\"nx\"\u003eat\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eIntl\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDateTimeFormat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;en-US\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreatedAt\u003c/span\u003e\u003cspan class=\"p\"\u003e)}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"nx\"\u003eUpdated\u003c/span\u003e \u003cspan class=\"nx\"\u003eat\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eIntl\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDateTimeFormat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;en-US\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdatedAt\u003c/span\u003e\u003cspan class=\"p\"\u003e)}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eBody\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003enote\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eli\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e))}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026lt;/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"-solution\"\u003e⚠️ Solution\u003c/h2\u003e\n\u003cp\u003eThe problem is with the following lines:\u003c/p\u003e","title":"Lost in translation - Remix edition"},{"content":"Finally, I managed to update my dotfiles today and change for chezmoi for managing them properly. It took a bit of time, but I\u0026rsquo;m pleased with the result now. If you are interested, you can find them here.\n","permalink":"https://joelazar.dev/posts/second-post/","summary":"\u003cp\u003eFinally, I managed to update my dotfiles today and change for \u003ca href=\"https://github.com/twpayne/chezmoi\"\u003echezmoi\u003c/a\u003e for managing them properly. It took a bit of time, but I\u0026rsquo;m pleased with the result now. If you are interested, you can find them \u003ca href=\"https://git.io/joedotfiles\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"wallpaper\" loading=\"lazy\" src=\"/wallpaper.png\"\u003e\u003c/p\u003e","title":"Refactored dotfiles"},{"content":"I guess my first post should be something funny so here is one pic of my sleeping dogs. I hope my next post will be something more useful though :)\n","permalink":"https://joelazar.dev/posts/first-post-with-my-dogs/","summary":"\u003cp\u003eI guess my first post should be something funny so here is one pic of my sleeping dogs. I hope my next post will be something more useful though :)\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Bükk and Picúr\" loading=\"lazy\" src=\"/sleeping_dogs.jpg\"\u003e\u003c/p\u003e","title":"My first post"}]