PageSourceSearch

https://bwh.tech/blog/

html bwh.tech collected 2026-10-09 17:41:20 UTC 26,333 bytes, 24 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><!--
2  frappe-ui reads the active scheme off `[data-theme]` on <html>, not off a
3  media query, so the attribute has to be stamped before first paint or every
4  page flashes light. Contract matches frappe-ui's `useColorScheme`: the stored
5  preference is 'light' | 'dark' | 'system', and only the resolved value is
6  written to the attribute.
7-->
7<script>
8	(() => {
9		const stored = localStorage.getItem('theme');
10		const preference = stored === 'light' || stored === 'dark' ? stored : 'system';
11		const resolve = () =>
12			preference === 'system'
13				? matchMedia('(prefers-color-scheme: dark)').matches
14					? 'dark'
15					: 'light'
16				: preference;
17		document.documentElement.dataset.theme = resolve();
18		if (preference === 'system') {
19			matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
20				document.documentElement.dataset.theme = resolve();
21			});
22		}
23	})();
24</script>
24<meta name="generator" content="Astro v7.1.6"><meta name="description" content="Ideas, experiments, and practical lessons from building useful software."><meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"><meta name="theme-color" content="#171717" media="(prefers-color-scheme: dark)"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="alternate" type="application/rss+xml" title="BWH" href="https://bwh.tech/rss.xml"><link rel="canonical" href="https://bwh.tech/blog/"><title>Letters from BWH · BWH</title><meta property="og:type" content="website"><meta property="og:title" content="Letters from BWH · BWH"><meta property="og:description" content="Ideas, experiments, and practical lessons from building useful software."><meta property="og:url" content="https://bwh.tech/blog/"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Letters from BWH · BWH"><meta name="twitter:description" content="Ideas, experiments, and practical lessons from building useful software.">
24<script defer src="https://assets.onedollarstats.com/stonks.js"></script>
24<link rel="stylesheet" href="/_astro/BaseLayout.BEbllEvb.css"></head><body class="min-h-screen bg-surface-base text-ink-gray-9 antialiased"><a class="sr-only fixed left-3 top-3 z-50 rounded-4 bg-surface-base px-3 py-2 text-sm text-ink-gray-9 shadow focus:not-sr-only" href="#main-content">Skip to content</a><main id="main-content" class="mx-auto w-full max-w-[820px] px-4 pb-32 pt-14 sm:px-5 sm:pt-24"><section class="max-w-[770px]" aria-labelledby="page-title"><div class="flex items-center gap-3"><h1 id="page-title" class="text-4xl-semibold text-ink-gray-9">Letters from BWH</h1><a class="text-ink-gray-5 transition-colors hover:text-ink-gray-8" href="/rss.xml" aria-label="RSS feed" title="RSS feed"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 11a9 9 0 0 1 9 9"></path><path d="M4 4a16 16 0 0 1 16 16"></path><circle cx="5" cy="19" r="1"></circle></svg></a></div><p class="mt-3 max-w-2xl text-p-lg text-ink-gray-6">Read how we are solving it, with Frappe.</p></section><section class="mt-14 sm:mt-16" aria-label="Latest writing"><ul class="divide-y divide-outline-gray-1 border-y border-outline-gray-1"><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/announcements/commera-now-in-beta/"><img src="/_astro/og.B2eqi39x_1ve0Oj.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Commera, now in beta</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Open Source eCommerce Platform powered by ERPNext</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Announcements</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-09-28T00:00:00.000Z">28 Sept 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/tutorial/the-erpnext-upgrade-playbook/"><img src="/_astro/og.Bmde7AT7_1pr4oa.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">The ERPNext Upgrade Playbook</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">A comprehensive guide on how to upgrade an ERPNext instance through a major version.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Tutorial</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-09-17T00:00:00.000Z">17 Sept 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/stories/the-frappeverse-2026-experience/"><img src="/_astro/the-future.ycMxNVjL_Z28eA4G.webp" alt loading="lazy" decoding="async" width="352" height="264" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">The Frappeverse 2026 Experience</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">This changes everything.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Stories</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-08-24T00:00:00.000Z">24 Aug 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/tutorial/automating-stuff-with-donna/"><img src="/_astro/og.Cf3ZhyrF_1xTYPa.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Automating the boring stuff w/ OpenClaw &amp; ERPNext</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Learn how we automated our manual book-keeping and operational processes with an AI agent named Donna</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Tutorial</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-08-13T00:00:00.000Z">13 Aug 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/stories/how-i-became-a-computer-engineer/"><img src="/_astro/waiting-outside-the-computer-class.Rtu532xA_8J16m.webp" alt loading="lazy" decoding="async" width="352" height="235" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">How I Became a Computer Engineer</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">From sitting outside a coaching class as a kid, to writing backend code for a living. This is the full story, one computer at a time.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Stories</span> by <span class="text-ink-gray-5">Gajendra Nishad</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-08-12T00:00:00.000Z">12 Aug 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/engineering/webhook-retries-in-frappe/"><img src="/_astro/cover.bQi0oRLj_20Oswl.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Adding real retries to Frappe Framework Webhooks</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">A failed webhook used to vanish after three attempts in five seconds. This is the redesign, how the retries are scheduled and deduplicated, and a one-line bug that taught me more than the feature did.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Engineering</span> by <span class="text-ink-gray-5">Kaushal Shriwas</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-08-07T00:00:00.000Z">7 Aug 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/stories/how-i-became-a-developer/"><img src="/_astro/bhavesh-milan-friends-photo.DEIvdpn2_Z2nREQ6.webp" alt loading="lazy" decoding="async" width="352" height="264" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">From Being Afraid of Computers to Becoming a Software Developer</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">I feared computers so much I planned my whole life around avoiding them. Here&#39;s what changed.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Stories</span> by <span class="text-ink-gray-5">Vishwajeet Singh</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2026-07-30T00:00:00.000Z">30 Jul 2026</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/stories/how-i-ended-up-at-mini-frappe/"><img src="/_astro/whatsapp-image-2025-08-01-at-14-59-41.Ufxi2JKE_25UHsc.webp" alt loading="lazy" decoding="async" width="352" height="264" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">How I ended up @ Mini Frappe</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">I was on my way to pursue CA, but life had other plans. Few turns later, here I am, building something exciting with friends at BWH Studios.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Stories</span> by <span class="text-ink-gray-5">Shivam Ghosh</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2025-08-04T00:00:00.000Z">4 Aug 2025</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/announcements/introducing-bwh-studios/"><img src="/_astro/bwh-studios-blog.DOFNsljl_Z21At42.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Introducing BWH Studios</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Leaving Frappe, but not leaving Frappe.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Announcements</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2025-07-14T00:00:00.000Z">14 Jul 2025</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/stories/my-journey-from-django-to-frappe-framework/"><img src="/_astro/frame-1.DhKP12XA_274a96.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">My Journey from Django to Frappe Framework</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Sharing my journey and lessons learned.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Stories</span> by <span class="text-ink-gray-5">Rahul Agrawal</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2025-06-17T00:00:00.000Z">17 Jun 2025</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/thoughts/bwh-2024-recap/"><img src="/_astro/bwh-2024-thumbnail.FHi8z7w4_277aUl.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">BWH, 2024 recap.</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Let&#39;s recap the past year and imagine what is to come!</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Thoughts</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2025-01-08T00:00:00.000Z">8 Jan 2025</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/announcements/frappeverse-2024-top-10-announcements/"><img src="/_astro/fv-2024-top-10.NffDyy1l_Z1Qlnyv.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Frappeverse 2024: Top 10 Announcements!</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Amazing new products, existing products got more powerful, and more!</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Announcements</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2024-10-22T00:00:00.000Z">22 Oct 2024</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/tips-and-tricks/five-ui-ux-things/"><img src="/_astro/small-stuff-og.B5DVvu1D_Z1uvSF2.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">
245 Small UI/UX things</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Few of the small UI/UX lessons I picked up at Frappe that make a big difference.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Tips &amp; Tricks</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2024-04-23T00:00:00.000Z">23 Apr 2024</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/announcements/one-year/"><img src="/_astro/bwh-at-1.JY8FYnVn_ZNzxQa.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">BWH turns One.</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Quick thoughts on the new beginnings and what&#39;s ahead for BWH!</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Announcements</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2024-04-20T00:00:00.000Z">20 Apr 2024</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/thoughts/the-learn-apply-cycle/"><img src="/_astro/the-learn-apply-cycle.sRKvD5Bc_PDkJ1.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">The Learn-Apply Cycle</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">The shorter the Learn-Apply Cycle, the faster and better you grasp the concept.</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Thoughts</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2024-01-16T00:00:00.000Z">16 Jan 2024</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/tips-and-tricks/system-console-is-your-friend/"><img src="/_astro/system-console-meta.DWEoYc-C_Z2ajI2H.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">System Console Is Your Friend.</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Improve your iteration speed by starting in Console!</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Tips &amp; Tricks</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2023-12-21T00:00:00.000Z">21 Dec 2023</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/tutorial/clean-and-dry-templates-with-jinja-macros-filters-and-methods-in-frappe-framework/"><img src="/_astro/jinja_techniques_article_meta.BW1_KqEf_pxwta.webp" alt loading="lazy" decoding="async" width="352" height="198" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Clean and DRY Templates with Jinja Macros, Filters, and Methods in Frappe Framework</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Let&#39;s learn some Jinja techniques!</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Tutorial</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span>
24 <time datetime="2023-11-13T00:00:00.000Z">13 Nov 2023</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/tips-and-tricks/stop-using-get-doc-for-everything/"><img src="/_astro/su_get_doc_everything_meta.C8SQWreQ_11lpTW.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Stop using get_doc for everything!</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">Well, there are other methods too 😉</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Tips &amp; Tricks</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2023-09-26T00:00:00.000Z">26 Sept 2023</time></span></p></div></a></li><li><a class="group -mx-4 grid grid-cols-[6.5rem_minmax(0,1fr)] items-start gap-4 px-4 py-5 no-underline transition-colors hover:bg-surface-gray-1 sm:-mx-5 sm:grid-cols-[11rem_minmax(0,1fr)] sm:gap-6 sm:px-5 sm:py-6" href="/blog/announcements/top-10-announcements-from-frappeverse-2023/"><img src="/_astro/frappeverse-top-10-thumbnail.BrSdjQtA_Z1Y43su.webp" alt loading="lazy" decoding="async" width="352" height="185" class="aspect-video w-full rounded-6 border border-outline-gray-1 bg-surface-gray-1 object-cover"><div class="min-w-0 py-0.5 sm:py-1"><h2 class="text-lg-medium text-ink-gray-8 transition-colors group-hover:text-ink-gray-9 sm:text-2xl sm:font-medium">Top 10 Announcements from Frappeverse 2023</h2><p class="mt-2 line-clamp-2 text-p-sm text-ink-gray-5 sm:text-p-base">New Design System, New Products, New Features, and much more!</p><p class="mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-sm tabular-nums text-ink-gray-4"><span>In <span class="text-ink-gray-5">Announcements</span> by <span class="text-ink-gray-5">Hussain Nagaria</span></span><span class="whitespace-nowrap"><span aria-hidden="true">·</span> <time datetime="2023-09-19T00:00:00.000Z">19 Sept 2023</time></span></p></div></a></li></ul></section></main></body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.