<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>pseudobun</title>
        <link>https://paragraph.com/@pseudobun</link>
        <description>r&amp;d engineer • coo @ lutra labs • blockchain lab:um • building masca.io endorse.fun swaylend.com • dog person • hiphop head • filmophile</description>
        <lastBuildDate>Sat, 16 May 2026 15:16:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>pseudobun</title>
            <url>https://storage.googleapis.com/papyrus_images/6b624a7e508e39d2edba6d949a945622e37c1e4faa6f15eb8d653b683b73e31b.png</url>
            <link>https://paragraph.com/@pseudobun</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Open-sourcing my personal portfolio]]></title>
            <link>https://paragraph.com/@pseudobun/open-sourcing-my-personal-portfolio</link>
            <guid>lncFHN7CmnCKOtBxwpnO</guid>
            <pubDate>Sat, 22 Jun 2024 14:15:18 GMT</pubDate>
            <description><![CDATA[IntroductionI&apos;ve always wanted to have a personal portfolio website. A little corner of the internet where I could showcase my work, share my hobbies, and just say I have a personal website. But for the longest time, I wasn&apos;t sure what would go on it. I dabbled in various hobbies and projects but needed more time to be ready to combine them into a cohesive presentation. But now here we are!Open-Source Software and PhotographyAs you probably already know, I am a software engineer, de...]]></description>
            <content:encoded><![CDATA[<h2 id="h-introduction" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Introduction</h2><p>I&apos;ve always wanted to have a personal portfolio website. A little corner of the internet where I could showcase my work, share my hobbies, and just say I have a personal website. But for the longest time, I wasn&apos;t sure what would go on it. I dabbled in various hobbies and projects but needed more time to be ready to combine them into a cohesive presentation. But now here we are!</p><h2 id="h-open-source-software-and-photography" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Open-Source Software and Photography</h2><p>As you probably already know, I am a software engineer, developer, r&amp;d engineer, or whatever you like to call it → I write code. One of the most beautiful things about being a developer is the open-source software and its community, especially in the crypto/web3 space. Supporting each other (primarily) and building in the open is a different kind of passion. I started contributing to open-source software when we began building <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/blockchain-lab-um/masca">Masca</a> at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blockchain-lab.um.si/?lang=en">Blockchain Lab:UM</a>. With Masca being a fantastic project, the idea of having a website to showcase projects I&apos;m working on came up.</p><p>Additionally, I picked up photography as an amateur a couple of years ago. I have always wanted to shoot beautiful portraits of my girlfriend, family, and friends, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Bokeh">bokeh</a> is one of the core effects I consider to make up a great portrait photo. The reason for my picking up photography was the poor performance of the bokeh effect on the iPhone&apos;s portrait mode - you can see the blur being digitally applied instead of it being there because of the actual lens settings. With more and more photos piling up, I wanted to show some of them to more people, and this is how the idea of having a Gallery on my personal website came up.</p><p>The more photos I took and the more open-source projects I contributed to, the more I wanted a place to display them. Building a website now made more and more sense because I had something to put on there.</p><h2 id="h-the-tech-stack" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Tech Stack</h2><p>We mostly used <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nextjs.org/">Next.js</a> with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://react.dev/">React</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://supabase.com/">Supabase</a> for frontend projects I worked on, so deciding which tech stack to use was a no-brainer for me. I used <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nextui.org/">NextUI</a> with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tailwindcss.com/">TailwindCSS</a> for styling because of their simplicity and whatnot. Oh, and I made the logo myself, I hope you dig it! For hosting, I use <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vercel.com">Vercel</a> because of their amazing free tier.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4ca6dba717e63a05db61ef6d67960efbf5eba6732ffbb7c3b7e57ab4429d34df.svg" alt="Bunny&apos;s den logo" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Bunny&apos;s den logo</figcaption></figure><p>Optimizing photos&apos; loading times was the most excellent &quot;feature&quot; I implemented. Next.js heavily pushes server-side rendering, so I wanted to get and cache as much data as I could on the server. I get the URLs of the first 10 photos on the server side and then serve them to the client, which then fetches the following 10 pictures by using infinite scroll with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tanstack.com/">TanStack Query</a> (kudos to the developer for abstracting those principles and everything else it supports to such an extent - I recommend you check it out). Check out below how I build the <code>useInfiniteQuery</code> to handle this.</p><pre data-type="codeBlock" text="const useImages = (initialData: { src: string; placeholder: string }[]) =&gt; {
  return useInfiniteQuery({
    queryKey: [&apos;images&apos;],
    queryFn: async ({ pageParam }) =&gt; {
      const response = await fetch(&apos;/api/images&apos;, {
        headers: {
          &apos;Content-Type&apos;: &apos;application/json&apos;,
        },
        method: &apos;POST&apos;,
        body: JSON.stringify({
          limit: 5,
          offset: pageParam,
        }),
        next: { revalidate: 60 * 60 * 24 * 7 }, // cache for 7 days
      });
      if (response.status !== 200) {
        return [];
      }
      return (await response.json()).urls;
    },
    staleTime: Number.POSITIVE_INFINITY,
    initialPageParam: 0,
    getNextPageParam: (lastPage, pages) =&gt; {
      if (lastPage.length === 0) {
        return null;
      }
      return pages.flat().length + 1;
    },
    initialData: {
      pages: [initialData],
      pageParams: [0],
    },
    placeholderData: keepPreviousData,
  });
};
"><code>const useImages <span class="hljs-operator">=</span> (initialData: { src: <span class="hljs-keyword">string</span>; placeholder: <span class="hljs-keyword">string</span> }[]) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
  <span class="hljs-keyword">return</span> useInfiniteQuery({
    queryKey: [<span class="hljs-string">'images'</span>],
    queryFn: async ({ pageParam }) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
      const response <span class="hljs-operator">=</span> await fetch(<span class="hljs-string">'/api/images'</span>, {
        headers: {
          <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>,
        },
        method: <span class="hljs-string">'POST'</span>,
        body: JSON.stringify({
          limit: <span class="hljs-number">5</span>,
          offset: pageParam,
        }),
        next: { revalidate: <span class="hljs-number">60</span> <span class="hljs-operator">*</span> <span class="hljs-number">60</span> <span class="hljs-operator">*</span> <span class="hljs-number">24</span> <span class="hljs-operator">*</span> <span class="hljs-number">7</span> }, <span class="hljs-comment">// cache for 7 days</span>
      });
      <span class="hljs-keyword">if</span> (response.status <span class="hljs-operator">!</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">200</span>) {
        <span class="hljs-keyword">return</span> [];
      }
      <span class="hljs-keyword">return</span> (await response.json()).urls;
    },
    staleTime: Number.POSITIVE_INFINITY,
    initialPageParam: <span class="hljs-number">0</span>,
    getNextPageParam: (lastPage, pages) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
      <span class="hljs-keyword">if</span> (lastPage.<span class="hljs-built_in">length</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>) {
        <span class="hljs-keyword">return</span> null;
      }
      <span class="hljs-keyword">return</span> pages.flat().<span class="hljs-built_in">length</span> <span class="hljs-operator">+</span> <span class="hljs-number">1</span>;
    },
    initialData: {
      pages: [initialData],
      pageParams: [<span class="hljs-number">0</span>],
    },
    placeholderData: keepPreviousData,
  });
};
</code></pre><p>And then, in the <code>GalleryGrid</code> component, I make sure to load new photos each time the user reaches the bottom of the page like shown in the code below.</p><pre data-type="codeBlock" text="export default function GalleryGrid({
  data,
}: { data: { src: string; placeholder: string }[] }) {
  const images = useImages(data);
  const observer = useRef&lt;IntersectionObserver | null&gt;(null);
  const sentinelRef = useRef&lt;HTMLDivElement&gt;(null);

  useEffect(() =&gt; {
    if (observer.current) observer.current.disconnect();

    observer.current = new IntersectionObserver(
      (entries) =&gt; {
        if (
          entries[0].isIntersecting &amp;&amp;
          !images.isFetching &amp;&amp;
          images.hasNextPage
        ) {
          images.fetchNextPage();
        }
      },
      { root: null, rootMargin: &apos;0px&apos;, threshold: 1.0 }
    );

    if (sentinelRef.current) {
      observer.current.observe(sentinelRef.current);
    }

    return () =&gt; {
      if (observer.current) observer.current.disconnect();
    };
  }, [images]);

  return (
    &lt;div className=&quot;flex flex-col justify-center&quot;&gt;
      &lt;Masonry
        items={images.data.pages.flat()}
        config={{
          columns: [1, 2, 3, 4],
          gap: [12, 12, 6, 3],
          media: [640, 768, 1024, 1280],
        }}
        render={(item, idx) =&gt; (
          &lt;Image
            key={idx}
            src={item.src}
            alt={`Gallery image at: ${item}`}
            style={{
              width: &apos;100%&apos;,
              height: &apos;auto&apos;,
            }}
            width={512}
            placeholder=&quot;blur&quot;
            blurDataURL={item.placeholder}
            height={512}
            sizes=&quot;100vw&quot;
            className=&quot;rounded-xl object-fit shadow-lg&quot;
          /&gt;
        )}
      /&gt;
      &lt;div ref={sentinelRef} /&gt;
      {images.isFetching &amp;&amp; &lt;Spinner size=&quot;md&quot; className=&quot;my-12&quot; /&gt;}
    &lt;/div&gt;
  );
}
"><code>export default <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">GalleryGrid</span>(<span class="hljs-params">{
  data,
}: { data: { src: <span class="hljs-keyword">string</span>; placeholder: <span class="hljs-keyword">string</span> }[] }</span>) </span>{
  const images <span class="hljs-operator">=</span> useImages(data);
  const observer <span class="hljs-operator">=</span> useRef<span class="hljs-operator">&#x3C;</span>IntersectionObserver <span class="hljs-operator">|</span> null<span class="hljs-operator">></span>(null);
  const sentinelRef <span class="hljs-operator">=</span> useRef<span class="hljs-operator">&#x3C;</span>HTMLDivElement<span class="hljs-operator">></span>(null);

  useEffect(() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
    <span class="hljs-keyword">if</span> (observer.current) observer.current.disconnect();

    observer.current <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> IntersectionObserver(
      (entries) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-keyword">if</span> (
          entries[<span class="hljs-number">0</span>].isIntersecting <span class="hljs-operator">&#x26;</span><span class="hljs-operator">&#x26;</span>
          <span class="hljs-operator">!</span>images.isFetching <span class="hljs-operator">&#x26;</span><span class="hljs-operator">&#x26;</span>
          images.hasNextPage
        ) {
          images.fetchNextPage();
        }
      },
      { root: null, rootMargin: <span class="hljs-string">'0px'</span>, threshold: <span class="hljs-number">1.0</span> }
    );

    <span class="hljs-keyword">if</span> (sentinelRef.current) {
      observer.current.observe(sentinelRef.current);
    }

    <span class="hljs-keyword">return</span> () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
      <span class="hljs-keyword">if</span> (observer.current) observer.current.disconnect();
    };
  }, [images]);

  <span class="hljs-keyword">return</span> (
    <span class="hljs-operator">&#x3C;</span>div className<span class="hljs-operator">=</span><span class="hljs-string">"flex flex-col justify-center"</span><span class="hljs-operator">></span>
      <span class="hljs-operator">&#x3C;</span>Masonry
        items<span class="hljs-operator">=</span>{images.data.pages.flat()}
        config<span class="hljs-operator">=</span>{{
          columns: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>],
          gap: [<span class="hljs-number">12</span>, <span class="hljs-number">12</span>, <span class="hljs-number">6</span>, <span class="hljs-number">3</span>],
          media: [<span class="hljs-number">640</span>, <span class="hljs-number">768</span>, <span class="hljs-number">1024</span>, <span class="hljs-number">1280</span>],
        }}
        render<span class="hljs-operator">=</span>{(item, idx) <span class="hljs-operator">=</span><span class="hljs-operator">></span> (
          <span class="hljs-operator">&#x3C;</span>Image
            key<span class="hljs-operator">=</span>{idx}
            src<span class="hljs-operator">=</span>{item.src}
            alt<span class="hljs-operator">=</span>{`Gallery image at: ${item}`}
            style<span class="hljs-operator">=</span>{{
              width: <span class="hljs-string">'100%'</span>,
              height: <span class="hljs-string">'auto'</span>,
            }}
            width<span class="hljs-operator">=</span>{<span class="hljs-number">512</span>}
            placeholder<span class="hljs-operator">=</span><span class="hljs-string">"blur"</span>
            blurDataURL<span class="hljs-operator">=</span>{item.placeholder}
            height<span class="hljs-operator">=</span>{<span class="hljs-number">512</span>}
            sizes<span class="hljs-operator">=</span><span class="hljs-string">"100vw"</span>
            className<span class="hljs-operator">=</span><span class="hljs-string">"rounded-xl object-fit shadow-lg"</span>
          <span class="hljs-operator">/</span><span class="hljs-operator">></span>
        )}
      <span class="hljs-operator">/</span><span class="hljs-operator">></span>
      <span class="hljs-operator">&#x3C;</span>div ref<span class="hljs-operator">=</span>{sentinelRef} <span class="hljs-operator">/</span><span class="hljs-operator">></span>
      {images.isFetching <span class="hljs-operator">&#x26;</span><span class="hljs-operator">&#x26;</span> <span class="hljs-operator">&#x3C;</span>Spinner size<span class="hljs-operator">=</span><span class="hljs-string">"md"</span> className<span class="hljs-operator">=</span><span class="hljs-string">"my-12"</span> <span class="hljs-operator">/</span><span class="hljs-operator">></span>}
    <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
  );
}
</code></pre><p>I first set the <code>initialData</code> to what I fetch already on the server side and then <code>useInfiniteQuery</code> to handle &quot;pagination&quot;.</p><h2 id="h-challenges-and-learnings" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Challenges and Learnings</h2><p>Even though I prefer working more on the backend, infrastructure, and DevOps, I had a blast creating my personal website. One challenge I faced was using the Plaiceholder package to fetch placeholder images for my photos. Still, it doesn&apos;t make sense to use it for so many pictures because it sends a request for every single one, and because of it, Vercel times out in production. Even though those placeholders are cached for the next week, the loading time is more significant and can exceed 10 seconds, leading to errors. To solve this, I just used a blank grey placeholder instead of generating unique ones using Plaiceholder.</p><h1 id="h-almost-perfect-lighthouse-score" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">&quot;Almost&quot; perfect Lighthouse score</h1><p>I also scored an almost perfect score on Lighthouse. The only issue is accessibility because the Hamburger nav button does not have aria labels set. Besides that, everything is perfect! You can view the report <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://googlechrome.github.io/lighthouse/viewer/?gist=ab052b13aaedfc4a9ed366fd3e69c788">here</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e8206f0a17e1103d6db980481d4537782946f62a784588bcc5224ea34365e37e.png" alt="Lighthouse score" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Lighthouse score</figcaption></figure><h2 id="h-conclusion" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion</h2><p>So, there you have it! That&apos;s the story of how I decided to create my personal website. It&apos;s been a fun journey, and I&apos;m excited to continue improving it. The website is open source and available on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/pseudobun/me">GitHub</a>. Check it out, and let me know what you think!</p><h2 id="h-inspiration" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Inspiration</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://morten.dev/">https://morten.dev/</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://portfolio.skippy-ai.com/">https://portfolio.skippy-ai.com/</a></p><hr><p><em>Written with ❤️, from me to you.</em></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/pseudourban">Twitter</a> | <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/pseudobun.eth">Farcaster</a> | <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hey.xyz/u/endorsedotfun">Lens</a></p>]]></content:encoded>
            <author>pseudobun@newsletter.paragraph.com (pseudobun)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/68dd7be82fe10d68796260b09c23aacada1f3f1e09ad61444cc722edd4282405.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Trying to be an exemplary participant of Web3 ...]]></title>
            <link>https://paragraph.com/@pseudobun/trying-to-be-an-exemplary-participant-of-web3</link>
            <guid>GIWIN8BTEP58uudUIp2c</guid>
            <pubDate>Wed, 01 Feb 2023 17:20:14 GMT</pubDate>
            <description><![CDATA[IntroductionThis being my first entry, I feel a slight need to introduce myself. At the time of writing this, I am 24 years old, I was born in 1998, and since I come from Maribor, Slovenia, where we’re like ten years behind the western world, I still consider myself more of a 90s baby. Having been born at the start of the fast-evolving era of technology, I literally grew up going from needing to unplug the landline phone to surf the internet to have the world’s info in the palm of my hand, so...]]></description>
            <content:encoded><![CDATA[<h2 id="h-introduction" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Introduction</h2><p>This being my first entry, I feel a slight need to introduce myself. At the time of writing this, I am <strong>24 years old</strong>, I was born in 1998, and since I come from <strong>Maribor, Slovenia</strong>, where we’re like ten years behind the western world, I still consider myself more of a 90s baby. Having been born at the start of the fast-evolving era of technology, I literally grew up going from needing to unplug the landline phone to surf the internet to have the world’s info in the palm of my hand, so understanding the technology was never a problem for me. I’m currently finishing my <strong>Master’s Degree</strong> study at the <strong>Faculty of Electrical Engineering and Computer Science at the University of Maribor, Slovenia</strong>. I’ve been in the Computer Science industry for about four years now. Still, my love and interest in technology and computer science have been keeping me company since I was ten years old - at first, having the need to play every video game released but having no money to afford it, so I had to become a pirate to get it for free, and later starting to wonder how video games are made, how the internet works, and how exactly can I write something in a simple input field and the person at the other end of the world receives my message instantly. It was all the whys and the hows until I was 14 when I first wrote a piece of code - it was a simple Python script, a console application that gave info about some PCs and hardware that was decent at the time. The information was not fetched from anywhere but was simply a hardcoded string that displayed when “navigating” to a specific section - but it was a beginning. I have also been obsessed with privacy since I remember, and I always had to have everything in control, which may be a vital factor explaining my interest in Web3 and data privacy.</p><p>Feel free to check out my <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://linktr.ee/plesastapevka">Linktree</a> for links to my professional and social profiles and my <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/plesastapevka">GitHub</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b9d8d147732b393eab064a4bf796af2f07b2e2ef29b9c9b106c74d87c6ee5926.jpg" alt="plesastapevka&apos;s profile photo." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">plesastapevka&apos;s profile photo.</figcaption></figure><h2 id="h-ideology-and-interests" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Ideology &amp; Interests</h2><p>Some of the people I meet in my everyday life don’t actually get why I spend time trying to contribute to Web3 and trying so hard to be an exemplary participant in it. Even some of my professors think Blockchain technology doesn’t solve any problem that hasn’t already been solved. While that might be true for the majority of “projects” out there, I believe there are still a lot of technical and social unsolved problems for which the blockchain may present a solution. Of course, I am not expecting every single thing and platform in the world to switch or use blockchain technology. It doesn’t even make sense in most cases. But, staying private, owning my data, being sure there’s no central authority that can shut me down whenever they want, and being independent and not relying on a few third parties providing me services online seems like a real treat. The thing I like about Web3 is that theoretically, no one can be censored, and no one can be excluded from participating. Give power to the people, make them somehow equal, and let’s see what happens.</p><p>A <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/plesasta_pevka/status/1447659526312939537?s=20">quote</a> from a blockchain documentary I really like:</p><blockquote><p>“Hold on. Satoshi turned money into code. Code is just letters and numbers, which is speech, right? So money now is speech, which is a pretty powerful idea if you think about it.”</p><p>- Torsten Hoffman, Cryptopia, 2020</p></blockquote><h2 id="h-experience-and-current-work" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Experience &amp; Current Work</h2><p>My first student job was setting up routers and TV receivers for a local ISP here in Maribor, Slovenia. Then, I started my work at <strong>Nicehash</strong>, where I first worked as an iOS Developer on Nicehash mobile app and then on a backend responsible for managing miners mining via Nicehash’s platform. After Nicehash, I worked at a company that I am not even going to mention as it doesn’t deserve any publicity and advertisement since the quality of their products and the company’s lead is trash. After that shitty company, I found out about <strong>Blockchain Lab:UM</strong>, where I currently work, and is actually my first job directly related to blockchain and Web3. I worked on a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/blockchain-lab-um/moodle-eductx-plugin"><strong>Moodle plugin</strong></a><strong> for the </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eductx.org/"><strong>EduCTX network</strong></a>. This is the product I am the proudest of in a weird, funny way because a great part of it is written in PHP, which I dislike, and my work on it has become a running gag with my colleagues.</p><p>And so we arrive at the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/blockchain-lab-um/ssi-snap/"><strong>Masca - an SSI Snap for MetaMask</strong></a>, our most actively developed project, and our baby. There is too much I have to tell about it, so please, if you’re interested, feel free to explore our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/@blockchainlabum">Medium posts</a> and check out <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://linktr.ee/blockchainlabum">Blockchain Lab:UM’s Linktree</a>.</p><h2 id="h-conclusion" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion</h2><p>Joining the Mirror, my first entry briefly introduces myself, presents my ideology and interests, and gives an overview of my experience and projects I worked on and am working on. Please do not expect regular entries from me or to stick to a specific topic. This is more of a personal blog. I am willing to write when inspired and have time and something to write about.</p><p>You can still subscribe to me or collect this entry.</p><p><em>Written with ❤️, from me to you.</em></p>]]></content:encoded>
            <author>pseudobun@newsletter.paragraph.com (pseudobun)</author>
        </item>
    </channel>
</rss>