<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Gift Egwuenu</title><description>Developer Advocate and Content Creator</description><link>https://giftegwuenu.com/</link><item><title>Migrating My Blog to Astro 6</title><link>https://giftegwuenu.com/migrating-to-astro-6/</link><guid isPermaLink="true">https://giftegwuenu.com/migrating-to-astro-6/</guid><description>Astro 6 just dropped and I migrated my blog. Here&apos;s what changed, what I love, and how I did it.</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://astro.build/blog/astro-6/&quot;&gt;Astro 6&lt;/a&gt; just dropped and I couldn&apos;t resist upgrading my blog right away. I&apos;ve been running on Astro 5.16 for a while and the release notes had a few features that caught my eye immediately. Let me walk you through the migration, what stood out, and the features I&apos;m most excited about.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Migrated from Astro 5.16 to Astro 6 in about an hour.&lt;/li&gt;
&lt;li&gt;The biggest wins for me: &lt;strong&gt;first-class Cloudflare support&lt;/strong&gt; (migrated from Pages to Workers and consolidated a standalone likes API into the main codebase) and the &lt;strong&gt;built-in Fonts API&lt;/strong&gt; (goodbye render-blocking Google Fonts imports).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Content Collections&lt;/strong&gt; are now stable, bringing request-time content fetching to Astro&apos;s content layer.&lt;/li&gt;
&lt;li&gt;Zod now imports from &lt;code&gt;astro/zod&lt;/code&gt; instead of &lt;code&gt;astro:content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enabled &lt;strong&gt;experimental queued rendering&lt;/strong&gt; for faster builds.&lt;/li&gt;
&lt;li&gt;Zero errors on the first build. Smoothest major version upgrade I&apos;ve done with Astro.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Features I&apos;m Loving&lt;/h2&gt;
&lt;h3&gt;First-Class Cloudflare Support&lt;/h3&gt;
&lt;p&gt;This is the big one for me. I was previously deploying my blog to Cloudflare Pages with the old &lt;code&gt;@astrojs/cloudflare&lt;/code&gt; adapter. It worked, but the dev experience had rough edges: the adapter didn&apos;t run &lt;code&gt;workerd&lt;/code&gt; locally, so I was always testing against Node.js and hoping nothing broke in production. I also had a per-post like counter running as a separate Worker with its own wrangler config and deployment pipeline. It was a small API, but maintaining it as a standalone project just to increment a number felt like overkill.&lt;/p&gt;
&lt;p&gt;With Astro 6, the rebuilt adapter now runs &lt;code&gt;workerd&lt;/code&gt; at every stage: dev, prerender, and production. That gave me the confidence to migrate the blog from Pages to Workers. I consolidated that standalone likes API directly into the Astro project. One codebase, one deployment, full access to bindings during development. It&apos;s the setup I always wanted.&lt;/p&gt;
&lt;h3&gt;Built-in Fonts API&lt;/h3&gt;
&lt;p&gt;This is the other feature I was really excited about. Before Astro 6, I was loading Inter and JetBrains Mono via Google Fonts &lt;code&gt;@import&lt;/code&gt; in my CSS. This is render-blocking, sends user data to Google, and honestly just feels wrong for a static site that cares about performance.&lt;/p&gt;
&lt;p&gt;Now I just configure fonts directly in &lt;code&gt;astro.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
	fonts: [
		{
			provider: fontProviders.google(),
			name: &quot;Inter&quot;,
			cssVariable: &quot;--font-inter&quot;,
			weights: [400, 500, 600, 700],
			styles: [&quot;normal&quot;],
			fallbacks: [&quot;sans-serif&quot;],
		},
		{
			provider: fontProviders.google(),
			name: &quot;JetBrains Mono&quot;,
			cssVariable: &quot;--font-jetbrains-mono&quot;,
			weights: [400, 500],
			styles: [&quot;normal&quot;],
			fallbacks: [&quot;monospace&quot;],
		},
	],
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then add a `` component in my layout&apos;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---

---

&amp;lt;head&amp;gt;
	
	
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Astro downloads the fonts at build time, generates optimized fallbacks, and serves them from my domain. No more third-party requests. No more render-blocking imports. The fonts are just there, and they&apos;re fast.&lt;/p&gt;
&lt;h3&gt;Experimental Queued Rendering&lt;/h3&gt;
&lt;p&gt;My blog has 25+ posts with OG image generation for each one, so build performance matters. The new queued rendering replaces Astro&apos;s recursive rendering with a two-pass approach: first traverse the component tree, then render it in order. Early benchmarks show up to 2x faster rendering.&lt;/p&gt;
&lt;p&gt;Enabling it is just a config flag:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
	experimental: {
		queuedRendering: {
			enabled: true,
		},
	},
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&apos;ve enabled this and I&apos;m curious to see how it performs as I add more content.&lt;/p&gt;
&lt;h3&gt;Live Content Collections&lt;/h3&gt;
&lt;p&gt;Live Content Collections are now stable in Astro 6. Content collections have always required a rebuild when content changed. Live collections flip that: they fetch content at request time using &lt;code&gt;defineLiveCollection()&lt;/code&gt; and &lt;code&gt;getLiveEntry()&lt;/code&gt;, with no rebuild needed. Your content updates the moment it&apos;s published.&lt;/p&gt;
&lt;p&gt;You define a live collection in &lt;code&gt;src/live.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;



const updates = defineLiveCollection({
	loader: cmsLoader({ apiKey: process.env.MY_API_KEY }),
	schema: z.object({
		slug: z.string(),
		title: z.string(),
		excerpt: z.string(),
		publishedAt: z.coerce.date(),
	}),
});

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then query it in your page with built-in error handling:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---


const { entry: update, error } = await getLiveEntry(&quot;updates&quot;, Astro.params.slug);

if (error || !update) {
	return Astro.redirect(&quot;/404&quot;);
}
---

&amp;lt;h1&amp;gt;{update.data.title}&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;{update.data.excerpt}&amp;lt;/p&amp;gt;
&amp;lt;time&amp;gt;{update.data.publishedAt.toDateString()}&amp;lt;/time&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&apos;m not using this yet since my blog posts are all Markdown files in the repo, but now that I&apos;m running on Workers with full binding access, I can see pairing this with a CMS or D1-backed content source down the line. The fact that live and build-time collections use the same APIs (&lt;code&gt;getCollection()&lt;/code&gt;, &lt;code&gt;getEntry()&lt;/code&gt;, schemas, loaders) makes it easy to adopt incrementally.&lt;/p&gt;
&lt;h3&gt;Zod 4&lt;/h3&gt;
&lt;p&gt;The Zod upgrade is mostly invisible if your schemas are straightforward. The main change is where you import it from. Instead of importing &lt;code&gt;z&lt;/code&gt; from &lt;code&gt;astro:content&lt;/code&gt;, you now import it from &lt;code&gt;astro/zod&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you&apos;re using &lt;code&gt;.default()&lt;/code&gt; with &lt;code&gt;.transform()&lt;/code&gt;, check the &lt;a href=&quot;https://zod.dev/v4/changelog&quot;&gt;Zod 4 changelog&lt;/a&gt; because the behavior around default values changed.&lt;/p&gt;
&lt;h2&gt;How I Migrated&lt;/h2&gt;
&lt;p&gt;The actual migration took about an hour. Here&apos;s the rough process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Created a branch.&lt;/strong&gt; Always migrate on a separate branch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ran &lt;code&gt;pnpm dlx @astrojs/upgrade&lt;/code&gt;.&lt;/strong&gt; This handles the package version bumps automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updated Zod imports.&lt;/strong&gt; &lt;code&gt;z&lt;/code&gt; from &lt;code&gt;astro/zod&lt;/code&gt; instead of &lt;code&gt;astro:content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrated fonts.&lt;/strong&gt; Removed Google Fonts &lt;code&gt;@import&lt;/code&gt;, configured the new Fonts API, added `` to my layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrated from Pages to Workers.&lt;/strong&gt; Switched to the rebuilt &lt;code&gt;@astrojs/cloudflare&lt;/code&gt; adapter and consolidated my standalone likes API Worker into the Astro project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enabled experimental features.&lt;/strong&gt; Queued rendering for faster builds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built and tested.&lt;/strong&gt; &lt;code&gt;pnpm build&lt;/code&gt; + &lt;code&gt;pnpm check&lt;/code&gt;, zero errors on the first try.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What I&apos;m Planning Next&lt;/h2&gt;
&lt;p&gt;Now that I&apos;m on Astro 6, there are a few things I want to explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Live Content Collections with a CMS.&lt;/strong&gt; Now that I&apos;m on Workers with full binding access, I want to pair live collections with a headless CMS so content updates go live without a rebuild.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive images.&lt;/strong&gt; Astro&apos;s image handling keeps getting better and I&apos;m not using &lt;code&gt;srcset&lt;/code&gt;/&lt;code&gt;sizes&lt;/code&gt; anywhere yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View Transitions.&lt;/strong&gt; I&apos;ve been putting this off, but Astro&apos;s `` has matured a lot since it was introduced.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind v4.&lt;/strong&gt; The &lt;code&gt;@astrojs/tailwind&lt;/code&gt; integration works fine for now, but Tailwind v4 with its native Vite plugin is the future.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re still on Astro 5, I&apos;d recommend giving the upgrade a try. The migration path is smooth and the new features are worth it. Have you upgraded yet? I&apos;d love to hear how it went.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://astro.build/blog/astro-6/&quot;&gt;Astro 6 announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/upgrade-to/v6/&quot;&gt;Astro 6 upgrade guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/fonts/&quot;&gt;Fonts guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot;&gt;Content collections guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zod.dev/v4/changelog&quot;&gt;Zod 4 changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Setting Up a Custom Email with Zoho Mail and Cloudflare</title><link>https://giftegwuenu.com/custom-email-zoho-cloudflare/</link><guid isPermaLink="true">https://giftegwuenu.com/custom-email-zoho-cloudflare/</guid><description>Learn how to set up a professional custom email address using Zoho Mail&apos;s free tier with your domain hosted on Cloudflare.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve always wanted a professional email address for my domain - something like hello@giftegwuenu.com instead of a generic Gmail address.&lt;/p&gt;
&lt;p&gt;I&apos;ve tried using &lt;a href=&quot;https://developers.cloudflare.com/email-routing/&quot;&gt;Cloudflare Email Routing&lt;/a&gt; in the past, and while it works great for forwarding emails to your personal inbox, I was missing having an actual custom mailbox - a dedicated inbox where I could send and receive emails as my custom address.&lt;/p&gt;
&lt;p&gt;After exploring a few options, I landed on &lt;a href=&quot;https://www.zoho.com/mail/&quot;&gt;Zoho Mail&lt;/a&gt;. Here&apos;s how I set it up with my Cloudflare-hosted domain.&lt;/p&gt;
&lt;h2&gt;Why Zoho Mail?&lt;/h2&gt;
&lt;p&gt;There are several providers for custom domain email - Google Workspace, Microsoft 365, Fastmail, and more. I chose Zoho Mail for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free tier available&lt;/strong&gt; - Up to 5 users with 5GB storage each&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean interface&lt;/strong&gt; - Modern UI without the clutter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy-focused&lt;/strong&gt; - No ads, even on the free tier&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Good deliverability&lt;/strong&gt; - Emails actually land in inboxes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re a freelancer, creator, or just want a professional email without paying monthly fees, Zoho&apos;s free tier is hard to beat.&lt;/p&gt;
&lt;h2&gt;What You&apos;ll Need&lt;/h2&gt;
&lt;p&gt;Before we start, make sure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A domain name (I&apos;m using my domain)&lt;/li&gt;
&lt;li&gt;Access to your Cloudflare DNS dashboard (or if your domain is hosted elsewhere, access to that dashboard to change DNS settings)&lt;/li&gt;
&lt;li&gt;About 15-20 minutes of your time&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign Up for Zoho Mail&lt;/h2&gt;
&lt;p&gt;Head to &lt;a href=&quot;https://www.zoho.com/mail/&quot;&gt;Zoho Mail&lt;/a&gt; and click &quot;Sign Up Free&quot;. Choose the &lt;strong&gt;Personal email&lt;/strong&gt; which includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Up to 5 users&lt;/li&gt;
&lt;li&gt;5GB storage per user&lt;/li&gt;
&lt;li&gt;Web access + mobile apps&lt;/li&gt;
&lt;li&gt;Email hosting for one domain&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During signup, you&apos;ll enter your domain name and the email address you want to create (e.g., hello@giftegwuenu.com).&lt;/p&gt;
&lt;p&gt;After signing up, head over to the Zoho admin panel.&lt;/p&gt;
&lt;h2&gt;Step 2: Verify Domain Ownership (One-Click Method)&lt;/h2&gt;
&lt;p&gt;Zoho needs to confirm you own the domain. The good news is that Zoho offers a &lt;strong&gt;one-click verification&lt;/strong&gt; method that makes this incredibly easy. If you use one-click verification, you can also configure your MX, SPF, and DKIM records using the same method - no manual DNS editing required!&lt;/p&gt;
&lt;h3&gt;Using One-Click Verification (Recommended)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the Zoho setup wizard, look for the &lt;strong&gt;One-click verification&lt;/strong&gt; option&lt;/li&gt;
&lt;li&gt;Authenticate with your DNS provider (Cloudflare, in my case)&lt;/li&gt;
&lt;li&gt;Zoho will automatically add the verification TXT record to your domain&lt;/li&gt;
&lt;li&gt;Once verified, you can use the same one-click method for MX, SPF, and DKIM records&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the method I used, and it took less than a minute to configure everything. Zoho handles all the DNS record creation for you.&lt;/p&gt;
&lt;h3&gt;Manual Method (If One-Click Isn&apos;t Available)&lt;/h3&gt;
&lt;p&gt;If one-click verification isn&apos;t available for your DNS provider, you can add the records manually. Zoho will give you a verification code that looks something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;zoho-verification=zb12345678.zmverify.zoho.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add this TXT record in Cloudflare:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to your &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;Cloudflare dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Select your domain&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;DNS&lt;/strong&gt; &amp;gt; &lt;strong&gt;Records&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add record&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Configure the record:&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;zoho-verification=zb12345678.zmverify.zoho.com&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; and head back to Zoho to verify. It usually takes a few minutes for DNS to propagate.&lt;/p&gt;
&lt;h2&gt;Step 3: Configure MX Records&lt;/h2&gt;
&lt;p&gt;If you used one-click verification, you can configure MX records the same way - just click the button and Zoho handles it automatically.&lt;/p&gt;
&lt;p&gt;For manual configuration, MX (Mail Exchange) records tell the internet where to deliver emails for your domain. This is the most important step.&lt;/p&gt;
&lt;p&gt;In Cloudflare, add the following MX records:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Mail server&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;mx.zoho.com&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;mx2.zoho.com&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;mx3.zoho.com&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The priority numbers matter - lower numbers have higher priority. If the primary server (mx.zoho.com) is unavailable, email routes to the backup servers.&lt;/p&gt;
&lt;h2&gt;Step 4: Set Up SPF Record&lt;/h2&gt;
&lt;p&gt;Again, if you used one-click verification, Zoho can add this automatically for you.&lt;/p&gt;
&lt;p&gt;SPF (Sender Policy Framework) helps prevent email spoofing by specifying which servers can send email on behalf of your domain.&lt;/p&gt;
&lt;p&gt;For manual setup, add this TXT record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;v=spf1 include:zoho.com ~all&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you already have an SPF record (maybe from another service), don&apos;t create a duplicate. Instead, merge them:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 include:zoho.com include:other-service.com ~all
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 5: Configure DKIM&lt;/h2&gt;
&lt;p&gt;One-click verification supports DKIM too! If you&apos;re doing it manually, here&apos;s how:&lt;/p&gt;
&lt;p&gt;DKIM (DomainKeys Identified Mail) adds a digital signature to your emails, proving they came from your domain. This improves deliverability significantly.&lt;/p&gt;
&lt;p&gt;In Zoho Mail:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Admin Console&lt;/strong&gt; &amp;gt; &lt;strong&gt;Email Authentication&lt;/strong&gt; &amp;gt; &lt;strong&gt;DKIM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Selector&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Zoho will generate a TXT record value for you&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Add the DKIM record in Cloudflare:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;zmail._domainkey&lt;/td&gt;
&lt;td&gt;v=DKIM1; k=rsa; p=MIGfMA0GCS... (your key)&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The selector name might be different (like &lt;code&gt;default._domainkey&lt;/code&gt; or &lt;code&gt;zoho._domainkey&lt;/code&gt;) - use whatever Zoho provides.&lt;/p&gt;
&lt;h2&gt;Step 6: Add DMARC Record (Optional but Recommended)&lt;/h2&gt;
&lt;p&gt;DMARC ties SPF and DKIM together and tells receiving servers what to do with emails that fail authentication.&lt;/p&gt;
&lt;p&gt;Add this TXT record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;_dmarc&lt;/td&gt;
&lt;td&gt;v=DMARC1; p=none; rua=mailto:hello@giftegwuenu.com&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;p=none&lt;/code&gt; policy means you&apos;re just monitoring for now. Once you&apos;re confident everything works, you can change it to &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Final DNS Configuration&lt;/h2&gt;
&lt;p&gt;Here&apos;s what your Cloudflare DNS records should look like when you&apos;re done:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# MX Records
@    MX    mx.zoho.com     10
@    MX    mx2.zoho.com    20
@    MX    mx3.zoho.com    50

# TXT Records
@              TXT    zoho-verification=zb12345678.zmverify.zoho.com
@              TXT    v=spf1 include:zoho.com ~all
zmail._domainkey    TXT    v=DKIM1; k=rsa; p=MIGfMA0GCS...
_dmarc         TXT    v=DMARC1; p=none; rua=mailto:hello@giftegwuenu.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Testing Your Setup&lt;/h2&gt;
&lt;p&gt;Once everything is configured:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Send a test email&lt;/strong&gt; from your new address to a Gmail account&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check email headers&lt;/strong&gt; - Look for SPF=pass and DKIM=pass&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a testing tool&lt;/strong&gt; like &lt;a href=&quot;https://www.mail-tester.com/&quot;&gt;mail-tester.com&lt;/a&gt; to check your deliverability score&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If SPF or DKIM fails, double-check your DNS records and wait for propagation (can take up to 48 hours, though usually much faster).&lt;/p&gt;
&lt;h2&gt;Accessing Your Email&lt;/h2&gt;
&lt;p&gt;You can access your Zoho Mail through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web:&lt;/strong&gt; &lt;a href=&quot;https://mail.zoho.com&quot;&gt;mail.zoho.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mobile:&lt;/strong&gt; Zoho Mail app for iOS/Android&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desktop client:&lt;/strong&gt; Configure IMAP/SMTP in your preferred email client&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IMAP/SMTP Settings&lt;/h3&gt;
&lt;p&gt;If you want to use a desktop client like Apple Mail or Thunderbird, here are the settings. Note that IMAP/POP access requires a paid Zoho plan, so if you&apos;re optimizing for free, you&apos;ll want to stick with the web and mobile apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Incoming (IMAP):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server: imap.zoho.com&lt;/li&gt;
&lt;li&gt;Port: 993&lt;/li&gt;
&lt;li&gt;Security: SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Outgoing (SMTP):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server: smtp.zoho.com&lt;/li&gt;
&lt;li&gt;Port: 465&lt;/li&gt;
&lt;li&gt;Security: SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Setting up a custom email might seem intimidating at first, but Zoho&apos;s one-click verification makes it incredibly straightforward - you can have everything configured in minutes without touching DNS records manually. Even if you go the manual route, it&apos;s really just a matter of adding a few DNS records. With Zoho&apos;s free tier and Cloudflare&apos;s DNS management, you get a professional email setup without any monthly costs.&lt;/p&gt;
&lt;p&gt;Now when I send emails from hello@giftegwuenu.com, they land in inboxes properly authenticated. That&apos;s a win!&lt;/p&gt;
&lt;p&gt;Have you set up custom email for your domain? I&apos;d love to hear what provider you chose and why.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zoho.com/mail/help/adminconsole/configure-email-delivery.html&quot;&gt;Zoho Mail Setup Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/dns/&quot;&gt;Cloudflare DNS Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.spfwizard.net/&quot;&gt;SPF Record Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dmarc.org/&quot;&gt;DMARC Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mail-tester.com/&quot;&gt;Mail Tester&lt;/a&gt; - Check your email deliverability score&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>What is llms.txt and Why Your Website Might Need One</title><link>https://giftegwuenu.com/llms-txt/</link><guid isPermaLink="true">https://giftegwuenu.com/llms-txt/</guid><description>What is llms.txt, how it works, and why it matters for making your website AI-friendly.</description><pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There’s been so much going on in the AI space lately, and I’ve been spending time catching up, both with &lt;a href=&quot;http://ai.cloudflare.com/&quot;&gt;Workers AI&lt;/a&gt; at work and just staying plugged in to what&apos;s happening across the AI ecosystem. As always, I like writing down the things I’m learning, for future me and for anyone else who finds this stuff interesting.&lt;/p&gt;
&lt;p&gt;So, let’s talk about something I recently discovered: &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;What even is llms.txt?&lt;/h2&gt;
&lt;p&gt;At first glance, it sounds a bit like &lt;code&gt;robots.txt&lt;/code&gt;, and while there’s a tiny resemblance in concept, it actually serves a different purpose. &lt;code&gt;llms.txt&lt;/code&gt; is a proposed standard, basically a markdown file you can place at the root of your website (like &lt;code&gt;giftegwuenu.com/llms.txt&lt;/code&gt;) to help large language models (LLMs) better understand what your site is about.&lt;/p&gt;
&lt;p&gt;Unlike web crawlers that index your site for search, this is meant for LLMs at inference time. So, not exactly for training, but for those moments when someone prompts an AI and it tries to pull context from your website. The idea is to provide a simple, structured overview of your content to make it easier for these models to find the important stuff.&lt;/p&gt;
&lt;h2&gt;Why does this matter?&lt;/h2&gt;
&lt;p&gt;LLMs aren’t great at digging through cluttered web pages. They can get distracted by navbars, ads, or just irrelevant content. And because they have a limited context window (aka how much they can “see” at once), giving them a shortcut to the good stuff just makes sense.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;llms.txt&lt;/code&gt;, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Highlight key sections like docs, tutorials, or guides&lt;/li&gt;
&lt;li&gt;Help AI tools give users better answers&lt;/li&gt;
&lt;li&gt;Control what parts of your site should be prioritized&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, this whole concept lets you say, “Hey AI, here’s what you should check out first.”&lt;/p&gt;
&lt;h2&gt;What does a llms.txt file look like?&lt;/h2&gt;
&lt;p&gt;Here’s a sample format for a &lt;code&gt;llms.txt&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# My Website

&amp;gt; A brief description of what the site is about.

## Docs
- [Getting Started](https://example.com/docs/start): A quickstart guide.

## Blog
- [Latest Post](https://example.com/blog/llms-txt): Covers how to use llms.txt.

## Optional
- [API Reference](https://example.com/api): Full list of endpoints.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can get fancier with more sections or use &lt;code&gt;llms-full.txt&lt;/code&gt; if you want to go deeper, but the standard is intentionally lightweight.&lt;/p&gt;
&lt;h2&gt;How do you create one?&lt;/h2&gt;
&lt;p&gt;You can absolutely write one manually (it’s just markdown!), but if you want a head start, tools like &lt;a href=&quot;https://www.firecrawl.dev/&quot;&gt;Firecrawl&lt;/a&gt; make it super easy to get started. They’ll crawl your site and generate the file for you.&lt;/p&gt;
&lt;h2&gt;Who’s already using &lt;code&gt;llms.txt&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;This isn’t just a niche idea, some major players in the industry are already experimenting with &lt;code&gt;llms.txt&lt;/code&gt; for their docs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/llms.txt&quot;&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/a&gt;, we’ve rolled it out on our docs too&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/llms.txt&quot;&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;&lt;/a&gt;, helping their AI models better parse internal resources&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.perplexity.ai/llms.txt&quot;&gt;&lt;strong&gt;Perplexity AI&lt;/strong&gt;&lt;/a&gt;, making it easier for their LLM-powered search to reference accurate content&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elevenlabs.io/docs/llms.txt&quot;&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt;&lt;/a&gt;, guiding AI to their most relevant documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Curious who else is on board? Check out the &lt;a href=&quot;https://directory.llmstxt.cloud/&quot;&gt;llms.txt directory&lt;/a&gt; to browse a growing list of websites using this format.&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;I think it’s a smart and simple way to make our websites more AI-accessible, without needing to change anything.As someone who builds and writes a lot on the web, it just feels like a nice step toward being intentional with how AI interacts with our content.&lt;/p&gt;
&lt;p&gt;Especially in a world where LLMs are becoming the new interface to the internet. It’s also very easy to pass the file to ChatGPT, Cursor, or whatever AI tool you’re using, so it can quickly understand your site’s structure and context.&lt;/p&gt;
&lt;p&gt;Would you consider adding &lt;code&gt;llms.txt&lt;/code&gt; to your site?&lt;/p&gt;
</content:encoded></item><item><title>Build a Bookmark Manager with the HONC Stack!</title><link>https://giftegwuenu.com/honc-stack/</link><guid isPermaLink="true">https://giftegwuenu.com/honc-stack/</guid><description>Build a full-stack Bookmark Manager with Hono, Drizzle ORM, and Cloudflare D1.</description><pubDate>Tue, 04 Mar 2025 23:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What Even is the Best Stack? 🤔&lt;/h2&gt;
&lt;p&gt;As developers, we are constantly in pursuit of the best way to build applications that are frictionless, scalable, and a joy to work with. The ecosystem is filled with countless frameworks, libraries, and tools, each promising to make development easier. But what if there was a stack that combined performance, simplicity, and flexibility?&lt;/p&gt;
&lt;p&gt;Enter the &lt;strong&gt;HONC Stack&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;What is the HONC Stack?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://honc.dev/&quot;&gt;HONC&lt;/a&gt; is a modern full-stack development approach optimized for speed, developer experience, and global scalability. It stands for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;H&lt;/strong&gt; – &lt;a href=&quot;https://hono.dev/&quot;&gt;Hono&lt;/a&gt;: A lightweight, fast, and Edge-first web framework for building APIs and applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O&lt;/strong&gt; – &lt;a href=&quot;https://orm.drizzle.team/&quot;&gt;Drizzle ORM&lt;/a&gt;: A type-safe ORM designed for SQL databases with a great developer experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N&lt;/strong&gt; – &lt;strong&gt;Name your Database&lt;/strong&gt;: Whether it&apos;s&lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt; &lt;strong&gt;Cloudflare D1&lt;/strong&gt; &lt;/a&gt;(SQLite on the Edge), &lt;strong&gt;Neon&lt;/strong&gt; (serverless Postgres), or any other preferred database, HONC allows for flexibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt; – &lt;a href=&quot;https://cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt;: A powerful developer platform offering Workers, KV, R2, D1, and more, making it an ideal environment for deploying modern apps at the Edge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Why the HONC Stack?&lt;/h3&gt;
&lt;p&gt;The HONC stack is designed to take advantage of modern cloud and Edge computing principles, enabling developers to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;⚡ Build fast, globally distributed applications&lt;/strong&gt; with Cloudflare Workers and Hono.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🛡️ Ensure type safety and maintainability&lt;/strong&gt; with Drizzle ORM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🗃️ Use a flexible database&lt;/strong&gt; solution depending on the use case.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🚀 Deploy effortlessly&lt;/strong&gt; with Cloudflare’s robust global infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting Started with HONC&lt;/h2&gt;
&lt;p&gt;Want to try the HONC stack for yourself? Setting up a new project is as easy as running:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm create honc-app@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command sets up a new application with Hono, Drizzle ORM, and Cloudflare Worker bindings pre-configured. During setup, you’ll be prompted to choose a template. Select the &lt;strong&gt;D1 base template&lt;/strong&gt; to ensure your application is optimized for Cloudflare D1 as the database solution.&lt;/p&gt;
&lt;h2&gt;Build a Bookmark Manager with the Honc Stack&lt;/h2&gt;
&lt;p&gt;To showcase the HONC Stack in action, let&apos;s build a simple &lt;strong&gt;Bookmark Manager&lt;/strong&gt; that allows users to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add bookmarks (title, URL, description, tags)&lt;/li&gt;
&lt;li&gt;View saved bookmarks&lt;/li&gt;
&lt;li&gt;Delete bookmarks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Set Up Your HONC App&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This part was already done in the step above, go ahead and run the application using:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run db:setup
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Configure Cloudflare D1&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Let&apos;s create a new D1 database:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx wrangler d1 create bookmarks_db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add it to &lt;code&gt;wrangler.toml&lt;/code&gt; and update the database name in &lt;code&gt;package.json&lt;/code&gt; scripts accordingly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[d1_databases]]
binding = &quot;DB&quot;
database_name = &quot;bookmarks_db&quot;
database_id = &quot;&amp;lt;your-database-id&amp;gt;&quot;
migrations_dir = &quot;drizzle/migrations&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Define the Database Schema (Drizzle ORM)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Update the &lt;code&gt;schema.ts&lt;/code&gt; to define the bookmarks table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;

	id: integer(&quot;id&quot;, { mode: &quot;number&quot; }).primaryKey(),
	title: text(&quot;title&quot;).notNull(),
	url: text(&quot;url&quot;).notNull(),
	description: text(&quot;description&quot;),
	tags: text(&quot;tags&quot;),
	createdAt: text(&quot;created_at&quot;)
		.notNull()
		.default(sql`(CURRENT_TIMESTAMP)`),
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Create API Routes with OpenAPI (Hono)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Next, update the &lt;code&gt;index.ts&lt;/code&gt; to define API endpoints with OpenAPI support:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;





type Bindings = {
	DB: D1Database;
};

type Variables = {
	db: DrizzleD1Database;
};

const app = new OpenAPIHono&amp;lt;{ Bindings: Bindings; Variables: Variables }&amp;gt;();

app.use(async (c, next) =&amp;gt; {
	const db = drizzle(c.env.DB);
	c.set(&quot;db&quot;, db);
	await next();
});

const BookmarkSchema = z
	.object({
		id: z.number().openapi({ example: 1 }),
		title: z.string().openapi({ example: &quot;My Bookmark&quot; }),
		url: z.string().url().openapi({ example: &quot;https://example.com&quot; }),
		description: z.string().optional().openapi({ example: &quot;A useful link&quot; }),
		tags: z.string().optional().openapi({ example: &quot;tech, coding&quot; }),
	})
	.openapi(&quot;Bookmark&quot;);

const getBookmarks = createRoute({
	method: &quot;get&quot;,
	path: &quot;/api/bookmarks&quot;,
	responses: {
		200: {
			content: { &quot;application/json&quot;: { schema: z.array(BookmarkSchema) } },
			description: &quot;Bookmarks fetched successfully&quot;,
		},
	},
});

const createBookmark = createRoute({
	method: &quot;post&quot;,
	path: &quot;/api/bookmark&quot;,
	request: {
		body: {
			required: true,
			content: {
				&quot;application/json&quot;: {
					schema: BookmarkSchema,
				},
			},
		},
	},
	responses: {
		201: {
			content: {
				&quot;application/json&quot;: {
					schema: BookmarkSchema,
				},
			},
			description: &quot;Bookmark created successfully&quot;,
		},
	},
});

const deleteBookmark = createRoute({
	method: &quot;delete&quot;,
	path: &quot;/api/bookmark/{id}&quot;,
	responses: {
		200: {
			content: {
				&quot;application/json&quot;: { schema: z.object({ message: z.string() }) },
			},
			description: &quot;Bookmark deleted successfully&quot;,
		},
	},
});

app.openapi(getBookmarks, async (c) =&amp;gt; {
	const db = c.get(&quot;db&quot;);
	const bookmarks = await db.select().from(schema.bookmarks);
	return c.json(bookmarks);
});

app.openapi(createBookmark, async (c) =&amp;gt; {
	const db = c.get(&quot;db&quot;);
	const { title, url, description, tags } = c.req.valid(&quot;json&quot;);
	const [newBookmark] = await db
		.insert(schema.bookmarks)
		.values({ title, url, description, tags })
		.returning();
	return c.json(newBookmark, 201);
});

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Seed the Database&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;To populate the database with actual sample bookmarks, update the existing &lt;code&gt;scripts/seed.ts&lt;/code&gt; file to include:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
...
const sampleBookmarks = [
  {
    title: &quot;Hono Framework&quot;,
    url: &quot;https://hono.dev&quot;,
    description: &quot;A lightweight web framework for building APIs and applications.&quot;,
    tags: &quot;hono, framework, edge&quot;,
  },
  {
    title: &quot;Drizzle ORM&quot;,
    url: &quot;https://orm.drizzle.team&quot;,
    description: &quot;A type-safe ORM designed for SQL databases.&quot;,
    tags: &quot;orm, database, typescript&quot;,
  },
  {
    title: &quot;Cloudflare D1&quot;,
    url: &quot;https://developers.cloudflare.com/d1/&quot;,
    description: &quot;Cloudflare’s globally distributed, serverless database.&quot;,
    tags: &quot;cloudflare, database, d1&quot;,
  },
  {
    title: &quot;HTMX&quot;,
    url: &quot;https://htmx.org&quot;,
    description: &quot;A library that allows access to modern browser features directly from HTML.&quot;,
    tags: &quot;htmx, frontend, html&quot;,
  },
  {
    title: &quot;MDN Web Docs&quot;,
    url: &quot;https://developer.mozilla.org&quot;,
    description: &quot;Comprehensive documentation for web technologies.&quot;,
    tags: &quot;documentation, web, mdn&quot;,
  },
];

seedDatabase();

async function seedDatabase() {
  ...
  try {
    await db.insert(bookmarks).values(sampleBookmarks);
    console.log(&apos;✅ Database seeded successfully!&apos;);
    if (!isProd) {
    }
  } catch (error) {
    console.error(&apos;❌ Error seeding database:&apos;, error);
    process.exit(1);
  } finally {
    process.exit(0);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Build a Frontend with Hono JSX Renderer&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Use Hono&apos;s JSX renderer to serve the frontend dynamically:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;

app.use(&quot;*&quot;, jsxRenderer());

app.get(&quot;/&quot;, async (c) =&amp;gt; {
	const db = c.get(&quot;db&quot;);
	const bookmarks: Bookmark[] = await db.select().from(schema.bookmarks);

	return c.render(
		&amp;lt;html&amp;gt;
			&amp;lt;head&amp;gt;
				&amp;lt;title&amp;gt;Bookmark Manager&amp;lt;/title&amp;gt;
				&amp;lt;script src=&quot;https://cdn.tailwindcss.com&quot;&amp;gt;&amp;lt;/script&amp;gt;
				&amp;lt;script src=&quot;https://unpkg.com/htmx.org@1.9.5&quot;&amp;gt;&amp;lt;/script&amp;gt;
			&amp;lt;/head&amp;gt;
			&amp;lt;body class=&quot;min-h-screen bg-gray-100&quot;&amp;gt;
				&amp;lt;h1 class=&quot;my-6 mb-4 text-center text-4xl font-bold&quot;&amp;gt;📌 Bookmark Manager&amp;lt;/h1&amp;gt;
				&amp;lt;div class=&quot;mx-auto my-6 w-full max-w-xl rounded bg-white p-6 shadow-md&quot;&amp;gt;
					&amp;lt;form
						hx-post=&quot;/api/bookmark&quot;
						hx-target=&quot;#bookmarkList&quot;
						hx-swap=&quot;beforeend&quot;
						class=&quot;mb-4 flex flex-col gap-2&quot;
					&amp;gt;
						&amp;lt;input
							type=&quot;text&quot;
							name=&quot;title&quot;
							placeholder=&quot;Title&quot;
							required
							class=&quot;rounded border p-2&quot;
						/&amp;gt;
						&amp;lt;input type=&quot;url&quot; name=&quot;url&quot; placeholder=&quot;URL&quot; required class=&quot;rounded border p-2&quot; /&amp;gt;
						
						&amp;lt;input
							type=&quot;text&quot;
							name=&quot;description&quot;
							placeholder=&quot;Description&quot;
							class=&quot;rounded border p-2&quot;
						/&amp;gt;
						&amp;lt;input
							type=&quot;text&quot;
							name=&quot;tags&quot;
							placeholder=&quot;Tags (comma-separated)&quot;
							class=&quot;rounded border p-2&quot;
						/&amp;gt;
						&amp;lt;button
							type=&quot;submit&quot;
							class=&quot;rounded bg-blue-600 px-4 py-2 text-white hover:bg-blue-700&quot;
						&amp;gt;
							Add Bookmark
						&amp;lt;/button&amp;gt;
					&amp;lt;/form&amp;gt;
				&amp;lt;/div&amp;gt;
				&amp;lt;ul id=&quot;bookmarkList&quot; class=&quot;mx-auto w-full max-w-xl space-y-2&quot;&amp;gt;
					{bookmarks.map((b) =&amp;gt; (
						&amp;lt;li
							class=&quot;flex items-center justify-between rounded border bg-white p-2&quot;
							id={`bookmark-${b.id}`}
						&amp;gt;
							&amp;lt;div class=&quot;flex flex-col&quot;&amp;gt;
								&amp;lt;span class=&quot;font-semibold&quot;&amp;gt;{b.title}&amp;lt;/span&amp;gt;
								&amp;lt;small&amp;gt;{b.description}&amp;lt;/small&amp;gt;
								&amp;lt;small class=&quot;text-gray-500&quot;&amp;gt;{b.tags ?? &quot;&quot;}&amp;lt;/small&amp;gt;
							&amp;lt;/div&amp;gt;
							&amp;lt;div class=&quot;space-x-2&quot;&amp;gt;
								&amp;lt;a href={b.url} target=&quot;_blank&quot; class=&quot;text-blue-600 hover:underline&quot;&amp;gt;
									Visit
								&amp;lt;/a&amp;gt;
								&amp;lt;button
									hx-delete={`/api/bookmark/${b.id}`}
									hx-target={`#bookmark-${b.id}`}
									hx-swap=&quot;outerHTML&quot;
									class=&quot;rounded bg-red-500 px-2 py-1 text-white hover:bg-red-600&quot;
								&amp;gt;
									Delete
								&amp;lt;/button&amp;gt;
							&amp;lt;/div&amp;gt;
						&amp;lt;/li&amp;gt;
					))}
				&amp;lt;/ul&amp;gt;
			&amp;lt;/body&amp;gt;
		&amp;lt;/html&amp;gt;,
	);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To serve the frontend with JSX, rename your entry files to .tsx (for example, index.tsx) instead of .ts, ensuring that Hono can properly compile and serve JSX. For the full code checkout the &lt;a href=&quot;https://github.com/lauragift21/bookmark-manager&quot;&gt;GitHub Repo&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Deploy Everything to Cloudflare&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Afterwards, run the migration script for production and optionally seed the database:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run db:migrate:prod
npm run db:seed:prod

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, deploy to production:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;a href=&quot;https://bookmark-app.lauragift.workers.dev/&quot;&gt;Bookmark Manager&lt;/a&gt; is now live with a minimal frontend!&lt;/p&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;The HONC stack makes it easy to build modern, efficient applications. Try it out and start building today!&lt;/p&gt;
</content:encoded></item><item><title>2024 Year In Review</title><link>https://giftegwuenu.com/year-in-review-2024/</link><guid isPermaLink="true">https://giftegwuenu.com/year-in-review-2024/</guid><description>A reflection on unexpected blessings, growth, and milestones shaping a fulfilling 2024.</description><pubDate>Tue, 31 Dec 2024 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Writing &lt;a href=&quot;/posts/year-in-review-2019&quot;&gt;year-in-review&lt;/a&gt; &lt;a href=&quot;/posts/year-in-review-2018&quot;&gt;posts&lt;/a&gt; has always been a tradition I deeply enjoy. They offer a chance to pause, reflect, and celebrate the journey, something I haven’t done in recent years as consistently as I’d like. This lapse is partly due to blogging less frequently, but I’ve always found value in keeping a record of my accomplishments throughout the year. It helps me appreciate how far I’ve come, and this year was no different.&lt;/p&gt;
&lt;p&gt;In fact, I tried something new this year, I started keeping a &lt;a href=&quot;https://www.righttouchediting.com/2020/06/01/defeat-impostor-syndrome-with-a-win-jar/&quot;&gt;&lt;strong&gt;Wins Jar&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/winsjar.jpg&quot; alt=&quot;My Wins Jar&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Inspired by a tweet I saw early in the year, I adopted the idea of writing down small wins and storing them in a mason jar. The concept is simple yet powerful, by the end of the year, you can revisit those moments, triggering a sense of joy and accomplishment. It&apos;s a tradition I’m excited to carry forward in the years to come.&lt;/p&gt;
&lt;p&gt;Now, onto my 2024. This year was a mix of the anticipated and the unexpected. While I had envisioned some of these, I didn’t foresee how quickly they would unfold. Here&apos;s a look back at my year across the key aspects of my life:&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Life&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;You know that feeling when you’ve prayed for something, trusting in God’s infinite mercies, and He answers in a way that exceeds your expectations? That’s exactly how this year unfolded for me. For some time now, I’ve been thinking about settling down and starting a family, but I envisioned it as something that would happen over the next couple of years.&lt;/p&gt;
&lt;p&gt;However, God had His own perfect timing in mind. This year, I reconnected with a longtime friend, and what began as a simple reconnection quickly blossomed into something beautiful. Before I knew it, we were married and, to our absolute joy, expecting our first child, all within the first seven months of the year.&lt;/p&gt;
&lt;p&gt;The pace at which everything happened was unexpected, but it’s a testament to how God’s plans for us are often better than anything we could imagine. What I thought would take years unfolded in months, and I couldn’t be more excited and grateful. This year has been a whirlwind of blessings, and I’m stepping into this new chapter with immense joy and faith.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Career&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;This year, one of my major highlights was getting promoted, a milestone I’ve been working toward for a while. It was incredibly rewarding to see my efforts recognized and to step into a role with more responsibility and impact.&lt;/p&gt;
&lt;p&gt;Another highlight was publishing my second &lt;a href=&quot;https://www.linkedin.com/learning/accessible-layout-for-the-web/creating-accessible-web-layout-for-a-diverse-audience&quot;&gt;LinkedIn Learning course&lt;/a&gt;, this time focusing on &lt;strong&gt;web accessibility&lt;/strong&gt;, a topic I’m deeply passionate about. Sharing my knowledge and helping others understand the importance of creating inclusive digital experiences was both fulfilling and inspiring.&lt;/p&gt;
&lt;p&gt;I also had the opportunity to engage in public speaking and travel extensively for work, which allowed me to connect with new communities and share my expertise. Toward the end of the year, I reduced my travel commitments as I prepared for my growing family, but I’m proud of how much I accomplished in the earlier months.&lt;/p&gt;
&lt;p&gt;As I reflect on this year, I feel proud of my achievements and grateful for the opportunities I’ve had. In 2025, I’m excited to challenge myself further, grow in my career, and make the most of the opportunities that come my way.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Health&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;At the start of the year, I had high hopes for my fitness journey. I began strong, with clear intentions to commit, but over time, I found myself slipping back into old patterns. This seems to be a recurring theme for me, setting goals but finding excuses along the way. However, this year, I had a valid reason: I was expecting!&lt;/p&gt;
&lt;p&gt;While I couldn’t commit to intense workouts, I focused on staying active in ways that felt manageable and safe for my pregnancy. It wasn’t perfect, but I’m proud that I made an effort to prioritize movement during such a transformative time in my life.&lt;/p&gt;
&lt;p&gt;Looking ahead to next year, I want to approach my health with renewed energy. My goal is to adopt a more balanced and sustainable approach, including improving my diet and cutting down on carbs. As I recover from pregnancy and adjust to life postpartum, I’m looking forward to making gradual changes that will benefit both my physical and mental well-being.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Looking Ahead&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;As 2024 comes to a close, I’m filled with gratitude for the wins, both big and small, and the unexpected surprises that shaped this year. The Wins Jar reminded me that every step forward matters, and it’s those small moments that build a life well-lived.&lt;/p&gt;
&lt;p&gt;In 2025, I hope to continue growing in my personal and professional life, embracing new opportunities, and cherishing the journey as it unfolds. Here’s to more wins, more growth, and more joy in the year ahead! I wish everyone a happy new year!&lt;/p&gt;
</content:encoded></item><item><title>Dealing with Burnout!</title><link>https://giftegwuenu.com/burnout/</link><guid isPermaLink="true">https://giftegwuenu.com/burnout/</guid><description>A personal journey through burnout, rediscovery, and reigniting passion for creativity and technology.</description><pubDate>Tue, 19 Nov 2024 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Well, well, well! It’s time I faced the truth, I’ve struggled with burnout for most of the last two years (2023-2024, I see you). This has been the lowest I’ve ever felt, both energetically and creatively, when it comes to work and my passion projects.&lt;/p&gt;
&lt;h2&gt;A Trip Down Memory Lane&lt;/h2&gt;
&lt;p&gt;Back in early 2019 through to 2023, I was bursting with energy and excitement about exploring new paths in my career. And I did just that! During those years, I achieved so much:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grew my online audience&lt;/li&gt;
&lt;li&gt;Published two courses&lt;/li&gt;
&lt;li&gt;Tons of Speaking Opportunities&lt;/li&gt;
&lt;li&gt;Joined ambassador programs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…and celebrated countless wins along the way. However, as time passed, I began to feel increasingly stressed, and slowly but surely, burnout crept in.&lt;/p&gt;
&lt;h2&gt;Why Did This Happen?&lt;/h2&gt;
&lt;p&gt;Looking back, I realise I might have stretched myself too thin. Life happened, and this year especially, has been overwhelming in ways I couldn’t anticipate. One of the biggest changes? I got married and I’m currently 9 months pregnant. So, yeah, there’s a lot going on.&lt;/p&gt;
&lt;p&gt;Why am I writing this? Well, I’ve evaluated my situation and decided it’s time to climb out of this burnout hole. I want to return to doing the things I love and enjoy, the things that make me feel fulfilled.&lt;/p&gt;
&lt;h2&gt;The Wake-Up Call&lt;/h2&gt;
&lt;p&gt;Recently, I &lt;a href=&quot;https://www.mayoclinic.org/healthy-lifestyle/adult-health/in-depth/burnout/art-20046642?ck_subscriber_id=1312907829&quot;&gt;read an article&lt;/a&gt; recommended by &lt;a href=&quot;https://x.com/amyhoy&quot;&gt;Amy Hoy&lt;/a&gt; from &lt;em&gt;Stacking the Bricks&lt;/em&gt;. It included a checklist of burnout symptoms, and many of them resonated deeply with me both in my personal projects and work life.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;Job burnout symptoms&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;To find out if you might have job burnout, answer these questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do you question the value of your work?&lt;/li&gt;
&lt;li&gt;Do you drag yourself to work and have trouble getting started?&lt;/li&gt;
&lt;li&gt;Do you feel removed from your work and the people you work with?&lt;/li&gt;
&lt;li&gt;Have you lost patience with co-workers, customers or clients?&lt;/li&gt;
&lt;li&gt;Do you lack the energy to do your job well?&lt;/li&gt;
&lt;li&gt;Is it hard to focus on your job?&lt;/li&gt;
&lt;li&gt;Do you feel little satisfaction from what you get done?&lt;/li&gt;
&lt;li&gt;Do you feel let down by your job?&lt;/li&gt;
&lt;li&gt;Do you doubt your skills and abilities?&lt;/li&gt;
&lt;li&gt;Are you using food, drugs or alcohol to feel better or to numb how you feel?&lt;/li&gt;
&lt;li&gt;Have your sleep habits changed?&lt;/li&gt;
&lt;li&gt;Do you have headaches, stomach or bowel problems, or other physical complaints with no known cause?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I read through this list, I saw myself reflected in so many of these symptoms. It was a tough pill to swallow, but also a moment of clarity.&lt;/p&gt;
&lt;h2&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;Now that I’m aware of the problem, I’m determined to take actionable steps to help myself heal and grow. I refuse to let my potential go to waste or feel like I’m being left behind.&lt;/p&gt;
&lt;p&gt;Here’s to rediscovering what fuels my spirit, reigniting my motivation, and building a life that feels balanced and fulfilling again. You can expect to see me back to blogging, creating videos, and sharing my love for technology with renewed energy and purpose.&lt;/p&gt;
&lt;p&gt;Hey! While you&apos;re still here, please &lt;a href=&quot;https://www.youtube.com/@giftegwuenu&quot;&gt;subscribe to my YouTube channel&lt;/a&gt;, I’ve got some exciting content coming your way!&lt;/p&gt;
</content:encoded></item><item><title>The Best Time to Learn to Code is Now</title><link>https://giftegwuenu.com/learn-to-code/</link><guid isPermaLink="true">https://giftegwuenu.com/learn-to-code/</guid><description>Why now is the perfect time to start learning to code and how it can transform your career.</description><pubDate>Mon, 12 Feb 2024 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Are you considering learning to code but keep putting it off because you need more time or experience? The truth is, there is no better time to start learning than now.&lt;/p&gt;
&lt;p&gt;The demand for skilled coders has never been higher. With the rapid growth of technology in every industry, companies seek individuals who can create, maintain, and improve their digital products. This means that the developer job market is constantly expanding, and the opportunities are endless.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note that although there have been layoffs in the tech industry, this is not a permanent problem. The demand for skilled coders remains high, and the industry is expected to bounce back. Learning to code now can still provide you with valuable skills and open up opportunities in the long run.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Coding is no longer a skill reserved for computer science majors or tech enthusiasts. With the abundance of online resources, coding has become accessible to anyone interested and willing to learn. You can find free or affordable courses, tutorials, and coding communities online to get you started.&lt;/p&gt;
&lt;p&gt;Another reason to start learning to code now is that it can benefit you in any career. The ability to code is an invaluable asset in today&apos;s digital age. It allows you to automate tasks, analyze data, and create digital solutions to problems. Even if you don&apos;t plan on becoming a professional developer, having the ability can make you a more competitive candidate.&lt;/p&gt;
&lt;p&gt;So, what is making you stall? With the demand for skilled developers on the rise and the abundance of accessible resources, there is no better time to start than now. Get started on your coding journey today.&lt;/p&gt;
</content:encoded></item><item><title>Delete Multiple Branches in Git</title><link>https://giftegwuenu.com/git-branch/</link><guid isPermaLink="true">https://giftegwuenu.com/git-branch/</guid><description>Quick terminal commands to clean up multiple Git branches at once.</description><pubDate>Mon, 22 Mar 2021 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you been piling up so many branches you don&apos;t even use anymore and want to clean them up? In this article, I&apos;ll share snippets you can use to do that quickly from your terminal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Only use this if you&apos;re sure the branches are not needed anymore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Deleting Local Branch&lt;/h2&gt;
&lt;p&gt;You can delete a local branch that has been merged into the remote and also delete an un-merged local branch. You want to make sure you know which branch is merged in or not and to do that you can use the following commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch&lt;/code&gt; - to list out all local branches&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch -r&lt;/code&gt; - to list all remote branches&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch -a&lt;/code&gt; - to list both local and remote branches&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch --merged&lt;/code&gt; - to list all the branches that have been merged&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch --no-merged&lt;/code&gt; - to list all branches not merged&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now to delete the local branches, you want to do either of these:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# delete fully merged branch
git branch -d &apos;name-of-branch&apos;

# I use the git alias a lot so this also applies
gbd &apos;name-of-branch&apos;

# delete branch (even if not merged)
git branch -D &apos;name-of-branch&apos;

# alias
gbD &apos;name-of-branch&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Deleting Multiple Local Branches&lt;/h2&gt;
&lt;p&gt;Feeling confident enough and you want to delete multiple local branches you can do so using the command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: You need to be careful when doing this so you don&apos;t delete a branch that is not merged in yet and adding the &lt;code&gt;--merged&lt;/code&gt; flag helps ascertain that you don&apos;t do that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;git branch --merged | egrep -v &quot;(^\*|master|main|develop)&quot; | xargs git branch -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To further explain the command above, &lt;code&gt;git branch --merged&lt;/code&gt; will list out all the merged branches, &lt;code&gt;egrep -v &quot;(^\*|master|main)&quot;&lt;/code&gt; will ensure the master and main branch is not deleted, you can add other branches you want to exclude here. &lt;code&gt;xargs git branch -d&lt;/code&gt; will go ahead and delete the remaining branches.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ⚠️ adding --no-merged and -D flag will go ahead and delete unmerged branches
git branch --no-merged | egrep -v &quot;(^\*|master|main|develop)&quot; | xargs git branch -D

# ⚠️ use this for when you want to delete all the branches both merged and unmerged
git branch | egrep -v &quot;(^\*|master|main|develop)&quot; | xargs echo git branch -D
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Deleting Remote Branches&lt;/h2&gt;
&lt;p&gt;In a case where you need to delete a remote branch because you are done working on it and it had been merged into the remote master branch. You can delete a remote branch using the &lt;code&gt;--delete&lt;/code&gt; flag and a git push to the remote branch:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push origin --delete &apos;name-of-branch&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Deleting Multiple Remote Branches&lt;/h2&gt;
&lt;p&gt;When you need to delete multiple remote branches and don&apos;t want to do them individually with the command previously stated, you can do so using:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git branch -r --merged | egrep -v &quot;(^\*|master|main|develop)&quot; | sed &apos;s/origin\///&apos; | xargs -n 1 git push origin --delete
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will delete all remote merged branches excluding &lt;code&gt;master&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt;. To further explain the command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch -r --merged&lt;/code&gt; - will list out all the remote branches that are merged&lt;/li&gt;
&lt;li&gt;&lt;code&gt;egrep -v &quot;(^\*|master|main)&quot;&lt;/code&gt; - exclude branch master and main&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed &apos;s/origin\///&apos;&lt;/code&gt; - because the remote branches are prefixed with &lt;code&gt;origin/&lt;/code&gt; this command will filter that part out so it returns only the branch name.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xargs -n 1 git push origin --delete&lt;/code&gt; - deletes the remaining branches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now if you&apos;re feeling very confident and want to delete all un-merged branches or all the remote branches use this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ⚠️ deletes all un-merged branches from remote
git branch -r --no-merged | egrep -v &quot;(^\*|master|main|develop)&quot; | sed &apos;s/origin\///&apos; | xargs -n 1 echo git push origin --delete

// delete all branches including merged and unmerged 🙊
git branch -r | egrep -v &quot;(^\*|master|main|develop)&quot; | sed &apos;s/origin\///&apos; | xargs -n 1 echo git push origin --delete
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I added the &lt;code&gt;echo&lt;/code&gt; command to print what I&apos;ll be doing to the screen so I&apos;m sure I know what I&apos;m about to delete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image.png&quot; alt=&quot;List of remote branches&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now you can take the &lt;code&gt;echo&lt;/code&gt; command out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ⚠️ deletes all un-merged branches from remote
git branch -r --no-merged | egrep -v &quot;(^\*|master|main|develop)&quot; | sed &apos;s/origin\///&apos; | xargs -n 1 git push origin --delete

# delete all branches including merged and unmerged 🙊
git branch -r | egrep -v &quot;(^\*|master|main|develop)&quot; | sed &apos;s/origin\///&apos; | xargs -n 1 git push origin --delete
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s it! I hope this was helpful for you. I know I will be referencing this again when I need it.&lt;/p&gt;
</content:encoded></item><item><title>Show Your Work!</title><link>https://giftegwuenu.com/show-your-work/</link><guid isPermaLink="true">https://giftegwuenu.com/show-your-work/</guid><description>Key insights from Austin Kleon&apos;s Show Your Work and why sharing your process matters.</description><pubDate>Tue, 02 Mar 2021 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What do you mean by &lt;strong&gt;&quot;Show your work!&quot;?&lt;/strong&gt; This is what my brain tells me the first time I stumbled upon this book. I already do that no? I think I already do but I was so sure I will take out more from reading this book and I was not wrong. After reading lots of reviews on GoodReads I decided to get a copy and see what I&apos;m doing wrong or need to start doing. In this article, I&apos;ll share the insights I learned from reading Austin Kleon&apos;s: &lt;strong&gt;Show Your Work!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1615016326/00-show-cover-500x333_sqyagk.jpg&quot; alt=&quot;Hardcover of Show Your Work By Austin Kleon&quot; title=&quot;Hardcover of Show Your Work By Austin Kleon&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;You don’t have to be a genius&lt;/h2&gt;
&lt;p&gt;The first chapter starts with this very statement we always shy away from when thinking of putting our work out in the world. I personally have this problem when I think I&apos;m not a genius so I shouldn&apos;t be talking or sharing about a specific topic and I&apos;m certain a lot of us feel that way too. In this chapter, Austin proves that is not a good yardstick for measuring what work we should put out.&lt;/p&gt;
&lt;p&gt;We should all be &lt;strong&gt;Amateurs&lt;/strong&gt; because amateurs are willing to try different things, learn in public and share all the knowledge, rinse and repeat without the burden of thinking we have to be an expert.&lt;/p&gt;
&lt;h2&gt;Think process, not product&lt;/h2&gt;
&lt;p&gt;I like this statement so much! He&apos;s calling on us to start thinking of our work as a process and not a product. I can decide to create a book, course, tool, or even a library in private and come back with the finished product this is how a lot of artists and creators think.&lt;/p&gt;
&lt;p&gt;This idea is different it&apos;s calling on us to share all the process behind the scenes of creating our work. You might think this is not a great idea may be because your process is messy and not streamlined for anyone to understand. Share it anyway!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1615016326/01-think-process-500x333_yxtttb.jpg&quot; alt=&quot;Think Process, Not Product&quot; title=&quot;Think Process, Not Product&quot; /&gt;&lt;/p&gt;
&lt;p&gt;People want to see how we create the things we create, from ideation to result and it&apos;s important to make them part of the journey to the product. You can think of it as a way of documenting your work out in the open.&lt;/p&gt;
&lt;h2&gt;Share something small every day&lt;/h2&gt;
&lt;p&gt;Once a day, share some part of your work it might be unfinished yes, remember think process nor product. Doing this will create compounded results as you see small changes leads to remarkable results.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Put yourself and your work out there every day and you&apos;ll start meeting some amazing people.&quot; - Bobby Solomon&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1615025452/AD3AFAEA-FC37-43A0-9144-7C30583D72F2_oytmmw.jpg&quot; alt=&quot;Share something small every day&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The format for sharing doesn&apos;t matter, we have many different platforms like Twitter, Instagram, YouTube for showing our work. It&apos;s also important to have a domain on the internet where we own our own content and it&apos;s great for your brand.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Carving a space for yourself online, somewhere where you can express yourself and share your work, is still one of the best possible investments you can make with your time&quot; - Andy Baio&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Open up your cabinet of curiosities&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t be a hoarder.&lt;/strong&gt; Be open to sharing your process as well as where you get your inspiration and ideas from. The people you follow are interested in learning how you come up with all that you do and seeing as creatives it is evident we collect inspiration from different sources we should be open to sharing that too. Also remember, attribution is very important and we should attribute when necessary. How do you know when to do that I love this sketch flow that shows exactly how.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/c_fit,q_auto:low,w_489/v1615016349/IMG_5102_sq3q52.png&quot; alt=&quot;Open up your cabinet of curiosities&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Tell good stories&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;We should all be good storytellers.&lt;/strong&gt; When it comes to showing your work we should be able to tell &lt;strong&gt;great stories&lt;/strong&gt; about the work we do and not selling your self short because you&apos;re either trying to be humble or modest.&lt;/p&gt;
&lt;h2&gt;Teach what you know&lt;/h2&gt;
&lt;p&gt;Learn to share your knowledge by teaching others too, this is by far the best way to keep improving yourself. Teaching people doesn&apos;t subtract value from you it actually adds to it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1615016326/07-learn-teach_njc8c1.jpg&quot; alt=&quot;Learn Teach&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By teaching people what you&apos;ve learned you get to solidify that knowledge more giving you even more leverage than you get if you just keep it to yourself.&lt;/p&gt;
&lt;h2&gt;Don’t turn into human spam&lt;/h2&gt;
&lt;p&gt;Sharing what you do online is great until you start overdoing it and only open to promoting your work without promoting or reading other people&apos;s work. It&apos;s always good to know when you&apos;re turning into spam. The people you&apos;re trying to reach care about your work the moment you make it all about yourself they sense it and can stop supporting or patronizing you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/c_scale,q_auto:good,w_350/v1615016356/IMG_5110_ulewa3.png&quot; alt=&quot;Don’t turn into human spam&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be open and genuine,&lt;/strong&gt; don&apos;t focus on the follower count or how many subscribers you have let that be organic, and remember people connect with you because they enjoy your work don&apos;t make them think you&apos;re just after the numbers or popularity.&lt;/p&gt;
&lt;h2&gt;Learn to take a punch&lt;/h2&gt;
&lt;p&gt;Be ready to take a punch. When you share your work publicly be ready for the good, bad, and ugly. People can be mean on the internet especially with relaying feedback or criticism. Don&apos;t feed the trolls if you get bad comments from your audience try to ignore or block them out. Only focus on the good things and the audience that finds value in what you&apos;re doing.&lt;/p&gt;
&lt;h2&gt;Sell out&lt;/h2&gt;
&lt;p&gt;It&apos;s okay to &lt;strong&gt;charge for the value you create&lt;/strong&gt;. Many people are made to believe as content creators we all should be doing free work. It&apos;s okay to start putting out work for free but the moment you feel it&apos;s time to start charging them don&apos;t feel guilty about it. We put in all the work and effort and we also have bills piling upright so that&apos;s certainly a valid reason to charge for your work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/c_fit,q_auto:good,w_385/v1615016354/IMG_5112_bwunfb.png&quot; alt=&quot;Sell out&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Remember to &lt;strong&gt;pay it forward&lt;/strong&gt; too when you are successful be open to pivoting other voices so they also can make it to where you are.&lt;/p&gt;
&lt;h2&gt;Stick around&lt;/h2&gt;
&lt;p&gt;It&apos;s not always going to be rosy. we can either feel success from all the work we&apos;ve done or feel like absolute failures but it helps to think of this as a journey. The road to success isn&apos;t going to be smooth at all times and keeping at what we do regardless of the outcome should be something we always hold on to.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/c_scale,q_auto:good,w_350/v1615016359/IMG_5113_hyaebe.png&quot; alt=&quot;Stick Around&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Of course, it&apos;s easier said than done when you feel you need to quit, take a break instead and continue when you feel alright to start again not start all over from scratch. it&apos;s hard to start over because our work still exists and all the knowledge gained from previous work still remains with us.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I really enjoyed reading this book. It was a very insightful read and I took away a lot from reading it. It&apos;s the type of book I can always pick up to go over again and again and still learn something from it. I really liked the artwork incorporated into it as well.&lt;/p&gt;
&lt;p&gt;I&apos;ll rate this book &lt;strong&gt;5 stars&lt;/strong&gt; because it changed how I view myself as a creative person. If you are trying to build a brand or put more work out in the open as a content creator this should be the next book you read.&lt;/p&gt;
&lt;h2&gt;Video Review&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/9XHcWhJ1nBU?si=mYzielt1mZ3mqIde&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;Get the book &lt;a href=&quot;https://amzn.to/3sTvgm3&quot;&gt;here&lt;/a&gt; :)&lt;/p&gt;
</content:encoded></item><item><title>Buddy vs. Travis CI: A Detailed Comparison</title><link>https://giftegwuenu.com/buddy/</link><guid isPermaLink="true">https://giftegwuenu.com/buddy/</guid><description>A detailed comparison of Buddy and Travis CI features for continuous integration.</description><pubDate>Wed, 10 Feb 2021 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;Continuous Integration(CI)&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Continuous_deployment&quot;&gt;Continuous Deployment(CD&lt;/a&gt;) are both software development techniques mainly used in modern development practices.&lt;/p&gt;
&lt;p&gt;The concept of continuous integration is a process that involves the practice of merging all developers working branches on a shared repository several times a day. Each branch goes through an automated build check which in turn runs tests to ensure no errors are found before merging.&lt;/p&gt;
&lt;p&gt;The main goal of CI is to prevent integration problems, referred to as &quot;integration hell&quot; in its early adoption. On the other hand, Continuous Deployment is closely related to Continuous Integration and refers to a software engineering approach in which software functionalities are delivered frequently through automated deployments.&lt;/p&gt;
&lt;p&gt;In this post, we’ll take a look at two of the most popular CI/CD tools and outline the features of both, and also get to know each of them better. Let’s get right into it, shall we?&lt;/p&gt;
&lt;h2&gt;What is Buddy?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://buddy.works/&quot;&gt;Buddy&lt;/a&gt; is a smart CI/CD tool for development designed to provide a suite of automation tools that modern development teams can use to accelerate their development lifecycle from coding, to testing and delivering the products to their customers. It uses delivery pipelines to build, test and deploy software from &lt;a href=&quot;https://en.wikipedia.org/wiki/GitHub&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Bitbucket&quot;&gt;BitBucket&lt;/a&gt;, and &lt;a href=&quot;https://en.wikipedia.org/wiki/GitLab&quot;&gt;GitLab&lt;/a&gt;. The pipelines are created with over 100 ready-to-use actions that can be set up in different ways.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E2A5020A16692F11AD6D6D1650A197ED486465DEE7728C5E82E095B4FBB8B03E_1565680135825_Screen+Shot+2019-08-13+at+8.08.38+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Buddy is configured to perform predefined actions in a sequence which are called Pipelines. These pipelines can be triggered automatically on push, manually, or recurrently. Let’s take a look at some features Buddy comes bundled with.&lt;/p&gt;
&lt;h2&gt;Key Features&lt;/h2&gt;
&lt;p&gt;Buddy offers the following benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Native Docker support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flexible Build Configuration - Allows both UI and YAML configuration for creating Pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 100+ ready-to-use actions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support Instant Deployments to FTP/SFTP, AWS, Google Cloud, Digital Ocean, Heroku, Kubernetes, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integration with GitHub, GitLab, and BitBucket out of the box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Builds are run in isolated containers with cached dependencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5-minute setup of the complete environment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E2A5020A16692F11AD6D6D1650A197ED486465DEE7728C5E82E095B4FBB8B03E_1566143344179_3w9Yy6a00q.gif&quot; alt=&quot;Demo of Buddy Workflow&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is Travis CI?&lt;/h2&gt;
&lt;p&gt;Travis CI is a hosted continuous integration service that is free for open-source projects and used to build and test software projects. Travis CI is focused on enabling users to quickly test their code as it’s being deployed. It has support for both small and large code changes, and it watches when a change is detected, It can provide feedback if the change was successful or not. Travis CI is configured by adding a file named &lt;code&gt;.travis.yml&lt;/code&gt;, which is a &lt;a href=&quot;https://en.wikipedia.org/wiki/YAML&quot;&gt;YAML&lt;/a&gt; format text file, to the root directory of the repository.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E2A5020A16692F11AD6D6D1650A197ED486465DEE7728C5E82E095B4FBB8B03E_1565680945160_Screen+Shot+2019-08-13+at+8.22.09+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Travis CI has support for container builds, and also supports Linux Ubuntu and Mac OS platforms as well as have support for other different programming languages, such as JavaScript, Ruby, PHP, Java, C#, and a lot more.&lt;/p&gt;
&lt;h2&gt;Key Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Setup in seconds- Getting up and running with Travis CI is as easy as enabling a project, adding basic build instructions to your project, and committing code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request Support - Test every pull request in your project before it gets merged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bundled with support for 20 different languages out of the box, including Javascript and Node.js, Ruby, PHP, Python, Mac/iOS, as well as Docker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Different Platform support- Pre-installed database services and can simply be enabled in your build configuration, MySQL, PostgreSQL, ElasticSearch, Redis, Memcached, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supports automatic deployment for passing builds.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E2A5020A16692F11AD6D6D1650A197ED486465DEE7728C5E82E095B4FBB8B03E_1566143106882_J0bzM1uvQ8.gif&quot; alt=&quot;Demo of Travis CI Workflow&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Detailed Comparison Between Buddy vs Travis CI&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Buddy&lt;/th&gt;
&lt;th&gt;Travis CI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All configurations are driven by the web platform and as well as a YAML file depending on the option you decide to go with.&lt;/td&gt;
&lt;td&gt;All configurations are driven by YAML files within the code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intuitive UI as well as ability to get up and running in 5 minutes and setup configuration on the UI or with YAML files.&lt;/td&gt;
&lt;td&gt;Decent UI that outlines all the benefits of the platform but one will have to set up configuration using a YAML file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Continuous Delivery Pipelines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;With Buddy, you can define multiple actions for a pipeline. I.e upload files to a server and update assets on every push.&lt;/td&gt;
&lt;td&gt;Travis has a similar workflow which is called Build Stages. It allows you to group and build jobs in parallel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buddy comes bundled with Docker support.&lt;/td&gt;
&lt;td&gt;Travis CI support Docker only in a specific environment. It doesn’t have support for Docker on macOS at the moment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buddy is available on both GitHub, GitLab, and BitBucket.&lt;/td&gt;
&lt;td&gt;Travis CI only offers limited support for projects hosted on GitHub.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platforms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buddy is compatible with all platforms including Mac and Linux.&lt;/td&gt;
&lt;td&gt;Travis has support for only Mac, Linux, and iOS platforms.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;In this article, We have seen a comparison between Buddy and Travis CI automation tools and we looked at both of them extensively. Now that we have a good understanding of what Buddy and Travis CI can do and also have an idea of the best use case for each of the tools. With this, we can then go ahead and decide which tool to use for our projects going forward.&lt;/p&gt;
</content:encoded></item><item><title>Vuejs Global 2020: A Recap</title><link>https://giftegwuenu.com/vue-global/</link><guid isPermaLink="true">https://giftegwuenu.com/vue-global/</guid><description>Highlights and key takeaways from speaking at Vue.js Global 2020.</description><pubDate>Tue, 29 Sep 2020 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple of weeks ago, I had a fantastic time speaking and attending &lt;a href=&quot;https://www.vuejs.amsterdam/&quot;&gt;Vue.js Global&lt;/a&gt;, a global online conference held on September 17th and 18th. This article will share my thoughts and experience from attending the conference and some of my takeaways.&lt;/p&gt;
&lt;p&gt;Overall, I&apos;ll say I had such a good time at the conference, even though it was online and we all miss attending in-person conferences. This one didn&apos;t feel so much like that because the community made it come alive. There were so many memorable moments during the conference.&lt;/p&gt;
&lt;p&gt;I had the chance to be a part of the Speaker&apos;s Dinner a day before the conference, and it was so much fun. You can tell my face is missing from the zoom call, but I was present 😉. We had so much fun playing a Pub Quiz hosted by &lt;a href=&quot;https://twitter.com/isro_me&quot;&gt;Israel Roldan&lt;/a&gt; (PS: My manager, I&apos;m so proud to be working with him!)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465163/Screen_Shot_2020-09-16_at_5.12.12_PM_jlm4rf.png&quot; alt=&quot;Speaker Dinner Celebration via Zoom&quot; title=&quot;Speaker Dinner Celebration via Zoom&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL: DR;&lt;/strong&gt; The conference was so much fun and I took away so many things and looking forward to exploring and using them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The conference was a &lt;a href=&quot;https://www.vuejs.amsterdam/program&quot;&gt;two-day conference&lt;/a&gt; packed with so much goodness and some exciting news everyone was looking forward to... I&apos;m sure you already know what that is but more on that later.&lt;/p&gt;
&lt;h2&gt;Conference Day 1 (September 17th)&lt;/h2&gt;
&lt;p&gt;We kicked off the conference with &lt;a href=&quot;https://twitter.com/josgerards88&quot;&gt;Jos Gerards&apos;&lt;/a&gt; opening remarks and welcomed both attendees and speakers. I liked many cool things about the conference. I&apos;ll share some hints as we go on, and you can also &lt;a href=&quot;https://twitter.com/lauragift_&quot;&gt;let me know if you feel the same way&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our hosts for the conference were &lt;a href=&quot;https://twitter.com/MariaLamardo&quot;&gt;Maria Lamardo&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/bencodezen&quot;&gt;Ben Hong&lt;/a&gt; and they took over with &lt;strong&gt;speaker&lt;/strong&gt; &lt;strong&gt;introductions&lt;/strong&gt; and &lt;strong&gt;QnA Moderation&lt;/strong&gt;. I must say they both did a fantastic job pulling together and keeping everyone hyped for two days. That&apos;s no easy task, not that I&apos;ve hosted a conference before, but I can tell it must have taken a lot of work to pull it off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here&apos;s a rundown of some talks I attended from the first day of the conference. Watch out for yours truly!&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Test Driving Vue 3 by Anthony Gore&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/anthonygore&quot;&gt;Anthony Gore&lt;/a&gt; is the creator of &lt;a href=&quot;https://vuejsdevelopers.com&quot;&gt;VuejsDevelopers&lt;/a&gt; and a Vue Community Partner. In his talk, he takes Vue 3 on a Test Drive and explains why some changes were made from the way it works in Vue 2 and the ideas behind Vue 3. He shows how to use Vue 3 to build a reusable modal detailing some of the new features like Fragments, Teleports, and Composition API.&lt;/p&gt;
&lt;h3&gt;The Future of VueX by Kai King&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ajGglyQQD0k&quot;&gt;https://www.youtube.com/watch?v=ajGglyQQD0k&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/KiaKing85&quot;&gt;Kia King&lt;/a&gt; is a member of the Vue Core Team, and he focused his talk on the current state of VueX and what&apos;s coming in the future of VueX. VueX 3 support will work for Vue 2; likewise, VueX 4 will work with Vue3. The focus of Vuex 4 is for compatibility. He also shares the new installation process and some of the new features coming in Vuex 4, such as new bundles aligned with Vue 3 and slightly better TypeScript support. He also shares the direction for the future &lt;strong&gt;&quot;Vuex5&quot;&lt;/strong&gt; which is still in the RFC stage, and he shared features that this new version will ship with.&lt;/p&gt;
&lt;h3&gt;Migrating a big old codebase to Vue 3: what I&apos;m excited about! by Natalia Tepluhina&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=K1JoWmXh4qA&amp;amp;t=58s&quot;&gt;https://www.youtube.com/watch?v=K1JoWmXh4qA&amp;amp;t=58s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/N_Tepluhina&quot;&gt;Natalia Tepluhina&lt;/a&gt; is a member of the Vue Core team and Staff Frontend Engineer at GitLab. In her talk, she shared how she plans to migrate a big old codebase(Gitlab Codebase) to Vue 3 and some of the things she&apos;s excited about. In general, she pointed out things to watch out for like mixins, and she recommends as a go-to use Stateful components as Functional components can grow performance gains by 2.x.&lt;/p&gt;
&lt;h3&gt;Experience of the new Vue by Rahul Kadyan&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465192/Screen_Shot_2020-09-17_at_2.26.07_PM_fmbrgt.png&quot; alt=&quot;New Vue Experience&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/znck0&quot;&gt;Rahul Kaydan&lt;/a&gt; is also a Vue.js core team member and works as a software engineer at Grammarly. His talk is about his experience with Vue 3 and its ecosystem. He shares his experience working with Composition API, Compiler, and Vite.&lt;/p&gt;
&lt;h3&gt;Vue 3 Reactivity Under The Hood by Marc Backes&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465297/Screen_Shot_2020-09-17_at_2.47.16_PM_qr8yxv.png&quot; alt=&quot;Vue Reactivity&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/themarcba&quot;&gt;Marc Backes&lt;/a&gt; is a freelance developer and host of Whiskey Wednesdays. In his talk, he shared in a demo how Vue 3 Reactivity works under the hood by building a simplified version from scratch. He took us through how Reactivity worked in Vue 2 and showed how Vue 3 reactivity works differently.&lt;/p&gt;
&lt;h3&gt;Introduction to Vite &amp;amp; Vitepress by Tim Benniks&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/timbenniks&quot;&gt;Tim&apos;s&lt;/a&gt; talk was one of the best in terms of delivery...he went all out on this one and made us all look like amateurs! His talk covered Vite and Vitepress, and it was an excellent introduction to Vite for me personally. I&apos;ve never used it in a project. I only remember when it was released, and it was nice to see how Vite and Vitepress works from scratch.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=gojCkw5Ih7E&quot;&gt;https://www.youtube.com/watch?v=gojCkw5Ih7E&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The Exciting New Features for Routing in Vue3; Vue Router 4 by Eduardo San Martin Morote&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465206/Screen_Shot_2020-09-17_at_3.45.40_PM_xjjtm1.png&quot; alt=&quot;Vue Router 4 Talk&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/posva&quot;&gt;Eduardo&lt;/a&gt; is the creator of Vue Router. He shared some exciting new features coming in Vue Router 4. His talk showed features no longer supported and some useful features that&apos;s coming in the latest version.&lt;/p&gt;
&lt;h3&gt;JAMstack FTW- Static Site Generation With Gridsome by Gift Egwuenu&lt;/h3&gt;
&lt;p&gt;I gave a talk, and it covered an introduction to Gridsome and the possibilities of what you can achieve with the Jamstack. I showed how you could also extend the functionalities of a Gridsome Application by leveraging the API&apos;s it ships with. At this point, technical difficulties set in, and I wasn&apos;t able to complete my talk(it was prerecorded, and the video was skipping). No worries though, I have a link to &lt;a href=&quot;https://speakerdeck.com/lauragift21/jamstack-ftw-static-site-generation-with-gridsome&quot;&gt;my slides&lt;/a&gt; and the recording if you missed it or want to see the full version of the &lt;a href=&quot;https://youtu.be/E3kyCodVVOM&quot;&gt;talk on my channel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=E3kyCodVVOM&quot;&gt;https://www.youtube.com/watch?v=E3kyCodVVOM&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Creating a JAM Stack product from scratch by Alex Jover&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465058/Screen_Shot_2020-09-30_at_3.46.57_AM_juuxsy.png&quot; alt=&quot;Alex Jover Talk&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/alexjoverm&quot;&gt;Alex Jover&lt;/a&gt; is the creator of &lt;a href=&quot;https://vuedose.tips/&quot;&gt;Vue Dose&lt;/a&gt; and Organizer of Vue.js Spain. In his talk, he shared the process of rebuilding Vue Dose from the ground up with Nuxt and Storyblok. He also showed the problems with the first version and what needed to be improved, and the &lt;strong&gt;seven steps&lt;/strong&gt; he went through to recreate a new version of Vue Dose.&lt;/p&gt;
&lt;h3&gt;Dynamic from static with the right (JAM)stack by Maya Shavin&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465107/Screen_Shot_2020-09-30_at_3.52.57_AM_r4b56o.png&quot; alt=&quot;Maya Shavin Talk&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/MayaShavin&quot;&gt;Maya Shavin&lt;/a&gt; is a Senior Frontend Developer at Cloudinary. In her talk, she shares what the Jamstack is and explores some tools in the Jamstack ecosystem. She mentioned something I think I needed to pay attention to because we have so many options to choose from, doesn&apos;t mean you have to use every tool in your application but instead think from the performance perspective. So asking the question does adding all of these services make my app more performant?&lt;/p&gt;
&lt;h2&gt;Conference Day 2 (September 18th)&lt;/h2&gt;
&lt;p&gt;The second day of the conference kicked off with the organizer Jos Gerards welcoming attendees back for another day of great content. The talks for the day were all packed with news and great content in the Vue community. Ranging from a lineup of Nuxt.js seasoned featured speakers and the most anticipated presentation - Evan You&apos;s announcement(Wait for it...)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here&apos;s a rundown of some of the talks from the second day of the conference.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Optimizing for Super Sonic Speed in Vue.js &amp;amp; Gridsome by Shopido Ayomide&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=U3oYroX1LCQ&quot;&gt;https://www.youtube.com/watch?v=U3oYroX1LCQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/developerayo&quot;&gt;Shopido Ayomide&lt;/a&gt; was the first speaker for the day. He&apos;s a developer Advocate at Fleek and also Community Organizer. His talk focused on optimizing speed in Vue &amp;amp; Gridsome. He shared why speed should be treated as a feature and the importance of performance optimization in
Vue.js applications.&lt;/p&gt;
&lt;h3&gt;Chakra UI Vue by Jonathan Bakebwa&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/codebender828&quot;&gt;Jonathan&lt;/a&gt; is the creator of Chakra UI Vue and UI Engineer at Akkadu. He shows us some Chakra UI Vue capabilities with demos of some popular websites he recreated with Chakra UI Vue in his talk. The component library is built from the ground up with accessibility in mind. I&apos;m a big fan of Chakra UI and love that it&apos;s a fast-growing component library and one of my goto libraries to use in a project.&lt;/p&gt;
&lt;h3&gt;The state of Nuxt by Sebastien Chopin&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/Atinux&quot;&gt;Sebastien Chopin&lt;/a&gt; is the co-author of Nuxt.js. His talk focused on the state of Nuxt and recent features that were introduced in the current release Nuxt v2.14 including Full Static Mode, Smart Generate that skips webpack build when there are no code changes. He also shared some stats from this year, a project from the Nuxt team called &lt;a href=&quot;https://vuetelemetry.com/&quot;&gt;Vue Telemetry&lt;/a&gt;, and finally talked about some changes coming in Nuxt.js v3.0&lt;/p&gt;
&lt;h3&gt;Nuxt.js Architecture by Pooya Parsa&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/_pi0_&quot;&gt;Pooya Parsa&lt;/a&gt; is the head of framework at Nuxt.js. In his talk, he goes through a deep dive of Nuxt architecture updates and an in-depth look at some of the features coming in Nuxt v3.0 - Typescript Support, updates to Builder 3, multi-app support. He also shared there&apos;s ongoing work in creating a guide for migrating from Nuxt 2 to Nuxt 3.&lt;/p&gt;
&lt;h3&gt;Nuxt.js as a headless CMS by Debbie O&apos;Brien&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/debs_obrien&quot;&gt;Debbie O&apos;Brien&lt;/a&gt; is the head of learning at Nuxt. She shared one of the new features in Nuxt that I&apos;m excited about &lt;a href=&quot;https://content.nuxtjs.org&quot;&gt;Nuxt Content Module&lt;/a&gt;. She explained what a headless CMS is and how Nuxt content works and demonstrates how to get the Content module up and running.&lt;/p&gt;
&lt;h3&gt;SEO in a Vue.js world by Alexander Lichter&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/TheAlexLichter&quot;&gt;Alexander&lt;/a&gt; is a Nuxt.js core maintainer and web developer consultant. In his talk, he walks through what SEO is and the importance of optimizing SEO and detailing the three pillars of SEO - on-page, off-page, and technical and shared some tips for improving SEO on Vue.js applications.&lt;/p&gt;
&lt;h3&gt;What you&apos;ll love in Vue 3 by Alex Kyriakidis&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hootlex&quot;&gt;Alex Kyriakidis&lt;/a&gt; is the founder of Vue School. In his talk, he shares some exciting features we&apos;ll love in Vue 3. I enjoyed learning about some features of Vue 3 from Alex as he talked through them with examples. No more Reactivity Caveats in Vue 3, introduced teleports with some use cases, and how composition API will help with logic reuse and code organization flexibility.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vykQhui3tfE&quot;&gt;https://www.youtube.com/watch?v=vykQhui3tfE&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The State of Vue 3 featuring Evan You&apos;s Announcement&lt;/h3&gt;
&lt;p&gt;This was one of the sessions we&apos;ve been waiting for and anticipating to hear what news &lt;a href=&quot;https://twitter.com/youyuxi&quot;&gt;Evan You&lt;/a&gt; had for us in his Keynote, which streamed live. I guessed right on this one, and I was right.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://v3.vuejs.org/guide/introduction.html&quot;&gt;Vue 3&lt;/a&gt; &lt;strong&gt;&quot;One Piece&quot;&lt;/strong&gt; was released on September 18th at 4:45 pm(WAT). I even got the time right; that&apos;s to show you how excited I was! You can watch the recording directly. I want to say I appreciate the work that went into the release of Vue 3 when Evan shared the journey to Vue 3. It took two years of active development to get this out the door so thank you to every member of the Core Team and Community doing the excellent work of contributing to make Vue the fantastic framework that it is.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Vp5ANvd88x0&quot;&gt;https://www.youtube.com/watch?v=Vp5ANvd88x0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Following the announcement, there was a live QnA session where some members of the community and Panel got to ask Evan some questions. It was so good and nicely put together.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465296/Screen_Shot_2020-09-18_at_5.31.57_PM_mqgrto.png&quot; alt=&quot;QnA Session with Evan You&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;After Party and Community Connections&lt;/h2&gt;
&lt;p&gt;Well, after the talks ended for the conference, you&apos;d think it was the end of the conference since it&apos;s online and there&apos;s no physical after party. That was not the case for us. We had a great time during the conference, yes but still had many people hanging around waiting for the after-party! 🎉&lt;/p&gt;
&lt;p&gt;Jos Gerards played some lovely music. We even had a conference Spotify Playlist where people can add cool songs from where their locations. I liked that the &lt;a href=&quot;https://hopin.to/&quot;&gt;Hopin&lt;/a&gt; platform had almost the same experience you&apos;ll get from attending an in-person conference. I checked out the Sponsors Booth and did a couple of networking with some attendees for me. This was one of the things I appreciated about the conference. The chat was so lively, and everyone was excited, and you could feel it from wherever you&apos;re connected from around the world.&lt;/p&gt;
&lt;h2&gt;Takeaways and What I&apos;m looking forward to next time!&lt;/h2&gt;
&lt;p&gt;The conference was very well put together, and I had a lot of fun participating in it. Kudos and great job to the team for putting on such a great event.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vuejs.amsterdam&quot;&gt;Vue.js Amsterdam 2021&lt;/a&gt; is freeeeee! Meaning you get the same experience from this year with even more vibes, but for free, isn&apos;t that just great! &lt;a href=&quot;https://www.vuejs.amsterdam/account/register?event=vue-js-amsterdam-2021&quot;&gt;You can sign up for a ticket now&lt;/a&gt;. I&apos;ve already got my ticket! 😅&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1601465000/Screen_Shot_2020-09-29_at_1.29.05_PM_qayo2k.png&quot; alt=&quot;Vuejs amsterdam 2021 ticket&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m looking forward to the awesomeness we create next year. Vue Global conference is brought to the community by &lt;a href=&quot;https://passionatepeople.io/&quot;&gt;Passionate People&lt;/a&gt; - a developer consultancy in Amsterdam, where I work(shameless plug 😜).&lt;/p&gt;
&lt;p&gt;The videos from the conference will be available on &lt;a href=&quot;https://www.youtube.com/vuejsamsterdam?sub_confirmation=1&quot;&gt;Youtube&lt;/a&gt; with some already uploaded and on the Conference Video Portal, so keep an eye on there to catch the talks you missed.&lt;/p&gt;
</content:encoded></item><item><title>Deploy a Gridsome App on Azure Static Web Apps</title><link>https://giftegwuenu.com/azure/</link><guid isPermaLink="true">https://giftegwuenu.com/azure/</guid><description>A step-by-step guide to deploying a Gridsome app with Azure Static Web Apps.</description><pubDate>Sun, 07 Jun 2020 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mybuild.microsoft.com/home&quot;&gt;Microsoft Build&lt;/a&gt; happened a few weeks back, among the various exciting news, one of my favorite ones was the newly unveiled &lt;a href=&quot;https://azure.microsoft.com/en-us/services/app-service/static/&quot;&gt;Azure Static Web Apps&lt;/a&gt;. I&apos;m excited to give it a try and show you how to deploy a Gridsome web application. There&apos;s already enough tutorials about this why write more? Well, because I couldn&apos;t find one with a Gridsome example and I decided to take on the opportunity, there&apos;s never enough written tutorials on a subject.&lt;/p&gt;
&lt;h2&gt;What is Azure Static Web Apps?&lt;/h2&gt;
&lt;p&gt;Azure Static Web Apps is a service that automatically builds and deploys full-stack web apps to Azure from a GitHub repository.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1591628792500_static-apps-overview.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;These are some of the features it ships with out of the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free web hosting&lt;/li&gt;
&lt;li&gt;Free SSL Certificates&lt;/li&gt;
&lt;li&gt;Authentication Integrations&lt;/li&gt;
&lt;li&gt;Custom Domains&lt;/li&gt;
&lt;li&gt;Globally distributed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s a more detailed guide on how &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/static-web-apps/overview&quot;&gt;Azure Static Web Apps Works&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this tutorial, We&apos;ll go over how to deploy a static website to Azure using the Static Web Apps service. For this example, I have a Gridsome app I&apos;ll like to deploy to this service, and I&apos;ll walk through how to set up and deploy my app.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;To follow this guide, you need to have basic knowledge of Vue.js, have an Azure account, Node.js installed, and a GitHub account handy.&lt;/p&gt;
&lt;h2&gt;Step 1:&lt;/h2&gt;
&lt;p&gt;Install Gridsome CLI tool:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install --global @gridsome/cli
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 2:&lt;/h2&gt;
&lt;p&gt;I’m using a starter project I created to get things moving fast here. Go ahead and run the command to create a new Gridsome project.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gridsome create my-blog https://github.com/lauragift21/gridsome-minimal-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now run your app locally with the command.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run develop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590433661331_Screenshot+2020-05-25+at+8.07.25+PM.png&quot; alt=&quot;screenshot of gridsome blog&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Step 3:&lt;/h2&gt;
&lt;p&gt;We have our &lt;a href=&quot;http://www.gridsome.org&quot;&gt;Gridsome&lt;/a&gt; application up and running, Let&apos;s push the app to GitHub we&apos;ll do so using the following commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add.

git commit -m &apos;my new gridsome blog&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, create a repository on &lt;a href=&quot;https://github.com/new&quot;&gt;GitHub&lt;/a&gt; called my-fancy-blog or use any fancy name you want and run the following commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin git@github.com:&amp;lt;YOUR-USER-NAME&amp;gt;/my-fancy-blog.git`

git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We&apos;ve now added our application to GitHub successfully. Let&apos;s move on to the last step.&lt;/p&gt;
&lt;h2&gt;Step 4:&lt;/h2&gt;
&lt;p&gt;This is where we deploy the web app on Azure Static Web Apps.&lt;/p&gt;
&lt;p&gt;You need to have an active Azure account to follow these next steps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Login to your Azure account and navigate to Azure Portal&lt;/li&gt;
&lt;li&gt;Click on create a resource&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590606779748_Screenshot+2020-05-27+at+7.57.18+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search for Static Web Apps and click create&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607743578_Screenshot+2020-05-27+at+7.57.42+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next, pick a subscription from the dropdown and pick a resource group in my case, I selected the default subscription and created a new resource group.&lt;/li&gt;
&lt;li&gt;Give your app a name and choose a region that’s closest to you.&lt;/li&gt;
&lt;li&gt;Click on the sign in with the GitHub button. It&apos;ll enable you to connect your repository to Azure Static Web Apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590606908511_Screenshot+2020-05-27+at+8.05.59+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once you have GitHub connected, you can choose your GitHub repository and choose the branch you want to deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607195497_Screenshot+2020-05-27+at+8.11.08+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specify a folder location to store static output in my case I’m using the &lt;code&gt;dist&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607248709_Screenshot+2020-05-27+at+8.11.27+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Azure sets up a default &lt;code&gt;npm run build&lt;/code&gt; in my GitHub actions workflow which can be customized to a different command. In my case, I didn&apos;t need to set that up since it&apos;s the default command.&lt;/p&gt;
&lt;p&gt;In the last step, we can review our configuration to make sure we have everything set up correctly and click create to get the app deployed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607481589_Screenshot+2020-05-27+at+8.21.58+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s it! You&apos;ll get redirected to a page showing your app deployment is ongoing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607486946_Screenshot+2020-05-27+at+8.22.27+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607491471_Screenshot+2020-05-27+at+8.23.23+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To check how things are working under the hood, Log on to GitHub and check the actions tab on your repo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607496804_Screenshot+2020-05-27+at+8.23.33+PM.png&quot; alt=&quot;setting up azure static web apps&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You should see the actions running, and when that ends, your app should be live. Check back on the Azure portal you should see a browse button by clicking on it will take you to your deployed app🎉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A01F5AB394E159A5771101449A83AC90C3F879B2DA59BD15747F4E3DA92C5900_1590607535650_Screenshot+2020-05-27+at+8.25.26+PM.png&quot; alt=&quot;Deployed version of the blog&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That was fun! I&apos;m quite impressed with how straightforward it was to get this working. In just a few clicks, I deployed version of my site. If you&apos;re interested in learning more about how to deploy another kind of application, The Azure team has a &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/static-web-apps/&quot;&gt;well-documented guide&lt;/a&gt; on how to do that. I hope this was helpful as much I enjoyed writing and trying out Azure Static Web Apps.&lt;/p&gt;
</content:encoded></item><item><title>Soft Skills Every Software Developer Should Learn</title><link>https://giftegwuenu.com/soft-skills/</link><guid isPermaLink="true">https://giftegwuenu.com/soft-skills/</guid><description>Essential soft skills that can accelerate your growth as a software developer.</description><pubDate>Thu, 30 Apr 2020 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello People! Let&apos;s move away from core technical things for a bit. In this video, I share soft skills that I feel every developer should learn and improve.&lt;/p&gt;
&lt;p&gt;https://www.youtube.com/embed/b4b_z6gFmlY&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;The norm that technical skills are important than the core soft skills does not hold true in the industry today. We all have to balance both to stay relevant in the industry.&lt;/p&gt;
&lt;p&gt;I learned a lot from &lt;a href=&quot;https://www.pluralsight.com/&quot;&gt;Pluralsight&lt;/a&gt; this month already and I decided to learn a bit more about soft skills. Here are some courses that I really enjoyed taking.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.pluralsight.com/courses/developing-killer-personal-brand&quot;&gt;Developing a Killer Personal Brand - Jason Alba&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.pluralsight.com/courses/hanselman-speaking&quot;&gt;The Art of Speaking: Scott Hanselman&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.pluralsight.com/courses/how-to-be-great-mentor&quot;&gt;How to Be a Great Mentor: Get More out of Mentoring - Jason Alba&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy the video :)&lt;/p&gt;
</content:encoded></item><item><title>Applying CSS :focus-within</title><link>https://giftegwuenu.com/focus-within/</link><guid isPermaLink="true">https://giftegwuenu.com/focus-within/</guid><description>How to use the CSS :focus-within pseudo-class for better form and component styling.</description><pubDate>Wed, 12 Feb 2020 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In my quest to learn something new every week. I came across a not so new pseudo-class element &lt;a href=&quot;https://drafts.csswg.org/selectors-4/#the-focus-within-pseudo&quot;&gt;:focus-within&lt;/a&gt;. Let&apos;s take a look at how it works and how to apply it to our styles.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;:focus-within&lt;/code&gt; pseudo-class represents an element that is paired with the &lt;code&gt;:focus&lt;/code&gt; pseudo-class or has a descendant that is matched by &lt;code&gt;:focus&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NB: the focus here means when you click, tap or tab through an element such as a form input or a link.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like how &lt;a href=&quot;https://css-tricks.com/almanac/selectors/f/focus-within/&quot;&gt;Chris Coyier&lt;/a&gt; explains it in simple terms:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It selects an element if that element contains any children that have &lt;code&gt;:focus&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;How is this different from &lt;code&gt;:focus&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;:focus&lt;/code&gt; pseudo-element works differently, an element receives focus when the &lt;code&gt;:focus&lt;/code&gt; element is applied to it, but, in a case when you have a collection of child elements it is not common to use &lt;code&gt;:focus&lt;/code&gt; pseudo-class to select the parent element. The &lt;code&gt;:focus&lt;/code&gt; pseudo-class applies only to the focused element itself.&lt;/p&gt;
&lt;p&gt;https://codepen.io/lauragift21/pen/VwLLggX?tabs=result,css&lt;/p&gt;
&lt;p&gt;This is what &lt;code&gt;:focus-within&lt;/code&gt; is able to solve. We can use &lt;code&gt;:focus-within &lt;/code&gt;pseudo-class if we want to select an element that contains a focused element or elements that has descendants matched by &lt;code&gt;:focus&lt;/code&gt;. Let&apos;s see how to achieve that.&lt;/p&gt;
&lt;h2&gt;Applying :focus-within&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;:focus-within&lt;/code&gt; is useful for different use-cases. You can think of using it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To highlight an entire form when one of its input fields is in focus.&lt;/li&gt;
&lt;li&gt;Highlight rows of a table and change the background color when a user clicks on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s an example, for highlighting an entire &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; container when the user focuses on one of its &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; fields.&lt;/p&gt;
&lt;p&gt;https://codepen.io/lauragift21/pen/gOppEVP?tabs=result,css&lt;/p&gt;
&lt;h2&gt;Browser Support&lt;/h2&gt;
&lt;p&gt;As of 2020, This CSS feature is widely supported only IE browsers don&apos;t have support yet. Here&apos;s a table of current browser that fully supports &lt;code&gt;:focus-within&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/i/nu2usvsjsm47xyraenqe.png&quot; alt=&quot;Can I use&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;:focus-within&lt;/code&gt; element is an accessibility win for developers and users on the web. We should always keep it in mind while coding it&apos;s way better to reach for this than use JavaScript to accomplish the same task.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://drafts.csswg.org/selectors-4/#the-focus-within-pseudo&quot;&gt;CSS Focus Within Spec&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within&quot;&gt;MDN Docs&lt;/a&gt; &lt;a href=&quot;https://css-tricks.com/almanac/selectors/f/focus-within/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://css-tricks.com/almanac/selectors/f/focus-within/&quot;&gt;CSS Tricks :focus-within&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>TIL: CSS Media Queries</title><link>https://giftegwuenu.com/media-queries/</link><guid isPermaLink="true">https://giftegwuenu.com/media-queries/</guid><description>Lesser-known CSS media query features that can improve your responsive designs.</description><pubDate>Thu, 06 Feb 2020 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been working on the web for a few years now but I haven&apos;t paid any attention to the &lt;a href=&quot;https://www.w3.org/&quot;&gt;W3C standards&lt;/a&gt; or visited the website to see where all the magic on the web happens.&lt;/p&gt;
&lt;p&gt;Well, a few days ago I stumbled on &lt;a href=&quot;https://www.smashingmagazine.com/2019/10/happy-birthday-w3c/&quot;&gt;Rachel Andrew&apos;s smashing article celebrating the W3C at 25&lt;/a&gt; and one thing led to another I landed on the CSS working group page several clicks down the line and I&apos;m lost and amazed at what I had no idea existed.&lt;/p&gt;
&lt;p&gt;The web is an open platform and there are a lot of amazing people working together to build and manage the web standards we all work with from accessibility, CSS, JavaScript and a lot more. Why I&apos;m saying all of this is because from my crazy search I learned something new and I&apos;ll like to share with others.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TIL - Today I Learned&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we&apos;ve come across the &lt;code&gt;@media&lt;/code&gt; CSS rule but did you know that they are cool things you can do with it asides making your website responsive? The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries&quot;&gt;syntax of a media query&lt;/a&gt; is composed of an optional media type(such as print or screen) and any number of media feature expressions. In this article, I&apos;ll share some media features I previously didn&apos;t know about and hope you learn and share them too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NB: Some of the features I&apos;ll share are part of the CSS Working Group Draft and are not finalized yet. The features are part of the Media Queries Level 5 specifications and should be used&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Prefers-Color-Scheme&lt;/h2&gt;
&lt;p&gt;The prefers-color-scheme CSS media feature is used to detect if the user has requested the system to use a light or dark color theme. This is very useful for aesthetics and accessibility purposes and a lot of developers now adopt the dark mode feature, most websites I have visited lately have the dark mode feature implemented mine included. This media feature can be implemented with these modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;no-preference:&lt;/strong&gt; Indicates that the user has made no preference known to the system. This keyword value evaluates as false in the boolean context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;light:&lt;/strong&gt; Indicates that the user has notified the system that they prefer an interface that has a light theme.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dark:&lt;/strong&gt; Indicates that the user has notified the system that they prefer an interface that has a dark theme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s a short demo of how this feature works.&lt;/p&gt;
&lt;p&gt;https://codepen.io/lauragift21/pen/ZEGYzXB?tabs=result,css&lt;/p&gt;
&lt;p&gt;This feature was added in &lt;a href=&quot;https://drafts.csswg.org/mediaqueries-5/#prefers-color-scheme&quot;&gt;Media Queries Level 5 spec&lt;/a&gt; and is supported by major browsers you can try this out right now by switching the default theme of your device. The &lt;a href=&quot;https://caniuse.com/&quot;&gt;can I use embed&lt;/a&gt; give a detailed view of browsers that are fully supported.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/i/lwhsv1gesnswh0g1868v.png&quot; alt=&quot;Can I Use Image&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Prefers-Reduced-Motion&lt;/h2&gt;
&lt;p&gt;The prefers-reduced-motion CSS media feature is used to detect if the user has requested that the system minimize the amount of animation or motion it uses. This feature is super important for people with the &lt;a href=&quot;https://vestibular.org/understanding-vestibular-disorder&quot;&gt;vestibular disorder&lt;/a&gt; or motion sickness this can be uncomfortable for them visiting a website with a lot of animation and motion so this feature is a great way to minimize or turn motion off. Luckily, Operating systems like Android, iOS, macOS, or Windows in their accessibility settings have allowed users for a long time to reduce motion wherever possible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/i/vlr74psyz92nza7araxq.png&quot; alt=&quot;MacOS settings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This media feature can be implemented with these modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;no-preference&lt;/strong&gt;: Indicates that the user has made no preference known to the system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reduce&lt;/strong&gt;: Indicates that the user has notified the system that they prefer an interface that minimizes the amount of movement or animation, preferably to the point where all non-essential movement is removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s a demo of how this feature works. The box will remain animated unless you switch the reduce motion option on let&apos;s try doing that by checking the accessibility settings on your device you&apos;ll immediately notice the animation is turned off.&lt;/p&gt;
&lt;p&gt;https://codepen.io/lauragift21/pen/WNvbNGR?tabs=result,css&lt;/p&gt;
&lt;p&gt;Added in &lt;a href=&quot;https://drafts.csswg.org/mediaqueries-5/#prefers-reduced-motion&quot;&gt;Media Queries Level 5 spec&lt;/a&gt; and is supported by major browsers you can try this out right now by switching the default theme of your device. The &lt;a href=&quot;https://caniuse.com/&quot;&gt;can I use embed&lt;/a&gt; give a detailed view of browsers that are fully supported.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/i/pfnjmi9npnwd5s94liz3.png&quot; alt=&quot;Prefers Reduced Motion embed&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Prefers-Contrast&lt;/h2&gt;
&lt;p&gt;The prefers-contrast CSS media feature is used to detect if the user has requested that the web content is presented with a higher (or lower) contrast.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This feature is still experimental and it&apos;s currently in the process of being added to the web platform.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The media feature can be implemented with these modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;no-preference&lt;/strong&gt;: Indicates that the user has made no preference known to the system. This keyword value evaluates as false in the boolean context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;low&lt;/strong&gt;: Indicates that the user has notified the system that they prefer an interface that has a lower level of contrast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;high&lt;/strong&gt;: Indicates that the user has notified the system that they prefer an interface that has a higher level of contrast.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: No browser currently implements this feature so I can&apos;t show an example of how it works but I look forward to seeing this feature ship.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Prefers-Reduced-Transparency&lt;/h2&gt;
&lt;p&gt;The prefers-reduced-transparency CSS media feature is used to detect if the user has requested that the system minimize the amount of transparency used across elements.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This feature is still experimental and it&apos;s currently in the process of being added to the web platform.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The media feature can be implemented with these modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;no-preference:&lt;/strong&gt; Indicates that the user has made no preference known to the system. This keyword value evaluates as false in the boolean context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reduce:&lt;/strong&gt; Indicates that the user has notified the system that they prefer an interface that minimizes the amount of transparent or translucent layer effects.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: No browser currently implements this feature so I can&apos;t show an example of how it works but I look forward to seeing this feature ship.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Prefers-Reduced-Data&lt;/h2&gt;
&lt;p&gt;The prefers-reduced-data media feature is used to detect if the user has a preference for being served alternate content that uses less data for the page to be rendered.&lt;/p&gt;
&lt;p&gt;The media feature can be implemented with these modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;no-preference:&lt;/strong&gt; Indicates that the user has made no preference known to the system. This keyword value evaluates as false in the boolean context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reduce:&lt;/strong&gt; Indicates that the user has expressed the preference for lightweight alternate content.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: No browser currently implements this feature but here&apos;s an example of how it works from Adam Argyle tweet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://twitter.com/argyleink/status/1225240181822742529&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&apos;m excited about these additional media features and can&apos;t wait to start using them in my web projects. Like I mentioned earlier a few of them are still in the working draft for &lt;a href=&quot;https://drafts.csswg.org/mediaqueries-5/&quot;&gt;Media Queries Level 5&lt;/a&gt; and there&apos;s no browser support for now. But 2020 is the year more capability grows on the web and I&apos;m here to experience all of it. Share your thoughts on these if you have used it or have any thoughts on this specification.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;p&gt;https://drafts.csswg.org/mediaqueries-5&lt;/p&gt;
&lt;p&gt;https://web.dev/prefers-color-scheme&lt;/p&gt;
&lt;p&gt;https://a11y-101.com/development/reduced-motion&lt;/p&gt;
&lt;p&gt;https://developers.google.com/web/updates/2019/03/prefers-reduced-motion&lt;/p&gt;
</content:encoded></item><item><title>2019 In Review; My Year of Grace</title><link>https://giftegwuenu.com/year-in-review-2019/</link><guid isPermaLink="true">https://giftegwuenu.com/year-in-review-2019/</guid><description>My year of grace: unexpected blessings and milestones that made 2019 unforgettable.</description><pubDate>Sun, 29 Dec 2019 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The year is 2025, and I’m randomly scrolling through my blog and I come across this post I’ve written, one thing is certain I’ll have a sheepish smile on my face. The purpose of writing a year-end review is to reflect on how well you did, check yourself and set goals for the next year. &lt;a href=&quot;https://www.giftegwuenu.com/my-2018-year-in-review-and-2019-resolutions&quot;&gt;I started doing this in 2018&lt;/a&gt; and I know there’s value here and it helps reinforce the fact that I’m doing great and hitting my long term goals.&lt;/p&gt;
&lt;p&gt;I resolved at the beginning of the year to create a list of things I wanted to achieve before the year runs out I used &lt;a href=&quot;https://www.notion.so/?r=dc185bbb4b3443619f50b44d8415422d&quot;&gt;Notion&lt;/a&gt; for tracking my progress which I find helpful. I’m happy to say I accomplished all my goals for the year. Well, except a few like learning how to drive but I’ve moved those to my 2020 goals.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577438430063_Screenshot+2019-12-27+at+10.20.15+AM.png&quot; alt=&quot;My Notion Board&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Highlights of the year ✨&lt;/h2&gt;
&lt;p&gt;I tagged 2019 my year of grace because a lot of events that happened in my life didn’t go the way I had planned it they were even better than I expected. I am so sure God is looking out for me because I had a good year.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;In 2019, I…&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Got promoted at work in January&lt;/li&gt;
&lt;li&gt;Hosted 3 events for Vue Vixens Nigeria&lt;/li&gt;
&lt;li&gt;Started a the JAMstack Community with &lt;a href=&quot;https://twitter.com/iChuloo&quot;&gt;William&lt;/a&gt; and hosted 2 events&lt;/li&gt;
&lt;li&gt;Spoke 5 times this year and gave 1 workshop&lt;/li&gt;
&lt;li&gt;Traveled to 3 countries and visited 6 cities&lt;/li&gt;
&lt;li&gt;Invited to 3 International Conferences&lt;/li&gt;
&lt;li&gt;I became a Media Developer Expert for Cloudinary&lt;/li&gt;
&lt;li&gt;Started a YouTube Channel and created 12 videos and got up 464 subs in less than 6 months&lt;/li&gt;
&lt;li&gt;Published 23 posts on my blog and my blog traffic grew to 15,000 page views and on &lt;a href=&quot;https://dev.to&quot;&gt;Dev.to&lt;/a&gt; 129,000 post views.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Work&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Overall I think my growth pivoted this year, Things started great at work as I got promoted in January, I was involved with a lot of open-source projects. I contributed to &lt;a href=&quot;https://github.com/gridsome/gridsome.org&quot;&gt;Gridsome Docs&lt;/a&gt;, &lt;a href=&quot;https://github.com/DivanteLtd/storefront-ui&quot;&gt;Storefront UI&lt;/a&gt;, &lt;a href=&quot;https://github.com/devcenter-square/Learning-Resource-Path-Front-End&quot;&gt;Learning Resource Roadmap&lt;/a&gt;. In total, I had 1017 contributions on GitHub. I created a &lt;a href=&quot;https://github.com/lauragift21/gridsome-minimal-blog&quot;&gt;starter for Gridsome called Minimal Blog Starter&lt;/a&gt; which I’ve seen a couple of people using.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577440586388_Screenshot+2019-12-27+at+10.56.18+AM.png&quot; alt=&quot;GitHub Contributions&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Writing, Speaking &amp;amp; Community&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I wrote a total of 23 articles both on my blog and other publications and traffic on my blog grew by over 15,000 page views. I shared a lot of tutorials and decided to try video tutorials as well. I created 12 videos on &lt;a href=&quot;https://www.youtube.com/channel/UCgUgg53iJX1pdabUxpkgozA&quot;&gt;my YouTube Channel&lt;/a&gt; and grew my subscribers to 464 amazing subs.&lt;/p&gt;
&lt;p&gt;My favorites among articles I wrote:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.giftegwuenu.com/the-art-of-googling&quot;&gt;The Art of Googling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.giftegwuenu.com/building-a-ui-component-with-react-and-storybook&quot;&gt;Building a UI Component with React &amp;amp; Storybook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.giftegwuenu.com/a-practical-guide-to-optimizing-performance-on-the-web&quot;&gt;A Practical Guide to Optimizing Performance on the Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.giftegwuenu.com/guide-to-using-alternative-text-on-images&quot;&gt;Guide to using Alternative Text on Images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and YouTube Videos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=HxDqyK3fNUs&quot;&gt;Personal Branding for Software Engineers and Designers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9mLMtAxSr8U&quot;&gt;A Day in the Life of a Software Engineer in Lagos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ENaGmtn8dho&amp;amp;t=238s&quot;&gt;WHAT&apos;S IN MY WORK BAG?! // Software Engineer Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577441397781_Screenshot+2019-12-27+at+10.40.27+AM.png&quot; alt=&quot;YouTube Channel&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I spoke at &lt;a href=&quot;https://speakerdeck.com/lauragift21&quot;&gt;5 events&lt;/a&gt;, one of which was a meetup in Denver my first ever international speaking opportunity and gave a Vue Vixens workshop at &lt;a href=&quot;http://concatenate.dev/&quot;&gt;Concatenate Conference.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577443603774_EGgtusgWwAA_muk.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I was super active in the community this year. This comes with a lot of hard work and opportunities. I helped organized 6 events (meetups and a conference). The Vue Vixens Nigeria chapter I help run had 3 events with over 150 women introduced to Vue.js. JAMstack Lagos a community I started with a friend &lt;a href=&quot;https://twitter.com/iChuloo&quot;&gt;William Imoh&lt;/a&gt; now has almost &lt;a href=&quot;https://www.meetup.com/JAMStack-Lagos&quot;&gt;600 members on Meetup&lt;/a&gt; with two events under our belts I look forward to doing more in 2020. I also helped co-organize one of the biggest conferences in Africa &lt;a href=&quot;http://concatenate.dev/&quot;&gt;Concatenate Conference&lt;/a&gt; with other amazing folks (Sarah, Simona, Christian, and Silm) this is my biggest highlight of the year.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577443125933_IMG_5611.jpg&quot; alt=&quot;Vue Vixens 😍&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My dream to attend an international conference came to pass! Not only did I get a chance to attend one but I attended three different conferences. Microsoft Ignite, GitHub Universe and AWS re:Invent. This by far was one of the biggest events in my life this year and I’m grateful because not only did I attend I got to meet some of my heroes and made new connections not to forget the tons of knowledge gained on this adventure.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577444207304_IMG_6691-COLLAGE.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I got recognized as a &lt;a href=&quot;https://cloudinary.com/partners-old/media-developers&quot;&gt;Media Developer Expert for Cloudinary&lt;/a&gt;. They started the program this year and MDEs are unique software and design advocates who share their knowledge, expertise, and insights at community events and across the social web, aided by Cloudinary’s products and resources.
I was a guest on 3 podcasts in 2019 alone!! &lt;a href=&quot;https://devchat.tv/views-on-vue/vov-071-gridsome-with-gift-egwuenu/&quot;&gt;Views on Vue&lt;/a&gt;&lt;a href=&quot;https://thatsmyjamstack.com/posts/gift-egwuenu/&quot;&gt;, That’s my JAMstack&lt;/a&gt;&lt;a href=&quot;https://frontendhappyhour.com/episodes/sipping-our-drinks-enjoying-the-vue-vue-js/&quot;&gt;,&lt;/a&gt; and &lt;a href=&quot;https://frontendhappyhour.com/episodes/sipping-our-drinks-enjoying-the-vue-vue-js/&quot;&gt;Front End Happy Hour.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Life&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;My life was quite interesting nothing out of the blue. I was more intentional about self-care and looking out for myself. Also, like my friend will say trying to live my best life.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I read about 3 books not proud of this because I wanted to do more but didn’t dedicate time to reach my set goal. I promise myself I’ll do better by investing in audiobooks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I turned 24 and it feels like I’m getting old omg!!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I traveled to 6 cities in 3 countries. This was such an amazing experience and I look forward to doing more trips in 2020.
&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577445786445_IMG_3515-COLLAGE.jpg&quot; alt=&quot;Happy Moments&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I decided to cut my hair. Best decision ever as I now feel free I never liked making my natural hair it was so painful.
&lt;img src=&quot;https://paper-attachments.dropbox.com/s_613553E3A2CF0B36768E92B8020027C7BF360306EC6342F8BDEAE81FF9AA8BEE_1577445904155_IMG_0349-COLLAGE.jpg&quot; alt=&quot;Big Chop&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The L&apos;s in My Life&lt;/h2&gt;
&lt;p&gt;I&apos;ll be lying to myself if I said the entire 2019 was great and only good things happened to me. Well, life they say is not always a bed of roses. I had different points in my life when I doubted myself and dealt with depression. Not even going to think about the amount of times I felt like an imposter. A shitty place to be in life is when you can&apos;t find happiness I was in this block for a period and I hated it. I got rejected from getting things I was really hoping I would secure but that didn&apos;t stop me from trying again when I failed because if anything I won&apos;t give up. I kept the energy high and my attitude to those rejections is to keep trying I&apos;m taking this same energy into 2020.&lt;/p&gt;
&lt;h2&gt;Humans of 2019&lt;/h2&gt;
&lt;p&gt;I couldn&apos;t think of a better name for this section. I had grateful list in mind but decided to change it last minute. A special list of people who came through for me this year in one way or another and I want to thank them for taking a chance on me. These are people I now call friends and happy I have them in my life.
&lt;a href=&quot;https://twitter.com/sarah_edo&quot;&gt;Sarah Drasner&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/Mac_2reel&quot;&gt;Franca Rotwukka&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/simona_cotin&quot;&gt;Simona Cotin&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/karissapeth&quot;&gt;Karissa Peth&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/AdoraNwodo&quot;&gt;Adora Nwodo&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/seyi__adeleke&quot;&gt;Seyi Adeleke&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;I have a couple of things planned out for 2020. I also look forward to doing even more work and creating more impact than I did this year. It’s been such an exciting and scary journey I’ve had and I sincerely look forward to what I do with myself in 2020. My mantra for 2020 is to Do The Work!! Some plans I’ve in the works and hope to achieve include:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More Speaking Engagements:&lt;/strong&gt; I hope to speak at more events in 2020 and also improve my skills as a speaker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep the Fire Burning; Learn In Public:&lt;/strong&gt; I love the concept of &lt;a href=&quot;https://www.swyx.io/writing/learn-in-public/&quot;&gt;Learning in Public&lt;/a&gt; and I want to be intentional about this in 2020. The act of learning in public means you get to share your skill development and your works in progress online, even before you think you’re ready. I want to continue sharing content on my blog, YouTube and help build communities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Release Egghead Lessons:&lt;/strong&gt; I became an Egghead Instructor this year and I’m working on a couple of lessons and hoping they get released in 2020.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Write a Book and release a Course:&lt;/strong&gt; I started working on this project this year but I look forward to releasing them in 2020.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Land a New Job:&lt;/strong&gt; I want to explore more opportunities by 2020 that includes finding a new job. I’m open to working remotely or relocation. If you have any leads please let me know thanks!&lt;/p&gt;
&lt;p&gt;That wraps up my year! It was a great one I can’t wait to see what I do in 2020 as it’s the start of a new decade I’m so excited to keep growing and making an impact in my community.&lt;/p&gt;
</content:encoded></item><item><title>Reflections from Microsoft Ignite 2019</title><link>https://giftegwuenu.com/ms-ignite-2019/</link><guid isPermaLink="true">https://giftegwuenu.com/ms-ignite-2019/</guid><description>My experience attending Microsoft Ignite 2019 as a community leader and key takeaways.</description><pubDate>Sat, 09 Nov 2019 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This past week, I had the opportunity to attend &lt;a href=&quot;https://www.microsoft.com/en-us/ignite&quot;&gt;Microsoft Ignite&lt;/a&gt; as a community leader. This is by far one of the best things that have ever happened to me this year. Over the last few years, I started my career in tech I&apos;ve always wanted to attend an international conference I just didn&apos;t know when I&apos;ll get the chance to.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191056103045550080&lt;/p&gt;
&lt;p&gt;Microsoft Ignite is an annual conference put together by Microsoft with over 25k attendees ranging from IT Professionals, developers, architects, and data professionals who want to expand their proficiencies. The event features learning paths providing unmatched opportunities to explore the latest tools, receive deep technical training, and get specific questions answered by Microsoft experts.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191449564458475528&lt;/p&gt;
&lt;p&gt;The conference ran for 5 consecutive days and I had a lot of sessions scheduled but all I was looking forward to is Learn, Explore and Connect while at the conference.&lt;/p&gt;
&lt;h2&gt;Day 1 (Vision Keynote)&lt;/h2&gt;
&lt;p&gt;The first day of the conference was insightful I had first-hand experience attending &lt;a href=&quot;https://myignite.techcommunity.microsoft.com/sessions/77831?source=sessions&quot;&gt;Satya&apos;s keynote session&lt;/a&gt; where he made a couple of announcements of new products and improvements to other Microsoft products. One of my favorites was announcing &lt;a href=&quot;https://visualstudio.microsoft.com/services/visual-studio-online/&quot;&gt;Visual Studio online&lt;/a&gt; and Live share support.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191368024588206080&lt;/p&gt;
&lt;p&gt;Other announcements include:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://myignite.techcommunity.microsoft.com/sessions/77831?source=sessions&quot;&gt;Azure Stack Edge&lt;br /&gt;
Azure Arc&lt;br /&gt;
Azure Synapse&lt;br /&gt;
Autonomous Systems&lt;br /&gt;
Azure Quantum&lt;br /&gt;
Microsoft Edge announcements&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also got the chance to attend other sessions which I found interesting so much content to digest with a wide range of topics and interesting sessions to attend. I was able to attend these sessions as well.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://myignite.techcommunity.microsoft.com/sessions/80247?source=schedule&quot;&gt;Travel the world, meet the community&lt;/a&gt; - &lt;a href=&quot;https://twitter.com/benitezhere&quot;&gt;Elaiza Benitez&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://myignite.techcommunity.microsoft.com/sessions/80296?source=schedule&quot;&gt;Creating an inclusive community event&lt;/a&gt; - &lt;a href=&quot;https://twitter.com/larsklint&quot;&gt;Lars Klint&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191411453519171585&lt;/p&gt;
&lt;p&gt;The Partner Expo area is also one place I liked visiting because I got the chance to learn about products from Microsoft&apos;s Partner on the work they do and how they are leveraging Microsoft in their products and another perk you get is free swags who doesn&apos;t like free swags right??&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1192570538960576512&lt;/p&gt;
&lt;h2&gt;Day 2 (Developer Keynote)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://myignite.techcommunity.microsoft.com/sessions/81591?source=sessions&quot;&gt;The developer keynote&lt;/a&gt; themed &quot;Application development for everyone&quot; was one session I was looking forward to and I was not disappointed because the keynote speaker was &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;Scott Hanselman&lt;/a&gt; and oh well we know he&apos;s an amazing speaker.&lt;/p&gt;
&lt;p&gt;Here are my takeaways from the Keynote:&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191725350910341120?s=20&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Visual Studio Online - You can create a dev environment in minutes just online and it works the exact way as Visual studio with access to the full extension marketplace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Azure functions now have new languages support .Net Core 3.0 and Powershell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/services/intellicode/&quot;&gt;Intellicode&lt;/a&gt; AI-assisted IntelliSense saves you time by putting what you’re most likely to use at the top of your completion list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Live share support which lets you do real-time collaboration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We had several other demos on stage from other amazing speakers.&lt;/p&gt;
&lt;p&gt;Another session was an AMA with Scott Hanselman put together for the community leaders and that one was certainly one of my favorite I have a lot of favorites sessions you know! We got the chance to ask Scott any question we had in mind and he also shared his story with the entire room.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191749405185126400&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191768696978649088&lt;/p&gt;
&lt;p&gt;The last session I was in was something I was looking forward to listening to and it was another session from Scott Hanselman you can say it was a Scott Hanselman dedicated day! 😆&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191831297972408323&lt;/p&gt;
&lt;h2&gt;Day 3 &amp;amp; 4 (More Sessions)&lt;/h2&gt;
&lt;p&gt;The following days were really busy as I tried to attend as many sessions as I could. I missed some interesting sessions I scheduled but the good thing is it&apos;s all recorded and available to watch after. I prioritized meeting people from attending the sessions because I know I can always go back and watch them.&lt;/p&gt;
&lt;p&gt;I also had a short interview with the channel 9 team and I talked about what community means to me and how being at Ignite has impacted me.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1191843689582211072&lt;/p&gt;
&lt;p&gt;I also met Brian Holt omg!! 🤯&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1192366791886024705&lt;/p&gt;
&lt;p&gt;A lot of interesting places in the hub worth mentioning but one of the best was the therapy animal area with lot of pets to play with. Trust me I spent some time there.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1192459305531908096?s=20&lt;/p&gt;
&lt;h2&gt;Day 5 (Explore)&lt;/h2&gt;
&lt;p&gt;This was the last day of the conference after a long week I got the chance to explore since this was the last chance I had. One area I loved was the Diversity and Inclusion Lounge.&lt;/p&gt;
&lt;p&gt;It had pictures and videos telling stories of people and the impact of Diversity and Inclusion. I think this is great to have this sort of thing at a conference because it creates a safe space for people not knowledgeable in this area to learn as much as they can.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://thepracticaldev.s3.amazonaws.com/i/zgndbx29wyq5v5pzl2q7.jpg&quot; alt=&quot;Alt Text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://thepracticaldev.s3.amazonaws.com/i/54trsinij7a77mpyy6jj.jpg&quot; alt=&quot;Alt Text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I made two recap vlogs during the conference on my YouTube channel check that one out as well.&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/4nfY1uZk7ko?si=l4nHOuR0vDFDHLTM&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;This conference was a big win for me because I got to learn and make connections that I never would have thought was possible I&apos;ll like to thank the following people for helping out in one way or another &lt;a href=&quot;https://twitter.com/simona_cotin&quot;&gt;Simona Cotin&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/nitya&quot;&gt;Nitya&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/piyali_vancity&quot;&gt;Piyali&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/truckerfling&quot;&gt;Sarah&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/adamj89&quot;&gt;Adam&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/MegMallin&quot;&gt;Meghan&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>The Benefits of Owning a Personal Blog</title><link>https://giftegwuenu.com/own-a-blog/</link><guid isPermaLink="true">https://giftegwuenu.com/own-a-blog/</guid><description>Why every developer should have a personal blog and how it can boost your career.</description><pubDate>Sun, 27 Oct 2019 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As developers, We always tend to look up solutions to a bug or an error on Google and half the time we do this we are redirected to a blog written by another developer or even yourself in some cases. This is one of the ultimate reasons for owning a personal blog - teaching other developers.&lt;/p&gt;
&lt;p&gt;In this post, I&apos;ll outline the benefits of blogging and why it&apos;s important to start a blog as a developer and also share several ways you can get your blog up and running.&lt;/p&gt;
&lt;p&gt;I became aware of the benefit of personal blogging in February 2018. This was when I started &lt;a href=&quot;https://www.giftegwuenu.com&quot;&gt;my own blog&lt;/a&gt;. I initially took a course on &lt;a href=&quot;https://www.pluralsight.com/courses/developing-killer-personal-brand&quot;&gt;Pluralsight about personal branding&lt;/a&gt; and it was a goal to complete at least one of the steps outlined in the course. I went ahead to start with blogging by purchasing my domain name even though I had no clue what content I will write about.&lt;/p&gt;
&lt;p&gt;Let&apos;s start with the good stuff I&apos;ll share the benefits of starting a personal blog and further explain how to get a blog up and running. Because I think it&apos;s important I share, I&apos;ll also write about my process and share resources needed to move forward.&lt;/p&gt;
&lt;h2&gt;Benefits of Blogging&lt;/h2&gt;
&lt;p&gt;These are some of the reasons I feel it&apos;s really important to start your blog.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sharing Knowledge:&lt;/strong&gt; Most times you find yourself trapped trying to solve a specific problem and with all of Google&apos;s help you still can&apos;t find a solution. You are finally able to fix the bug and instead of hoarding that knowledge you decide to write an article on how you fixed the problem helping thousands of other developers. This is by far one of the importance of blogging you teach others and this is a very fulfilling experience especially when you get sent messages of how your article helped other developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Develop your Brand:&lt;/strong&gt; Blogging helps boost your brand. You become known for your work and this will improve your reputation in the community.I have met a lot of people because I started blogging consistently and also gotten opportunities to grow my network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning New Tech:&lt;/strong&gt; Blogging is a good way to learn about new technologies and concepts. As developers, learning never stops for us it&apos;s a continuous journey so how do you keep up and still stay sane? I&apos;ve discovered one way to make the best out of this is to learn a new concept and teach it that way you end up teaching other people and also solidifying those concepts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Introduce yourself to the Community:&lt;/strong&gt; When you consistently create helpful content and share it with the community. You become known as a teacher in your field. An example is if you create content on web development you become known in the web development community and that&apos;s a great way to make friends and connect with people in the community. Some platforms that will enable this happen are &lt;a href=&quot;https://www.twwiter.com&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://www.dev.to&quot;&gt;Dev.to&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How do you start?&lt;/h2&gt;
&lt;p&gt;Now that you know the benefits of blogging how do you start your blog? I always get asked how I created mine and where I host my blog. I&apos;ll share all the details here. Now there are several ways to go about this and I&apos;ll recommend creating a blog and having a domain name that is closely related to your name. That way it is easy to find you on the internet.
But feel free to disregard my recommendation and do what fits your needs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pick a Domain or Field:&lt;/strong&gt; This should always be your first thought before going on to publish your first post. Think about what you want to specialize in. Are you more interested in web, mobile, security, or career guides? This is the best time to pick a domain you can as well do as much as you want but make sure you are specific to get a target audience that will always return to your blog.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a Platform:&lt;/strong&gt; This is the interesting part that I love. You get to choose a platform that best suits your needs. I&apos;m going to outline some platforms that I think is great and you make the choice.
&lt;ul&gt;
&lt;li&gt;Build your blog! You can either decide to use Wordpress which is a pre-generated CMS or pick a static site generator like Gatsby and Hugo and create a custom made blog for yourself.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com&quot;&gt;Medium&lt;/a&gt;: You can create an account and post directly to medium the downside to this is &lt;a href=&quot;https://ownyourcontent.wordpress.com/2019/05/14/khoi-vinh-on-how-his-blog-amplified-his-work-and-career/&quot;&gt;you don&apos;t own your content&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to&quot;&gt;Dev.to&lt;/a&gt;: This platform allows you to post your content and has a huge developer community and also allows you to cross-post your content more on that later.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hashnode.com&quot;&gt;Hashnode&lt;/a&gt;: Hashnode is also a great platform for blogging with a huge number of developer centered content.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syndicate your content:&lt;/strong&gt; I recently learned a concept called &lt;a href=&quot;https://indieweb.org/POSSE&quot;&gt;POSSE - Publish (on your) Own Site, Syndicate Elsewhere&lt;/a&gt;. This means you get to keep your content on your site and share on other platforms like &lt;a href=&quot;https://www.medium.com&quot;&gt;Medium&lt;/a&gt;, &lt;a href=&quot;https://www.dev.to&quot;&gt;Dev.to&lt;/a&gt;, and &lt;a href=&quot;https://www.hashnode.com&quot;&gt;Hashnode&lt;/a&gt; and you keep ownership of your content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post on Social Media:&lt;/strong&gt; Social media is a tool you can use to gain more readership. When you publish a new post remember to share across all your social media platforms to gain more audience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay Consistent:&lt;/strong&gt; Remember to stay consistent when you start your blog. That way you can always learn, teach and connect with the community and you can measure your success over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;My Process&lt;/h2&gt;
&lt;p&gt;I follow the same process I&apos;ve outlined above but I&apos;ll go ahead and share in detail how I create my content.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://giftegwuenu.com&quot;&gt;My blog&lt;/a&gt; is built using &lt;a href=&quot;https://www.gridsome.org&quot;&gt;Gridsome&lt;/a&gt; static site generator hosted on &lt;a href=&quot;https://www.netlify.com&quot;&gt;Netlify&lt;/a&gt; and I write my content in &lt;a href=&quot;https://www.markdownguide.org/basic-syntax/&quot;&gt;Markdown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I have a Notion Page dedicated to collecting blog post ideas when I think of an idea I add it on there.
&lt;img src=&quot;https://thepracticaldev.s3.amazonaws.com/i/2022roez4pnw8dhuyyki.png&quot; alt=&quot;Alt Text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;I start an article by researching on the topic if it&apos;s new to me and coming up with an outline. After I complete the article I syndicate to &lt;a href=&quot;https://www.dev.to&quot;&gt;Dev.to&lt;/a&gt; and share it on social media(Twitter, Instagram, Linkedin).&lt;/li&gt;
&lt;li&gt;I also do this thing where I share after about 3 weeks on social media to gain more audience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading! I hope you find this post helpful and if after reading this you decide to start blogging please share with me here or on &lt;a href=&quot;https://www.twitter.com/lauragift_&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;More Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://drewdevault.com/make-a-blog&quot;&gt;You should make a blog!&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://dev.to/ladybug/why-blogging-is-awesome-127&quot;&gt;Why Blogging is Awesome&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://dev.to/yelluw/how-to-do-technical-blogging&quot;&gt;How to do technical blogging&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://writtent.com/blog/format-perfect-blog-post-10-tips/&quot;&gt;10 Killer Tips: How to Format a Perfect Blog Post&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://dev.to/helenanders26/thoughts-on-blogging-after-six-months-on-devto-3a9p&quot;&gt;Thoughts on blogging after six months on dev.to&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Building A Career In Tech As A Newbie</title><link>https://giftegwuenu.com/career-in-tech/</link><guid isPermaLink="true">https://giftegwuenu.com/career-in-tech/</guid><description>How to break into tech, start your developer journey, and build a lasting career.</description><pubDate>Fri, 12 Jul 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The tech industry is ever evolving, what this means is the industry is growing rapidly and there’s no chance for you to be comfortable with an acquired skill without trying to grow or level up on a skill.&lt;/p&gt;
&lt;p&gt;In this article, I’ll be sharing what it means to start out as a developer and how to keep building your career as you embark on this journey.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_A7D74081BACFF863EFFEB7AD26D45E7FDE06394D44DF3F96354E453866451119_1557037409925_photo-1495805442109-bf1cf975750b.jpeg&quot; alt=&quot;Image from unsplash by&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Starting Point 📍&lt;/h2&gt;
&lt;p&gt;Let’s begin this journey, Are you a newbie or you’re currently on the verge of switching careers and you are certain you want to venture into software development. I applaud your courage and I’m happy you’ve made that decision because you won’t regret it I assure you. I know it might be a bit overwhelming when you start out but with time everything will ease in and you will begin to understand how things work.&lt;/p&gt;
&lt;p&gt;The tech industry today is one of the most supportive industries I’ve ever been a part of. Regardless of the path you have decided to take on be it Front-End Development, Back-End Development, Full Stack Development, Mobile App Development, and Data Science, etc, this article still relates to you and by following through with it I’m certain you’ll gain useful knowledge from it.&lt;/p&gt;
&lt;p&gt;Now as a newbie in the tech world where do you start from? How do you get updates about the latest happenings, how do you get help when you’re stuck, how do you connect with other developers like yourself all of these are what is running through your mind and I totally get you. This is why I’m writing this article, to share the basic knowledge on how you can kickstart your career from scratch.
Now to get you in the boat of what steps you should take to be successful. I&apos;ll be highlighting several ways you can kick start your career in tech.&lt;/p&gt;
&lt;h2&gt;Tips On How To Fast Track Your Developer Career&lt;/h2&gt;
&lt;p&gt;Building a career will involve you try out several ways on how you can be successful in the path and that you are involved in. The steps I’ll be outlining have proven to work for a number of developers including myself. so let’s get right into it. some ways you can leverage in building your career include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Community&lt;/li&gt;
&lt;li&gt;Online Resources&lt;/li&gt;
&lt;li&gt;Mentorship&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Community&lt;/h3&gt;
&lt;p&gt;Being involved with a community either online or in-person will go a long in helping you improve your career. There are several local communities that help foster the growth of developers both by organizing events like meetups and also by organizing workshops.&lt;/p&gt;
&lt;p&gt;As developers, it is important that we have a community we belong to based on the fact that we get to learn how other developers think, we network with other developers at these events and we also get hear other people’s story on how they kicked off their journey in tech. Also being in a community gives you the opportunity to meet new friends or a potential employer which is a great way of breaking into the tech ecosystem if that is something you are looking out for.&lt;/p&gt;
&lt;p&gt;A large number of developer communities exists across the world all you just need to do is find them. I’m a member of the &lt;a href=&quot;https://developers.google.com/programs/community/gdg/apply/&quot;&gt;GDG community&lt;/a&gt; and &lt;a href=&quot;https://forloop.africa/&quot;&gt;forloop Africa community&lt;/a&gt; and I can’t describe the benefits of joining communities enough. I’ll just urge you to find a local community and join.&lt;/p&gt;
&lt;h3&gt;Online Resources&lt;/h3&gt;
&lt;p&gt;This is a no brainer as we need to learn the tech right. That is the whole essence of starting the journey in the first place. Figuring out where to start your journey can be overwhelming but then that is why you have the Internet and Google to help us figure out these things.&lt;/p&gt;
&lt;p&gt;They are a lot of online resources both free and paid that can help you in your journey of becoming a world class developer. After you’ve mapped out the path you want to take the next thing I’ll advice is to start learning the technologies you need to succeed. Defining a guided path for yourself is very important and setting goals for what you want to achieve is also important.&lt;/p&gt;
&lt;p&gt;One of the many resources out there I’ll also recommend &lt;a href=&quot;https://www.freecodecamp.org/&quot;&gt;freecodecamp&lt;/a&gt; as a starting point if you’re interested in Front end development. Because it is very interactive and provides a guided path from beginner to advanced and lastly for the community behind it.&lt;/p&gt;
&lt;p&gt;I’ll like to plug in a &lt;a href=&quot;https://learning-resource-path.gitbook.io/resources/&quot;&gt;project&lt;/a&gt; I worked on for beginners venturing into front end development. It will also serve as a guide for you on your journey. Above all, the internet is flooding with a lot of great resources that will help you win in your new chosen career path.&lt;/p&gt;
&lt;h3&gt;Mentorship&lt;/h3&gt;
&lt;p&gt;Mentorship is the act of seeking the guidance provided by a mentor, especially an experienced person in a company or industry. Getting a mentor is also an important step you can take as an effort for building your career.&lt;/p&gt;
&lt;p&gt;We as humans can succeed on our own as we are trained to fend for ourselves but we can do better by following the footsteps of those that are ahead of us. One of the most important thing you can do as a developer is to get a mentor that is interested in your growth and passionate about helping you become successful. In our career path, everyone has a role model right because I know I do.&lt;/p&gt;
&lt;p&gt;One thing I learned while finding ways I can improve and build my career is not only seeking physical mentorship, by the way, it is great to go for it if you can. But also by following the steps of my role models. Who do you look up to in the industry? Find out how they started their journey what worked for them and what did not. This is in actual fact a great way to learn because you won’t be making obvious mistakes because you’ve learned from mistakes from others.&lt;/p&gt;
&lt;p&gt;So really pick what works best for you in this case, a mentor that can check up on you from time to time and see how you’ve improved or follow the steps of the leaders in your field. If you’re up to it you can do both and that is great.&lt;/p&gt;
&lt;h2&gt;Advice For Developers&lt;/h2&gt;
&lt;p&gt;I want to share advice regarding your career and I think this is a great way to do it. I’ve always wanted to share with developers starting out what worked for me and how I think following in the same footsteps can be beneficial to others. So here we go.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Celebrate Your Small Wins:&lt;/strong&gt; This is as important as every other thing you do, regardless of how small the progress you’ve made in your journey always learn to celebrate it. Doing this as often as possible makes you realize you’re not doing a terrible job after all and you’ll gain more confidence in your abilities which I think will make you want to do more and explore further possibilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Find Your Learning Style:&lt;/strong&gt; Everyone learns differently, and I think finding out what method works for you earlier will influence how you learn over time. There are people who are more comfortable with traditional learning through bootcamps, others prefer watching videos tutorials and taking online courses or reading articles to grasp fundamental concepts. whichever method works for you, make it a habit and also stick to it as this will make your learning smooth and you avoid overwhelming yourself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Don’t Be Afraid To Seek Help:&lt;/strong&gt; A lot of people find it difficult to ask for help when they get stuck. I did too when I was starting out but I’ll say we should not be a victim and fall into the pit of having to figure everything out ourselves. Because it gets overwhelming as you’re learning and it is okay to ask for help and seek advice from more experienced developers and they’re a lot of ways this can be done. i.e Stack Overflow, Forums, Community Slack Groups, and mentors can be of help when you get stuck and need answers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learn By Doing:&lt;/strong&gt; This is as important as other advice I’ve given, I think this is very relevant when you’re starting out. Learning by doing here means you’re not just watching that youtube video or reading that article on CSS Grid, but you’re also practicing what you’re learning because, to be honest, that is the most efficient way to learn. When you learn a new concept and you go ahead to tinker with the code I think you’ll have that knowledge stick as compared to just reading that article or watching that course. Always remember to try out what you just learned, improve on it and even go ahead and build your own based on what you’ve learned.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;In this article, I outlined ways new developers can break into the tech industry and also sustainably build their career. My takeaway from my years in tech and what I think should be general knowledge to everyone is that you never stop learning as a software developer.&lt;/p&gt;
&lt;p&gt;This journey of building your career never ends because you have to continue sustaining what you’ve built and in this ever-changing industry we are in, the only way to do it by staying abreast with the technologies you work with and look for means to gain new knowledge as time goes on. Once you know this and understand it then you are going to do well regardless of your chosen career path.&lt;/p&gt;
</content:encoded></item><item><title>Love At Second Sight With TailwindCSS</title><link>https://giftegwuenu.com/tailwind/</link><guid isPermaLink="true">https://giftegwuenu.com/tailwind/</guid><description>My experience with Tailwind CSS and how to get started with this utility-first framework.</description><pubDate>Tue, 28 May 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Imagine my thoughts when I first saw the TailwindCSS Framework, in my head I already thought this was one of the usual frameworks like Bootstrap, Bulma, and Foundation, etc that I have tried using before and I took my eyes off it for a second.&lt;/p&gt;
&lt;p&gt;Until recently I decided to give it another look after I saw the recent release of v1 and to my greatest surprise, I fell in love with TailwindCSS. In this article, I’ll be introducing you to TailwindCSS and why I think it is a different ball game entirely with useful examples. Let’s get right into it, shall we?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1558984626/image_preview_s8bbns.png&quot; alt=&quot;tailwind&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;TailwindCSS&lt;/a&gt; is a utility first CSS framework for building custom user interface designs. It is a highly customizable, low-level CSS framework that gives you all of the building blocks you need to build bespoke designs without any annoying opinionated styles you have to fight to override.&lt;/p&gt;
&lt;h2&gt;Why TailwindCSS?&lt;/h2&gt;
&lt;p&gt;One of the common reasons why I think I got love struck with TailwindCSS is that I found out I can get the following out of the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Customization on the fly:&lt;/strong&gt; Tailwind is easily customizable to fit your needs. You can customize your own colors, border-sizes, shadows, spacing and a whole lot more. You&apos;re the limit as far as customization is concerned with TailwindCSS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Component-friendly:&lt;/strong&gt; TailwindCSS is also a component friendly CSS framework, what this means is that instead of having repeated utility classes for your UI, you can combine common patterns and abstract it out as component classes that eventually become reusable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive to the Core:&lt;/strong&gt; TailwindCSS comes bundled with responsive variants for different screen sizes that can be adopted in your UI by only prefixing the screen size to the class.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;To get started with TailwindCSS in your project you will need to install it as a dependency or you can use it as a CDN. But mind you it&apos;s not a recommended choice to use the CDN option because some features that make tailwind awesome won&apos;t be available for use.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!--using CDN--&amp;gt;

&amp;lt;link href=&quot;https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# using npm
npm install tailwindcss -save-dev or

# using yarn
yarn add tailwindcss --dev

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After installation, we will need to inject tailwind&apos;s styling into our CSS using the &lt;code&gt;@tailwind&lt;/code&gt; directive. So let&apos;s go ahead and add Tailwind&apos;s base, components, and utility styles into our &lt;code&gt;styles.css&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@tailwind base;

@tailwind components;

@tailwind utilities;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;With the recent release of &lt;code&gt;v1.0&lt;/code&gt;, the good news is we won&apos;t need to create &lt;code&gt;tailwind.config.js&lt;/code&gt; file anymore as this is now optional.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Using TailwindCSS CLI&lt;/h2&gt;
&lt;p&gt;Now, we can use tailwind&apos;s CLI to build out our CSS into tailwind&apos;s styles using the command below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx tailwind build style.css -o output.css

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The tailwind command is simply taking our default CSS file &lt;code&gt;style.css&lt;/code&gt; as the input and processing the styles into &lt;code&gt;output.css&lt;/code&gt; as the output file.&lt;/p&gt;
&lt;p&gt;Instead of using &lt;code&gt;style.css&lt;/code&gt; as the stylesheet in our HTML you can now use &lt;code&gt;output.css&lt;/code&gt; to ensure tailwind styles are being applied to our HTML content.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;output.css&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&apos;s now go ahead and create some examples that we can utilize to explore the capabilities of TailwindCSS. We can also spin up tailwindcss on codepen or have it on our local computer whichever one works for you.&lt;/p&gt;
&lt;h2&gt;Example 1: Creating a Card&lt;/h2&gt;
&lt;p&gt;Let&apos;s create a card using TailwindCSS and see how seamless this process is without writing any line of CSS.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;mx-auto my-3 max-w-md overflow-hidden rounded shadow-lg&quot;&amp;gt;
	&amp;lt;img
		src=&quot;https://images.unsplash.com/photo-1557310717-d6bea9f36682?ixlib=rb-1.2.1&amp;amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;h=400&amp;amp;w=634&amp;amp;q=80&quot;
		class=&quot;w-full&quot;
		alt=&quot;a platter of cookies&quot;
	/&amp;gt;
	&amp;lt;div class=&quot;px-6 py-4&quot;&amp;gt;
		&amp;lt;div class=&quot;mb-2 text-xl font-bold&quot;&amp;gt;Chocolate Chip Cookies&amp;lt;/div&amp;gt;
		&amp;lt;p class=&quot;text-base text-gray-700&quot;&amp;gt;
			Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatibus quia, nulla! Maiores et
			perferendis eaque, exercitationem praesentium nihil.
		&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;px-6 py-4&quot;&amp;gt;
		&amp;lt;span
			class=&quot;mr-2 inline-block rounded-full bg-gray-300 px-3 py-2 text-sm font-semibold text-gray-700&quot;
		&amp;gt;
			#photography
		&amp;lt;/span&amp;gt;
		&amp;lt;span
			class=&quot;mr-2 inline-block rounded-full bg-gray-300 px-3 py-2 text-sm font-semibold text-gray-700&quot;
		&amp;gt;
			#food
		&amp;lt;/span&amp;gt;
		&amp;lt;span
			class=&quot;inline-block rounded-full bg-gray-300 px-3 py-2 text-sm font-semibold text-gray-700&quot;
		&amp;gt;
			#cookies
		&amp;lt;/span&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://thepracticaldev.s3.amazonaws.com/i/0sxm0lavhep6rxvaufk0.png&quot; alt=&quot;card&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Example 2: Custom Buttons&lt;/h2&gt;
&lt;p&gt;The second example we&apos;ll be looking at is how to create buttons using TailwindCSS.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button class=&quot;my-2 rounded bg-blue-400 px-5 py-2 font-bold text-white&quot;&amp;gt;Button&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;my-2 rounded bg-red-600 px-5 py-2 font-bold text-white&quot;&amp;gt;Button&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;my-2 rounded bg-gray-600 px-5 py-2 font-bold text-white&quot;&amp;gt;Button&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;my-2 rounded bg-green-500 px-5 py-2 font-bold text-white&quot;&amp;gt;Button&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://thepracticaldev.s3.amazonaws.com/i/lisvz2yc589jn50xht4e.png&quot; alt=&quot;button&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I absolutely enjoyed playing around with the docs to create these examples and one thing you can also leverage is extracting utility classes as a component.&lt;/p&gt;
&lt;h2&gt;Extracting Utility Classes as Components&lt;/h2&gt;
&lt;p&gt;You can additionally extract utility classes as a component as I mentioned earlier. Tailwind advocates for &lt;code&gt;Utility-first&lt;/code&gt; workflow but when you find out that you&apos;re reusing the same styles over again then this is when you should think of extracting them into components. Here&apos;s how to accomplish just that.&lt;/p&gt;
&lt;p&gt;From example 2 above, We can further reduce the number of utility classes by extracting it out as a component using &lt;code&gt;@apply&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button class=&quot;btn btn-blue&quot;&amp;gt;Button&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;btn btn-gray&quot;&amp;gt;Button&amp;lt;/button&amp;gt;

&amp;lt;style&amp;gt;
	.btn {
		@apply my-2 rounded px-4 py-2 font-bold text-white;
	}
	.btn-blue {
		@apply bg-blue-500;
	}
	.btn-blue:hover {
		@apply bg-blue-700;
	}
	.btn-gray {
		@apply bg-gray-500;
	}
	.btn-gray:hover {
		@apply bg-gray-700;
	}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you still get the same result but with a lot, fewer utility classes applied. Note that variants like &lt;code&gt;hover:&lt;/code&gt;, &lt;code&gt;focus:,&lt;/code&gt; and &lt;code&gt;{screen}:&lt;/code&gt; can&apos;t be applied directly, so instead apply the plain version of the utility to the appropriate pseudo-selector or media query.&lt;/p&gt;
&lt;p&gt;I absolutely had fun exploring TailwindCSS and I can&apos;t wait to work with it in my projects. Have you tried TailwindCSS or used it in a project? What are your thoughts about it?.&lt;/p&gt;
</content:encoded></item><item><title>How To Supercharge Your Productivity As A Developer</title><link>https://giftegwuenu.com/productivity-tips/</link><guid isPermaLink="true">https://giftegwuenu.com/productivity-tips/</guid><description>Practical tips and strategies to boost your productivity as a software developer.</description><pubDate>Thu, 23 May 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;I gave a talk about this topic a couple of months ago at forloop Summit Lagos, Nigeria. I decided to write a blog post out of it so here it goes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As developers, we are constantly trying to churn out work and we often find ourselves distracted from doing the actual work. In this article, I&apos;ll be sharing tips on how you can stay productive as a developer and also share tools to help automate this process.&lt;/p&gt;
&lt;h2&gt;What is Productivity?&lt;/h2&gt;
&lt;p&gt;Productivity is an act of getting quality work done without the need for adding extra effort.&lt;/p&gt;
&lt;p&gt;This is my definition of productivity and I am sure a lot of developers are already familiar with the term productivity. Daily in our lives, we all try to churn out meaningful work, tick that task off our to-do list and the cycle continues. One hard truth I&apos;ll like us to think about is how many developers around the world actually struggle with being unproductive daily due to different circumstances.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1558652153/_HOW_TO_SUPERCHARGE_YOUR_PRODUCTIVITY_AS_A_DEVELOPER_ywdakh.png&quot; alt=&quot;fun fact&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s a fun fact. I think this is the case for most developers we don&apos;t work actively for straight 8 hours mind you if you do this then it&apos;s totally fine, this is just my point of view because I know in order to work efficiently you need breaks so please don&apos;t come for me :).&lt;/p&gt;
&lt;h2&gt;Causes Of Low Productivity&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1558652550/5_zpgqwq.png&quot; alt=&quot;causes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ll be brief and butcher these points on why I think these are some causes of low productivity for developers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Distractions:&lt;/strong&gt; Our phone notifications, unread emails, and meetings are some of the biggest distractions that can cause us to be less productive during our working hours. I personally turned off notifications from all my devices when working yet there&apos;s still an urge to pick up my phone while working.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Low Work-Life Balance:&lt;/strong&gt; Burnout is real, when you spend your time working past your usual hours or when you are supposed to spend time away from work this will eventually lead to low productivity because all you eventually concerned about is work and the other part which is You is lacking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unhealthy Company Culture:&lt;/strong&gt; An unhealthy company culture can also trigger low productivity in several ways. Working in a toxic environment significantly affect developers. People have to deal with some unpleasant scenario at the workplace and this tends to affect the quality of work they produce.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stress:&lt;/strong&gt; Learning when to take a break is also key, A lot of developers are guilty of this act. If you overwork yourself you become stressed and that eventually leads to low work output and lack of productivity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lack of Growth Opportunities:&lt;/strong&gt; Working at an organization that doesn&apos;t align with your goals or you are in a position where you keep doing the same task over and over without learning anything new or you don&apos;t see your self getting that promotion anytime soon then that can cause low productivity towards your work output.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Recommended Tips To Supercharge Your Productivity&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minimize Distractions:&lt;/strong&gt; The best way to get rid of distractions is by restricting it entirely. What this means is you&apos;ll have to figure out ways to reduce the notifications and email you get. You can either mute notifications on your mobile devices or make sure you don&apos;t have it close to you when working. Use whatever works for you but the goal is to reduce distractions. Some tools that can help you are &lt;a href=&quot;http://www.stayfocusd.com/&quot;&gt;Stay Focused&lt;/a&gt;, &lt;a href=&quot;https://selfcontrolapp.com/&quot;&gt;Self Control for Mac&lt;/a&gt;, &lt;a href=&quot;http://gofuckingwork.com/&quot;&gt;gofuckingwork&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate Your Process:&lt;/strong&gt; As developers, this is one of the things I think we should be interested in because repeating a task can become daunting when we can automate it then why not. If you figure out you spend more than 2 minutes doing the same thing every day then you should find a way to automate that task. Tools for automating your process. &lt;a href=&quot;https://dotfiles.github.io/&quot;&gt;.dotfiles&lt;/a&gt;, &lt;a href=&quot;https://ohmyz.sh/&quot;&gt;ohmyzsh&lt;/a&gt;, &lt;a href=&quot;https://mediaatelier.com/CheatSheet/&quot;&gt;cheatsheet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time Management:&lt;/strong&gt; Managing your time is another important tip you can leverage to stay productive. when you plan ahead efficiently it&apos;ll help boost your productivity. Some tools to leverage &lt;a href=&quot;https://tomato-timer.com/&quot;&gt;Tomato Timer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work With Right Tools:&lt;/strong&gt; It&apos;s important to work with the right tools, this way we don&apos;t spend a lot of time figuring out why the task we are trying to complete is not working as expected when we are using the wrong tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take Breaks and Rest:&lt;/strong&gt; This is as necessary as every other tip I&apos;ve shared. Take breaks when you need to and rest. If there&apos;s anything I&apos;ve learned then it is I and my life comes first before any work because at the end if you&apos;re not healthy you won&apos;t be able to the work eventually.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prioritize Your Work:&lt;/strong&gt; This works for a couple of people, in fact, I&apos;ve tried it and I saw the need to use this technique. Making sure to prioritize our work is one way to improve your productivity. You can either choose to do the hard and time-consuming task first and then do the easy ones last or vice versa whichever works for you but make sure you prioritize.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan Ahead With Note Taking:&lt;/strong&gt; I love note taking it&apos;s a habit for me and I&apos;ve found that it&apos;s one way the works for me I take notes of what I want to accomplish for the day and at the end of the day I can visualize the amount of work I&apos;ve been able to achieve. I must confess on some days this gives me chills and goosebumps other days I&apos;m disappointed but still, I don&apos;t give up. Tools I use &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;, &lt;a href=&quot;https://numi.io/&quot;&gt;Numi&lt;/a&gt;, &lt;a href=&quot;https://www.taskade.com/&quot;&gt;Taskade&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Break Tasks Into Chunks:&lt;/strong&gt; I can&apos;t emphasize this enough make sure you break up your tasks into smaller chunks that way you&apos;re able to visualize them in bits size and it doesn&apos;t become overwhelming for you to achieve.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule Your Time:&lt;/strong&gt; Lastly, use your calendar. Schedule activities for the week so that you don&apos;t skip or forget things you&apos;re supposed to do. Personally, I use &lt;a href=&quot;https://www.google.com/calendar&quot;&gt;Google Calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How Do You Define Success?&lt;/h2&gt;
&lt;p&gt;After going through these steps and applying these tips, how do you know when you&apos;ve succeeded.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1558654196/13_wzuy0r.png&quot; alt=&quot;success&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improved Time Mangement:&lt;/strong&gt; You know you&apos;ve succeeded when you can now effectively manage your time and stick to it and there&apos;s a noticeable improvement in the work you churn out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gain Focus And Stability:&lt;/strong&gt; You are now very focused and stable because you have dedicated time to rest and take breaks so you feel refreshed when working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Career Advancement:&lt;/strong&gt; The amount of valuable work you achieve now leads to possible promotion including better opportunities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work-Life Balance:&lt;/strong&gt; You now have proper work-life balance, no signs of burnout and you can take time outside work to go on a vacation or spend time with family.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you found these few tips helpful and you can start using them in your daily workflow to improve your productivity as a developer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/lauragift21/how-to-supercharge-your-productivity-as-a-developer&quot;&gt;You can find the talk slides here&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Guide to using Alternative Text on Images</title><link>https://giftegwuenu.com/alt-text/</link><guid isPermaLink="true">https://giftegwuenu.com/alt-text/</guid><description>Why alternative text matters for images and how it improves web accessibility.</description><pubDate>Sun, 31 Mar 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, A lot of developers are conversant with the &lt;code&gt;alt&lt;/code&gt; attribute on images. I can say most of us know that it is one way of making webpages accessible but do we really understand the scope of the alternative text, when to make use of it, how to use it. I agree it is one step to being an accessibility advocate so that is why in this article, I&apos;ll be explaining in detail the alt attribute and how practicing it can improve web accessibility in a long run.&lt;/p&gt;
&lt;p&gt;Truthful confession here, before I became really involved with accessibility I didn&apos;t understand the importance of having a descriptive text for all images on the web. I&apos;m mostly guilty of leaving the &lt;code&gt;alt&lt;/code&gt; attribute blank. Now that I know better I can&apos;t keep it to myself which is one of the reasons I&apos;m writing this article to share this new knowledge gained with everyone.&lt;/p&gt;
&lt;h2&gt;What is Alternative Text?&lt;/h2&gt;
&lt;p&gt;Alternative text or alt text as it is fondly called is a written text description for an image on the web.
Alt text is really useful and can come in handy in any of these scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;people using assistive technology such as screen readers and so on.&lt;/li&gt;
&lt;li&gt;people that have images turned off on their devices due to a poor internet connection.&lt;/li&gt;
&lt;li&gt;it helps improve SEO for the webpage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Writing good alt text for images is very important and shouldn&apos;t be sidelined. To show how important this is the Web Content Accessibility Guidelines document &lt;a href=&quot;https://www.w3.org/TR/WCAG21/#text-alternatives&quot;&gt;WCAG 2.1&lt;/a&gt; have it has the first rule which shows that it&apos;s really important.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Guideline 1.1 Text Alternatives: Provide text alternatives for any non-text content so that it can be changed into other forms people need, such as large print, braille, speech, symbols or simpler language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;How to Use Alt Text&lt;/h2&gt;
&lt;p&gt;Typically, when adding an image to a webpage, we use the HTML image element to represent the image and the alt attribute on the image tag to give a description of the image. Here&apos;s an example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1554123305/photo-1551212721-f0d4160f0abd_fxpx0w.jpg&quot; alt=&quot;girl holding burger&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./burger.png&quot; alt=&quot;A girl holding a hamburger.&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above alt attribute describes the context of the image. In this case, if a screen reader is being used on this page. It&apos;ll read the alt text instead and the user gets a very descriptive context of the image used.
There are other things to consider when writing alt text this is just a primer to writing descriptive alternate text for images. I&apos;ll be going over the important concepts to take note of when using images on the webpages.&lt;br /&gt;
All images on the web must have alternative text that describes the function of the image.
There are seven concepts for using images on the web I&apos;ll be outlining each of them and they include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Informative Images:&lt;/strong&gt; Informative images are images that describe a piece of information or concept. The information described can be anything from an emotion/impression to a label or the file format used in a link. The text alternative for an informative image should convey the meaning or content of the image. Here&apos;s an example:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1554128116/photo-1492633423870-43d1cd2775eb_xgcd0p.jpg&quot; alt=&quot;girl smiling happily&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./girl.png&quot; alt=&quot;A girl smiling happily.&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The image illustrated above shows the emotion of a girl. The idea therefore, is to make the alternative text convey this information.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Decorative Images:&lt;/strong&gt; Decorative images are images that don&apos;t necessarily convey meaning or information. These images don&apos;t add information to the content of the page mainly because the content description is already provided or the image is used for styling purposes. Therefore, the &lt;code&gt;alt&lt;/code&gt; attribute is not provided or left empty &lt;code&gt;(alt=&quot;&quot;)&lt;/code&gt;. The reason for this is to avoid assistive technologies such as screen readers from reading a redundant text to its users. Leaving the &lt;code&gt;alt&lt;/code&gt; attribute out entirely is not a good practice because some screen readers will announce the file name of the image instead. An example is shown below:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./line.png&quot; alt=&quot;&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Functional Images:&lt;/strong&gt; Functional images are images that convey an action to be taken rather than informative images that only conveys the information of the image. They are mostly used in links, buttons, and other interactive elements. The alternative text should convey the action to be taken rather than the description of the image. For example, having an alternative text that says &lt;code&gt;search list&lt;/code&gt; instead of &lt;code&gt;a microscope&lt;/code&gt; or &lt;code&gt;print page&lt;/code&gt; instead of &lt;code&gt;image of a printer&lt;/code&gt;. Having an empty &lt;code&gt;alt&lt;/code&gt; attribute won&apos;t be helpful too because you want to be able to notify users using screen readers to navigate your site that you want them to take an action at that point. Here&apos;s an example:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1554130730/how-to-search-gmail_etobms.jpg&quot; alt=&quot;search&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&quot;image&quot; src=&quot;search.png&quot; alt=&quot;search this page&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Images of text:&lt;/strong&gt; Images of text like the name implies is describing the text illustrated in an image. This is rarely used because with most modern browsers we can use CSS to style text to look exactly the way we want it rather than using images to represent text. Using text instead of images to display content has more advantages as the text can easily be scaled or resized without losing clarity but with images, the text becomes distorted and loses image quality. In the event that the only possible option available is to use images to describe a text then the alternative text must also contain the text in the image. For example, we can have:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/c_crop,h_111/v1554131437/Screen_Shot_2019-04-01_at_4.10.10_PM_mkphqf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;text.png&quot; alt=&quot;For sale: baby shoes, never worn.&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Group of Images:&lt;/strong&gt; This type of images represent images that are grouped together to convey a single piece of information. An example can be a collection of heart icons to represent a rating. When adding descriptive text for each image, the alt attribute for only one of the image should have a description of the group of images, while the other images have an empty &lt;code&gt;alt&lt;/code&gt; attribute so they are ignored by screen readers. Here&apos;s an example:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1554132040/lLdzWnJ_v1o7ie.png&quot; alt=&quot;heart&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;full-heart.png&quot; alt=&quot;1.5 of 3 hearts&quot; /&amp;gt;
&amp;lt;img src=&quot;half-heart.png&quot; alt=&quot;&quot; /&amp;gt;
&amp;lt;img src=&quot;empty-heart.png&quot; alt=&quot;&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Complex Images:&lt;/strong&gt; Complex images convey a very detailed and substantial amount of information. These type of images ranges from graphs to bar charts, maps showing locations and diagram or illustration, etc. In these cases, two text alternative description is provided. The first one being the short description of the image. The second is the long description of the image to fully explain the information conveyed by the image. Here&apos;s an example:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1554132643/count-vs-animals_kjpeh5.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;figure role=&quot;group&quot;&amp;gt;
	&amp;lt;img src=&quot;bar.png&quot; alt=&quot;Bar chart showing population of animals in SA and LA zoos.&quot; /&amp;gt;
	&amp;lt;figcaption&amp;gt;
		&amp;lt;p&amp;gt;
			The bar chart shows a population of the animals in South African Zoo compared to Los Angelos
			Zoo. With the number of giraffes, monkeys and orangutans compared in both zoos.
		&amp;lt;/p&amp;gt;
	&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Image maps:&lt;/strong&gt; Image maps are images that have been divided into various regions, each region represented by the &lt;code&gt;area&lt;/code&gt; elements. An example can be an organizational chart. Image maps are created using &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;map&amp;gt;&lt;/code&gt; elements. The text alternative is needed on both the &lt;code&gt;img&lt;/code&gt; elements and each &lt;code&gt;area&lt;/code&gt; element. The example below illustrates an organization chart with each node represented to identify an individual in the organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1554133167/orgchart-b583d8ff_b3fqaw.png&quot; alt=&quot;map&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;orgchart.png&quot; alt=&quot;Board of directors and related staff: &quot; usemap=&quot;#Map&quot; /&amp;gt;
&amp;lt;map name=&quot;Map&quot; id=&quot;Map&quot;&amp;gt;
	&amp;lt;area shape=&quot;rect&quot; coords=&quot;176,14,323,58&quot; href=&quot;…&quot; alt=&quot;Davy Jones: Chairman&quot; /&amp;gt;
	...
&amp;lt;/map&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With all these images types listed, how do you know which one to use when implementing alt text. &lt;a href=&quot;https://www.w3.org/WAI/tutorials/images/decision-tree/&quot;&gt;The Alt decision tree&lt;/a&gt; is a guide provided to help you make that decision. So when in doubt use the alt decision tree.&lt;/p&gt;
&lt;h2&gt;Tips To Note When Writing Alternative Text&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;End the alt text with a full stop. This will make the screen readers pause for a bit before reading other content. which improves the experience for the user.&lt;/li&gt;
&lt;li&gt;Don&apos;t start alt text with &lt;code&gt;image of&lt;/code&gt; or &lt;code&gt;photo of&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Be specific when describing the image.&lt;/li&gt;
&lt;li&gt;Avoid cramping in keywords for SEO purposes.&lt;/li&gt;
&lt;li&gt;Don&apos;t add line breaks in the &lt;code&gt;alt&lt;/code&gt; text. This can cause a weird pause when the screen reader is describing the image.&lt;/li&gt;
&lt;li&gt;Use the empty &lt;code&gt;alt&lt;/code&gt; attribute &lt;code&gt;alt=&quot;&quot;&lt;/code&gt; for decorative images. for example, the background image of a website because understanding the context used here is not required.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this article, I&apos;ve explained in detail the benefit of using alternative text for images and how to go about using them in a different context. I&apos;m happy you read this far and my ask therefore is not to only read this but also learn to practice it. I believe the web will become more accessible with a collective effort from everyone.&lt;/p&gt;
</content:encoded></item><item><title>Web Accessibility For Beginners</title><link>https://giftegwuenu.com/web-accessibility/</link><guid isPermaLink="true">https://giftegwuenu.com/web-accessibility/</guid><description>A beginner&apos;s guide to web accessibility and how to build more inclusive websites.</description><pubDate>Thu, 21 Mar 2019 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Building accessible applications or websites is not the norm today. This is because the idea of accessibility is known to most developers, while in actual sense it is often neglected and not a common practice today in the world of web development. According to &lt;a href=&quot;https://www.worldbank.org/en/topic/disability&quot;&gt;World Bank Statistics&lt;/a&gt; about 15% of the world population experience some form of disability. This amounts to almost half the population of the web.&lt;/p&gt;
&lt;p&gt;In this tutorial, I’ll be explaining what web accessibility is to us as developers, how it affects the users of the web, and also ways to improve our application and tools to leverage to improve accessibility in our workflow.&lt;/p&gt;
&lt;h2&gt;What is Web Accessibility?&lt;/h2&gt;
&lt;p&gt;Web Accessibility or a11y as it is often called is a practice whereby websites, tools, and technologies are designed and developed so that people with disabilities can use them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Accessibility&quot; is often denoted as &quot;a11y&quot; because there are 11 letters between the &quot;A&quot; and &quot;Y&quot; in the word &quot;Accessibility&quot;. This pattern is known as a Numeronym.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Accessibility is all about making the web accessible to everyone. This includes people with all forms of disabilities including the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cognitive&lt;/li&gt;
&lt;li&gt;neurological&lt;/li&gt;
&lt;li&gt;physical&lt;/li&gt;
&lt;li&gt;speech&lt;/li&gt;
&lt;li&gt;visual&lt;/li&gt;
&lt;li&gt;auditory disabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Accessibility encompasses disability and still account for cases whereby the people using the web have the following limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Poor Internet connectivity.&lt;/li&gt;
&lt;li&gt;Temporary injury i.e broken arm.&lt;/li&gt;
&lt;li&gt;People using devices with smaller screens such as Smartwatches, Smart TVs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The POUR principle&lt;/h2&gt;
&lt;p&gt;The POUR principle is what guides building accessible websites. This principle helps put people at the center of the process. Every website should fulfill the following principles:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perceivable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Content on the web should be perceivable, This means the web should be available to the senses (vision, touch, and hearing) either through the browser or through assistive technologies like screen readers, screen enlargers, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Content on the web must be operable, This means users can interact with all controls and interactive elements using either the mouse, keyboard, or an assistive device. If the content is impossible to navigate then it is inaccessible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understandable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The content on the web should be clear and concise and easy to understand. Try as much as possible to cut down spelling errors and complex grammar. This is because as web developers we should never assume knowledge for the user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Robust&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is really important to have consistency across the web. What this means is are you maximizing compatibility with the tools you are building for? Does your site work the same way across all platforms i.e Browsers, Operating systems, and Device sizes, etc?&lt;/p&gt;
&lt;h2&gt;Tips For Making Your Site Accessible on the Web&lt;/h2&gt;
&lt;p&gt;I’ll be highlighting tips to help incorporate accessibility into your usual routine when building websites. Most of these tips can be implemented without affecting your website&apos;s overall look and feel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add Alternative Text for Images&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When using images in your websites, One important thing people miss out on is adding the &lt;code&gt;alt=&quot;&quot;&lt;/code&gt; attribute to images. Here’s an example of an accessible image tag.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.kimballstock.com/pix/CAT/02/CAT_02_RK0640_03_P.JPG&quot; alt=&quot;https://www.kimballstock.com/pix/CAT/02/CAT_02_RK0640_03_P.JPG&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;./cat.png&apos; alt=&quot;A cat sitting on a chair&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The big picture difference between having the alt attribute in all images and not including it at all is that it goes a long way in making sure your website is accessible because now screen readers can announce the alt tags for people with visual and cognitive disabilities. One rule of thumb here is to make sure the alt description is in context meaning it should describe the intent of the actual image. In the example above, I used &lt;code&gt;A cat sitting on a chair&lt;/code&gt; and not just &lt;code&gt;cat&lt;/code&gt; for the description.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make use of Semantic HTML&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is another important rule missed out on. Most developers use &lt;code&gt;div&lt;/code&gt; to represent everything and forget about the appropriate mark-up for headings, lists, tables that exists. HTML5 provides additional elements, such as &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; , &lt;code&gt;section&lt;/code&gt; and &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;, to better structure your content. This is an example of a well-structured page using semantic HTML.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Always provide an option to skip the Main Content&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve found that for people making use of screen readers and keyboard, this feature is really important because it provides the option to skip to the main content when using either the keyboard or screen readers for navigation. The technique for achieving this by adding a link to skip to the main content and make it invisible until the element receives keyboard focus. An example of this is &lt;a href=&quot;http://BBC.com&quot;&gt;BBC.com&apos;s&lt;/a&gt; official website. When using your keyboard to navigate the option to skip to the main content is provided when the keyboard focuses on that element and it is visible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identify page language and language changes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most people miss out on this, I feel like it should be one of the things we look out for when building accessible sites. Always remember to indicate the primary language of every page by using the &lt;code&gt;lang&lt;/code&gt; attribute in the &lt;code&gt;HTML&lt;/code&gt; tag, for example, &lt;code&gt;&amp;lt;html lang=&quot;en&quot;&amp;gt;&lt;/code&gt;. Use the &lt;code&gt;lang&lt;/code&gt; attribute on specific elements when the language of the element differs from the rest of the page.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html lang=&quot;en&quot;&amp;gt;
	&amp;lt;head&amp;gt;
		...
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		...
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Associate a label with every form element&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Whenever possible, use the &lt;code&gt;label&lt;/code&gt; element to associate text with form elements explicitly. The &lt;code&gt;for&lt;/code&gt; attribute of the label must exactly match the &lt;code&gt;id&lt;/code&gt; of the form control. In specific situations, it may be acceptable to hide &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; elements visually, but in most cases, labels are needed to help all readers understand the required input.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;form&amp;gt;
	&amp;lt;label for=&quot;username&quot;&amp;gt;Username&amp;lt;/label&amp;gt;
	&amp;lt;input type=&quot;text&quot; name=&quot;username&quot; id=&quot;username&quot; /&amp;gt;
	&amp;lt;label for=&quot;email&quot;&amp;gt;Email&amp;lt;/label&amp;gt;
	&amp;lt;input type=&quot;email&quot; name=&quot;email&quot; id=&quot;email&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tools To Leverage When Building Accessible Sites&lt;/h2&gt;
&lt;p&gt;I found this interesting while researching this topic, there are countless tools available to help you build accessible sites. The question right now is why aren’t people making use of these to build accessible websites? The reason might be because getting started with accessibility may seem difficult at first, especially for teams that are maintaining a legacy codebase. I’ll be sharing some tools to leverage when thinking of accessibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ffoodd.github.io/a11y.css/&quot;&gt;a11y.css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://accessibilityinsights.io/&quot;&gt;Accessibility Insights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.deque.com/axe/&quot;&gt;aXe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.chromevox.com/&quot;&gt;Chrome Vox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://contrastchecker.com/&quot;&gt;Contrast Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk&quot;&gt;Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/nocoffee/jjeeggmbnhckmgdhmgdckeigabjfbddl&quot;&gt;No Coffee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pa11y.org/&quot;&gt;Pa11y&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://khan.github.io/tota11y/&quot;&gt;Tota11y&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tenon.io/&quot;&gt;Tenon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apple.com/accessibility/voiceover/&quot;&gt;Voice Over&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wave.webaim.org/&quot;&gt;Wave&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These tools will go a long way in helping you build accessible applications. You can find more tools to leverage from the compiled &lt;a href=&quot;https://www.w3.org/WAI/ER/tools/&quot;&gt;Web Accessibility Evaluation Tools List&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Further Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/WCAG20/&quot;&gt;Web Content Accessibility Guidelines (WCAG 2.1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/WAI/&quot;&gt;W3C’s Web Accessibility Initiative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/standards/wcag/checklist&quot;&gt;WebAIM Checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://a11yproject.com/checklist&quot;&gt;a11y Project Checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://a11y.me/&quot;&gt;a11y &amp;amp; Me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this article, We got a good understanding of web accessibility and what it means for users with disabilities. I’ll like to end this by saying we should all be accessibility advocates by driving this force together, we’ll see a significant change in the way the web is approached. We should always remember to build for the user and this includes all users with any kind of disability.&lt;/p&gt;
</content:encoded></item><item><title>My Workflow And Tools That Help Me Speed Up Productivity</title><link>https://giftegwuenu.com/workflow/</link><guid isPermaLink="true">https://giftegwuenu.com/workflow/</guid><description>The tools and apps I use daily to stay productive as a developer.</description><pubDate>Sat, 16 Feb 2019 23:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;My workflow and Tools that help me Speed Up Productivity.&lt;/h1&gt;
&lt;p&gt;Nearly every developer works with different tools on a daily basis to help them achieve their goals or complete specific tasks. In this post, I’ll outlined the tools I use for my day to day activities.&lt;/p&gt;
&lt;p&gt;First thing I’ll like to do is define workflow.&lt;/p&gt;
&lt;h2&gt;What is a Workflow?&lt;/h2&gt;
&lt;p&gt;A workflow is a series of event or task that processes a set of data. Workflows occur across every kind of business and industry. They are the paths that describe how something goes from being a work in progress to complete or raw to processed. For example I have a workflow for writing articles, from finding ideas of posts to creating an outline and then writing the actual content of the post to publishing all these are series of event to achieving a task.&lt;/p&gt;
&lt;p&gt;As a developer, I tend to make use of certain tools that help speed up the process of completing a specific task. Even though a lot of these processes might be different for everyone I still feel the need to share this with you. At the end no knowledge is lost right!&lt;/p&gt;
&lt;h2&gt;Tools I use to help speed up productivity&lt;/h2&gt;
&lt;p&gt;This is going to be a broad list so I’ll try and split them into different categories, I’ll be highlighting the tools I use when coding, writing, and other tools I think you will find helpful in general.&lt;/p&gt;
&lt;h2&gt;Coding Tools&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GitKraken&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393045469_Screen+Shot+2019-02-17+at+9.43.43+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I found out about this tool recently from a friend and I really love using it. I’m a big fan of using the command line over using GUI but this tool is so much different. GitKraken is a GitHub client application that works just like the command line you are already used to but with intuitive UI/UX that makes for a great experience when you using this over the command line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Insomnia&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393433785_Screen+Shot+2019-02-17+at+9.50.15+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This tool is another one I really like using. It is similar to Postman but also allows your query GraphQL endpoints which is cool right. Insomnia is a Powerful HTTP and GraphQL tool belt that is available on Mac, Linux and Windows platforms. It features includes GraphQL support, SVG and image previews, AWS authentication etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393805099_Screen+Shot+2019-02-17+at+9.56.28+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio Code is a code editor that I really love using. I have been using for over a couple of years now and I’ve not found any reason to stop with constant improvements and new features added regularly this is my go to choice for a code editor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dash&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393860313_Screen+Shot+2019-02-17+at+9.57.24+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dash is a Mac application for developers that give you access to over 200+ API documentation offline for free. You can create your own docsets or even request for docs that are not included. For Windows users, an alternative for this app is&lt;a href=&quot;https://zealdocs.org/&quot;&gt; Zeal App&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SourceTree&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393949878_Screen+Shot+2019-02-17+at+9.58.09+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ever wanted to use GUI instead of the command line for Git. Then SourceTree is your best bet. I already mention GitKraken and they both do the same job I usually alternate between both apps occasionally. So I’ll say use what works best for you they are both great apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Postico&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393941779_Screen+Shot+2019-02-17+at+9.58.20+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Postico is one client app for Postgres. It has a beautiful UI and it’s easily accessible I prefer using this to other apps I’ve found or even using the postgres command line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hyper&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550393934437_Screen+Shot+2019-02-17+at+9.58.38+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Hyper is one tool I love using, it is in fact my default terminal for coding.&lt;/p&gt;
&lt;h2&gt;Writing&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394087029_Screen+Shot+2019-02-17+at+10.01.08+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Notion is a tool for almost everything you need. I’m yet to come in contact with anyone with negative thoughts about this tool. It is super helpful. You can write, plan and collaborate with Notion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dropbox Paper&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394131871_Screen+Shot+2019-02-17+at+10.01.53+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Paper by Dropbox is a great tool for writing. I frequently used this in creating notes, writing post and a lot of other things. It supports markdown formatting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bear App&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394165002_Screen+Shot+2019-02-17+at+10.02.32+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caret&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394221471_Screen+Shot+2019-02-17+at+10.03.21+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Deploying&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394460332_Screen+Shot+2019-02-17+at+10.04.00+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394468212_Screen+Shot+2019-02-17+at+10.04.20+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394477144_Screen+Shot+2019-02-17+at+10.04.36+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zapier&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394485706_Screen+Shot+2019-02-17+at+10.05.11+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Miscellaneous&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rocket&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394501488_4papv6sia3.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spectacle&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394696821_Screen+Shot+2019-02-17+at+10.09.47+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Numi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394514506_Screen+Shot+2019-02-17+at+10.07.06+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taskade&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394685532_Screen+Shot+2019-02-17+at+10.09.16+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RecordIt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394524806_Screen+Shot+2019-02-17+at+10.06.59+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aware&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://paper-attachments.dropbox.com/s_E948749FFF9AABC92D46BF495805D213A4C4E2668CE3B0F9FAB1649B51E48A0F_1550394673125_Screen+Shot+2019-02-17+at+10.10.51+AM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope you find all these tools listed useful and start using them to make your job a lot more easier. The idea is to share with you tools I found helpful and really I’d like it if you can also share with me tools you have found useful that are not listed here. Let’s all stay productive!&lt;/p&gt;
</content:encoded></item><item><title>My 2018 Year in Review &amp; 2019 Resolutions</title><link>https://giftegwuenu.com/year-in-review-2018/</link><guid isPermaLink="true">https://giftegwuenu.com/year-in-review-2018/</guid><description>Reflecting on a productive 2018: accomplishments, lessons learned, and goals for the new year.</description><pubDate>Wed, 19 Dec 2018 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Inspired by @una&apos;s article on her year in review and @ireaderinokun&apos;s post I decided to write mine so here it goes....&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m really excited and I needed to reflect on how the year has been for me which led me to write this post. Its been an amazing year and I can&apos;t wait to share what I&apos;ve been able to achieve and plans for the new year 2019.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1545070543/IMG_20180217_120621-COLLAGE-COLLAGE_mdxope.jpg&quot; alt=&quot;me&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1545069379/Screen_Shot_2018-12-17_at_6.55.36_PM_uepe00.png&quot; alt=&quot;Repo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Looking back at the past 11 months it still feels like yesterday. I remember in January when I had just started jotting down my 2018 resolutions and oh the things I planned to achieve. I wanted to grow and scale as a developer and I took networking with other developers and the community seriously this led me to getting a role as a remote open source developer at Okkur Labs. At the time I was really passionate about learning and contributing to open source projects. That was a big stepping stone for me just at the beginning of the year.&lt;/p&gt;
&lt;p&gt;I left my Job at a startup and was focused on working remotely. For a period I felt lost and wanted to do more challenging work and that led me to apply for the Andela Fellowship. I got a job as a software developer at Andela and I&apos;ve never looked back since then.&lt;/p&gt;
&lt;h2&gt;Writing, Speaking, and Community&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Started A Blog&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I remember I read an article from John Sonmez on blogging as a developer. I made it one of my goals for the year to start my personal blog and I went ahead to create one which is what you are currently reading 😁. I had no clue as to what I was going to be writing but I still went ahead to start it. I wrote 10 articles on my blog this year mostly based on front-end development, the things I&apos;m currently learning and things I will like to share.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Gave a talk at a Conference&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;I gave my first talk at the Concatenate Conference!!&lt;/strong&gt; If anyone told me I will be giving a talk at a conference this year I&apos;ll simply tell them to stop joking I dreaded public speaking. I never had intentions to speak at a conference, all I really wanted was to attend one of those international conferences and that&apos;s still one of my goals but when I got this opportunity I had to go for it regardless of my fear of speaking in public and yes I gave a talk at Concatenate Conference about Crafting Rich Documentation with Vuepress.&lt;/p&gt;
&lt;p&gt;https://twitter.com/lauragift21/status/1028227751524945921?ref_src=twsrc%5Etfw&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Became a Chapter Lead for VueVixens Nigeria and Co-organizer for Concatenate Conference&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I also wanted to do more for the tech community. A way I could do this is to contribute my quota to the growth of the tech scene in my local community that led me to volunteer to be a lead for Vue Vixens in Nigeria. &lt;a href=&quot;https://vuevixens.org/&quot;&gt;Vue Vixens&lt;/a&gt; are foxy people who identify as women and who want to learn Vue.js to make websites and mobile apps. Watch this space because I&apos;ll be putting together several events to get more women interested in learning Vuejs together in 2019! I&apos;m also a co-organizer for Concatenate Conference and we&apos;re making plans for a better Conference come 2019!&lt;/p&gt;
&lt;h2&gt;Life Events&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Photography&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I picked up interest in photography. I even went as far as saving up to get my own DSLR. I must say that was really fulfilling I wanted to do more street photography take pictures of the Lagos and if I had the chance to travel. Take stunning pictures of Nigeria and other Countries too. But as interesting as this dream was the only thing I could achieve was within Lagos state. But trust me I explored areas I&apos;ve not been to this was really fun. I know I&apos;ll do better next year.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1545324643/IMG_2251-COLLAGE_zlbkqb.jpg&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;p style=&quot;text-align:center&quot;&amp;gt;Pictures from my Archives&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Health and Fitness&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I made a pact to ditch Soda this year and I&apos;m happy I was able to reduce it even though I couldn&apos;t completely stop it. Overall I wanted to do more with my health. Lose a few pounds and live a healthier life in general. But like they stay consistency is key and to be sincere I wasn&apos;t consistent. For me, it was going from this diet to stopping and doing something different and from having regular morning runs to stopping and procrastinating forever 😞. I know how hard it is to keep a habit but I didn&apos;t do as much as I would have loved in terms of keeping track of my fitness life.&lt;/p&gt;
&lt;h2&gt;And Plans For 2019.📙&lt;/h2&gt;
&lt;p&gt;I&apos;ll say I accomplished a lot this year and with that, I will definitely continue on the same path throughout 2019. I want to make an impact in my community by the work I&apos;m doing so to keep me accountable these are some of the things I hope to get rolling in 2019.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Writing 📝:&lt;/strong&gt; I want to be more consistent with my writing. I had a goal of publishing content bi-weekly and I could not keep up so instead of making unrealistic goals I will instead set a goal to publish at least 2 articles monthly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Speaking 📣:&lt;/strong&gt; Now that I&apos;ve broken the burden of public speaking. I will really love to do more in this space by sharing the knowledge I&apos;ve acquired over time and giving talks on topics I&apos;m really passionate about. I started submitting CFPs already keeping my fingers crossed 🤞.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Organizing Event 🔖:&lt;/strong&gt; I&apos;ll be putting together an event for ladies that are interested in learning Vuejs. If you&apos;re interested please feel free to reach out to me on twitter. While I make plans for this, I hope to empower more women to brace up and join the tech community so we can even the gap we currently have a lot fewer women in the community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Personal Projects and Open Source 💻:&lt;/strong&gt; I have a whole lot of things to learn and be comfortable with this is inclusive of JavaScript so I want to practice learning by building. I did a lot of open source contributions this year looking at doing more of that next year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I want to read more books and listen to more Podcasts 📚&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Absolutely learn how to drive! 🚗&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exercise more and live a healthier life. 🏃🏻‍♀️&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Travel and Photography 😍❤️:&lt;/strong&gt; I will really love to travel more, see the world and take amazing pictures while at it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These are most of the things I&apos;m looking forward to doing next year and to keep it realistic I&apos;m just going to stop here. One of the reasons I decided to write a review is because I&apos;m going to read this December 2019 and see how far I&apos;ve gone with my goals which is amazing and fulfilling!&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>Setup CI with Travis CI in Your Nodejs App</title><link>https://giftegwuenu.com/travis-setup/</link><guid isPermaLink="true">https://giftegwuenu.com/travis-setup/</guid><description>How to set up Travis CI for automated testing and deployment in Node.js projects.</description><pubDate>Thu, 21 Jun 2018 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This post will explain in detail how to go about setting up &lt;a href=&quot;https://travis-ci.org/&quot;&gt;Travis CI&lt;/a&gt; deployment in a nodejs project.&lt;/p&gt;
&lt;h2&gt;What is Continuous Integration?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;Continuous Integration&lt;/a&gt; is the continuous practice of merging in small code changes frequently - rather than merging in a large change at the end of a development cycle. The goal is to build healthier software by developing and testing in smaller increments. This is where Travis CI comes in.&lt;/p&gt;
&lt;h2&gt;Project Setup&lt;/h2&gt;
&lt;p&gt;In order to test the way Travis CI works we need to setup a Node project with tests.
Make sure you have node and npm installed &lt;code&gt;node -v&lt;/code&gt; and &lt;code&gt;npm -v&lt;/code&gt; to check the versions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# start up your project

mkdir travis-ci
cd travis-ci
npm init

# install the dependencies required for this project
npm install express mocha chai
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;create an &lt;em&gt;index.js&lt;/em&gt; file in root directory with the following.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# index.js

const express = require(&apos;express&apos;);

const app = express();

app.get(&apos;/&apos;, (req, res) =&amp;gt; {
  res.send(&apos;ci with travis&apos;);
});

const server = app.listen(3000, () =&amp;gt; {
  console.log(&apos;App running on port 3000&apos;);
});

module.exports = server;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Also create a test folder and an &lt;strong&gt;index-spec.js&lt;/strong&gt; file for testing our node app.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# index.spec.js

const expect = require(&apos;chai&apos;).expect
const server = require(&apos;../index&apos;);

describe(&apos;test&apos;, () =&amp;gt; {
  it(&apos;should return a string&apos;, () =&amp;gt; {
    expect(&apos;ci with travis&apos;).to.equal(&apos;ci with travis&apos;);
  });
});

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1529662546/Screenshot_from_2018-06-22_11-11-40_nyow0d.png&quot; alt=&quot;test&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NPM Script&lt;/strong&gt;&lt;br /&gt;
Make sure app and test is working by running these scripts.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&quot;scripts&quot;: {
  &quot;start&quot;: &quot;node index.js&quot;,
  &quot;test&quot;: &quot;mocha&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Travis Setup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;create a file &lt;strong&gt;.travis.yml&lt;/strong&gt; in your root directory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
language: node_js
node_js:
  - &quot;stable&quot;
cache:
  directories:
    - &quot;node_modules&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The .travis.yml file indicated above is what instructs Travis on what to build. the language option can be whatever language your app is running in and the &quot;node_js&quot;: &quot;stable&quot; indicates Travis should use a stable version of node. You can also cache your node_modules directory on Travis to avoid installing all dependencies every time a build is triggered but rather it updates packages that has newer versions. more options that be added to this file can be found &lt;a href=&quot;https://docs.travis-ci.com/user/getting-started/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;em&gt;Integrate Travis with GitHub&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Travis is a CI service which simply means it a automated process. A typical workflow with Travis ad GitHub goes like this:&lt;br /&gt;
&lt;em&gt;* A commit is pushed to to GitHub&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;* Travis build is triggered and it checks if the test is passing or failing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/lauragift/image/upload/v1529664742/Screenshot_from_2018-06-22_11-49-48_abjiek.png&quot; alt=&quot;travis ui&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Travis Build setup&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;* Create a github repo and push the project folder to GitHub.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;* Add the repo to &lt;a href=&quot;https://travis-ci.org/&quot;&gt;Travis Website&lt;/a&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;* Make a change and push a commit to the repo. You should automatically see your build process running.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;* Add the travis badge to a README.md file in your GitHub repo.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Travis CI makes developing software efficient. it ensures you deploy clean code that follows good practice and also detects if there are possible bugs or deficit in your code caused by a change or refactor in your project.&lt;/p&gt;
&lt;p&gt;All code is available on the &lt;a href=&quot;https://github.com/lauragift21/travis-blog&quot;&gt;Github repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Also feel free to leave a comment with questions or thoughts.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>How to Center Anything in CSS</title><link>https://giftegwuenu.com/center-css/</link><guid isPermaLink="true">https://giftegwuenu.com/center-css/</guid><description>Two simple methods to center elements in CSS using Flexbox and Grid.</description><pubDate>Thu, 22 Mar 2018 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Centering in CSS can be a pain in the ass. There are several methods to achieve just one task, centering an element. To cut to the chase i&apos;ll outline two quick methods to achieve this in a jiffy ✈.&lt;/p&gt;
&lt;h2&gt;Flexbox Method&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;flex&quot;&amp;gt;EGWUENU GIFT NDUDI&amp;lt;/div&amp;gt;
&amp;lt;!-- CSS using flexbox as a default method for centering div --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.flex {
	margin: 20px;
	font-size: 30px;
	color: #133b49;
	font-family: &quot;Ubuntu&quot;, sans-serif;
	display: flex;
	justify-content: center;
	align-items: center;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Grid Method&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;flex&quot;&amp;gt;EGWUENU GIFT NDUDI&amp;lt;/div&amp;gt;
&amp;lt;!-- CSS using grid system as a default method for centering div --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.grid {
	margin: 20px;
	font-size: 30px;
	color: #d6005c;
	font-family: &quot;Ubuntu&quot;, sans-serif;
	display: grid;
	justify-items: center;
	align-items: center;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;p data-height=&quot;265&quot; data-theme-id=&quot;light&quot; data-slug-hash=&quot;QmMbma&quot; data-default-tab=&quot;css,result&quot; data-user=&quot;lauragift21&quot; data-embed-version=&quot;2&quot; data-pen-title=&quot;Centering in CSS&quot; data-preview=&quot;true&quot; class=&quot;codepen&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;See the Pen &amp;lt;a href=&quot;https://codepen.io/lauragift21/pen/QmMbma/&quot;&amp;gt;Centering in CSS&amp;lt;/a&amp;gt; by Egwuenu Gift (&amp;lt;a href=&quot;https://codepen.io/lauragift21&quot;&amp;gt;@lauragift21&amp;lt;/a&amp;gt;) on &amp;lt;a href=&quot;https://codepen.io&quot;&amp;gt;CodePen&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
&amp;lt;script async src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;There are 1000 ways to do a particular thing in CSS. The question is are you doing it correctly? - Unknown&quot;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>