<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="en">
	<title>Oken Labs: experimental tech projects.</title>
	<subtitle>Oken Labs aims to build experimental projects and make the web fun again.</subtitle>
	<link href="https://okenlabs.com/feed/feed.xml" rel="self" />
	<link href="https://okenlabs.com/" />
	<updated>2024-09-14T00:00:00Z</updated>
	<id>https://okenlabs.com/</id>
	<author>
		<name>Oken Labs</name>
	</author>
		<entry>
			<title>Let&#39;s make the web fun again!</title>
			<link href="https://okenlabs.com/blog/lets-make-the-web-fun-again/" />
			<updated>2024-09-14T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/lets-make-the-web-fun-again/</id>
			<content type="html">&lt;p&gt;When I &lt;a href=&quot;https://okenlabs.com/blog/hello-world/&quot;&gt;started writing&lt;/a&gt; for this blog and created this website, my original idea was to make something I called an &lt;em&gt;&amp;quot;independent Product Engineering initiative&amp;quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Beyond the fancy name, my goal was to contribute to open-source software, build tools and resources for developers and designers, and help maintain them.&lt;/p&gt;
&lt;p&gt;I still want to do that. However, that previous idea could sometimes feel paralyzing because I often felt like what I was building wasn&#39;t good enough.&lt;/p&gt;
&lt;p&gt;So, starting today, I’ll focus on building random things, prioritizing fun over productivity.&lt;/p&gt;
&lt;p&gt;Maybe along the way, I’ll create something genuinely useful. But if not, that&#39;s fine too :)&lt;/p&gt;
&lt;p&gt;Stay tuned for some &lt;s&gt;crazy random&lt;/s&gt; cool experiments!&lt;/p&gt;
&lt;p&gt;P.S. Thank you, &lt;a href=&quot;https://eieio.games/&quot;&gt;eieio&lt;/a&gt;, for making &lt;a href=&quot;https://onemillioncheckboxes.com/&quot;&gt;One Million Checkboxes&lt;/a&gt;. Thank you, &lt;a href=&quot;https://www.youtube.com/@t3dotgg&quot;&gt;Theo&lt;/a&gt;, for &lt;a href=&quot;https://www.youtube.com/watch?v=hTxArh6tBHY&quot;&gt;reminding me the web can be fun&lt;/a&gt; and doesn&#39;t always need to be so productized. Finally, thank you, &lt;a href=&quot;https://neal.fun/&quot;&gt;neal.fun&lt;/a&gt;, for being a great inspiration.&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>Taking a break</title>
			<link href="https://okenlabs.com/blog/taking-a-break/" />
			<updated>2024-07-12T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/taking-a-break/</id>
			<content type="html">&lt;p&gt;I haven&#39;t posted in a while, and it&#39;s okay :)&lt;/p&gt;
&lt;p&gt;When I started this blog I posted three days in a row, however, I knew that posting so frequently wouldn&#39;t work for me. So I decided back then I would post whenever I felt like.&lt;/p&gt;
&lt;p&gt;Still, I didn&#39;t think that I would go three months without posting, but here we are. While I was not writing that much, some interesting things happened, and I was coding and engineering a lot.&lt;/p&gt;
&lt;p&gt;Anyway, by the end of June, my mind needed a break. Since I had the opportunity to take some time off from work, I did! In the first week of not coding, I felt I should be doing something, either working on a side project or studying, and then it hit me: &lt;strong&gt;the only way I would actually recharge myself would be to take a sincere break&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So, for the last two weeks, I have been binge-watching series like Vikings and cooking shows. I also played some games, and took some time to just chill and even just get bored.&lt;/p&gt;
&lt;p&gt;It&#39;s been a blast!&lt;/p&gt;
&lt;p&gt;I now feel refreshed and eager to get back to coding! Since I have a couple of weeks before getting back to my full-time work, I will gladly work on side projects and study.&lt;/p&gt;
&lt;p&gt;Honestly, if I kept pushing myself to &amp;quot;be productive&amp;quot; and hadn&#39;t taken this break, I most likely wouldn&#39;t be as excited and motivated as I&#39;m feeling now.&lt;/p&gt;
&lt;p&gt;To my future self and to whoever reads this: &lt;strong&gt;have a break without any guilt from time to time, it will be worthwhile in the long run.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Take care y&#39;all.&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>How I (Re)made my Web Portfolio: Tips, Tools and Best Practices</title>
			<link href="https://okenlabs.com/blog/how-i-remade-my-web-portfolio/" />
			<updated>2024-04-11T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/how-i-remade-my-web-portfolio/</id>
			<content type="html">&lt;h2 id=&quot;a-brief-introduction&quot; tabindex=&quot;-1&quot;&gt;A brief introduction &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;If you would like to check the &lt;s&gt;final&lt;/s&gt; current result, you can access it at &lt;a href=&quot;https://andreseiji.com/?utm_source=okenlabs&amp;amp;utm_campaign=article&quot;&gt;andreseiji.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;ve always wanted to have my own website.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I started my career as a UI designer, and I knew it was important to have a portfolio. It&#39;s a practical way to showcase my work. Eventually, I transitioned to software engineering, and along my journey, I&#39;ve had a few different versions of my website and/or portfolio.&lt;/p&gt;
&lt;p&gt;In the early 2010s, my very first website was a template bought in &lt;a href=&quot;https://themeforest.net/&quot;&gt;ThemeForest&lt;/a&gt;, by &lt;a href=&quot;https://www.envato.com/&quot;&gt;Envato&lt;/a&gt;. It was a simple HTML, CSS and JS website, using &lt;a href=&quot;https://jquery.com/&quot;&gt;jQuery&lt;/a&gt; and &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;. I remember I had to use FTP to upload the files to the server - UOL Host - a Brazilian hosting service.&lt;/p&gt;
&lt;p&gt;In the following years, I remade my portfolio using &lt;a href=&quot;https://angularjs.org/&quot;&gt;angular.js&lt;/a&gt;, &lt;a href=&quot;https://vuejs.org/&quot;&gt;VueJS&lt;/a&gt;, &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; (with &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;), and even Vanilla JS 🍦. I&#39;ve used different tools and libraries, like &lt;a href=&quot;https://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; and &lt;a href=&quot;https://webpack.js.org/&quot;&gt;Webpack&lt;/a&gt; for builds, &lt;a href=&quot;https://bulma.io/&quot;&gt;BulmaCSS&lt;/a&gt;, &lt;a href=&quot;https://material.angular.io/&quot;&gt;Angular Material&lt;/a&gt;, &lt;a href=&quot;https://stitches.dev/&quot;&gt;Stitches&lt;/a&gt;, &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt; and others for styling. I&#39;ve also used different hosting services, like &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;, and &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this article, I&#39;ll share my experience remaking my portfolio in 2024. I&#39;ll cover the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why I decided to remake my website&lt;/li&gt;
&lt;li&gt;The tools and libraries I used&lt;/li&gt;
&lt;li&gt;The best practices I followed&lt;/li&gt;
&lt;li&gt;The final result&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you find something useful. Let&#39;s get started!&lt;/p&gt;
&lt;h2 id=&quot;why-i-decided-to-remake-my-website&quot; tabindex=&quot;-1&quot;&gt;Why I decided to remake my website &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The previous version of my website was built originally in late 2022 using &lt;code&gt;React 17.x&lt;/code&gt;, &lt;code&gt;Next.js 13.x&lt;/code&gt; and &lt;code&gt;Tailwind CSS&lt;/code&gt;. It was a simple website, with only a landing page containing some info about myself, companies and projects I have worked on, and links to my resume and social accounts. It was hosted on Vercel, and I was happy with it.&lt;/p&gt;
&lt;p&gt;However, I felt the need to update it. I wanted to better showcase what I have learned and projects I am working on by myself - without a company or other person hiring me. This way it would feel like a web development and design portfolio that truly represents me.&lt;/p&gt;
&lt;p&gt;Finally, I wanted it to be scalable, so I could add new pages and content in the future without too much effort, while also having a personal touch.&lt;/p&gt;
&lt;p&gt;Here are some screenshots of the previous version of my website:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/782nf4SuhO-888.avif 888w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/782nf4SuhO-888.webp 888w&quot;&gt;&lt;img alt=&quot;andreseiji.com screenshot taken on 23 March 2024, part 1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/782nf4SuhO-888.png&quot; width=&quot;888&quot; height=&quot;584&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/pLDeFB-UiC-888.avif 888w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/pLDeFB-UiC-888.webp 888w&quot;&gt;&lt;img alt=&quot;andreseiji.com screenshot taken on 23 March 2024, part 2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/pLDeFB-UiC-888.png&quot; width=&quot;888&quot; height=&quot;710&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/LlnD9SCnsg-888.avif 888w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/LlnD9SCnsg-888.webp 888w&quot;&gt;&lt;img alt=&quot;andreseiji.com screenshot taken on 23 March 2024, part 3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/LlnD9SCnsg-888.png&quot; width=&quot;888&quot; height=&quot;710&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s alright, but I wanted to make it better. Like &lt;a href=&quot;https://twitter.com/addyosmani/status/314785735171518464&quot;&gt;Addy Osmany said once&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First do it, then do it right, then do it better.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For my website, I am now in the loop of always making it better, and better, and better...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick tip:&lt;/strong&gt; Update your website every now and then. It&#39;s a good way to learn new things and improve your skills.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Another quick tip:&lt;/strong&gt; If you are doing your first website, don&#39;t worry too much about it. Just do it. You can always change or update it later.&lt;/p&gt;
&lt;h2 id=&quot;the-tools-and-libraries-i-used&quot; tabindex=&quot;-1&quot;&gt;The tools and libraries I used &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Having used so many different tools and libraries in the past, I wanted to keep it simple this time, while also moving fast.&lt;/p&gt;
&lt;p&gt;For tooling, I used &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt; to plan and organize the project, &lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt; to design the website, and &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; to version control the code. I also used &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt; to host the website and &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt; as my code editor.&lt;/p&gt;
&lt;p&gt;For libraries, the base is &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt;, &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;, and &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt;. As I want to get more in-depth with them, learning more about their advanced features, it seemed like a good idea to use the same stack with updated versions (&lt;code&gt;React 18.x&lt;/code&gt;, &lt;code&gt;Next 14.x&lt;/code&gt; and &lt;code&gt;Tailwind 3.x&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This is what my &lt;code&gt;dependencies&lt;/code&gt; and &lt;code&gt;devDependencies&lt;/code&gt; look like in my &lt;code&gt;package.json&lt;/code&gt; file at the writing of this article:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@heroicons/react&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^2.1.3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@radix-ui/react-dropdown-menu&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^2.0.6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;classnames&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^2.5.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;framer-motion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^11.0.24&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;next&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^14.1.4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;next-intl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^3.10.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;next-plausible&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^3.12.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;next-themes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^0.3.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^18.2.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;react-dom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^18.2.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;sharp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^0.33.3&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@types/node&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^20.11.30&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@types/react&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^18.2.73&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@types/react-dom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^18.2.23&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@typescript-eslint/eslint-plugin&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^6.21.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;@typescript-eslint/parser&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^6.21.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;autoprefixer&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^10.4.19&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;eslint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^8.57.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;eslint-config-next&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^14.1.4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;eslint-config-prettier&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^9.1.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;eslint-plugin-no-relative-import-paths&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^1.5.3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;postcss&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^8.4.38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;prettier&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^3.2.5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;prettier-plugin-tailwindcss&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^0.5.13&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;tailwindcss&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^3.4.3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;typescript&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^5.4.3&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I would consider a fair amount for what I wanted to do. Not too much, not too little. Let&#39;s break down the dependencies:&lt;/p&gt;
&lt;h3 id=&quot;next-js-react-and-tailwind-css&quot; tabindex=&quot;-1&quot;&gt;Next.js, React and Tailwind CSS &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I started the project with &lt;a href=&quot;https://nextjs.org/docs/pages/api-reference/create-next-app&quot;&gt;create-next-app&lt;/a&gt;, with the following options:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;What is your project named? &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;andreseiji.com&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
Would you like to use TypeScript? &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;Yes&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
Would you like to use ESLint? &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;Yes&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
Would you like to use Tailwind CSS? &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;Yes&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
Would you like to use &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;src/&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt; directory? &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;Yes&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
Would you like to use App Router? &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;recommended&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;Yes&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
Would you like to customize the default &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;@/&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;*&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;? &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;No&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This generated a project with most of the dependencies I needed already.&lt;/p&gt;
&lt;h3 id=&quot;internationalization-i18n&quot; tabindex=&quot;-1&quot;&gt;Internationalization (i18n) &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One missing feature on my previous website was localization. I wanted to have my website available in Brazilian Portuguese, my native language. For this version, I decided to use &lt;a href=&quot;https://next-intl-docs.vercel.app/&quot;&gt;next-intl&lt;/a&gt;. It has great integration with Next.js app router, and once the setup is done, it&#39;s easy to use.&lt;/p&gt;
&lt;h3 id=&quot;theme-switcher&quot; tabindex=&quot;-1&quot;&gt;Theme switcher &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While &lt;a href=&quot;https://tailwindcss.com/docs/dark-mode&quot;&gt;Tailwind CSS makes implementing a dark theme very straightforward&lt;/a&gt;, and it is simple to implement a theme switcher, I used &lt;a href=&quot;https://github.com/pacocoursey/next-themes&quot;&gt;next-themes&lt;/a&gt; because it provides a more robust solution, with more features like live syncing all open tabs and support for multiple themes.&lt;/p&gt;
&lt;h3 id=&quot;analytics&quot; tabindex=&quot;-1&quot;&gt;Analytics &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I wanted to have some basic analytics. I decided to use &lt;a href=&quot;https://plausible.io/&quot;&gt;Plausible&lt;/a&gt; mainly because it&#39;s privacy-friendly. It&#39;s also simple to use and I don&#39;t need a lot of data for my website. The &lt;a href=&quot;https://github.com/4lejandrito/next-plausible&quot;&gt;next-plausible&lt;/a&gt; library is the official recommended way to add Plausible to a Next.js project.&lt;/p&gt;
&lt;h3 id=&quot;icons-and-ui-components&quot; tabindex=&quot;-1&quot;&gt;Icons and UI components &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For iconography, I used &lt;a href=&quot;https://heroicons.com/&quot;&gt;Heroicons&lt;/a&gt;. They are simple, clean, and easy to use. They are imported as modules, so I can use only the icons I need, reducing the bundle size. The background pattern is from &lt;a href=&quot;https://www.heropatterns.com/&quot;&gt;Hero Patterns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also used &lt;a href=&quot;https://www.radix-ui.com/&quot;&gt;Radix UI&lt;/a&gt; for the dropdown menu. Libraries like Radix UI are great for building accessible UI components. If you are using React, &lt;a href=&quot;https://headlessui.dev/&quot;&gt;Headless UI&lt;/a&gt; is another great option.&lt;/p&gt;
&lt;h3 id=&quot;animations&quot; tabindex=&quot;-1&quot;&gt;Animations &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I used &lt;a href=&quot;https://www.framer.com/motion/&quot;&gt;Framer Motion&lt;/a&gt; for animations. As my content is presented in a timeline, I thought it would be nice to make each item appear with a fade-in effect. I think it adds a nice touch to the website and shows thoughtfulness.&lt;/p&gt;
&lt;p&gt;I tried not to overdo it, though. Animations should be used to enhance the user experience, not to distract or annoy the user.&lt;/p&gt;
&lt;h3 id=&quot;other-libraries&quot; tabindex=&quot;-1&quot;&gt;Other libraries &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JedWatson/classnames&quot;&gt;classnames&lt;/a&gt;: a great utility for conditionally joining class names together, very useful to create components with variations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lovell/sharp&quot;&gt;sharp&lt;/a&gt;: a high-performance image processing library. Required by &lt;a href=&quot;https://nextjs.org/docs/pages/building-your-application/optimizing/images&quot;&gt;Next.js to optimize images&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Some ESLint and Prettier plugins to keep the code clean and consistent.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;a-final-thought-on-the-tools-and-libraries&quot; tabindex=&quot;-1&quot;&gt;A final thought on the tools and libraries &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I like either using what I am most comfortable with to move fast, or trying new things to learn more. In this project, I did a bit of both. I used tools I was already familiar with, like React, Next.js, and Tailwind CSS, but I also tried new libraries, like &lt;a href=&quot;https://next-intl-docs.vercel.app/&quot;&gt;next-intl&lt;/a&gt; and &lt;a href=&quot;https://www.framer.com/motion/&quot;&gt;Framer Motion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whatever you choose, make sure it fits your needs and goals.&lt;/strong&gt; Don&#39;t use a library just because it&#39;s popular or because everyone else is using it. Use it because it solves a problem you have. &lt;strong&gt;Make every choice intentional.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Don&#39;t be afraid to try new things, but also don&#39;t be afraid to stick with what you know. Balance is key.&lt;/p&gt;
&lt;h2 id=&quot;the-best-practices-i-followed&quot; tabindex=&quot;-1&quot;&gt;The best practices I followed &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;planning&quot; tabindex=&quot;-1&quot;&gt;Planning &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As a developer, sometimes all I want is to jump into the code and start building. But planning is important.&lt;/p&gt;
&lt;p&gt;Before starting the project, I planned &lt;s&gt;everything&lt;/s&gt; most things in Notion. I created a new page for the project, where I wrote what I wanted to have, and the tools and libraries I would use.&lt;/p&gt;
&lt;p&gt;I used the &lt;a href=&quot;https://landingpageboard.com/&quot;&gt;Landing Page Board&lt;/a&gt; to help me define the main content, and from there, I created a mockup in Figma. I also created a list of tasks on &lt;a href=&quot;https://todoist.com/&quot;&gt;Todoist&lt;/a&gt; to keep track of what I needed to do, especially because I wanted to finish it all in under 10 days.&lt;/p&gt;
&lt;h3 id=&quot;design&quot; tabindex=&quot;-1&quot;&gt;Design &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I designed the website in Figma. To keep it simple, I started with a neutral color palette from &lt;a href=&quot;https://tailwindcss.com/docs/customizing-colors&quot;&gt;Tailwind CSS colors&lt;/a&gt; and something more like a wireframe.&lt;/p&gt;
&lt;p&gt;I thought it would be nice to have a timeline to show my professional journey. It could also represent git branches, where each route is a different branch.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/u2KUpqsqEm-888.avif 888w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/u2KUpqsqEm-888.webp 888w&quot;&gt;&lt;img alt=&quot;First mockup on Figma&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/u2KUpqsqEm-888.png&quot; width=&quot;888&quot; height=&quot;666&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I usually go for simpler UIs and clean designs, but this time I wanted something bolder, more colorful and playful. I then iterated the design to give it a kinda brutalist look. It was fun to experiment with more colors!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/nEJrJKKkHL-888.avif 888w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/nEJrJKKkHL-888.webp 888w&quot;&gt;&lt;img alt=&quot;Brutalist mockup on Figma&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/nEJrJKKkHL-888.png&quot; width=&quot;888&quot; height=&quot;749&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Even though I wasn&#39;t 100% sure about the design, I decided to start coding this version. I knew I could always change it later.&lt;/p&gt;
&lt;h3 id=&quot;development&quot; tabindex=&quot;-1&quot;&gt;Development &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I started the project with &lt;code&gt;create-next-app&lt;/code&gt;, and I used the options I mentioned earlier.&lt;/p&gt;
&lt;p&gt;The first thing was the project setup, configuring my Prettier and ESLint preferences with helpful plugins for what I was going to use.&lt;/p&gt;
&lt;p&gt;Then I moved to &lt;code&gt;next-intl&lt;/code&gt; to account for the internationalization from the beginning.&lt;/p&gt;
&lt;p&gt;I created the main components, like the header, footer, and timeline. I used Tailwind CSS for styling, and I tried to keep the components small and reusable.&lt;/p&gt;
&lt;p&gt;Once I had all the components, I started adding more content. The modular structure of the site makes it easy to move cards and content around.&lt;/p&gt;
&lt;p&gt;The final thing I added were the animations. While they add a lot to the look and feel, they are not essential. I could have launched the website without them, and it would still be functional.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Always remember to prioritize the essential features. You can always add more later.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;typography&quot; tabindex=&quot;-1&quot;&gt;Typography &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For the typography, I decided to use only one font family, &lt;a href=&quot;https://fonts.google.com/specimen/IBM+Plex+Mono&quot;&gt;IBM Plex Mono&lt;/a&gt;, with two weights.&lt;/p&gt;
&lt;p&gt;Using a few fonts helps with performance, as the browser doesn&#39;t need to download multiple font files. It also helps with consistency, as you don&#39;t have to worry about different fonts clashing.&lt;/p&gt;
&lt;h3 id=&quot;performance&quot; tabindex=&quot;-1&quot;&gt;Performance &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js is already optimized for performance, but there are always things you can do to make it even faster, like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Picking just a few fonts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/pages/building-your-application/optimizing/images&quot;&gt;Optimizing images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/pages/building-your-application/optimizing/images#priority&quot;&gt;Using Priority for the Largest Contentful Paint (LCP) element&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using only libraries and code I actually needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By following these practices, I was able to achieve a &lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/overview/&quot;&gt;Lighthouse score&lt;/a&gt; of 100s on Desktop. Mobile wasn&#39;t bad either, with 98 for Performance.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/1d6KIaPku9-713.avif 713w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/1d6KIaPku9-713.webp 713w&quot;&gt;&lt;img alt=&quot;Lighthouse score on Desktop&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/1d6KIaPku9-713.png&quot; width=&quot;713&quot; height=&quot;774&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;To better understand Core Web Vitals, definitely check &lt;a href=&quot;https://web.dev/&quot;&gt;web.dev&lt;/a&gt;. It&#39;s a great resource.&lt;/p&gt;
&lt;p&gt;It&#39;s also important to understand that &lt;a href=&quot;https://web.dev/articles/lab-and-field-data-differences&quot;&gt;lab data (like Lighthouse) is not the same as field data (real user data)&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;seo&quot; tabindex=&quot;-1&quot;&gt;SEO &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For SEO, I made sure to have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A descriptive title and meta description&lt;/li&gt;
&lt;li&gt;A good URL structure&lt;/li&gt;
&lt;li&gt;Alt text for images&lt;/li&gt;
&lt;li&gt;A sitemap&lt;/li&gt;
&lt;li&gt;A robots.txt file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are using Next.js, check the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/file-conventions/metadata&quot;&gt;Metadata Files API Reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After publishing the website, I configured it on &lt;a href=&quot;https://search.google.com/search-console/welcome&quot;&gt;Google Search Console&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;accessibility&quot; tabindex=&quot;-1&quot;&gt;Accessibility &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I may not be an expert, but I care for accessibility and try to at least implement the basics, like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Having semantic HTML&lt;/li&gt;
&lt;li&gt;Adding alt text to images (when it makes sense, sometimes it&#39;s better to leave it empty)&lt;/li&gt;
&lt;li&gt;Using ARIA attributes when needed&lt;/li&gt;
&lt;li&gt;Ensuring contrast ratios are good for both light and dark themes&lt;/li&gt;
&lt;li&gt;Using focus traps where it makes sense (like the dropdown menu)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wrote about &lt;a href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;implementing focus traps&lt;/a&gt; on a previous article.&lt;/p&gt;
&lt;h3 id=&quot;ci-cd&quot; tabindex=&quot;-1&quot;&gt;CI/CD &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I used &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt; for hosting, which has such well-integrated CI/CD that I can publish new versions in just a few minutes. Every time I push to the &lt;code&gt;main&lt;/code&gt; branch, it automatically deploys the website. It&#39;s fast and reliable.&lt;/p&gt;
&lt;p&gt;I also set up a custom domain, and I configured the DNS records to point to Vercel.&lt;/p&gt;
&lt;h3 id=&quot;content&quot; tabindex=&quot;-1&quot;&gt;Content &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There is a saying that &amp;quot;content is king&amp;quot;. And it&#39;s true. You can have the best design and the best performance, but if the content is not good, the website won&#39;t be either. I made sure to write about myself trying to show my personality, and to showcase my work in a way that is easy to understand.&lt;/p&gt;
&lt;p&gt;I think I still can improve a lot on this aspect, and it&#39;s a good thing I can keep iterating on it.&lt;/p&gt;
&lt;h3 id=&quot;iteration&quot; tabindex=&quot;-1&quot;&gt;Iteration &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After launching the website, I asked for feedback from friends and colleagues. I also used &lt;a href=&quot;https://developers.google.com/web/tools/lighthouse&quot;&gt;Lighthouse&lt;/a&gt; to check the performance and accessibility.&lt;/p&gt;
&lt;p&gt;I made some changes based on the feedback, like reviewing the menu so the first thing you see is the timeline, and making the header sticky for easier navigation.&lt;/p&gt;
&lt;p&gt;I will keep improving it.&lt;/p&gt;
&lt;h2 id=&quot;the-final-result&quot; tabindex=&quot;-1&quot;&gt;The final result &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;quot;Final&amp;quot; meaning the current version, as I am always looking to improve it. Here is a screenshot I took on the date of this article:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/lNQm0isR5O-888.avif 888w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/lNQm0isR5O-888.webp 888w&quot;&gt;&lt;img alt=&quot;andreseiji.com screenshot taken on 11 April 2024&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/lNQm0isR5O-888.png&quot; width=&quot;888&quot; height=&quot;516&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Maybe by the time you are reading this article, the website has changed. If you want to check it out, you can access it at &lt;a href=&quot;https://andreseiji.com/?utm_source=okenlabs&amp;amp;utm_campaign=article&quot;&gt;andreseiji.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;thanks-for-reading&quot; tabindex=&quot;-1&quot;&gt;Thanks for reading &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/how-i-remade-my-web-portfolio/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I hope you found this article useful. I tried to cover the main aspects of remaking a website, from planning to launching. I hope you can take something from it and apply it to your own projects.&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>Brag Document: write your own</title>
			<link href="https://okenlabs.com/blog/brag-document-write-your-own/" />
			<updated>2024-03-12T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/brag-document-write-your-own/</id>
			<content type="html">&lt;p&gt;Have you ever struggled to remember all the awesome things you&#39;ve accomplished at work? Or maybe you feel like your efforts aren&#39;t getting the recognition they deserve? Well, I&#39;ve experienced both struggles and felt like my hard work was in vain sometimes, and then I discovered the brag document. It&#39;s not a magical solution, but it sure helps a lot.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-brag-document&quot; tabindex=&quot;-1&quot;&gt;What is a Brag Document? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/brag-document-write-your-own/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&#39;s a personal repository of accomplishments, skills, contributions, and anything else that shows how great you are at what you do. Whether it&#39;s completing a project ahead of schedule, getting praised by colleagues, or learning a new skill, it all goes in the brag document.&lt;/p&gt;
&lt;h2 id=&quot;why-you-need-one&quot; tabindex=&quot;-1&quot;&gt;Why you need one &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/brag-document-write-your-own/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When it comes time for performance reviews or job interviews, you&#39;ll have all the evidence you need to show why you&#39;re the best person for the job. Before having one, I would have to try really hard to remember what I did, and I most likely left out lots of cool stuff because I didn&#39;t remember them.&lt;/p&gt;
&lt;p&gt;It also helps to visualize your own progression and set personal goals for professional growth. Even when I didn&#39;t get a raise or promotion, I still felt good about myself by reflecting on everything I have achieved during a period of time.&lt;/p&gt;
&lt;h2 id=&quot;how-to-make-your-own-brag-document&quot; tabindex=&quot;-1&quot;&gt;How to make your own Brag Document &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/brag-document-write-your-own/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Creating one is easy, but keeping it updated requires some discipline. You can use a digital tool or even just a good old-fashioned notebook. I have used &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt; and &lt;a href=&quot;https://docs.google.com/&quot;&gt;Google Docs&lt;/a&gt;. An advantage of keeping it digital is the ease to share with your manager and other peers. Sharing is a great way to get feedback, be reminded of things that you wouldn&#39;t otherwise register in the brag document, and also see all the amazing things you and other people are achieving.&lt;/p&gt;
&lt;p&gt;When it comes to keeping it up to date, a good practice is to set aside some time every week to update it with new achievements, skills, and others. I reserve half an hour a week to do so.&lt;/p&gt;
&lt;h2 id=&quot;what-goes-in-it&quot; tabindex=&quot;-1&quot;&gt;What goes in it? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/brag-document-write-your-own/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Your brag document is your own and should be structured in a way that works for you and highlights your history. But I&#39;m the type who likes a template to guide me, and if you would rather have one too, I definitely recommend checking out Julia Evans&#39; &lt;a href=&quot;https://jvns.ca/blog/brag-documents/&quot;&gt;&amp;quot;Get your work recognized: write a brag document&amp;quot;&lt;/a&gt; post. It has a brag document template with examples.&lt;/p&gt;
&lt;p&gt;I will also share the template I&#39;m currently using with some fictional examples. The template is yearly and has been effective for me:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; (Your name)&#39;s 2024 Brag Document&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Goals&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;###&lt;/span&gt; Year goal&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Get to the next level on the career ladder

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;###&lt;/span&gt; Q1 Goals&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Improve app performance by reducing p90 LCP from 3s to 2s
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Learn a new programming language

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;###&lt;/span&gt; Q2 Goals&lt;/span&gt;

...

&lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Projects&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;###&lt;/span&gt; Project X&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Delivered 20 technical debts in one month, while also delivering product stories
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Optimized the CI/CD pipeline, reducing the average time from 11 minutes to 5 minutes

...

&lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Tools&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;###&lt;/span&gt; Some Experimentation Tool&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Implemented the tool in 3 projects, enabling the growth team to run 22 different A/B experiments in Q1

...

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Collabs and mentoring&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Worked with Team Delta to plan and deliver the new notifications central
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Mentored a junior software engineer by having weekly 1-on-1 sessions and specific pair programmings

...

&lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Acknowledgements and feedback&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Attach or quote some received feedbacks.

...

&lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Design &amp;amp; Docs&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Links to RFCs (Request For Comments) and Docs you have written or contributed to

...

&lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Learnings&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Completed a course on Clean Code and Clean Architecture
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Read &quot;The Staff Engineer&#39;s Path&quot; book

...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I hope these examples give you a good idea of how to fill in your own brag document. Remember, it&#39;s crucial to include real data and personalize it to reflect your achievements accurately.&lt;/p&gt;
&lt;h2 id=&quot;share-your-successes&quot; tabindex=&quot;-1&quot;&gt;Share your successes &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/brag-document-write-your-own/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once you&#39;ve got your brag document set up, don&#39;t be afraid to show it off! You can use it during performance reviews, bring it along to job interviews to prove you&#39;re the perfect fit for the role, and share it with teammates to celebrate your achievements together!&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>Accessibility: Implementing Focus Traps</title>
			<link href="https://okenlabs.com/blog/accessibility-implementing-focus-traps/" />
			<updated>2024-03-11T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/accessibility-implementing-focus-traps/</id>
			<content type="html">&lt;p&gt;I decided to write about focus traps because they are an essential aspect of keyboard accessibility, yet many sites and developers do not implement them.&lt;/p&gt;
&lt;h2 id=&quot;introduction-to-web-accessibility-a11y&quot; tabindex=&quot;-1&quot;&gt;Introduction to Web Accessibility (A11y) &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Web Accessibility basically means making websites easy to use for everyone, including people with disabilities.&lt;/p&gt;
&lt;p&gt;I will probably write more about it in the future, but since I&#39;m no expert at it, if you would like to dive deeper, I definitely recommend checking &lt;a href=&quot;https://www.a11yproject.com/&quot;&gt;The A11y Project&lt;/a&gt; and the most recent &lt;a href=&quot;https://www.w3.org/TR/WCAG22/&quot;&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;, which at the time of this writing is &lt;a href=&quot;https://www.w3.org/TR/WCAG22/&quot;&gt;version 2.2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;understanding-focus-traps&quot; tabindex=&quot;-1&quot;&gt;Understanding Focus Traps &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A focus trap is a design element that keeps a user&#39;s attention within a specific area of a webpage, commonly used to ensure keyboard navigation remains within certain interactive components like modals or menus.&lt;/p&gt;
&lt;p&gt;Focus traps are important for accessible web design because they prevent keyboard users, including those with disabilities, from unintentionally navigating away from important interactive elements, ensuring a smoother and more predictable user experience.&lt;/p&gt;
&lt;p&gt;Some examples of components that often benefit from focus traps are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modal or dialog&lt;/li&gt;
&lt;li&gt;Dropdown menus&lt;/li&gt;
&lt;li&gt;Contextual menus&lt;/li&gt;
&lt;li&gt;Popovers with interactions&lt;/li&gt;
&lt;li&gt;Lightboxes or overlays&lt;/li&gt;
&lt;li&gt;Tabs or tabbed interfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;design-considerations-for-focus-traps&quot; tabindex=&quot;-1&quot;&gt;Design considerations for Focus Traps &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ensure focus traps are easily discoverable and navigable, with clear visual indicators for focused elements.&lt;/li&gt;
&lt;li&gt;Avoid hindering the user experience for screen readers or other assistive technologies.&lt;/li&gt;
&lt;li&gt;Provide instructions for custom key navigation, in addition to the usual &lt;code&gt;Tab&lt;/code&gt; and &lt;code&gt;Shift + Tab&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ensure users can navigate into and out of the focus trap easily.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;implementing-focus-traps&quot; tabindex=&quot;-1&quot;&gt;Implementing Focus Traps &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most likely, you already use a UI library and some external packages. However, before recommending specific implementations using libraries, let&#39;s discuss how to implement focus traps from scratch and key considerations. Understanding these fundamentals will help visualize what happens under the hood.&lt;/p&gt;
&lt;h3 id=&quot;implementation-overview&quot; tabindex=&quot;-1&quot;&gt;Implementation Overview &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Implementing a focus trap from scratch requires event handling, such as listening to the &amp;quot;keydown&amp;quot; event and preventing the default behavior of certain keys, such as &lt;code&gt;Tab&lt;/code&gt;, when the focus is at the boundary of the trap.&lt;/p&gt;
&lt;p&gt;In addition to &lt;code&gt;Tab&lt;/code&gt; and &lt;code&gt;Shift + Tab&lt;/code&gt;, provide a clear method for users to exit the focus trap by pressing the Escape key.&lt;/p&gt;
&lt;p&gt;Focus management is also important. Set the focus to the first focusable element within the trap when it is activated, and then trap focus within the trap by redirecting focus back to the first element when attempting to move outside the trap.&lt;/p&gt;
&lt;p&gt;Utilize &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles&quot;&gt;ARIA roles&lt;/a&gt; and attributes to enhance accessibility. For example, apply the &lt;code&gt;role&lt;/code&gt; attribute with a value of &lt;code&gt;dialog&lt;/code&gt; to signify the purpose of the focus trap to assistive technologies.&lt;/p&gt;
&lt;p&gt;Ensure all interactive elements within the focus trap, such as buttons, links, and form fields, are focusable using keyboard navigation and have a clear indication when they are focused.&lt;/p&gt;
&lt;h3 id=&quot;implementation-using-libraries&quot; tabindex=&quot;-1&quot;&gt;Implementation using Libraries &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The suggested libraries will all depend on what packages your project already uses. I will leave some examples, but always make your research and check the official docs.&lt;/p&gt;
&lt;p&gt;You can also implement a Focus Trap yourself, without any library, just make sure to follow a11y best practices.&lt;/p&gt;
&lt;h4 id=&quot;libraries-for-react&quot; tabindex=&quot;-1&quot;&gt;Libraries for React &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you use a UI library, such as &lt;a href=&quot;https://mui.com/material-ui/&quot;&gt;Material UI&lt;/a&gt;, check for an existing component. For instance, MUI has &lt;a href=&quot;https://mui.com/base-ui/react-focus-trap/&quot;&gt;its own FocusTrap component&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you do not use a UI library, or the one you use does not have a Focus Trap component, consider these libraries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.radix-ui.com/&quot;&gt;Radix UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://headlessui.com/&quot;&gt;Headless UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react-spectrum.adobe.com/react-aria/&quot;&gt;React Aria&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or even get the base for the component you need from &lt;a href=&quot;https://ui.shadcn.com/&quot;&gt;shadcn/ui&lt;/a&gt;, which is not a library by itself but will provide some code for your component while accounting for a11y.&lt;/p&gt;
&lt;h4 id=&quot;libraries-for-angular&quot; tabindex=&quot;-1&quot;&gt;Libraries for Angular &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you use a UI library, such as &lt;a href=&quot;https://primeng.org/&quot;&gt;PrimeNG&lt;/a&gt;, check for a Focus Trap component. PrimeNG has &lt;a href=&quot;https://primeng.org/focustrap&quot;&gt;its own pFocusTrap directive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://material.angular.io/&quot;&gt;Angular Material&lt;/a&gt;, which uses the &lt;code&gt;@angular/cdk&lt;/code&gt; (Component Dev Kit), also has a &lt;a href=&quot;https://material.angular.io/cdk/a11y/overview#focustrap&quot;&gt;FocusTrap directive&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;other-library-options&quot; tabindex=&quot;-1&quot;&gt;Other library Options &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/focus-trap/focus-trap&quot;&gt;focus-trap&lt;/a&gt; package seems to work well, based on the &lt;a href=&quot;https://focus-trap.github.io/focus-trap/&quot;&gt;demo&lt;/a&gt;, although I haven&#39;t personally tested it.&lt;/p&gt;
&lt;p&gt;If you use Vue, Svelte, Solid, or another library, search for &amp;quot;&amp;lt;Library&amp;gt; Focus Trap&amp;quot; to find available options.&lt;/p&gt;
&lt;h2 id=&quot;accessibility-testing-and-validation&quot; tabindex=&quot;-1&quot;&gt;Accessibility Testing and Validation &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keyboard Testing&lt;/strong&gt;: Manually test the focus trap using only keyboard navigation. It&#39;s also a good idea to ask others to do the same.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screen Reader Testing&lt;/strong&gt;: Test the focus trap with a screen reader, such as &lt;a href=&quot;https://www.nvaccess.org/download/&quot;&gt;NVDA (NonVisual Desktop Access)&lt;/a&gt; or &lt;a href=&quot;https://www.a11yproject.com/posts/getting-started-with-voiceover/&quot;&gt;VoiceOver&lt;/a&gt;. Use the screen reader to navigate through the focus trap and verify proper announcements and navigation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility Inspection Tools&lt;/strong&gt;: Use browser developer tools or dedicated accessibility inspection tools, such as &lt;a href=&quot;https://www.deque.com/axe/devtools/&quot;&gt;Axe&lt;/a&gt;, to analyze the focus trap implementation for accessibility issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Testing&lt;/strong&gt;: Conduct user testing with individuals who rely on assistive technologies or keyboard navigation. Gather feedback from users with disabilities to identify usability issues or barriers encountered while interacting with the focus trap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Official Guidelines&lt;/strong&gt;: Ensure compliance with web accessibility standards, such as WCAG &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/no-keyboard-trap.html&quot;&gt;&amp;quot;No Keyboard Trap&amp;quot;&lt;/a&gt;, which is Level A, meaning it is the minimum level of accessibility compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;common-pitfalls-to-avoid&quot; tabindex=&quot;-1&quot;&gt;Common pitfalls to avoid &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Inadequate keyboard navigation&lt;/li&gt;
&lt;li&gt;Lack of visual focus indicators&lt;/li&gt;
&lt;li&gt;Unintuitive focus order&lt;/li&gt;
&lt;li&gt;Unclear exit mechanisms&lt;/li&gt;
&lt;li&gt;Ignoring screen reader compatibility&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;real-world-examples&quot; tabindex=&quot;-1&quot;&gt;Real-world examples &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next time you navigate a website, try navigating using only the keyboard. Usually, &lt;code&gt;Tab&lt;/code&gt; selects the next focusable element, &lt;code&gt;Shift + Tab&lt;/code&gt; the previous one, &lt;code&gt;Enter&lt;/code&gt; or &lt;code&gt;Space&lt;/code&gt; trigger the element, and &lt;code&gt;Escape&lt;/code&gt; exits a focus trap.&lt;/p&gt;
&lt;p&gt;In well-known sites, it will probably work mostly fine, but it shouldn&#39;t be too hard to find sites that lack visual indication of focusable elements or even focus traps.&lt;/p&gt;
&lt;p&gt;If you are looking for a benchmark, a site I think does an amazing job is &lt;a href=&quot;https://airbnb.com/&quot;&gt;Airbnb&lt;/a&gt;. Try navigating keyboard-only, and you will see what I mean.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/accessibility-implementing-focus-traps/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In conclusion, focus traps are critical to ensure accessible web design, particularly for keyboard users and individuals with disabilities. Implementing focus traps requires careful consideration of design principles, keyboard navigation, and compatibility with assistive technologies. Next time you design or develop a component, remember to think about keyboard interactivity and consider implementing a focus trap where appropriate.&lt;/p&gt;
&lt;p&gt;To dive deeper into web accessibility, here are some great resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.a11yproject.com/&quot;&gt;The A11y Project&lt;/a&gt;: A community-driven resource that offers articles, guides, and tools to help developers create accessible web experiences.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/WCAG22/&quot;&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;: The official guidelines published by the World Wide Web Consortium (W3C) listing the requirements for accessible web content.&lt;/li&gt;
&lt;/ul&gt;
</content>
		</entry>
		<entry>
			<title>FAQ for lockfiles</title>
			<link href="https://okenlabs.com/blog/faq-for-lockfiles/" />
			<updated>2024-03-05T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/faq-for-lockfiles/</id>
			<content type="html">&lt;p&gt;Working with JavaScript/TypeScript often involves dealing with lockfiles such as &lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;yarn.lock&lt;/code&gt;, or &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This FAQ draws from my experience working primarily with &lt;code&gt;npm&lt;/code&gt;-based projects. While I&#39;m not an expert, I&#39;ve gathered some insights over the years.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-lockfile-for&quot; tabindex=&quot;-1&quot;&gt;What is a lockfile for? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A lockfile &lt;strong&gt;precisely controls and records the versions of packages and their dependencies&lt;/strong&gt; in a project. This guarantees consistency and reproducibility across different installations and environments, preventing discrepancies in dependency versions across local development setups and cloud environments.&lt;/p&gt;
&lt;h2 id=&quot;should-i-commit-the-lockfile&quot; tabindex=&quot;-1&quot;&gt;Should I commit the lockfile? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Yes&lt;/strong&gt;, committing the lockfile is important. It ensures every installation results in the same &lt;code&gt;node_modules&lt;/code&gt; structure, facilitating consistent builds and mitigating &lt;em&gt;&amp;quot;works on my machine&amp;quot;&lt;/em&gt; issues. Committing the lockfile also speeds up &lt;code&gt;npm install&lt;/code&gt;, allows for easier review of dependency changes, and assists in identifying insecure dependencies through &lt;code&gt;npm audit&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-can-package-lock-json-change-without-modifications-to-package-json&quot; tabindex=&quot;-1&quot;&gt;Why can &lt;code&gt;package-lock.json&lt;/code&gt; change without modifications to &lt;code&gt;package.json&lt;/code&gt;? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Running &lt;code&gt;npm install&lt;/code&gt; may update some dependencies within the version ranges specified in &lt;code&gt;package.json&lt;/code&gt;, reflected in changes to &lt;code&gt;package-lock.json&lt;/code&gt;. To better understand this, it&#39;s important to know about &lt;a href=&quot;https://docs.npmjs.com/about-semantic-versioning&quot;&gt;semantic versioning&lt;/a&gt; and how &lt;code&gt;package.json&lt;/code&gt; interprets version ranges.&lt;/p&gt;
&lt;h2 id=&quot;how-does-the-package-manager-update-the-dependencies-based-on-my-package-json&quot; tabindex=&quot;-1&quot;&gt;How does the package manager update the dependencies based on my &lt;code&gt;package.json&lt;/code&gt;? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you ever wondered what the &lt;code&gt;ˆ&lt;/code&gt; or &lt;code&gt;~&lt;/code&gt; before a version means - as my younger self once did - it dictates how updates to dependencies are handled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Patch releases: &lt;code&gt;1.0&lt;/code&gt; or &lt;code&gt;1.0.x&lt;/code&gt; or &lt;code&gt;~1.0.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Minor releases: &lt;code&gt;1&lt;/code&gt; or &lt;code&gt;1.x&lt;/code&gt; or &lt;code&gt;^1.0.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Major releases: &lt;code&gt;*&lt;/code&gt; or &lt;code&gt;x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A simple example would be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You have in the &lt;code&gt;package.json&lt;/code&gt; dependencies &lt;code&gt;&amp;quot;some-lib&amp;quot;: &amp;quot;~1.0.1&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A new patch version of &lt;code&gt;some-lib&lt;/code&gt; is published; now versions &lt;code&gt;1.0.0&lt;/code&gt;, &lt;code&gt;1.0.1&lt;/code&gt;, and &lt;code&gt;1.0.2&lt;/code&gt; are available on &lt;code&gt;npm&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You run &lt;code&gt;npm install&lt;/code&gt;, and in the dependency resolution, it is possible to update to &lt;code&gt;1.0.2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;some-lib&lt;/code&gt; at version &lt;code&gt;1.0.2&lt;/code&gt; will be installed in &lt;code&gt;node_modules&lt;/code&gt;, and the lockfile will be updated accordingly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Using &lt;a href=&quot;https://semver.npmjs.com/&quot;&gt;npm&#39;s SemVer Calculator&lt;/a&gt; can help visualize which versions of a package are allowed under different version ranges.&lt;/p&gt;
&lt;h2 id=&quot;what-does-a-change-in-lockfileversion-indicate&quot; tabindex=&quot;-1&quot;&gt;What does a change in &lt;code&gt;lockfileVersion&lt;/code&gt; indicate? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A change in &lt;code&gt;lockfileVersion&lt;/code&gt; typically occurs when &lt;code&gt;npm install&lt;/code&gt; is executed with a different version of npm, reflecting changes in how dependencies are resolved or structured in the lockfile. Refer to the npm documentation for more on &lt;a href=&quot;https://docs.npmjs.com/cli/v10/configuring-npm/package-lock-json#lockfileversion&quot;&gt;lockfileVersion&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-can-i-ensure-my-ci-build-has-consistent-dependencies&quot; tabindex=&quot;-1&quot;&gt;How can I ensure my CI build has consistent dependencies? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To guarantee dependency consistency in CI environments, use the following installation commands that respect the lockfile:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the correct versions of Node and npm for your project.&lt;/li&gt;
&lt;li&gt;Use one of the following installation commands that respect the lockfile:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# npm&lt;/span&gt;
npm ci

&lt;span class=&quot;token comment&quot;&gt;# yarn&lt;/span&gt;
yarn &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;frozen&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;lockfile

&lt;span class=&quot;token comment&quot;&gt;# pnpm&lt;/span&gt;
pnpm install &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;frozen&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;lockfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will ensure the build is using the lockfile, and the dependencies should be consistent.&lt;/p&gt;
&lt;h2 id=&quot;if-your-question-isn-t-listed&quot; tabindex=&quot;-1&quot;&gt;If your question isn&#39;t listed &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Consult the official documentation for more in-depth guidance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/&quot;&gt;npm documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://classic.yarnpkg.com/lang/en/docs/&quot;&gt;yarn documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pnpm.io/motivation&quot;&gt;pnpm documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also use your favorite AI tool to ask about it, but always cross-reference with official sources.&lt;/p&gt;
&lt;h2 id=&quot;closing-note&quot; tabindex=&quot;-1&quot;&gt;Closing Note &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/faq-for-lockfiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recently came across &lt;a href=&quot;https://jsr.io/docs/why&quot;&gt;JSR&lt;/a&gt;, a new package registry with native TypeScript support. It seems interesting, but I will have to test it myself to have an opinion.&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>Getting things done</title>
			<link href="https://okenlabs.com/blog/getting-things-done/" />
			<updated>2024-03-01T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/getting-things-done/</id>
			<content type="html">&lt;p&gt;It is day 3 of the blog! And while I do not intend to post every day, I am trying to be more consistent at writing, so I have decided I am going to write at least half an hour every weekday until it becomes a habit. I might not post on the same day, but at least I will have to think about what I am going to write and try to put something &lt;s&gt;on paper&lt;/s&gt; on git.&lt;/p&gt;
&lt;h2 id=&quot;motivation-is-not-predictable&quot; tabindex=&quot;-1&quot;&gt;Motivation is not predictable &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/getting-things-done/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today I did not feel like writing. After a full day of work, I just wanted to chill. Sit back on the couch. Play some games. Watch something on TV.&lt;/p&gt;
&lt;p&gt;I know I will not always be motivated, and there will be ups and downs. Usually, I would just not write, but I am working on my self-discipline, and I know that to become a better writer, I will have to write, even when I don&#39;t feel like it.&lt;/p&gt;
&lt;p&gt;That&#39;s how I got better at programming and became more consistent as a professional, there is no secret formula.&lt;/p&gt;
&lt;h2 id=&quot;get-things-done&quot; tabindex=&quot;-1&quot;&gt;Get things done &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/getting-things-done/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Overall, in 3 days I set up this blog online, wrote some &lt;s&gt;dubious quality&lt;/s&gt; content and got things going. I wanted to do this for some time now, and I finally started. A lot of factors are involved in me starting this, but I want to highlight two resources that really helped me:&lt;/p&gt;
&lt;h3 id=&quot;the-get-things-done-book&quot; tabindex=&quot;-1&quot;&gt;The Get Things Done Book &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/getting-things-done/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.google.com/search?q=the+get+things+done+book&amp;amp;oq=the+get+things+done+book&quot;&gt;The Get Things Done Book: 41 tools to start, stick with, and finish things&lt;/a&gt;, by Mikael Krogerus and Roman Tschäppeler, is a packed book with quick reading chapters each presenting a technique or concept to help with productivity. I have been trying some techniques, and here I am, writing about it.&lt;/p&gt;
&lt;h3 id=&quot;the-atoms-app&quot; tabindex=&quot;-1&quot;&gt;The Atoms. app &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/getting-things-done/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://atoms.jamesclear.com/&quot;&gt;Atoms. The official Atomic Habits app&lt;/a&gt;, based on the Atomic Habits book by James Clear, aims to help build good habits and break bad ones.&lt;/p&gt;
&lt;p&gt;I got to admit I have not read the book yet, just read about the concept of it, and now that I am using the app, it is definitely on my reading list.&lt;/p&gt;
&lt;p&gt;The app guides you into creating some achievable habits, defining when to be reminded of them. Also, it delivers daily lessons based on the book which are great!&lt;/p&gt;
&lt;p&gt;What I enjoyed the most is a detail of the user experience: instead of simply &amp;quot;clicking a button&amp;quot; to complete a habit, you have to hold it for a while, receiving some visual and haptic feedback. Once the interaction goes off, there is an animation and a quick tracking view. It feels way more rewarding than simply clicking or touching a button. Anyway, to get the full experience you should &lt;a href=&quot;https://atoms.jamesclear.com/&quot;&gt;try it yourself&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick disclaimer:&lt;/strong&gt; I am not sponsored or anything, I am sharing resources that I genuinely enjoy, and I am not one so easy to please.&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>Leap of faith</title>
			<link href="https://okenlabs.com/blog/leap-of-faith/" />
			<updated>2024-02-29T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/leap-of-faith/</id>
			<content type="html">&lt;p&gt;&lt;em&gt;So, I decided not just to write content but also to write more code.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;get-things-going&quot; tabindex=&quot;-1&quot;&gt;Get things going &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/leap-of-faith/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I decided to start blogging in 2024, but in a way similar to the early days of the web. Instead of going for a larger and consolidated platform, such as &lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt; or &lt;a href=&quot;https://substack.com/&quot;&gt;Substack&lt;/a&gt;, I wanted to make a website where I would have full control over all content, including its code.&lt;/p&gt;
&lt;p&gt;While using a blogging platform would facilitate a lot of features, there is something incredibly fulfilling about making it &amp;quot;from scratch&amp;quot; &lt;em&gt;(I am using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt; and a &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;template&lt;/a&gt;, more on that in the next section)&lt;/em&gt;. I am taking a leap of faith that this will be a scalable and always performant, future-proof blog.&lt;/p&gt;
&lt;p&gt;For my future self and anyone interested, I am logging here a screenshot of the current look and feel of this blog, because it will change very soon.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://okenlabs.com/img/a3nQUCePCw-600.avif 600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://okenlabs.com/img/a3nQUCePCw-600.webp 600w&quot;&gt;&lt;img alt=&quot;Oken Labs site screenshot taken on 29 February 2024&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://okenlabs.com/img/a3nQUCePCw-600.png&quot; width=&quot;600&quot; height=&quot;348&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;build-your-own-blog&quot; tabindex=&quot;-1&quot;&gt;Build your own blog &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/leap-of-faith/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to start your own blog and own the code, I definitely recommend checking the official &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;eleventy-base-blog&lt;/a&gt; template on GitHub.&lt;/p&gt;
&lt;p&gt;I was originally going to start from scratch, without a template, just a basic &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt; setup to generate static web content. However, there are a lot of useful features that the template brings out of the box; you can &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog#features&quot;&gt;check all of them here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, thanks to all &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt; contributors for the amazing tooling.&lt;/p&gt;
</content>
		</entry>
		<entry>
			<title>First things first</title>
			<link href="https://okenlabs.com/blog/hello-world/" />
			<updated>2024-02-28T00:00:00Z</updated>
			<id>https://okenlabs.com/blog/hello-world/</id>
			<content type="html">&lt;p&gt;I have been thinking about starting to write for a while now, probably for some years, but eventually, I would find some reason not to. After 2023 and watching the way artificial intelligence is changing the world, I finally decided to start.&lt;/p&gt;
&lt;p&gt;Since from now on we are going to have more and more AI-generated content, I might as well feed the data with my own perspective on things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I may not be a good writer &lt;em&gt;(yet!)&lt;/em&gt;, but we all have to start from somewhere, right? Also, English is not my native language. I chose it to practice. In this first post, I am going to log a quick intro about myself and whatever I want Oken Labs to be.&lt;/p&gt;
&lt;h2 id=&quot;a-little-about-myself&quot; tabindex=&quot;-1&quot;&gt;A little about myself &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/hello-world/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most people I know call me Seiji (pronounced &lt;code&gt;say-g&lt;/code&gt;). I am from Brazil and I am a millennial working in the tech industry for the past 10 years, having worked as a product designer and software engineer for various markets.&lt;/p&gt;
&lt;p&gt;Hopefully, some of the content I share will help other people &lt;s&gt;or AI&lt;/s&gt; to build better code, designs, and products.&lt;/p&gt;
&lt;h2 id=&quot;what-is-oken-labs&quot; tabindex=&quot;-1&quot;&gt;What is Oken Labs? &lt;a class=&quot;header-anchor&quot; href=&quot;https://okenlabs.com/blog/hello-world/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Honestly, I wanted a GitHub organization to work on some side projects, so I would not use my personal account. I then created &lt;a href=&quot;https://github.com/oken-labs&quot;&gt;oken-labs&lt;/a&gt;. That is how it started. The current idea is to post articles, tutorials, and some non-related writings (like this one). Once I have some side projects ready, they will be listed here too.&lt;/p&gt;
&lt;p&gt;To whoever reads this, I wish you a great year ahead!&lt;/p&gt;
</content>
		</entry></feed>
