<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Miko</title>
    <description>The latest articles on Forem by Miko (@ademagic).</description>
    <link>https://forem.com/ademagic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1144915%2F67b344b6-80e8-4c94-bf68-6257081c02c4.png</url>
      <title>Forem: Miko</title>
      <link>https://forem.com/ademagic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ademagic"/>
    <language>en</language>
    <item>
      <title>I read: The Shortest, Strangest Engineering Interview I've Ever Done</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Mon, 28 Oct 2024 00:21:07 +0000</pubDate>
      <link>https://forem.com/ademagic/i-read-the-shortest-strangest-engineering-interview-ive-ever-done-5bki</link>
      <guid>https://forem.com/ademagic/i-read-the-shortest-strangest-engineering-interview-ive-ever-done-5bki</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post was originally written for my blog at &lt;a href="https://miko.ademagic.com/blog/i-read-the-strangest-interview/" rel="noopener noreferrer"&gt;miko.ademagic.com/blog/i-read-the-strangest-interview&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I read &lt;a href="https://bluepnume.medium.com/the-shortest-strangest-engineering-interview-ive-ever-done-950e8fa95f4e" rel="noopener noreferrer"&gt;The Shortest, Strangest Engineering Interview I've Ever Done&lt;/a&gt;, a blogpost by &lt;a href="https://x.com/bluepnume" rel="noopener noreferrer"&gt;Daniel Brain a.k.a. @bluepnume&lt;/a&gt; – what I would have called "The most productive interview" he'd ever done.&lt;/p&gt;

&lt;p&gt;I thought it was so good that I had to write to him to tell him, something I typically don't do. He had me hooked through the entire read, and I left it feeling satisfied for both parties involved, even though it seems the writer didn't. I &lt;em&gt;also&lt;/em&gt; felt compelled to write my thoughts down for the blog, something I am hoping to do more of.&lt;/p&gt;

&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Daniel puts out a job, uses reasonable hiring practices that have worked for him for years.&lt;/li&gt;
&lt;li&gt;A funny response hooks him, and the Candidate actually looks really good. Gets an interview.&lt;/li&gt;
&lt;li&gt;Chat starts off well. Candidate asks some clarifying questions and doesn't like the answers. Interview is cut short, despite Dan trying to save it.&lt;/li&gt;
&lt;li&gt;Further exchanges occur, but they're all strangely hostile.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I think 2 bullets were dodged here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bullet 1: A short interview is a good interview.
&lt;/h2&gt;

&lt;p&gt;At the beginning of interviews, I like to tell candidates something like "I blocked out (an hour) of your time to be safe, but it should only take about (45 minutes), maybe even less if we get to the answers we're after". Sometimes, interviews can feel like a dragged out interrogation where someone tries to poke holes in your experience and intelligence until one of you breaks.&lt;/p&gt;

&lt;p&gt;I like to run interviews as two-way, and both parties should know where they sit as the conversation unfolds. My goal is to get to answers as quickly as possible for both of us. If I need more info, I'll dig further. If you don't have it, I want you to feel comfortable enough to tell me.&lt;/p&gt;

&lt;p&gt;This can be challenging as the power dynamic is usually in favour of the Interviewer, especially with all the redundancies in the tech sector over the past few years. But in Dan's case, it didn't seem to be an issue for the Candidate. As Dan points out, they could have been burned by long interview processes where it was the case, or they could just not be desperate for this job.&lt;/p&gt;

&lt;p&gt;In any case, the Candidate did an awesome thing. They asked about the process, determined it did not suit them, and declined further consideration for the role. Everyone saves time and energy. Dan did what any professional in the situation would do by trying to find a compromise, but the Candidate already had their mind made up. &lt;/p&gt;

&lt;p&gt;They saved themselves a lot of effort for a role that they felt they would end up not aligning with. They could have stopped at any other point along the hiring process, but they made a key assessment at the beginning and decided progressing was not worth it. Beautiful. Everyone should feel good about this. Everyone dodges a bullet.&lt;/p&gt;

&lt;p&gt;It should have ended here. But then...&lt;/p&gt;

&lt;h2&gt;
  
  
  Bullet 2: Avoid &lt;del&gt;brilliant&lt;/del&gt; jerks.
&lt;/h2&gt;

&lt;p&gt;For some reason, the Candidate decides to respond soon after to confirm the end of the exchange. They do so unprofessionally and sometimes even offensively, personally targeting Dan with insults.&lt;/p&gt;

&lt;p&gt;I don't know what the motivation is for this kind of response. Based on what Dan wrote, it felt so clean-cut – even if they didn't, everyone should have felt closure. A confirmation is a nice paper trail, but further interaction, especially not constructive, is totally unnecessary.&lt;/p&gt;

&lt;p&gt;As a hiring manager, I'd be thankful this person didn't continue with the process. If they managed to land the role on technical ability alone, they would be difficult to keep happy, and even more difficult if unhappy. This kind of attitude would no doubt bring down the rest of the team, compounding the issue. But I bet it'd be tiring for the candidate, too. &lt;/p&gt;

&lt;p&gt;So, another bullet dodged.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should have gone differently?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;As the Hiring Mananger&lt;/strong&gt;, in this case Dan, I would have been satisfied with the end of the phonecall as the end of the conversation. Its obvious the candidate did not want to progress, and it sounds like Dan agreed. But then the next email came, and Dan took the bait. Its a waste of energy, and it should just have been "thankyou, next". I'm glad this blogpost came out of it though.&lt;/p&gt;

&lt;p&gt;I would also take away from this that candidates (at least one) find it valuable to know what the interview process is. I typically outline the interview structure &lt;em&gt;before&lt;/em&gt; the first interaction, and will also ask for it if I'm the candidate. Recruiters will usually ask for this, too. If you've considered the structure of your interview process, and you can justify the value, then why not share it in advance? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As the Candidate&lt;/strong&gt;, I would not have written the follow up email if I couldn't do it in a professional manner. They obviously felt a need to respond in such a way, almost like they were on the defense. Or on a power-trip?&lt;br&gt;
Maybe the conversation felt different to the discussion Dan describes, but regardless, the relationship ended with the phonecall. There was no need to burn a bridge, despite the short-term satisfaction it may have brought. &lt;/p&gt;

&lt;h2&gt;
  
  
  Finally...
&lt;/h2&gt;

&lt;p&gt;Dan ends the post with a question. "What the fuck did I do?". The answer: spent far more energy on this than he should have. Hope he got a good hire in the end, and if you do read this, thanks again for the lesson :)&lt;/p&gt;

</description>
      <category>career</category>
      <category>learning</category>
      <category>interview</category>
    </item>
    <item>
      <title>Now now now, now.</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Mon, 08 Jul 2024 05:16:34 +0000</pubDate>
      <link>https://forem.com/ademagic/now-now-now-now-1jp4</link>
      <guid>https://forem.com/ademagic/now-now-now-now-1jp4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post was originally written for my website at &lt;a href="https://miko.ademagic.com/blog/now" rel="noopener noreferrer"&gt;miko.ademagic.com/blog/now&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've been interested in the Indie Web as a new (old?) way to connect with a community on the Internet without an algorith holding my hand (amongst other reasons, but that's for another post). One of the things I found a lot of people setting up was a &lt;a href="https://nownownow.com/" rel="noopener noreferrer"&gt;Now Page&lt;/a&gt;. I liked the idea, so I &lt;a href="https://miko.ademagic.com/now" rel="noopener noreferrer"&gt;made my own&lt;/a&gt; a while back. If you have a personal website, I think you should too.&lt;/p&gt;

&lt;h2&gt;
  
  
  A what now?
&lt;/h2&gt;

&lt;p&gt;Yes. It's a page you put on your site with short-form, frequent(ish) updates similar to what you'd put on a post microblog. Read the &lt;a href="https://nownownow.com/about" rel="noopener noreferrer"&gt;about&lt;/a&gt; page, it explains it a lot better than I could.&lt;/p&gt;

&lt;p&gt;You let &lt;a href="https://sive.rs" rel="noopener noreferrer"&gt;Derek Sivers&lt;/a&gt; know you have one, and he puts it into a directory, and people find you (or you find people). No recommendations, no promoted listings, no ranking, no preference or order – all just based on location and a bit of random ordering. It's beautiful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why's that good?
&lt;/h2&gt;

&lt;p&gt;Total creative freedom over what you want to build. No standards or structure to feed an algorithm. Share as much (or as little) as you want. Have it indexed, it's up to you. Then find like-minded people, see what they're doing, and learn from them. Or, don't make one and just browse! Pure old school Internet.&lt;/p&gt;

&lt;p&gt;Since creating mine, I've already connected with others who have one. I've even made improvements to it and got inspiration for more.&lt;/p&gt;

&lt;p&gt;I've had to make changes to my Now page a few times before, or have had questions about it, and all I've had to do is email Derek. He's responded like he was sitting next to me and I tapped him on the shoulder. Quick, straightforward, personable, and even constructive. This doesn't feel like it's a labor of love for him (though it might be, sorry Derek) – it all just seems &lt;em&gt;natural&lt;/em&gt;. No revenue, no passion or ego behind this... he just seems to do this because this is what &lt;em&gt;should be done&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;But also, when's the last time you felt that the results you got from a search were totally unbiased? Not dependent on outside factors, like what's selling well, who's paying for engagement, or what people like you have viewed before? At the very least, there is a refreshing purity to this network that I haven't seen in a while and I want to get behind it.&lt;/p&gt;

&lt;p&gt;But most of all, it's just fun. Get a now page, and let me know you have one!&lt;/p&gt;

</description>
      <category>indieweb</category>
      <category>webdev</category>
      <category>website</category>
    </item>
    <item>
      <title>Dungeon Mode</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Mon, 04 Mar 2024 04:00:29 +0000</pubDate>
      <link>https://forem.com/ademagic/dungeon-mode-2mc4</link>
      <guid>https://forem.com/ademagic/dungeon-mode-2mc4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This blogpost was originally posted on my personal site at &lt;a href="https://miko.ademagic.com/blog/dungeon-mode/" rel="noopener noreferrer"&gt;https://miko.ademagic.com/blog/dungeon-mode/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hollywood loves to push the cliché. If you're any kind of developer, you've probably spent some time sharpening your coding blades in your Mum's basement illuminated only by RGBs, surrounded by screens dripping matrix-esque code, furiously typing away on a clicky keyboard pumping techno/drum&amp;amp;bass. Hell, you're probably hacking some sort of mainframe right &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It's tired, and we all know it's incredibly wrong. But what if &lt;em&gt;there's something to it?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What are you on about?
&lt;/h2&gt;

&lt;p&gt;I was reading &lt;a href="https://dev.to/lexingdailylife/how-to-stop-procrastinating-and-do-hard-things-4a6e"&gt;a post on dev.to&lt;/a&gt; about procrastination and productivity. It got me thinking about my own methods of trying to stay productive and focused, which also made me think about all the various tools and methodologies people adopt to do the same. I'm a big fan of simplicity, and reflected on my own simple toolkit - paper, pen, a stopwatch and a simple (and very flexible) methodology. There's only one thing I've ever done to abstract my process, and it's made it &lt;em&gt;strangely more effective&lt;/em&gt;. And I did it by accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dungeon Mode
&lt;/h2&gt;

&lt;p&gt;Around Covid I resigned from my people-focused role at a mid/large team and joined a startup to become an IC. This required me to be "100% on the tools", which I welcomed. I strapped in for long days and nights of learning, coding, and intense focus. I took advantage of the lockdown, retreated to my study, and got to work.&lt;/p&gt;

&lt;p&gt;I like to work with music on, and discovering &lt;a href="https://www.youtube.com/watch?v=jfKfPfyJRdk&amp;amp;ab_channel=LofiGirl" rel="noopener noreferrer"&gt;ChilledCow's Lofi Girl radio&lt;/a&gt; was an excellent source of non-invasive "ambient music" that I could listen to for hours. I found the almost whitenoise-like record-player crackling of LoFi music was more pleasant than active noise cancelling on my headphones.&lt;/p&gt;

&lt;p&gt;I also had some health issues, and would frequently experience migraines that brought on photosensitivity. It wasn't enough to use Dark Mode on my OS, or turn down my screen brightness. I had a warm grey wall in front of me which would reflect the lights overhead, straining my eyes. I found it best to dull the monitors, and then turn off all the lights to work. To make sure I didn't have to adjust too much, I had some warm white LEDs under my desk as ambient lighting.&lt;/p&gt;

&lt;p&gt;Winter in a poorly insulated apartment also meant it was usually cold and I was quite rugged up, often wearing a hoodie. Wearing the hood over my head not only kept me warm, but felt like a set of comfortable blinders that further blocked any light in my periphery from annoying my eyes.&lt;/p&gt;

&lt;p&gt;After a while I found myself employing all of the above as soon as I got to my study. I'm not sure whether this came first, or if it was overhearing my partner speaking on the phone to our family and friends and telling them that I was off in my "Dungeon", but my new habit soon got its name. Dungeon mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Productivity Hack, Though?
&lt;/h2&gt;

&lt;p&gt;I would start telling my partner I'm off to "Dungeon Mode". She knew that meant that I had headphones on and likely couldn't hear her talking to me, and that I was trying to focus and would try not to leave the room for a while. It worked really well. Less stimuli meant I wasn't checking my phone, losing my train of thought, or even &lt;em&gt;looking around the room&lt;/em&gt;. I'd also find it easier to enter &lt;em&gt;flow state&lt;/em&gt;, and I'd even need to be reminded to take breaks or about other tasks I have for the day.&lt;/p&gt;

&lt;p&gt;It's definitely not maintainable for long periods of time. It's probably not great for your health, likely not ergonomic, doesn't look good on zoom calls – generally, it may not even be good for any other role. &lt;em&gt;So does the trope have it right, then?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;If your job is to look at screen all day and translate complex and convoluted logic into scripts only your computer has to understand, is this sort of sensory deprivation something that will magically help you stay focused for long periods of time? Or will it work for other jobs, too? Or am I just an outlier who became motivated, feeling like some hacker from a movie he enjoyed?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sequel
&lt;/h2&gt;

&lt;p&gt;Today, my study is an open nook of my living room. It's sunny and lit, it has a lot of plants around, a window I can open to let the breeze in, and no way to close myself off from the world. When she's home, my 2yo will run over periodically and demand my attention with great urgency. It generally feels like a healthier work environment. But I look back on Dungeon Mode fondly, and sometimes wonder if needed, could I replicate it?&lt;/p&gt;

&lt;p&gt;Do you work like this? Does it sound like it would help you be better? If any of this experience resonates with you, or even if you disagree, I'd love to know. I'm borderline embarrassed about it, but I can't be the only one who has connected to the stereotype like this. Tell me your story.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>workplace</category>
      <category>webdev</category>
    </item>
    <item>
      <title>On Daily.Dev</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Thu, 01 Feb 2024 03:52:05 +0000</pubDate>
      <link>https://forem.com/ademagic/on-dailydev-1pnc</link>
      <guid>https://forem.com/ademagic/on-dailydev-1pnc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post was originally written for my personal website at &lt;a href="https://miko.ademagic.com/blog/on-daily-dev/" rel="noopener noreferrer"&gt;miko.ademagic.com/blog/on-daily-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Where Developers Suffer Together
&lt;/h2&gt;

&lt;p&gt;Part of the challenge of being a web developer (and my job as a manager) is to find ways to keep up to date with this ever-moving industry, its standards, and the available tools. I'm always on the lookout for good methods to do that.&lt;/p&gt;

&lt;p&gt;Recently I came across &lt;a href="https://daily.dev" rel="noopener noreferrer"&gt;daily.dev&lt;/a&gt;, a slick looking app that promises to help you stay in the loop, as the place "Where developers suffer together". So I signed up and invited my team as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it
&lt;/h2&gt;

&lt;p&gt;In short, it's a personalised news feed geared towards tech and the web in particular. It takes news from the RSS feeds of various well-known publications or developer blogging platforms, and presents them to you according to the topics you've said you're interested in.&lt;/p&gt;

&lt;p&gt;Sure, personalised news feeds are nothing new and if you have an RSS feed you've probably got some sort of reader/aggregator doing what you like. Daily.dev sets themselves apart (in my opinion) by sprinkling in a bit of gamification for habit forming, and social features so you can learn with friends.&lt;/p&gt;

&lt;p&gt;Their main feature seems to be a browser extension, but I've been getting by fine with the web app alone. I will try the extension soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I like about it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dev Cards
&lt;/h3&gt;

&lt;p&gt;I'm a big fan of gamification in UX, especially the "achievement" mechanics that games have popularised. &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt; got me to sign up with &lt;a href="https://dev.to/badges"&gt;badges&lt;/a&gt;, and so naturally I signed up as soon as I discovered the &lt;a href="https://docs.daily.dev/docs/your-profile/weekly-goal" rel="noopener noreferrer"&gt;Weekly Goal Badge&lt;/a&gt;. It was a great hook to bring me back almost daily, and I'm bummed I've been de-ranked and I'll definitely be reading more this week.&lt;/p&gt;

&lt;p&gt;You can flex your weekly goal badge with your &lt;a href="https://docs.daily.dev/docs/your-profile/devcard" rel="noopener noreferrer"&gt;Dev Card&lt;/a&gt;, which is a slick looking, license-like ID card they generate for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.daily.dev/ademagic" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujazj1cnk6ay61jjd23k.png" alt="Miko's Dev Card" width="800" height="1092"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They even have a series of instructions on how to embed it, and even &lt;a href="https://daily.dev/blog/adding-the-daily-devcard-to-your-github-profile" rel="noopener noreferrer"&gt;how to add it to your Github Profile&lt;/a&gt; and &lt;a href="https://github.com/marketplace/actions/dailydotdev-devcard" rel="noopener noreferrer"&gt;keep it up to date with a Github Action&lt;/a&gt;. Such a well-executed feature, looking forward to what else they'll do with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Squads
&lt;/h3&gt;

&lt;p&gt;You can invite your friends and create a "Squad" together, which gives you a common board where you can write posts and share links of things you read. Its a great way to give each other reading lists and share resources about a topic common to you, or a challenge you're facing together. You also get to find out about things that interest your squad mates which is a great way to foster diversity of thought.&lt;/p&gt;

&lt;p&gt;I created a squad for my workmates just to try it out. So far they aren't as hooked as I am but we've shared and spoken about a couple articles. Usually this would be something that happens over slack or another platform, but having this presents it in a much more consumable way.&lt;/p&gt;

&lt;h3&gt;
  
  
  TLDRs
&lt;/h3&gt;

&lt;p&gt;It's actually strange how useful I find this but how little I use it. I'm not used to articles being effectively summarised for me, but interacting with something in your reading list provides a small synopsis to help you decide whether you'd like to read further. I'm so not used to it that I forget it exists.&lt;/p&gt;

&lt;p&gt;It really helps with clickbaity content, or sensationalist youtube videos with misleading titles. Sure I gotta click the card to read the TLDR, but at least that's where I stop.&lt;/p&gt;

&lt;p&gt;I'm skeptical of products like these content feed providers since I always suspect some kind of prioritisation/favoritism. This synopsis feature (which could also be biased i suppose) helps by offering transparency before you "convert". I think it's great.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I don't like
&lt;/h2&gt;

&lt;p&gt;There's not much, but here's a summary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Feed duplicates&lt;/strong&gt;, sometimes showing me the same card I saw earlier in my scroll. I suspect this is to make it seem like an endless feed, but I've observed it happening a bit too early. Granted it may be due to the amount of topics I've selected, but I would have appreciated a "You've seen all the new stuff! &lt;em&gt;Browse more topics&lt;/em&gt; or &lt;em&gt;See results again&lt;/em&gt;" interface at the end of my feed moreso than an infinite scroll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sometimes my dev card is wrong&lt;/strong&gt;, or at least it is right now. I've only ever seen one youtube video of t3.gg in my feed (and am fairly certain I have downvoted), but somehow it's wound up in my favourites on my dev card. Which not only makes me question the algo, but also raises the question of how this made it into the feed anyway? Where do you draw the line between a personal blog and an influencer/creator's youtube channel being a "well known publication"? Follower count? I digress...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ads are not obvious enough&lt;/strong&gt;. Sure they're not the guiltiest, and you gotta make money somehow. Daily.dev has just done a few things that have impressed me, so putting an ad into a feed that looks close to a regular article gets me a little peeved. I would have liked if the card received a different colour treatment so I can ignore that design; the variation they have is &lt;em&gt;just&lt;/em&gt; different enough to stay similar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it's going
&lt;/h2&gt;

&lt;p&gt;It's been about 2 weeks since we joined Daily.dev as a squad. I'm the one mostly using this but have heard positive feedback from other team members, despite their read counts not being as active as mine :) We'll persist with using it since it's not a demanding part of our daily flow, and I'm interested to review this in about a month or two. But so far it's been a positive experience and I'm interested to see how this app grows.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>softwaredevelopment</category>
      <category>community</category>
    </item>
    <item>
      <title>Migrating to Astro's Collections</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Mon, 29 Jan 2024 23:46:41 +0000</pubDate>
      <link>https://forem.com/ademagic/migrating-to-astros-collections-56k8</link>
      <guid>https://forem.com/ademagic/migrating-to-astros-collections-56k8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post was originally written on my personal website at &lt;a href="https://miko.ademagic.com/blog/migrating-to-collections/" rel="noopener noreferrer"&gt;miko.ademagic.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m trying very hard to keep up with Astro’s upgrades, but they move through majors faster than any platform I’ve used before. One of the new features they introduced as part of v3 was Content Collections. This blogpost outlines my experience of migrating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why upgrade
&lt;/h2&gt;

&lt;p&gt;I have worked in web long enough to understand the potential pain of falling behind in dependency upgrades. As much as possible, I try to stay up to date with every project I work on but with personal projects in particular.&lt;/p&gt;

&lt;p&gt;Astro’s active development is something I really enjoy about the platform. The new Content Collections took some time for me to wrap my head around because I prefer the simplicity of Astro’s old file structure and organisation, and it was one of the original reasons why I chose to build my website with Astro. Engaging with the community and Astro’s documentation helped me understand the power and flexibility that comes with collections, and while it unlocks a lot of complexity, it can also be adaptive and kept simple.&lt;/p&gt;

&lt;p&gt;I currently have two types of content - &lt;a href="https://miko.ademagic.com/blog/" rel="noopener noreferrer"&gt;blogs&lt;/a&gt; and &lt;a href="https://miko.ademagic.com/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt;. I could technically store any kind of data, though. Authors, favourite songs, short posts etc. Each of these can have a defined type, and I can make sure I can define them correctly and predictably. And then display them in any way I want.&lt;/p&gt;

&lt;h2&gt;
  
  
  My plan
&lt;/h2&gt;

&lt;p&gt;Migrating seemed like a lot of work due to the move from a simple file structure to JSON and typedefs. I felt I couldn’t dedicate the time required to do this all at once, and was worried that I’d never get to it if I had to leave it unfinished.&lt;/p&gt;

&lt;p&gt;I planned to migrate my Releases first. The content was predictable and simple, there wasn’t a lot of it, and I didn’t really care if it broke. I’d create a type definition for it and move my content to the new directory and file structure, then ship. Once I’d tested and confirmed all ok, I’d move on to blogposts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Creating a content collection seemed to immediately switch Astro to using its new API. Not only did all my pages using the old structure fail to build, but any reference to &lt;code&gt;Astro.glob&lt;/code&gt; now became invalid and content had to be retrieved from the new &lt;code&gt;getCollections()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;It meant I had to go through and reactively bugfix rather than proactively make changes to my site as per my plan. In the end, this did not take as much time as I expected and I managed to resolve all errors across a couple of sessions. Astro’s error messaging, and the &lt;a href="https://marketplace.visualstudio.com/items?itemName=astro-build.astro-vscode" rel="noopener noreferrer"&gt;Astro Language Support Extension for VSCode&lt;/a&gt; was very helpful in telling me what to fix next.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it’s going
&lt;/h2&gt;

&lt;p&gt;This will be my first post since the migration, and nothing seems to have gone wrong. My old pages and links all work, as do my redirects that handle previous iterations of my site. Sound the “Everything’s OK” alarm 🚨&lt;/p&gt;

&lt;p&gt;I am not using typedefs at the moment, and my implementation of content collections is the simplest it can be. But I look forward to flexing this function a little more as I add to my site this year.&lt;/p&gt;

&lt;p&gt;But first, Astro v4.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astro</category>
      <category>website</category>
      <category>indieweb</category>
    </item>
    <item>
      <title>Why are styles on my Astro site not working in GitHub Pages?</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Tue, 31 Oct 2023 23:25:14 +0000</pubDate>
      <link>https://forem.com/ademagic/why-are-styles-on-my-astro-site-not-working-in-github-pages-58a2</link>
      <guid>https://forem.com/ademagic/why-are-styles-on-my-astro-site-not-working-in-github-pages-58a2</guid>
      <description>&lt;p&gt;I've been hosting my website with GitHub Pages in its last three iterations, and have most recently rewritten it in Astro. When I uploaded my first static build to my repo, I noticed that the rendered output was not the same as on my local even though all the files were identical. Something was off, and my suspicion was that it was GitHub's doing. I fixed it in &lt;a href="https://miko.ademagic.com/blog/release-6-missed-it" rel="noopener noreferrer"&gt;Release 6&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Astro generates static files which start with underscores&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pages.GitHub.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt; is preconfigured to use &lt;a href="https://jekyllrb.com/" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt; as a static site generator.&lt;/li&gt;
&lt;li&gt;Jekyll considers filenames starting with underscores to be special resources and ignores them. This means they will not be served by your site.&lt;/li&gt;
&lt;li&gt;To fix this, bypass Jekyll by adding a file named &lt;code&gt;.nojekyll&lt;/code&gt; to the root of the repository for your site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source: &lt;a href="https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/" rel="noopener noreferrer"&gt;GitHub Blog - Bypassing Jekyll on GitHub Pages&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My issue
&lt;/h3&gt;

&lt;p&gt;I pushed the first production ready build of my site to my GitHub pages repo with excitement. It was a simple copy-over from the &lt;code&gt;dist&lt;/code&gt; folder to the root of my repository. Once GitHub pages deployed my site, I noticed that my blog article title was far too wide, and my Bio component in the footer had my headshot too large and the typography sizing was wrong; in other words, both components were unstyled.&lt;/p&gt;

&lt;p&gt;I dug deeper and discovered that the styles for these components lived in the blogpost's template, named &lt;code&gt;[slug].md&lt;/code&gt;. When Astro built the static files for the site it put these styles into a file named &lt;code&gt;_slug_.a3a4f792.css&lt;/code&gt;, which was then loaded on each of the blog pages.&lt;/p&gt;

&lt;p&gt;When I served the site locally, these files were loading fine. But, when I deployed my site, looking for the URL of the CSS files returned my 404 page. Other CSS files would load fine, and I could see their raw contents in the browser. But it looks like this one wasn't being served at all. Hence, unstyled components.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Astro's Dynamic Route Parameters
&lt;/h3&gt;

&lt;p&gt;Astro lets you dynamically generate multiple pages by letting you specify dynamic route parameters in your filenames. You can do this by creating a template with square brackets in the name, like &lt;code&gt;[dog].astro&lt;/code&gt;. You then tell Astro all the paths it should generate with this template by exporting a function called &lt;code&gt;getStaticPaths()&lt;/code&gt; from it, and having the function return an array of objects which tells Astro the possible values for the &lt;code&gt;[dog]&lt;/code&gt; parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getStaticPaths&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clifford&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rover&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;spot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More information in &lt;a href="https://docs.astro.build/en/core-concepts/routing/#dynamic-routes" rel="noopener noreferrer"&gt;Astro's docs on dynamic routes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If there are any extra styles in these templates, Astro will pull them out and scope them with hashed classes, and will generate a CSS file based on the template's original filename, but with the square brackets replaced by underscores. In the above example, this would look something like &lt;code&gt;_dog_.b8f7f6g5.css&lt;/code&gt;. This file would then get loaded by each instance of the generated template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jekyll's configuration
&lt;/h3&gt;

&lt;p&gt;Jekyll has been used by GitHub to serve static pages for some time now. The format for its configuration files start with underscores (e.g. &lt;code&gt;_config.yml&lt;/code&gt;). There's not much point to serving these from your static site, so Jekyll ignores them by default. Ipso facto, &lt;strong&gt;this means that Jekyll won't serve the CSS files Astro generates for templates with dynamic paths&lt;/strong&gt;. So all of those generated static pages will reference a file that isn't being hosted.&lt;/p&gt;

&lt;p&gt;There are a bunch of ways of &lt;a href="https://jekyllrb.com/docs/configuration/options/#global-configuration" rel="noopener noreferrer"&gt;telling Jekyll not to do that&lt;/a&gt;, but in this context we don't need Jekyll at all so there's no need to maintain a configuration. Instead we can easily tell GitHub Pages that we aren't using Jekyll by adding a file to the repo's root called &lt;code&gt;.nojekyll&lt;/code&gt;, and the static files will get hosted as-is. GitHub Pages does the rest.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This was originally posted on my personal website at &lt;a href="https://miko.ademagic.com/blog/astro-styles-on-github-pages/" rel="noopener noreferrer"&gt;miko.ademagic.com/blog/astro-styles-on-github-pages/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I block bots.</title>
      <dc:creator>Miko</dc:creator>
      <pubDate>Wed, 13 Sep 2023 01:15:52 +0000</pubDate>
      <link>https://forem.com/ademagic/i-block-bots-4pi4</link>
      <guid>https://forem.com/ademagic/i-block-bots-4pi4</guid>
      <description>&lt;p&gt;A couple months ago, I posted &lt;a href="https://indieweb.social/@ademagic/110698140239508095" rel="noopener noreferrer"&gt;probably my second-most-popular social post&lt;/a&gt; ever, and it was reposting what I found was an insightful &lt;a href="https://adactio.com/journal/20315" rel="noopener noreferrer"&gt;blogpost by Jeremy Keith&lt;/a&gt;. The message was simple, but hit me deep.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We can rescind our invitation to Google."&lt;/p&gt;

&lt;p&gt;-- Jeremy Keith&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Part of every website go-live checklist I ever completed included integrating Google Analytics, or at the very least somehow ensuring that the site was being crawled as expected. I never actually questioned it.&lt;/p&gt;

&lt;p&gt;When I started building this site, I also looked at moving my analytics interface elsewhere. Getting another website to collect, host and display my data felt less unsavoury than Google doing it, especially because I figured Google did other things with it, in ways and at a scale that no other website could. The more I thought about it, the more intrusive it felt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;I never actually considered saying "actually don't crawl me ever" until I read Jeremy's post. I don't actually need to result on Google for my personal site &lt;em&gt;at all&lt;/em&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I'm not monetising it or selling any ad space&lt;/li&gt;
&lt;li&gt;I don't directly benefit from increased traffic&lt;/li&gt;
&lt;li&gt;I don't want to compete for high positions in results lists with paid professionals who benefit from 1. and 2.&lt;/li&gt;
&lt;li&gt;I don't care to teach Google stuff&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Upon further consideration I decided I'd rather&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get organic traffic from sources and circles I'm actively involved in (and post to)&lt;/li&gt;
&lt;li&gt;Leverage the SEO Pros of platforms that are incentivised to help me show up in search results&lt;/li&gt;
&lt;li&gt;Be selective (or at least have control of) the content I share to 1. and 2.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And so, &lt;strong&gt;I block bots&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ademagic/site/commit/cee03ba1868807bd46906bc5e82f7448cd9751ee" rel="noopener noreferrer"&gt;my commit for blocking Google's bots, apparently&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;And in case it's changed, &lt;a href="https://miko.ademagic.com/robots.txt" rel="noopener noreferrer"&gt;my robots.txt&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As many people have pointed out, &lt;a href="https://indieweb.social/@isagalaev@mastodon.social/110702761168333156" rel="noopener noreferrer"&gt;Google could just as easily ignore this&lt;/a&gt;, there are &lt;a href="https://indieweb.social/@Bju1046@mastodon.online/110702597116071796" rel="noopener noreferrer"&gt;probably more thorough ways to do this&lt;/a&gt;, and &lt;a href="https://indieweb.social/@corbin@defcon.social/110701821076049607" rel="noopener noreferrer"&gt;even (slightly) malicious ways to protest&lt;/a&gt;. I haven't gotten that far and am content with this for now. If you've got any other things I should be adding to my robots file, please reach out.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This was originally posted on my personal website at &lt;a href="https://miko.ademagic.com/blog/i-block-bots/" rel="noopener noreferrer"&gt;miko.ademagic.com/blog/i-block-bots&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>website</category>
      <category>privacy</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
