<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Luka Harambasic | All</title><description>All posts, uses, and experience in one feed, ordered by date.</description><link>https://harambasic.de</link><atom:link href="https://harambasic.de/rss" rel="self" type="application/rss+xml"/><item><title>Harambasic Consulting</title><link>https://harambasic.de/experience/harambasic-consulting</link><guid isPermaLink="true">https://harambasic.de/experience/harambasic-consulting</guid><description>My consulting practice, combining product, AI and automation for startups.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Wizard&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Jun 2026 – Present&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;I&apos;ve always been the tools guy 🧙. The one colleagues come to with &quot;what should I use for this?&quot; or &quot;can you help me automate that?&quot; I have a technical background, I think in products, and I have a deep urge to automate everything I touch.&lt;/p&gt;
&lt;p&gt;I work hands-on. I advise, and I also build. Sometimes that&apos;s a strategy session, sometimes it&apos;s a working automation by end of day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI Strategy: Where AI actually fits in your product or ops. What to build, buy, or skip. I&apos;ve made these calls from inside teams, including setting guidelines with engineers on what AI-written code can go to production.&lt;/li&gt;
&lt;li&gt;AI Workshops: Hands-on sessions built around your actual tools and problems. Ran these for 50+ colleagues. People leave with something running.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Product&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Product Strategy: Roadmap, PLG motions, self-serve flows, pricing experiments. Scaled HEMS from 0 to 3,000+ connected homes, merged three conflicting squads into one strategy.&lt;/li&gt;
&lt;li&gt;Prototyping: When validating beats planning, I&apos;ll build it. Production code, Figma prototypes, MCP servers, whatever gets to an answer fastest.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workflow Automation: n8n flows covering support triage, CRM enrichment, internal tooling, and data pipelines. Set up AI-first customer support that hit &gt;90% automated resolution.&lt;/li&gt;
&lt;li&gt;Agents &amp;#x26; Integrations: Custom AI agents, MCP server integrations, wiring your tools together. From daily summary agents to carbon accounting pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re figuring out AI, automation, or product direction and want someone who can advise and build, &lt;a href=&quot;https://cal.com/luhara/harambasic-consulting&quot;&gt;let&apos;s talk&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>Electricity Maps</title><link>https://harambasic.de/experience/electricity-maps</link><guid isPermaLink="true">https://harambasic.de/experience/electricity-maps</guid><description>The world’s most comprehensive  electricity data platform. Helping organizations make informed decisions about their energy usage.</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Product Manager&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Oct 2025 – May 2026&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;Back at Monta I used Electricity Maps data and simply loved the product, so when the chance came to join, I couldn&apos;t say no. I drove product-led growth, owning the full stack: from pricing experiments and self-serve flows to writing production code and building end-to-end automations. Most of the time I started manual to figure out what&apos;s actually needed, then let the process run fully autonomously or with a human-in-the-loop.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intercom AI Automation: Set up AI-first customer support reaching a &gt;90% automated resolution rate, the remaining conversations I handled manually.&lt;/li&gt;
&lt;li&gt;n8n Automation: Built automations covering API trial flows, Scope 2 carbon accounting pipelines calling internal APIs, Intercom-to-HubSpot sync, Clay contact enrichment and qualification, and many smaller automations.&lt;/li&gt;
&lt;li&gt;Product-Led Growth: Ran pricing experiments, built self-serve motions via Stripe (which didn&apos;t work out at all), validated API trials as lightweight experiments (Tally → Intercom → n8n) before baking them into the product, and shipped onboarding sequences plus an internal changelog process with PostHog annotations.&lt;/li&gt;
&lt;li&gt;Production Code: Shipped production code and defined with the engineers what (AI) code can go to prod.&lt;/li&gt;
&lt;li&gt;AI Agents: Built custom Dust.tt agents for user snapshots, daily Intercom summaries and product insights on scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It wasn&apos;t the longest stay 😅 I met amazing people and I learned a lot, but it wasn&apos;t the right time for me and I got an offer that was hard to say no to.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>AirPod Pro 2</title><link>https://harambasic.de/uses/airpod-pro-2</link><guid isPermaLink="true">https://harambasic.de/uses/airpod-pro-2</guid><description>Had the first version, got the second one but sadly still have them with a Lighntning-Port. USB-C for the win!</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Anker Prime Charger</title><link>https://harambasic.de/uses/anker-prime-charger</link><guid isPermaLink="true">https://harambasic.de/uses/anker-prime-charger</guid><description>As far as I know the smallest 100W charger (enough to charge a Macbook Pro) with 2x USB-Cand 2x USB-A.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Anker Nano Power Bank</title><link>https://harambasic.de/uses/anker-nano-power-bank</link><guid isPermaLink="true">https://harambasic.de/uses/anker-nano-power-bank</guid><description>Had a MagSafe Powerbank but as I&apos;m now on Android I needed a replacement. Tech spec: 10.000mAh, 30W, integrated USB-C cable.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Vortrieb Modell 1.2</title><link>https://harambasic.de/uses/vortrieb-modell-12</link><guid isPermaLink="true">https://harambasic.de/uses/vortrieb-modell-12</guid><description>All black city bike for my daily commute. I love it. Just a front basket for my backpack is missing.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Camelbak Chute Mag (1.2 l)</title><link>https://harambasic.de/uses/camelbak-chute-mag-12-l</link><guid isPermaLink="true">https://harambasic.de/uses/camelbak-chute-mag-12-l</guid><description>I fell in love with big water bottles, my old one broke and I got this one as a present. Dropped it multiple times and nothing happened.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>ChatGPT</title><link>https://harambasic.de/uses/chatgpt</link><guid isPermaLink="true">https://harambasic.de/uses/chatgpt</guid><description>I have the Plus version from work. I use it in different situations, dedicated post will follow.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Electric Tape (blue)</title><link>https://harambasic.de/uses/electric-tape-blue</link><guid isPermaLink="true">https://harambasic.de/uses/electric-tape-blue</guid><description>I&apos;m getting around a bit, leacing with two room mates. I needed something to mark everything that is mine so that I won&apos;t forget it, but also other know that it&apos;s mine.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Fritzvold Minimal Wallet</title><link>https://harambasic.de/uses/fritzvold-minimal-wallet</link><guid isPermaLink="true">https://harambasic.de/uses/fritzvold-minimal-wallet</guid><description>I&apos;m not a fan of these sliding wallets, but I also want something small that can hold a few coins and bills. Recycled paper artificial leather that is super durable.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Ghostty</title><link>https://harambasic.de/uses/ghostty</link><guid isPermaLink="true">https://harambasic.de/uses/ghostty</guid><description>Used Warp, but got to much AI, to much account, to much pushy in updates and it was slow. Giving Ghostty now a shot.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Google Keep</title><link>https://harambasic.de/uses/google-keep</link><guid isPermaLink="true">https://harambasic.de/uses/google-keep</guid><description>Use for more valatile notes, not knowledge that should be persisted, use it as &quot;App&quot; via Safari on my MacBook to have it in my dock.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>iPad Air 13&quot; (M2)</title><link>https://harambasic.de/uses/ipad-air-13-m2</link><guid isPermaLink="true">https://harambasic.de/uses/ipad-air-13-m2</guid><description>Always wanted an iPad with a large screen to also use it as a second screen when needed. And as I got to love the Apple silicons I also wanted at least a M1.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Loop Quiet 2 Kinetic</title><link>https://harambasic.de/uses/loop-quiet-2-kinetic</link><guid isPermaLink="true">https://harambasic.de/uses/loop-quiet-2-kinetic</guid><description>Got these earplugs recommended and have to say they fit perfectly, they dont fall out. I also love the little case so I can just throw them in my backback.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>MacBook Pro 14&quot; (M2 Pro)</title><link>https://harambasic.de/uses/macbook-pro-14-m2-pro</link><guid isPermaLink="true">https://harambasic.de/uses/macbook-pro-14-m2-pro</guid><description>My work laptop.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Notion</title><link>https://harambasic.de/uses/notion</link><guid isPermaLink="true">https://harambasic.de/uses/notion</guid><description>Used it for private stuff, heavily during my studies and now at work.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Perplexity AI</title><link>https://harambasic.de/uses/perplexity-ai</link><guid isPermaLink="true">https://harambasic.de/uses/perplexity-ai</guid><description>I use it for more complex search queries where I know I&apos;ll have to visit multiple sites to gather that information.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Pixel 9 Pro</title><link>https://harambasic.de/uses/pixel-9-pro</link><guid isPermaLink="true">https://harambasic.de/uses/pixel-9-pro</guid><description>Have been the last four years with the iPhone 12. Wanted to go back to the roots. With the most pinkish case. Post will follow.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Raspberry Pi 5 (8 GB)</title><link>https://harambasic.de/uses/raspberry-pi-5-8-gb</link><guid isPermaLink="true">https://harambasic.de/uses/raspberry-pi-5-8-gb</guid><description>Set up with Ansible and Docker, right now running Home Assistent with Zigbee. Next on the list: OpenVPN, AdGuard. Post will follow.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Standard Notes</title><link>https://harambasic.de/uses/standard-notes</link><guid isPermaLink="true">https://harambasic.de/uses/standard-notes</guid><description>My knowledge base, see it as how others use Obsidian. Out of the box sync on multiple devices and web access are important for me. The free version is enough and it is e2e encrypted.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Peak Design Tech Pouch</title><link>https://harambasic.de/uses/peak-design-tech-pouch</link><guid isPermaLink="true">https://harambasic.de/uses/peak-design-tech-pouch</guid><description>Bring a little bit more organization to your tech. I&apos;m not using it at the moment as I heavily reduced what I bring with me. But might become more relevant again.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Todoist</title><link>https://harambasic.de/uses/todoist</link><guid isPermaLink="true">https://harambasic.de/uses/todoist</guid><description>My go-to todo list. It exists for that single purpose and doesn&apos;t try to be more. I have a pro subscription. I use it at work and for private tasks.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Wandrd PRVKE (21 l)</title><link>https://harambasic.de/uses/wandrd-prvke-21-l</link><guid isPermaLink="true">https://harambasic.de/uses/wandrd-prvke-21-l</guid><description>Water-resistant 21L backpack for biking to work and travel. Features attachable waist and accessory straps for versatility.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Withings ScanWatch 2</title><link>https://harambasic.de/uses/withings-scanwatch-2</link><guid isPermaLink="true">https://harambasic.de/uses/withings-scanwatch-2</guid><description>Love that people don&apos;t spot that it is a Smart Watch. Love the month-long battery time. But it&apos;s not working at the moment, need to fix it.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Mac utility must haves</title><link>https://harambasic.de/posts/mac-utility-must-haves</link><guid isPermaLink="true">https://harambasic.de/posts/mac-utility-must-haves</guid><description>Explore my essential Mac utilities, including clipboard enhancements, window management, and more.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;motivation&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#motivation&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Over the last few years, I have repeatedly recommended these utilities and shortcuts to friends. Most of them are in developer roles. I used them while coding a lot, but I also used them for pure design and university-related work. The recommendations are stable and versatile. As you&apos;ll see below, I currently work as a Product Manager; therefore, most examples focus on that task field. But you can make it your own.&lt;/p&gt;
&lt;p&gt;If you are interested in a video walking you thorugh these tools I can recommend &lt;a href=&quot;https://www.youtube.com/watch?v=GK7zLYAXdDs&quot;&gt;Set up a Mac in 2024 for Power Users and Developers&lt;/a&gt; by &lt;a href=&quot;https://syntax.fm/&quot;&gt;Syntax&lt;/a&gt;, which covers almost everything I describe here.&lt;/p&gt;
&lt;h2 id=&quot;the-utilities&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#the-utilities&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;The utilities&lt;/h2&gt;
&lt;p&gt;Every section will start with a bit of motivation of why I use it and then go over how I have set it up and how I use it.&lt;/p&gt;
&lt;h3 id=&quot;screenshots-to-clipboard&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#screenshots-to-clipboard&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Screenshots to clipboard&lt;/h3&gt;
&lt;p&gt;▶︎ &lt;a href=&quot;https://support.apple.com/en-us/102646&quot;&gt;macOS Screenshots&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&apos;t know how many screenshots I take per day. They have one thing in common: they are only temporarily relevant. If it needs to be persisted, I handle it differently (e.g., save a website as a PDF). And I don&apos;t need such temporary data on my desktop or saved somewhere else. I need it in my clipboard to paste it somewhere, e.g., E-Mail, Slack, or Figma. I can&apos;t remember in which macOS version Apple introduced the current screenshot solution, but that was the time I ditched the way more powerful &lt;a href=&quot;https://www.techsmith.com/screen-capture.html&quot;&gt;Snagit&lt;/a&gt; (I even paid for it). The built-in solution just works. But you need to set it up to do so.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/apple_screenshots.png&quot; alt=&quot;TODO&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;em&gt;Screenshot&lt;/em&gt; app.&lt;/li&gt;
&lt;li&gt;Make sure one of the three buttons on the left is selected.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Options&lt;/em&gt; and select under &lt;em&gt;Save to Clipboard&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From now on, you can take screenshots with &lt;strong&gt;COMMAND + SHIFT + 4&lt;/strong&gt;, which will instantly be saved to your clipboard. You can then paste them as you normally would (&lt;strong&gt;COMMAND + V&lt;/strong&gt;), making your workflow more efficient.&lt;/p&gt;
&lt;p&gt;Also, an important remark: if you heavily rely on annotations, this might not be the best workflow for you. But if I need to annotate something, I just quickly paste it into Figma and add an arrow or box there.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;clipboard-history&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#clipboard-history&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Clipboard history&lt;/h3&gt;
&lt;p&gt;▶︎ &lt;a href=&quot;https://clipy-app.com/&quot;&gt;Clipy&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install --cask clipy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You might be asking yourself, what the hell is a clipboard manager? And I was like you, now I can&apos;t imagine my life without it. It allows you to access stuff you have been copying. This is helpful when you start doing something, need to jump on something else, copy stuff in between, and then need to continue what you didn&apos;t finish. With a clipboard manager, you still have all the things you copied previously accessible. Another use case is when I need to copy colors from one place to another, e.g., from a design file to my code editor; I only copy all the codes once and then paste them in whichever order I need them without switching back and forth between the applications. Windows has had it since Windows 10 was integrated, but Mac still misses this feature.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/clipy.png&quot; alt=&quot;TODO&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you install Clipy, you can use it via &lt;strong&gt;SHIFT + COMMAND + C&lt;/strong&gt;. It&apos;s just one additional keystroke to what you are used to. It has many customization options, but I only changed a little. I make sure that there are already copied items visible without the need to navigate to a folder first (see screenshot). Therefore, you need to set the &lt;em&gt;Number of items placed inline&lt;/em&gt; to a decent number, I have it at 10.&lt;/p&gt;
&lt;p&gt;A nice side effect is that it cleans the styles of the copied text. For example, copying something from VSCode to Outlook normally takes all the styling. But I can&apos;t think of a use case where I want that. Maybe I want the hierarchy of the text but not the styling. Everything should be Markdown.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;switching-between-windows&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#switching-between-windows&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Switching between windows&lt;/h3&gt;
&lt;p&gt;▶︎ &lt;a href=&quot;https://alt-tab-macOS.netlify.app/&quot;&gt;AltTab&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install --cask alt-tab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AltTab solves one of my main problems with window switching on macOS: &lt;strong&gt;COMMAND + TAB&lt;/strong&gt; can&apos;t handle multiple instances of the same program. I tried multiple virtual desktops, switching between them with gestures, but this worked better with multiple monitors. Besides this benefit, AltTab adds more context to the open windows, a screenshot, and the instance&apos;s title.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/alttab.gif&quot; alt=&quot;ALtTab cycling through multiple windows&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend replacing the default &lt;strong&gt;ALT + COMMAND&lt;/strong&gt; with AltTab. After the installation, it will guide you through the process of replacing it. Below, you can see my &lt;em&gt;Appearance&lt;/em&gt; settings. That is the outcome of trial and error. You can also turn off the screenshots in the preview.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/alttab_settings.png&quot; alt=&quot;AlTab appearance of around 20 settings&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;window-management&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#window-management&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Window management&lt;/h3&gt;
&lt;p&gt;▶︎ &lt;a href=&quot;https://rectangleapp.com/&quot;&gt;Rectangle&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install --cask rectangle
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After being able to switch between all the windows, they need to be organized. One goes to the left half, one to the right half. Another one needs to be maximized without going fullscreen - I don&apos;t like the macOS fullscreen and split mode.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/rectangle.gif&quot; alt=&quot;Rectangle resizing multiple windows by dragging them to the side of the screen&quot;&gt;&lt;/p&gt;
&lt;p&gt;Therefore, you either use your mouse to drag a window into one of the hot areas (you can define them in the settings) or double-click the title bar to maximize a window. But I would encourage you to use the keyboard shortcuts. I tend to use the mouse, but I would love to get used to the shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/rectangle_shortcuts.png&quot; alt=&quot;Overview of the Rectangle shortcut settings&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;better-spotlight&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#better-spotlight&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Better Spotlight&lt;/h3&gt;
&lt;p&gt;▶︎ &lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install --cask raycast
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Everything besides this point is something I would recommend to everyone who works on a Mac daily. Raycast is a little bit more nerdy but can also be useful for everyone else. But what is it even? It is an extensible version of the default macOS Spotlight, which is already awesome. But Raycast can do more.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/raycast.gif&quot; alt=&quot;TODO&quot;&gt;&lt;/p&gt;
&lt;p&gt;I use it in some ways, like Spotlight, e.g., to open all my applications, do simple calculations, and make simple currency conversions. But Raycast allows me to install extensions or to use my scripts. One default extension is the emoji search; this gives me the same way to add emojis in every application. I don&apos;t need to consider whether I&apos;m in Slack, Notion, Jira, or Gmail. Besides this, here is a short list of other extensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Color Picker&lt;/em&gt; - Pick a color everywhere and get the HEX code on your clipboard.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Todoist&lt;/em&gt; - Create a task or search through all of them.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Shortcut&lt;/em&gt; - Use your macOS/iOS shortcuts, I have some tiny automations I want to share between my Mac and my iPhone. Therefore, having a Shortcut instead of a bash script or something similar that only works on my Mac is easier.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Calendar&lt;/em&gt; - See your next events and join calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also use some custom commands for simple automations. For example, to open a specific website with some parameters, below is a simple example of a translation service. But as you can see, this is a bash script, so you can do whatever you want.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title DeepL
# @raycast.mode silent

# Optional parameters:
# @raycast.icon images/deepl.png
# @raycast.argument1 { &quot;type&quot;: &quot;text&quot;, &quot;placeholder&quot;: &quot;From&quot;, &quot;percentEncoded&quot;: true }
# @raycast.argument2 { &quot;type&quot;: &quot;text&quot;, &quot;placeholder&quot;: &quot;To&quot;, &quot;percentEncoded&quot;: true }
# @raycast.argument3 { &quot;type&quot;: &quot;text&quot;, &quot;placeholder&quot;: &quot;Text&quot;, &quot;percentEncoded&quot;: true }
# @raycast.packageName Translations

# Documentation:
# @raycast.description Open DeepL
# @raycast.author Luka Harambasic
# @raycast.authorURL https://harambasic.de

# From &amp;#x26; to are the typical language codes, like en, de, da etc.
open &quot;https://www.deepl.com/translator#/$1/$2/$3&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/posts/mac-utility-must-haves/raycast_deepl.png&quot; alt=&quot;TODO&quot;&gt;&lt;/p&gt;
&lt;p&gt;It also offers solutions for screenshots, clipboard management, and window management. But I don&apos;t use these; I use the solutions described above, but hey, maybe that&apos;s something for you.&lt;/p&gt;
&lt;h2 id=&quot;useful-shortcuts&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#useful-shortcuts&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Useful shortcuts&lt;/h2&gt;
&lt;p&gt;I use shortcuts besides these utilities, besides copy and paste, on a daily basis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CTRL + L&lt;/strong&gt;: In Notion and Figma (I don&apos;t know if there are others), it copies the URL of what you currently have open directly to your clipboard. Quickly share a Notion page via Slack or link a Figma screen in a Jira ticket.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CTRL + K&lt;/strong&gt;: This opens a similar command palette like Spotlight/Raycast in multiple applications and websites (e.g., Jira, Figma, Notion, Slack) that lets you perform all kinds of tasks, depending on the application.&lt;/p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#closing-thoughts&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;Most of these tools have been shipped with Windows for years, which is strange because I need to go through all this every time I have to set up a new macOS. But thanks to Open Source solutions like &lt;a href=&quot;https://opencollective.com/clipy#backer&quot;&gt;Clipy&lt;/a&gt;, &lt;a href=&quot;https://www.patreon.com/lwouis&quot;&gt;AltTab&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sponsors/rxhanson&quot;&gt;Rectangle&lt;/a&gt; macOS feels way more usable. So think about donating to them or using the other open-source solutions you use on a daily basis. And remember, besides monetary support, you also can contribute to the code base.&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>AltTab</title><link>https://harambasic.de/uses/alttab</link><guid isPermaLink="true">https://harambasic.de/uses/alttab</guid><description>A better and customizable version of CMD + Tab on Mac.</description><pubDate>Sat, 25 Nov 2023 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Homebrew</title><link>https://harambasic.de/uses/homebrew</link><guid isPermaLink="true">https://harambasic.de/uses/homebrew</guid><description>Installing all the stuff the easy way, for nerds on Mac.</description><pubDate>Sat, 25 Nov 2023 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Raycast</title><link>https://harambasic.de/uses/raycast</link><guid isPermaLink="true">https://harambasic.de/uses/raycast</guid><description>Nicer version of Spotlight for Mac.</description><pubDate>Sat, 25 Nov 2023 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>SvelteKit</title><link>https://harambasic.de/uses/sveltekit</link><guid isPermaLink="true">https://harambasic.de/uses/sveltekit</guid><description>Opinionated meta framework for Svelte (used for his website).</description><pubDate>Sat, 25 Nov 2023 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Apple MacBook Air</title><link>https://harambasic.de/uses/apple-macbook-air</link><guid isPermaLink="true">https://harambasic.de/uses/apple-macbook-air</guid><description>Specs: M1 (Processor), 16 GB (Memory), 256 GB (Storage)</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>ASUS ZenScreen MB16AC</title><link>https://harambasic.de/uses/asus-zenscreen-mb16ac</link><guid isPermaLink="true">https://harambasic.de/uses/asus-zenscreen-mb16ac</guid><description>Mobile display, powered over USB-C which gives me a dual display set up almost everywhere.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Bookmark Divider</title><link>https://harambasic.de/uses/bookmark-divider</link><guid isPermaLink="true">https://harambasic.de/uses/bookmark-divider</guid><description>A tool created by myself to use it as a bookmark divider between my favicon bookmarks.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Clipy</title><link>https://harambasic.de/uses/clipy</link><guid isPermaLink="true">https://harambasic.de/uses/clipy</guid><description>A clipboard manager for macOS. No more, no less.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Elgato Ring Light</title><link>https://harambasic.de/uses/elgato-ring-light</link><guid isPermaLink="true">https://harambasic.de/uses/elgato-ring-light</guid><description>Quite expansive, but the warmness (Kelvin) and brightness can be adjusted seamlessly (Mobile &amp; Desktop).</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Elgato Streamdeck</title><link>https://harambasic.de/uses/elgato-streamdeck</link><guid isPermaLink="true">https://harambasic.de/uses/elgato-streamdeck</guid><description>Programmable keyboard with displays which shows different keys depending on the context.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Enpass</title><link>https://harambasic.de/uses/enpass</link><guid isPermaLink="true">https://harambasic.de/uses/enpass</guid><description>I bought this password manager before they started the subscription model. Therefore, I can use it without any monthly fees.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Figma</title><link>https://harambasic.de/uses/figma</link><guid isPermaLink="true">https://harambasic.de/uses/figma</guid><description>Awesome vector tool, you can work live at files and share them easily.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>GitHub Actions</title><link>https://harambasic.de/uses/github-actions</link><guid isPermaLink="true">https://harambasic.de/uses/github-actions</guid><description>As all my projects are on GitHub I&apos;m just happy about such a simple solution for automation.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Google Workspace</title><link>https://harambasic.de/uses/google-workspace</link><guid isPermaLink="true">https://harambasic.de/uses/google-workspace</guid><description>In my case it is used privately, but it is also very easy to set up for small to large organizations.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>google webfonts helper</title><link>https://harambasic.de/uses/google-webfonts-helper</link><guid isPermaLink="true">https://harambasic.de/uses/google-webfonts-helper</guid><description>Tool to help you host Google fonts without the CDN. Why should you care? GDPR, Performance, Control.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Logitech Streamcam</title><link>https://harambasic.de/uses/logitech-streamcam</link><guid isPermaLink="true">https://harambasic.de/uses/logitech-streamcam</guid><description>Supports default mounting options and produces a pretty good Full HD image.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Netlify</title><link>https://harambasic.de/uses/netlify</link><guid isPermaLink="true">https://harambasic.de/uses/netlify</guid><description>Connect Netlify to your repository to get a build when you push to main and also get previews in PRs.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Nuxt.js</title><link>https://harambasic.de/uses/nuxtjs</link><guid isPermaLink="true">https://harambasic.de/uses/nuxtjs</guid><description>Opinionated meta framework for Vue.js.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Playwright</title><link>https://harambasic.de/uses/playwright</link><guid isPermaLink="true">https://harambasic.de/uses/playwright</guid><description>A Node.js browser automation framework I use it to automate websites which won&apos;t give me API access or to generate images.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Rectangle</title><link>https://harambasic.de/uses/rectangle</link><guid isPermaLink="true">https://harambasic.de/uses/rectangle</guid><description>Move and snap windows in macOS via mouse and shortcuts.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Rode NT-USB Mini</title><link>https://harambasic.de/uses/rode-ntusb-mini</link><guid isPermaLink="true">https://harambasic.de/uses/rode-ntusb-mini</guid><description>Nice quality (as far as I can tell) and can be used without an arm.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Slack</title><link>https://harambasic.de/uses/slack</link><guid isPermaLink="true">https://harambasic.de/uses/slack</guid><description>If there is a new side project with multiple people I tend to directly create a workspace to streamline the communication.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Vercel</title><link>https://harambasic.de/uses/vercel</link><guid isPermaLink="true">https://harambasic.de/uses/vercel</guid><description>Same as Netlify, but I prefer Vercel for projects with serverless functions.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>VS Code</title><link>https://harambasic.de/uses/vs-code</link><guid isPermaLink="true">https://harambasic.de/uses/vs-code</guid><description>As I&apos;m not a big fan of TextEdit (macOS) I use VS Code as my primarily text editor. And nowadays also for Astro.js.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>Vue.js</title><link>https://harambasic.de/uses/vuejs</link><guid isPermaLink="true">https://harambasic.de/uses/vuejs</guid><description>My favorite JS framework, as it lets you use what the web was made with: HTML and CSS! And Single File Components are just awesome.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>vue-resume-component</title><link>https://harambasic.de/uses/vueresumecomponent</link><guid isPermaLink="true">https://harambasic.de/uses/vueresumecomponent</guid><description>My first npm package which powered the CV of a previous version of this page.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>WebStorm</title><link>https://harambasic.de/uses/webstorm</link><guid isPermaLink="true">https://harambasic.de/uses/webstorm</guid><description>I like it as it just works and has all the features I need built-in.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>WorkFlowy</title><link>https://harambasic.de/uses/workflowy</link><guid isPermaLink="true">https://harambasic.de/uses/workflowy</guid><description>My go-to knowledge app, you could also call it a note app. Basically it is an endless list.</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><category>Uses</category></item><item><title>GreenKayak</title><link>https://harambasic.de/experience/greenkayak</link><guid isPermaLink="true">https://harambasic.de/experience/greenkayak</guid><description>GreenKayak is an environmental NGO that engages people in the fight for cleaner oceans. Collect trash and therefore paddle for free.</description><pubDate>Thu, 01 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Product Manager&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Sep 2022 – Apr 2023&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;I saw a posting for an intern and loved the mission, but I told them I couldn&apos;t work part-time without pay. So we found a solution: I did this project as part of my Master&apos;s degree. This allowed me to dedicate my &quot;study time&quot; to building a product I actually cared about, while keeping a paying job on the side.&lt;/p&gt;
&lt;p&gt;Before the app, GreenKayak&apos;s booking ran entirely through the web, which meant little control over the booking experience and data collection. A core part of the NGO&apos;s model is reporting the amount of trash collected, and that process was analog and error-prone until the app.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mobile Booking System: Designed and shipped the app enabling thousands of volunteers to kayak for free in exchange for ocean cleanup. Increasing self-service rate to reduce workload for hosts.&lt;/li&gt;
&lt;li&gt;Solo Builder: I acted as a one-man product team: scoping the MVP, building clickable Figma prototypes, testing with users and managing an external dev agency to get it shipped.&lt;/li&gt;
&lt;li&gt;Impact: The app is live with 20,000+ downloads and engaged more than 16,000 volunteers in the 2023 season alone, actively helping clean the worlds waterways. Get it on the &lt;a href=&quot;https://play.google.com/store/apps/details?id=org.greenkayak.app&quot;&gt;Play Store&lt;/a&gt; or the &lt;a href=&quot;https://apps.apple.com/us/app/greenkayak/id6446000420&quot;&gt;App Store&lt;/a&gt;, or learn more at &lt;a href=&quot;https://www.greenkayak.org/&quot;&gt;greenkayak.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS: I might have written a few lines of code myself, but let&apos;s not look too closely at those 😊&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>Quickly copying paths to the terminal on macOS</title><link>https://harambasic.de/posts/quickly-copying-paths-to-the-terminal-on-macos</link><guid isPermaLink="true">https://harambasic.de/posts/quickly-copying-paths-to-the-terminal-on-macos</guid><description>Quickly copying paths to the terminal on macOS</description><pubDate>Mon, 08 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#intro&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Intro&lt;/h2&gt;
&lt;p&gt;A friend once showed me this little tip. We were developing an Android app, and therefore we tested our apps frequently on different physical devices. The compiled app had very speakable and easy to type names... not! And then I got told that I easily can copy a complete file paths. With this I don&apos;t need to figure out where I&apos;m right now in my terminal or where I need to navigate to. It might be obvious for those who know it, but sooo many people don&apos;t know. And everybody I told this was amazed.&lt;/p&gt;
&lt;h2 id=&quot;how-to&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#how-to&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;How-To&lt;/h2&gt;
&lt;p&gt;You only have to select a file in Finder, press &lt;code&gt;CMD + C&lt;/code&gt; to than paste it via &lt;code&gt;CMD + V&lt;/code&gt; to your favourite terminal.&lt;/p&gt;
&lt;p&gt;Here you can see it with a little script I use for compressing PDFs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/quickly-copying-paths-to-the-terminal-on-macos/copy_path_terminal.gif&quot; alt=&quot;Copy and paste a file path via keyboard commands on macOs&quot;&gt;&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>Monta</title><link>https://harambasic.de/experience/monta</link><guid isPermaLink="true">https://harambasic.de/experience/monta</guid><description>A software platform to manage and scale EV charging infrastructure for businesses, cities, and operators. It covers charge point management, payments, roaming, and energy management.</description><pubDate>Mon, 01 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Product Manager&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Aug 2023 – Sep 2025&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;I was originally rehired to build &quot;Product Led Support&quot; to stop tickets from out scaling our agents, but as big enterprise clients landed, my team had to pivot to maintaining the exports and notification service (push, sms, email). Then came the opportunity to lead a Home Energy Management Systems (HEMS) project with a large Danish utility.&lt;/p&gt;
&lt;p&gt;After a year, we hit a wall. We were &quot;shipping our org chart&quot;, three different squads with conflicting roadmaps trying to control the charge session of an EV: Grid, Load Management, HEMS. I pushed to merge these into one unified End-to-End Energy Management squad and strategy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scaled HEMS: Took the HEMS from 0 to 3,000+ connected homes supporting Solar inverters, Smart Meter readers (MQTT, HTTP) and CT-Clamps via OCPP.&lt;/li&gt;
&lt;li&gt;Grid Services: Took ownership of the domain, expanding beyond FCR-D (DK, SE, UK) our portfolio to include aFRR (DK) and overhauling the UX to make complex flexibility markets accessible.&lt;/li&gt;
&lt;li&gt;Monta Control: Rebranded and repositioned an internal utility (&quot;CPI tool&quot;) into a customer-facing product that became Monta&apos;s AI playground.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve always been the &quot;Tools Guy&quot;. I simply love tinkering with new tech, so I naturally ended up helping my colleagues figure out how to use AI to automate the boring parts of our jobs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enablement: Ran cross-department sessions and 1:1s, helping colleagues build their own automations.&lt;/li&gt;
&lt;li&gt;Zapier Workflows: Built automations to scan sales and CS transcripts, so I stayed on top of real customer problems and could jump in when something spiked (one of my fav automations).&lt;/li&gt;
&lt;li&gt;Automation &amp;#x26; AI Squad: Joined the squad to push these topics across the entire company, also hosted a hackathon.&lt;/li&gt;
&lt;li&gt;First MCP Server: Built Monta&apos;s first MCP server to control the entire CPMS via prompts, hooking it up to internal systems to automate QA and generate instant, customized customer demos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I learned a shit ton 😞&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Product Owner&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Aug 2022 – Feb 2023&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;This was my &quot;first date&quot; with Monta, working part-time alongside my full-time Master&apos;s. I focused on the B2B side (the legacy Portal), getting my crash course in the EV industry and figuring out what on earth a CPMS actually is.&lt;/p&gt;
&lt;p&gt;I got my hands dirty early on, even coding fully functional internal tools that eventually got productized. This was way before the &quot;vibe coding&quot; era, so I actually had to write the code myself, including a beautiful daylight time shift (or however you call this) bug that took me forever to debug 😊.&lt;/p&gt;
&lt;p&gt;Full transparency: I extended the end date on this experience so LinkedIn groups it nicely with my return in 2023. In reality, I worked in this position from Aug 2022 to Feb 2023 and took a break for a semester abroad in California.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>PDF CV/Resume from Figma template with Auto Layout</title><link>https://harambasic.de/posts/pdf-cvresume-from-figma-template-with-auto-layout</link><guid isPermaLink="true">https://harambasic.de/posts/pdf-cvresume-from-figma-template-with-auto-layout</guid><description>A simple one-page CV/Resume template that heavily relies on Auto Layout makes it super easy to adjust.</description><pubDate>Tue, 12 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;motivation&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#motivation&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Motivation&lt;/h2&gt;
&lt;p&gt;If you look at my &lt;a href=&quot;/projects&quot;&gt;projects&lt;/a&gt; you can see parts of my history simplifying CVs. To quote me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why bother with Word or a graphics program when creating your CV? Hence, I designed and developed a tool with Vue 3 which takes a JSON and generates a CV from it. It is easy to maintain as new entries can be added to JSON and the CV will be updated automatically.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To be honest, I still like this programmatic approach, but I like pixel-perfect designs, which is hard to achieve with PDFs generated from HTML (at least to my knowledge). And Figma introduced Auto Layout, which makes it sooooo easy to adjust structured designs. That&apos;s when I started playing around with CVs in Figma.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/pdf-cvresume-from-figma-template-with-auto-layout/cv.png&quot; alt=&quot;CV template in Figma&quot;&gt;&lt;/p&gt;
&lt;p&gt;As my history of CVs is known to friends, and my current CV is public, I was asked multiple times if people could borrow my CV to adjust it to their needs. Of course, they can! But if it&apos;s of interest to them, some other people might also benefit from it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.figma.com/community/file/1128439910915950322&quot;&gt;» Here it is - just create a copy.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-to-adjust-it&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#how-to-adjust-it&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;How to adjust it&lt;/h2&gt;
&lt;p&gt;I thought about writing a comprehensive tutorial. But I think it&apos;s straightforward, and I also added some notes to the template so everybody can benefit from it. Therefore, please let me know if there are some &quot;bugs&quot; or if you don&apos;t understand something (&lt;a href=&quot;https://twitter.com/luka_harambasic&quot;&gt;@luka_harambasic&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Portrait picture: &lt;a href=&quot;https://this-person-does-not-exist.com/&quot;&gt;Random Face Generator (This Person Does Not Exist)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Name: &lt;a href=&quot;https://www.behindthename.com/random/&quot;&gt;Behind the name&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>Posts</category></item><item><title>My nerd path - 10+ years of (personal) development</title><link>https://harambasic.de/posts/my-nerd-path-10-years-of-personal-development</link><guid isPermaLink="true">https://harambasic.de/posts/my-nerd-path-10-years-of-personal-development</guid><description>This post shows how I acquired my technical knowledge and illustrates where my interests lie and how they have developed over almost 15 years.</description><pubDate>Wed, 22 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;preamble&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#preamble&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Preamble&lt;/h2&gt;
&lt;p&gt;This post is a story about my life, a big part of mine. It shows how I acquired my technical knowledge and illustrates where my interests lie and how they have developed over almost 15 years. This story should serve as an inspiration to enable others to follow their passion. Because not every person doing something with technology has to follow a strict path - there are multiple ways to reach the goal. Furthermore, I want this post to look back on someday and remember how everything evolved since I was a young boy.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/tobsch?lang=en&quot;&gt;Tobias Schlottke&lt;/a&gt; hosting the &lt;a href=&quot;https://alphalist.com/podcast&quot;&gt;alphalist.CTO&lt;/a&gt; inspired me to write this post. He always starts an episode with the question: &quot;What&apos;s your nerd path?&quot;. He got me thinking about how I became who I am in technology.&lt;/p&gt;
&lt;p&gt;The story started when I was around 11, and I had no clue about computers. Continuing with a self-motivated learning phase, I became competent in web technologies and ended my last job as a technology consultant. Which also marks the end of this chapter in my life.&lt;/p&gt;
&lt;h2 id=&quot;getting-to-know-the-internet&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#getting-to-know-the-internet&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Getting to know the internet&lt;/h2&gt;
&lt;p&gt;When I was 11, there was a platform called Knuddels; nowadays, I would describe it as a predecessor of &lt;a href=&quot;https://slack.com/&quot;&gt;Slack&lt;/a&gt; with mini-games. If you were an active user, you got promoted as a Family Member. You&apos;d get new features, of which I remember the homepage the most fondly because it somehow kicked off my Nerd. On my &quot;homepage,&quot; you could learn more about my interests and hobbies. My initial &quot;homepage&quot; was visually very dull. I just had some colorful text without nice graphics. By contrast, other users had nice borders around each box and animated pictures. So I got curious and found some templates I could copy over that weren&apos;t even HTML, they were written in &lt;a href=&quot;https://en.wikipedia.org/wiki/BBCode&quot;&gt;BBCode&lt;/a&gt;. I&apos;m not sure when I have seen it the last time, maybe in a forum around that time? Just having something nice looking wasn&apos;t enough though, I wanted to make it my own. After a while, I recognized how powerful the style attribute is and could change the look of my whole homepage. And that&apos;s what I did.&lt;/p&gt;
&lt;p&gt;Afterward, I started a browser game with a clan with a styleable information page, again with BBCodes. This was the first time I used &lt;a href=&quot;https://www.gimp.org/&quot;&gt;GIMP&lt;/a&gt;, and that was the first time I became aware of what Open Source is.&lt;/p&gt;
&lt;p&gt;In the end, simple websites started my journey, and as I write this, I also understand why I&apos;m so addicted to the web. It&apos;s been with me since I was a young boy dipping my towns in the vast ocean that is the internet, and it&apos;s always been accessible to me. Thanks to my parents ❤️.&lt;/p&gt;
&lt;h2 id=&quot;using-the-website-builder&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#using-the-website-builder&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Using the website builder&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/posts/my-nerd-path/shadow_rounded_corner.png&quot; alt=&quot;Website with an drop shadow and border radius as image&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step was to publish my first website. To be honest, I can&apos;t even remember the content. Nevertheless, I won&apos;t forget that it was at &lt;a href=&quot;https://www.homepage-baukasten.de/&quot;&gt;Homepage Baukasten&lt;/a&gt; (Homepage Builder), which gave you a pretty lovely domain: .de.tl. And, as before, I stuck to this place because there was a very active community, but this time with &quot;experts&quot; in programming. I remember how I stood in awe of everybody who could build a website from scratch on this platform. It felt like magic. I still have this feeling today for stuff I don&apos;t understand. After customizing some designs from the community, I created my own layouts. If you wanted to create a nice background for your content, as you see above, you had to create an image and then split it into three parts putting it together. It wasn&apos;t as convenient as it is nowadays.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;div id=&quot;container&quot;&gt;
	&amp;#x3C;div id=&quot;top&quot;&gt;&amp;#x3C;/div&gt;
	&amp;#x3C;div id=&quot;middle&quot;&gt;
		&amp;#x3C;h1&gt;About Us&amp;#x3C;/h1&gt;
		&amp;#x3C;p&gt;Lorem Ipsum...&amp;#x3C;/p&gt;
	&amp;#x3C;/div&gt;
	&amp;#x3C;div id=&quot;bottom&quot;&gt;&amp;#x3C;/div&gt;
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#top {
	background: url(&apos;/container-top.png&apos;) no-repeat;
}
#middle {
	background: url(&apos;/container-middle.png&apos;) repeat-y;
}
#bottom {
	background: url(&apos;/container-bottom.png&apos;) no-repeat;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Another recognizable feature of websites at this time was this glossy, well-known Web 2.0 button. I used masks in GIMP the first time to achieve this. It was quite some fun to rebuild this in Figma, the third generation of graphic tools I use to create websites.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/my-nerd-path/glossy_button.svg&quot; alt=&quot;Glossy Web 2.0 button with the text: Click Me&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;hosting-my-own-websites&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#hosting-my-own-websites&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Hosting my own websites&lt;/h2&gt;
&lt;p&gt;The next logical step was to build an entire website from scratch. For that, I needed some hosting, and everybody around me used &lt;a href=&quot;https://bplaced.net&quot;&gt;bplaced.net&lt;/a&gt;.net as they had a decent free tier. But, with this, I still didn&apos;t know how to handle a web space. I remember when a strange person I got to know over the Homepage-Baukasten forum showed me how to use my webspace via Skype &amp;#x26; TeamViewer. He also showed me &lt;a href=&quot;https://filezilla-project.org/&quot;&gt;FileZilla&lt;/a&gt; to upload my files. Quickly, I got annoyed by this manual step. Naturally, I wanted to speed up my process, so I installed a plugin in &lt;a href=&quot;https://notepad-plus-plus.org/downloads/&quot;&gt;Notepad++&lt;/a&gt; to directly edit files on the server. I didn&apos;t know that you shouldn&apos;t change something directly in production without testing, but it was convenient.&lt;/p&gt;
&lt;p&gt;At this time I started to look more into &lt;a href=&quot;https://www.php.net/&quot;&gt;PHP&lt;/a&gt;, as I was lazy! I just didn&apos;t wanted to update my header and footer for every page when I change something, e.g. add a new link to the menu. &lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;&quot;Don&apos;t repeat yourself&quot; (DRY)&lt;/a&gt; wasn&apos;t something I was aware of, but it was already part fo my philosophy.&lt;/p&gt;
&lt;p&gt;I started to look more into &lt;a href=&quot;https://www.php.net/&quot;&gt;PHP&lt;/a&gt; at this time, as I was lazy! I just didn&apos;t want to update my header and footer for every page when I change something, e.g., add a new link to the menu. &lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;&quot;Don&apos;t repeat yourself&quot; (DRY)&lt;/a&gt; wasn&apos;t something I was aware of, but it was already part of my philosophy.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;#x3C;?php include (&quot;./header.php&quot;); ?&gt;
&amp;#x3C;body&gt;&amp;#x3C;/body&gt;
&amp;#x3C;?php include (&quot;./footer.php&quot;); ?&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As I already knew so much about HTML &amp;#x26; CSS, I was very disappointed by my IT teacher, who asked us to learn layouts with tables. Although every good web developer used &lt;code&gt;float: left&lt;/code&gt;. He was so kind enough to let me plan and conduct some lectures in my advanced IT course at school. I even wrote a small PHP script, making it easy to share all my codings with the others as I wasn&apos;t aware of other solutions. Sadly we had to use table layouts for the final exam.&lt;/p&gt;
&lt;h2 id=&quot;getting-more-advanced&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#getting-more-advanced&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Getting more advanced&lt;/h2&gt;
&lt;p&gt;During this time, I started using &lt;a href=&quot;https://wordpress.com/&quot;&gt;WordPress&lt;/a&gt; and looked into a mystical new world: JavaScript. If I remember correctly, my first blog with WordPress was a relaunch of bagarts.de where I could write about online marketing. During this time, I thought marketing might be my passion. How wrong I was... And how could I believe that someone would care about the two cents from a 16-year-old boy without any substantial knowledge in this area? At this point, I got to know &lt;a href=&quot;https://www.netcup.de/&quot;&gt;Netcup.net&lt;/a&gt;, the only web hoster I have had since then. I tried other hosters for other organizations, and I don&apos;t buy many domains at Netcup, but the hosting is still perfect, and the support is incredible.&lt;/p&gt;
&lt;p&gt;Other solutions like the German homepage builder &lt;a href=&quot;https://www.jimdo.com/&quot;&gt;Jimdo&lt;/a&gt; were also on my radar. I created a simple website for my Handball team and my parents&apos; construction company. After only 1 year, I moved to a self-implementation (see &lt;a href=&quot;https://web.archive.org/web/20150920234612/http://ivo-bau.de/&quot;&gt;archive.org&lt;/a&gt;). I used &lt;a href=&quot;http://koala-app.com/&quot;&gt;Koala&lt;/a&gt; (a GUI tool) for &lt;a href=&quot;https://sass-lang.com/&quot;&gt;Sass&lt;/a&gt;. That was it, no framework or anything like that included, just PHP, HTML &amp;#x26; CSS (ok and a third party lightbox).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/my-nerd-path/ivo_bau.png&quot; alt=&quot;An old version of IVO-BAU.de - showing the title and a picture of the office&quot;&gt;&lt;/p&gt;
&lt;p&gt;My first customer was my sports club. I developed a multi-WordPress website with a custom theme. I&apos;m still quite happy with how it looks. Of course, it could use some optimization, but it&apos;s still alive. Despite some users trying to break it with an entire blog post in red and Comic Sans. During this, I fell in love with this concept of CPTs (&lt;a href=&quot;https://wordpress.org/support/article/post-types/&quot;&gt;Custom Post Types&lt;/a&gt;) and subsequently added some: teams, department management, and events. Then enhanced all of it with ACF (&lt;a href=&quot;https://www.advancedcustomfields.com/&quot;&gt;Advanced Custom Fields&lt;/a&gt;), e.g., to link to the current table for each team. I learned a lot and would do it entirely differently nowadays. Like on my previous homepages, I was in charge of the design, assets, hosting, and development.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/my-nerd-path/tv_edigheim.png&quot; alt=&quot;Screenshot of handball.tv-edigheim.de showing the start page&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;learn-programming&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#learn-programming&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Learn programming&lt;/h2&gt;
&lt;p&gt;In 2016 I started a corporate study program for a bachelor in &lt;em&gt;Business Informatics focusing on Sales &amp;#x26; Consulting&lt;/em&gt;. I worked in a three-month cycle at &lt;a href=&quot;https://www.sap.com/&quot;&gt;SAP&lt;/a&gt; (my partner company) and then studied for three months at &lt;a href=&quot;https://www.dhbw.de/english/home&quot;&gt;DHBW&lt;/a&gt; (my university) for three years. At my company, I learned a JavaScript framework called &lt;a href=&quot;https://sapui5.hana.ondemand.com/&quot;&gt;SAP UI5&lt;/a&gt;, which is not my favorite one.&lt;/p&gt;
&lt;p&gt;I had the opportunity to work in one of the most impressive teams I have ever been in. Everyone was fantastic, from the senior developer, designers, and &lt;a href=&quot;https://en.wikipedia.org/wiki/User_assistance&quot;&gt;user assistance&lt;/a&gt;. This team dynamic was extraordinarily unique, and I learned a lot. This atmosphere, where everyone is respected, constructive criticism is appreciated, problem-solving and free time are done together, continues to be what I strive towards in my choice of teams.&lt;/p&gt;
&lt;p&gt;Even though work taught me a lot, I still learned most of my skills in my spare time on projects with friends. Fortunately, one of them showed me &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt;. My new love, still today! It feels right to write everything in the original intended language: HTML. HTML with a very intuitive syntax for templating, CSS is CSS or &lt;a href=&quot;https://sass-lang.com/guide&quot;&gt;SASS/SCSS&lt;/a&gt; when you prefer it, and JavaScript is JavaScript. It makes sense if you are used to the fundamentals of these three languages.&lt;/p&gt;
&lt;p&gt;During this time, I got to know many other remarkable technologies and services: &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;NodeJs&lt;/a&gt;, &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt;, &lt;a href=&quot;https://nuxtjs.org/&quot;&gt;Nuxt&lt;/a&gt;, &lt;a href=&quot;https://jamstack.org/headless-cms/&quot;&gt;Headless CMS&lt;/a&gt;, &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;, &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Serverless_computing&quot;&gt;Serverless&lt;/a&gt;, &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;, and &lt;a href=&quot;https://firebase.google.com/&quot;&gt;Firebase&lt;/a&gt;. I didn&apos;t have any lecture on any of these topics - I learned all of these on my own. If you wanted to give my approach a name, I would go for &quot;problem-based-learner.&quot; If I want to achieve something and don&apos;t know how to do it, I&apos;ll learn the skill. Which is somehow lovely but sad as my journeys end most of the time end at the surface of new technology. It also makes it hard to dive deeper into new technologies as I&apos;m bored by the first chapter of Udemy courses, and then it&apos;s hard to keep the motivation up.&lt;/p&gt;
&lt;p&gt;I still wouldn&apos;t call myself an expert, but I can build a full-stack web application on my own. I always say it&apos;s enough for a prototype or an &lt;a href=&quot;https://en.wikipedia.org/wiki/Minimum_viable_product&quot;&gt;MVP&lt;/a&gt;. After that phase, experts should take over. Nevertheless, at this time, it looked that I could become a full-time developer, as I fulfilled all the requirements: I started a lot of side projects that I never finished.&lt;/p&gt;
&lt;p&gt;Besides all these technologies, I started to follow my passion for UX/UI design. I went into design departments, and in all the projects I did, I was responsible for the logo, colors, typographies, and mockups. You can check out my first UI design, schmackofatz. On the &lt;a href=&quot;/projects&quot;&gt;projects page&lt;/a&gt;, if you want to see my skills during this time in my life. It was my first complete UI design, and even though I would do it quite differently today, I&apos;m still proud of the outcome. Later I had to implement the UI for this idea in Vue.js.&lt;/p&gt;
&lt;p&gt;On top of that, I could live out my love for tools. Digital tools. I changed the whole infrastructure of the oldest finance student club in Germany. I was responsible for setting everything up for a newly founded club and fixing all the wrong decisions I took two years later. My favorite failure is the email naming convention. We wanted to look like a startup and decided to only use first names for the email addresses, e.g., luka@q-summit.com. Though I didn&apos;t think that another Luka could join this club.&lt;/p&gt;
&lt;p&gt;On my own, I tried a lot of tools in different areas: to-do lists, note-taking, PDF annotation, data storage, calendar, email. I&apos;m sure I&apos;ve annoyed most people around me, not just once with a great new tool, not just once. Thank you for still being friends with me. By the way, an &lt;a href=&quot;https://airtable.com/&quot;&gt;Airtable&lt;/a&gt; with all the tools I found and used is currently in the making (and will be published soon).&lt;/p&gt;
&lt;p&gt;In the context of this chapter, I really need to say thanks to two people: &lt;strong&gt;Frank&lt;/strong&gt; &amp;#x26; &lt;strong&gt;Henry&lt;/strong&gt;! You know why. ❤️&lt;/p&gt;
&lt;h2 id=&quot;becoming-a-technology-consultant&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#becoming-a-technology-consultant&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Becoming a Technology Consultant&lt;/h2&gt;
&lt;p&gt;Shortly before my vocational contract with SAP ended, I found an excellent department where I became a &lt;em&gt;Technology Consultant for Mobile UX (EMEA)&lt;/em&gt;. In the beginning, I worked with the &lt;a href=&quot;https://developers.sap.com/topics/mobile-development-kit.html&quot;&gt;SAP Mobile Development Kit&lt;/a&gt; focusing on the &lt;a href=&quot;https://www.sap.com/denmark/products/asset-manager.html&quot;&gt;SAP Asset Manager&lt;/a&gt; for iPads. Shortly after that, I had familiarized myself with the subject Covid-19 started, and the German government commissioned an app: The &lt;a href=&quot;/projects&quot;&gt;Corona-Warn-App&lt;/a&gt;. I started as an Android developer before I became the team lead. In this way, I found out that I like to take on responsibility, make decisions, organize, and prioritize. With these new tasks, I slowly left the development behind me.&lt;/p&gt;
&lt;p&gt;This section is relatively short as I was heavily focused on my work during these two years. Hence, I &quot;only&quot; started two projects with some friends:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.active-ambassadors.org/&quot;&gt;Active Ambassadors&lt;/a&gt;: A NGO to raise awareness for other NGOs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techmob.show/&quot;&gt;Tech Mob Show&lt;/a&gt;: A technology entertainment podcast with two friends.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ending-my-nerd-path&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#ending-my-nerd-path&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Ending my nerd path&lt;/h2&gt;
&lt;p&gt;I first wanted to call this chapter &lt;strong&gt;&quot;To be continued&quot;&lt;/strong&gt; and add new chapters to my nerd path. But I think it won&apos;t be continued. I don&apos;t want to make my living as a developer. I love technology! I&apos;ll develop in my free time, learn new technologies, automate stuff I could do way quicker manually, be the number one contact for my family, friends, and colleagues to ask technical questions. For me, it&apos;s some kind of relaxation if I can develop after a stressful day.&lt;/p&gt;
&lt;p&gt;However, I have taken a new path. I moved to Copenhagen to start my master&apos;s in &lt;em&gt;&lt;a href=&quot;https://www.dtu.dk/english/education/msc/programmes/technology-entrepreneurship&quot;&gt;Technology Entrepreneurship&lt;/a&gt;&lt;/em&gt; &lt;a href=&quot;https://www.dtu.dk/english&quot;&gt;@DTU&lt;/a&gt;. I wanted to risk something, go out of my comfort zone, try something new, get to know inspiring people from all over the world, and just calm down a bit after my time at the Corona-Warn-App. However, I want to work on more meaningful projects from me. I want to find something with impact. It might sound cheesy, but I want to change something in the world, tackle the significant challenges, and leave a better world.&lt;/p&gt;
&lt;p&gt;Right now, I&apos;m already three and a half months into this program, and I love it. It&apos;s just an inspiring environment where everything seems to be possible. I already got my first megalomaniac idea. More on that later when I make that dream come true.&lt;/p&gt;
&lt;p&gt;Wood picture: &lt;a href=&quot;https://unsplash.com/photos/q2Fyzn-KJOQ&quot;&gt;Andrey Haimin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank&apos;s to Niklas and Leo for proofreading.&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>Sparkle</title><link>https://harambasic.de/experience/sparkle</link><guid isPermaLink="true">https://harambasic.de/experience/sparkle</guid><description>Solar energy startup that pivoted through multiple models, from solar fintech to enabling apartment renters to participate in the green transition.</description><pubDate>Fri, 01 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Co-Founder&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Oct 2021 – Aug 2022&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;Tried to build a company. Spoiler: We failed.&lt;/p&gt;
&lt;p&gt;I remember printing hundreds of flyers, throwing them into mailboxes in my hometown, and getting exactly zero responses. I posted on LinkedIn looking for rooftops, got on calls with homeowners, and realized: I have no idea what I&apos;m doing. What we are doing.&lt;/p&gt;
&lt;p&gt;We pivoted wildly trying to find something that works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solar on Shipping Containers: Too niche&lt;/li&gt;
&lt;li&gt;Solar Fintech: Attempting to democratize access for departments (the main dream)&lt;/li&gt;
&lt;li&gt;The Final Pivot: An app for apartment renters to participate in the green transition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I spent nights on endless spreadsheet calculations trying to balance risk factors for homeowners against our own exposure. In the end, the math only worked with massive scale. Investors demanded a proof of concept. We realized that without deep capital or a massive network, the risk profile was impossible for three first-time founders.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>The Preneur</title><link>https://harambasic.de/experience/the-preneur</link><guid isPermaLink="true">https://harambasic.de/experience/the-preneur</guid><description>Podcast around entrepreneurship, interviewing founders of impact startups in Copenhagen. Started as &quot;Technopreneur&quot;.</description><pubDate>Fri, 01 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Co-Founder &amp;amp; Host&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Oct 2021 – Aug 2022&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;During the period when I co-founded and hosted the podcast, it was known as &quot;Technopreneur&quot;. We interviewed founders of impact startups based in Copenhagen and built our own studio, which accommodated recordings with up to four people. After producing twelve episodes we transferred ownership of the podcast, which led to the rebranding to &quot;The Preneur&quot;.&lt;/p&gt;
&lt;p&gt;Listen on &lt;a href=&quot;https://podcasts.apple.com/de/podcast/the-preneur/id1605492643?l=en&quot;&gt;Apple Podcasts&lt;/a&gt; or &lt;a href=&quot;https://open.spotify.com/show/03PwaeNcCcjYCvzQN8s3As&quot;&gt;Spotify&lt;/a&gt;, or find it on &lt;a href=&quot;https://www.linkedin.com/company/thepreneurpodcast/&quot;&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>Automatically generate social media images for Nuxt.js with a git pre-commit hook</title><link>https://harambasic.de/posts/automatically-generate-social-media-images-for-nuxtjs-with-a-git-precommit-hook</link><guid isPermaLink="true">https://harambasic.de/posts/automatically-generate-social-media-images-for-nuxtjs-with-a-git-precommit-hook</guid><description>Generate social media images for a nuxt/content project in a git pre-commit hook, this logic can be adapted to any other CMS.</description><pubDate>Sun, 18 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#intro&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Intro&lt;/h2&gt;
&lt;p&gt;For this website, I want to generate images for social media automatically every time I publish something new. The image for this post looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/automatically-generate-social-media-images-for-nuxt-js-with-a-git-pre-commit-hook/end-result.png&quot; alt=&quot;Generated social media preview with the script in this post, it  shows the title of the post&quot;&gt;&lt;/p&gt;
&lt;p&gt;There is a Nuxt.js specific article using Cloudinary by &lt;a href=&quot;https://davidparks.dev/blog/social-share-images-in-nuxt-content/&quot;&gt;David Parks&lt;/a&gt; which is based on an article by &lt;a href=&quot;https://www.learnwithjason.dev/blog/auto-generate-social-image&quot;&gt;Jason Lengstrof&lt;/a&gt;. I somehow like the idea, but for this website, I want as much control as possible and as few as possible external dependencies, especially on other servers.&lt;/p&gt;
&lt;p&gt;With these requirements, I thought about the article by &lt;a href=&quot;https://flaviocopes.com/canvas-node-generate-image/&quot;&gt;Flavio Copes&lt;/a&gt; which I used to generate Instagram posts for &lt;a href=&quot;https://techmob.show&quot;&gt;Techmob Show&lt;/a&gt;. You can even get the package on npm - &lt;a href=&quot;https://www.npmjs.com/package/@techmobshow/generate-podcast-cover&quot;&gt;@techmobshow/generate-podcast-cover&lt;/a&gt;. This uses &lt;a href=&quot;https://www.npmjs.com/package/canvas&quot;&gt;node-canvas&lt;/a&gt; which is okay, but I wouldn&apos;t use it again after a friend - &lt;a href=&quot;https://github.com/TimonLukas&quot;&gt;Timon Lukas&lt;/a&gt; - came up with the idea to use a browser automation tool. The problem with node-canvas are the dependencies, check out what &lt;a href=&quot;https://github.com/Automattic/node-canvas#compiling&quot;&gt;you have to install&lt;/a&gt;. I had a conflict between a local and global version and I wasn&apos;t able to fix it. Also, I have to do the styling programmatically, and I even need to handle multi-line text, as it isn&apos;t working out of the box.&lt;/p&gt;
&lt;p&gt;The final solution is based on &lt;a href=&quot;https://playwright.dev/&quot;&gt;Playwright&lt;/a&gt; which allows me to write and style a &lt;code&gt;template.html&lt;/code&gt;, inject the title and take a screenshot. That&apos;s what I feel comfortable with and that&apos;s fun for me.&lt;/p&gt;
&lt;h2 id=&quot;how-to-generate-the-images&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#how-to-generate-the-images&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;How to generate the images&lt;/h2&gt;
&lt;p&gt;Nuxt.js has a strongly opinionated directory structure which I like, but somehow it felt wrong to put this script which runs only locally in assets. For that, I created a scripts directory (who knows what will be automated next) where all my node scripts will live which aren&apos;t part of the website build. This is important as these scripts aren&apos;t handled by Nuxt.js which uses webpack with babel. They are executed through Node.js which means you can&apos;t use &lt;code&gt;import X from &apos;x&apos;&lt;/code&gt;, but it also allows you to use &lt;code&gt;fs&lt;/code&gt;, which means you can interact with the file system.&lt;/p&gt;
&lt;p&gt;Let us come to the interesting part, for the sake of simplicity I&apos;ll put everything in one file and explain the automatic generation in detail. On my website I have three files to get this working:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LukaHarambasic/harambasic.de/blob/main/scripts/generate-social-media-preview/util.js&quot;&gt;util.js&lt;/a&gt; - shared logic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LukaHarambasic/harambasic.de/blob/main/scripts/generate-social-media-preview/generateAutomatic.js&quot;&gt;generateAutomatic.js&lt;/a&gt; - automatic image generation for new posts and lists&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LukaHarambasic/harambasic.de/blob/main/scripts/generate-social-media-preview/generateManual.js&quot;&gt;generateManual.js&lt;/a&gt; - manual image generation by passing a title via the command line&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const { readdirSync, readFileSync } = require(&apos;fs&apos;);
const { chromium } = require(&apos;playwright&apos;);
const path = require(&apos;path&apos;);

const ROOT_PATH = process.cwd();
const SOCIAL_PATH = `${ROOT_PATH}/static/social`;
const POSTS_PATH = `${ROOT_PATH}/content/posts`;
const LISTS_PATH = `${ROOT_PATH}/content/lists`;

/*
 * Opens an HTML template, sets the title, takes a screenshot and saves it locally as png
 * @param {Page} page
 * @param {string} title
 * @param {string} slug
 */
const generateImage = async (page, title, slug) =&gt; {
	const URL = `file:///${path.join(__dirname, &apos;/template.html&apos;)}`;
	const SCREENSHOT_PATH = `${SOCIAL_PATH}/${slug}.png`;
	await page.goto(URL);
	// strange syntax, check https://playwright.dev/docs/api/class-page#page-eval-on-selector for more infos
	await page.$eval(&apos;.title&apos;, (el, title) =&gt; (el.textContent = title), title);
	const cardHandle = await page.$(&apos;.card&apos;);
	await cardHandle.screenshot({
		type: &apos;png&apos;,
		path: SCREENSHOT_PATH
	});
};

/*
 * Returns if there is an image for the given slug
 * @param {string} slug
 * @returns {boolean}
 */
const doesImageAlreadyExist = (slug) =&gt; {
	const files = readdirSync(SOCIAL_PATH);
	return files.find((file) =&gt; file.startsWith(slug));
};

/*
 * Posts and lists contain a title followed by a description in YAML
 * @nuxt/content isn&apos;t accessible so this has to be parsed manually
 * Returns the extracted title
 * @param {string} str
 * @returns {string}
 */
const getTitle = (str) =&gt; {
	const start = &apos;title: &apos;;
	const end = &apos;\ndescription: &apos;;
	return str.substring(str.indexOf(start) + start.length, str.indexOf(end));
};

/*
 * Returns meta data to a given file
 * @params {string} name
 * @params {string} basePath
 * @returns {{name|string,path|string,slug|string}} // not sure how to do this object syntax without defining a type
 */
const fileToMeta = (name, basePath) =&gt; {
	return {
		name,
		path: `${basePath}/${name}`,
		slug: name.split(&apos;.&apos;)[0]
	};
};

/*
 * Instantiate a new browser with playwright, get all potential files (lists, posts)
 * and check if there is already a social media preview image in SOCIAL_PATH
 * if not execute generateImage(), nothing will be returned
 */
const generateSocialMediaPreview = async () =&gt; {
	console.info(&apos;&gt;&gt; GENERATE SOCIAL MEDIA PREVIEWS &amp;#x3C;&amp;#x3C;&apos;);
	console.info(&apos;🆕 newly generated, 🛑 already exists&apos;);
	console.info(&apos;-------------------------------------&apos;);
	const browser = await chromium.launch();
	const page = await browser.newPage();
	const posts = readdirSync(POSTS_PATH).map((name) =&gt; fileToMeta(name, POSTS_PATH));
	const lists = readdirSync(LISTS_PATH).map((name) =&gt; fileToMeta(name, LISTS_PATH));
	const files = [...posts, ...lists];
	for (const file of files) {
		const content = readFileSync(file.path, &apos;utf8&apos;);
		const title = getTitle(content);
		if (!doesImageAlreadyExist(file.slug)) {
			console.info(&apos;🆕&apos;, title);
			await generateImage(page, title, file.slug);
		} else {
			console.info(&apos;🛑&apos;, title);
		}
	}
	await browser.close();
};

/*
 * Entry point for generateSocialMediaPreview() when this file is executed
 */
(async () =&gt; {
	try {
		await generateSocialMediaPreview();
	} catch (error) {
		console.info(&apos;Error:&apos;, error);
	}
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I would say this code is quite self-explaining, but as I have spent some time with it, I might miss something. Feel free to get in touch on &lt;a href=&quot;https://twitter.com/luka_harambasic&quot;&gt;Twitter&lt;/a&gt; if you have any questions. However, I might not forget the appropriate &lt;a href=&quot;https://github.com/LukaHarambasic/harambasic.de/blob/main/scripts/generate-social-media-preview/template.html&quot;&gt;HTML template&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;!DOCTYPE &gt;
&amp;#x3C;html lang=&quot;en&quot;&gt;
	&amp;#x3C;head&gt;
		&amp;#x3C;title&gt;Hello&amp;#x3C;/title&gt;
		&amp;#x3C;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;
		&amp;#x3C;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;
		&amp;#x3C;link
			href=&quot;https://fonts.googleapis.com/css2?family=Open+Sans:wght@700&amp;#x26;display=swap&quot;
			rel=&quot;stylesheet&quot;
		/&gt;
		&amp;#x3C;style&gt;
			* {
				box-sizing: border-box;
			}
			body {
				font-family:
					Open Sans,
					Helvetica Neue,
					Arial,
					sans-serif;
				color: #121218;
			}
			.card {
				width: 1200px;
				height: 630px;
				background: url(&apos;./template.svg&apos;) no-repeat;
				padding: 5rem;
			}
			.title {
				font-size: 5rem;
				font-weight: bold;
			}
		&amp;#x3C;/style&gt;
	&amp;#x3C;/head&gt;
	&amp;#x3C;body&gt;
		&amp;#x3C;div class=&quot;card&quot;&gt;
			&amp;#x3C;div class=&quot;title&quot;&gt;Will be replaced! Wuhu! Party :)&amp;#x3C;/div&gt;
		&amp;#x3C;/div&gt;
	&amp;#x3C;/body&gt;
&amp;#x3C;/html&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[template.html]&lt;/p&gt;
&lt;p&gt;It&apos;s super simple, directly using Google Fonts with a &lt;a href=&quot;https://github.com/LukaHarambasic/harambasic.de/blob/main/scripts/generate-social-media-preview/template.svg&quot;&gt;svg graphic as background&lt;/a&gt;. Thereby only the text has to be styled.&lt;/p&gt;
&lt;h2 id=&quot;automation&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#automation&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Automation&lt;/h2&gt;
&lt;p&gt;As I&apos;m forgetful I need to automate the generation. As titles of posts normally won&apos;t change this is a one-time job per post. Therefore, I won&apos;t want to generate this during the build step on Netlify. This step can happen locally, after a change, before I commit or push something. That&apos;s why I thought about a git pre-commit hook. Alternative a GitHub Action could be used which executes the same script and then commits the newly generated files. I stuck to the pre-commit hook for now, but with that, the odyssey began...&lt;/p&gt;
&lt;p&gt;I looked in the native git pre-commit hook and I was able to execute the file, but somehow the image generation wasn&apos;t triggered. I had the same problem with &lt;a href=&quot;https://github.com/observing/pre-commit&quot;&gt;pre-commit&lt;/a&gt; and &lt;a href=&quot;https://typicode.github.io/husky/#/&quot;&gt;husky&lt;/a&gt;. Nothing worked. So I wrote my first &lt;a href=&quot;https://stackoverflow.com/questions/68153276/git-pre-commit-hook-isnt-executed/68169136#68169136&quot;&gt;Stackoverflow question&lt;/a&gt; in a while and asked some friends, what they use and if they have an idea. The same friend who had the idea to use browser automation tools to generate the images also helped me here and found two tickets that Webstorm isn&apos;t working with git hooks (&lt;a href=&quot;https://youtrack.jetbrains.com/issue/IDEA-264817&quot;&gt;this&lt;/a&gt; and &lt;a href=&quot;https://youtrack.jetbrains.com/issue/IDEA-244581&quot;&gt;this&lt;/a&gt;). That explained why my script was never executed*. For now, I have to commit via command line and not via the Webstorm UI, but hey that is possible. During my research everybody recommended husky, so I tried it again and stuck to it. As the script was now executed the next problem occurred: newly generated files aren&apos;t committed. But Stackoverflow has already an &lt;a href=&quot;https://stackoverflow.com/a/12802592/5438990&quot;&gt;answer&lt;/a&gt; for this. You need a pre-commit and a post-commit hook, read more about this in the linked question.&lt;/p&gt;
&lt;p&gt;I only need to define a new script in my &lt;code&gt;package.json&lt;/code&gt;. This will be executed in my &lt;code&gt;post-commit&lt;/code&gt; hook and don&apos;t forget to also define a &lt;code&gt;pre-commit&lt;/code&gt; hook.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{
  ...
  &quot;scripts&quot;: {
    ...
    &quot;socialMedia:auto&quot;: &quot;node scripts/generate-social-media-preview/generateAutomatic.js&quot;,
    ...
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[package.json]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;#!/bin/sh
. &quot;$(dirname &quot;$0&quot;)/_/husky.sh&quot;

# https://stackoverflow.com/questions/3284292/can-a-git-hook-automatically-add-files-to-the-commit
touch .commit
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[.husky/pre-commit]&lt;/p&gt;
&lt;p&gt;The new script is then called here &lt;code&gt;npm run socialMedia:auto&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;#!/bin/sh
. &quot;$(dirname &quot;$0&quot;)/_/husky.sh&quot;

# https://stackoverflow.com/questions/3284292/can-a-git-hook-automatically-add-files-to-the-commit
if [ -e .commit ]
    then
    rm .commit
    npm run socialMedia:auto
    git add .
    git commit --amend -C HEAD --no-verify
fi
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[.husky/post-commit]&lt;/p&gt;
&lt;h2 id=&quot;manual&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#manual&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Manual&lt;/h2&gt;
&lt;p&gt;For some pages, which are unique like home or imprint I also need images, but automating these would be a little bit overkill. The corresponding pages don&apos;t even have the required meta data, they could, but currently, they don&apos;t have. For that, I wanted a way to generate social media previews manually by passing in a title.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{
  ...
  &quot;scripts&quot;: {
    ...
    &quot;socialMedia:manual&quot;: &quot;node scripts/generate-social-media-preview/generateManual.js&quot;,
    ...
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[package.json]&lt;/p&gt;
&lt;p&gt;You only need to add a script to your &lt;code&gt;package.json&lt;/code&gt; and then parse the arguments to retrieve the title.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const title = process.argv[2].replace(&apos;--title=&apos;, &apos;&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, execute your new command with the according title. And yes somehow the &lt;code&gt;--&lt;/code&gt; is needed, I just accepted it and didn&apos;t ask why.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;npm run socialMedia:manual -- --title=&quot;Your preferred title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Webstorm does some strange things. I&apos;m a big fan of the JetBrain IDEs but didn&apos;t consider that they would change the default behavior of git.* But in the end, it works quite well, I learned a lot and I&apos;ll consider husky also for some other projects. Playwright showed again why I fall in love with it and why I&apos;ll use it for every browser automation project I have. Finally, I also got an idea for another approach: GitHub Actions. But that&apos;s something for another post.&lt;/p&gt;
&lt;p&gt;*currently it&apos;s working with commits via the UI&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>Build a custom search engine in your browser</title><link>https://harambasic.de/posts/build-a-custom-search-engine-in-your-browser</link><guid isPermaLink="true">https://harambasic.de/posts/build-a-custom-search-engine-in-your-browser</guid><description>I show you why custom search engines in your browser are a nice tool and how I use them.</description><pubDate>Sun, 20 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#intro&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Intro&lt;/h2&gt;
&lt;p&gt;A friend - &lt;a href=&quot;https://www.linkedin.com/in/sebastian-furkert/&quot;&gt;Sebastian Furkert&lt;/a&gt; - showed me this little trick during our studies. With this, you can build your own search engine. Okay, that might sound a little over the top, but basically, that&apos;s what you&apos;re doing. If you often search on the same websites this can save you a lot of time.&lt;/p&gt;
&lt;p&gt;From my point of view, there are two use cases: search and find. I would define searching that you are open for the outcome and don&apos;t know what to expect. You want to find something if you are looking for something specific, something expected, something with an identifier.&lt;/p&gt;
&lt;p&gt;There are many other ways how you can achieve this, but if you are signed-in in Chrome your search engines will be synced across multiple devices. You could use Keyboard Maestro (macOS) or Auto Hotkey (Window) to trigger something like this from everywhere.&lt;/p&gt;
&lt;h2 id=&quot;examples&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#examples&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Examples&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/posts/custom-search-engines-in-your-browser/usage.gif&quot; alt=&quot;GIF: Use custom search engine in Google Chrome&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;search&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#search&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Search&lt;/h3&gt;
&lt;p&gt;A selection of websites where you search. I use some of them almost daily and others are here to show you what&apos;s possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Translation services
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dict.cc/&quot;&gt;dict.cc&lt;/a&gt;*&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.deepl.com/&quot;&gt;DeepL&lt;/a&gt;*&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Documentations
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/&quot;&gt;MDN Web Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/&quot;&gt;Android Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Misc
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/&quot;&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;find&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#find&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Find&lt;/h3&gt;
&lt;p&gt;If you have a unique identifier you can find it. I don&apos;t even want to know how much time the Jira shortcut has saved me in the last year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tickets/Issues
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/de/software/jira&quot;&gt;Jira&lt;/a&gt;*&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;*I use this multiple times a week.&lt;/p&gt;
&lt;h2 id=&quot;how-to-add-a-custom-search-engines&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#how-to-add-a-custom-search-engines&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;How to add a custom search engines&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/posts/custom-search-engines-in-your-browser/add.gif&quot; alt=&quot;GIF: Add a new custom search engine to Google Chrome&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click in the URL bar (not sure how to name the thing where you put the URL)&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;Manage search engines...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;Add&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;Set a &lt;code&gt;Search engine&lt;/code&gt; title, e.g. &lt;code&gt;GitHub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set a &lt;code&gt;Keyword&lt;/code&gt; to trigger your search engine, e.g. &lt;code&gt;gh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set a &lt;code&gt;URL with %s in place of query&lt;/code&gt; and replace the search term by &lt;code&gt;%s&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;That&apos;s it!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can use every website which reflects search results or identifiers in the URL. There are examples where you can&apos;t use this as the search is only an overlay and won&apos;t manipulate the URL, e.g. &lt;a href=&quot;https://vuejs.org/v2/guide/&quot;&gt;https://vuejs.org/v2/guide/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/custom-search-engines-in-your-browser/firefox.png&quot; alt=&quot;Firefox search engine shortcuts&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can use the same concept on Firefox it&apos;s just called &lt;strong&gt;Search Shortcuts&lt;/strong&gt;.&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>My perfect Home-Office Conference Call &amp; Podcasting Setup</title><link>https://harambasic.de/posts/my-perfect-homeoffice-conference-call-podcasting-setup</link><guid isPermaLink="true">https://harambasic.de/posts/my-perfect-homeoffice-conference-call-podcasting-setup</guid><description>Overview for my perfect Homeoffice Conference Call &amp; Podcasting Setup.</description><pubDate>Sun, 18 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#intro&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Intro&lt;/h2&gt;
&lt;p&gt;A friend had the idea for our podcast &lt;a href=&quot;https://techmob.show&quot;&gt;Techmob Show&lt;/a&gt; (german). I got one requirement before we would start the first recording: get a new microphone. During this time a colleague also stepped up his camera game which got me thinking. And so one thing led to another...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/my-perfect-homeoffice-conference-call-and-podcasting-setup/setup_overview.jpg&quot; alt=&quot;Desk with camera, ring light, display, microphone with an arm, stream deck and MacBook.&quot;&gt;&lt;/p&gt;
&lt;p&gt;A lot of the following can be achieved a lot cheaper. But in this kind of area, I prefer plug-and-play solutions. Besides, that I had one hard requirement: USB-C. The hardware I bought should last some years, and I don&apos;t want to be annoyed in two years that I have to use a USB-A to USB-C adapter.&lt;/p&gt;
&lt;h2 id=&quot;laptops-dock--monitor&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#laptops-dock--monitor&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Laptops, Dock &amp;#x26; Monitor&lt;/h2&gt;
&lt;p&gt;My setup has to work with my private MacBook 15&quot; (Mid 2014) and my business MacBook 16&quot; (2019). The ports are the major difference, basically from everything you need to USB-C. As I spend most of my time working at this desk I focused on my business MacBook which is connected to the &lt;a href=&quot;https://www.belkin.com/us/p/P-F4U097/&quot;&gt;Belkin Thunderbolt 3 Dock Pro Hub&lt;/a&gt; via one cable, which is quite convenient compared with the previous dongle setup. Mouse &amp;#x26; Keyboard connect in both cases via Bluetooth. The 2019 MacBook connects to the Samsung display (Samsung SE790C Display) over the dock via DisplayPort, which leaves HDMI for the 2014 MacBook. That&apos;s my first widescreen display and I bought it used from a friend. If you compare it with Retina Displays you see a difference, especially at text. Staring at this display by consuming or producing text I really would like to step up this part of my setup. Overall a widescreen monitor is just nice and comes in very handy for Pull Request reviews.&lt;/p&gt;
&lt;h2 id=&quot;streamdeck&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#streamdeck&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Streamdeck&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.elgato.com/en/stream-deck&quot;&gt;Elgato Streamdeck&lt;/a&gt; (150 €)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before I even bought the microphone I wanted to play with an &lt;a href=&quot;https://www.elgato.com/en/stream-deck&quot;&gt;Elgato Streamdeck&lt;/a&gt; to speed up some repetitive tasks. Alternatives to this would be an external number pad or the &lt;a href=&quot;https://github.com/FreeYourStream/freedeck-ino&quot;&gt;FreeDeck&lt;/a&gt; (&lt;a href=&quot;https://www.youtube.com/watch?v=-3Zw8hbpVq4&quot;&gt;Video&lt;/a&gt;).
A friend of mine already used a Streamdeck, mainly for ABAP programming. He mentioned that it&apos;s only a gadget, though a nice one.
After two months of use I have to admit he was right, but I use, it multiple times daily. Some of my most used actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Start/Stop Spotify&lt;/em&gt;: If I get called via Microsoft Teams and press Play/Stop on my keyboard it pauses the ringtone but not Spotify. With a Plugin I stop Spotify directly without going over the system audio. A very small convenience, but I would not want to miss it anymore.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Open Jira Filters and Boards&lt;/em&gt;: A lot of my work happens in Jira where I have some Boards and Filters I visit multiple times a day.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Control my Elgato Ring Light&lt;/em&gt;: I sometimes change the brightness or Kelvin depending on the sunlight, but most of the time I want my default preset.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Shortcuts for my IDEs (Android Studio, Webstorm)&lt;/em&gt;: There are just some shortcuts I can&apos;t remember, especially around Git (Git with UI tools &amp;#x3C;3). I created custom shortcuts to not interfere with existing ones and bound them to the Streamdeck, e.g. Fetch, Pull, Clean, Build.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Run Commands&lt;/em&gt;: Mainly used while testing and reviewing some Android PRs, e.g. open language or time settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this is still pretty basic and I would like to do even more with it.&lt;/p&gt;
&lt;h2 id=&quot;microphone&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#microphone&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Microphone&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://en.rode.com/microphones/nt-usb_mini&quot;&gt;Rode NT-USB Mini&lt;/a&gt; (100 €)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of the goals was to not spend a fortune but still have a significantly better quality than my AirPod Pros. I also wanted a stand as I wasn&apos;t certain if I want to spend extra 20 € on an arm, and I can tell you: get an arm for your microphone. Otherwise, it&apos;s quite annoying as it&apos;s always in the way, and you are too far away to get a nice audio quality. It&apos;s still nice to have a microphone with an integrated stand as I can change locations, which is relevant for our podcast recordings. With all that in mind, I went for the &lt;a href=&quot;https://en.rode.com/microphones/nt-usb_mini&quot;&gt;Rode NT-USB Mini&lt;/a&gt; and until now, I only got compliments about the sound quality. To be honest, 50% of the sound is the microphone arm, it just sounds more professional if you see this in my webcam image. If you don&apos;t need a built-in stand you should check out the &lt;a href=&quot;https://en.rode.com/microphones/podcaster&quot;&gt;Rode Podcaster&lt;/a&gt;. As an alternative, I would go for some wired headphones with a microphone.&lt;/p&gt;
&lt;h2 id=&quot;light&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#light&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Light&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.elgato.com/en/ring-light&quot;&gt;Elgato Ring Light&lt;/a&gt; (200 €)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was quickly certain that I want a Ring Light as I don&apos;t want to do a full-blown light setup, and I like the look of a Ring Light. I may also have been influenced by the video &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=cmWhMVjlpB8&quot;&gt;Elgato&apos;s new Ringlight. But for whom?&lt;/a&gt;&quot; (german). Most cheap Ring Lights come with a Tripod and in my current setup, this doesn&apos;t make any sense. I&apos;m also thinking about getting a height-adjustable table, so I only wanted to go with a table clamp. For me, someone who knows nothing about light, I was struggling to pay so much money for something banal like light. I went for this light because it was convenient, and I was pretty confident the quality will be right. As an alternative, you can use a reading lamp or turn your desk to your window so that you benefit from natural light. Or maybe the &lt;a href=&quot;https://www.razer.com/gb-en/streaming-accessories/razer-ring-light/RZ19-03660100-R3M1&quot;&gt;Razer Ring Light&lt;/a&gt; is something for you with 90 €.&lt;/p&gt;
&lt;h2 id=&quot;camera&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#camera&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Camera&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.logitech.com/de-de/products/webcams/streamcam.960-001281.html&quot;&gt;Logitech Streamcam&lt;/a&gt; (160 €)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Like most people in Home-Office I used my built-in laptop camera and to honest the first half of the year I never turned it on. In the meantime, my opinion changed and I think everyone should turn on their cameras. It still doesn&apos;t replace a real meeting, but it brings you a little closer. Most of the time the built-in camera is very unfavorable as it records your nostrils has a poor low light performance and a bad resolution.&lt;/p&gt;
&lt;p&gt;My first idea was to use my smartphone, as it can record in 4K, and I always have it with me, and thanks to the &lt;a href=&quot;https://www.elgato.com/en/epoccam&quot;&gt;Elgato EpocCam Pro App&lt;/a&gt; it&apos;s not even a problem. There is one thing I mentioned, in the beginning, I want a plug-and-play solution. Yes, this setup is straightforward, but I have to set it up multiple times a day, every day. That&apos;s not what I imagine, and I hoped to solve it with my next idea: using my &lt;a href=&quot;https://gopro.com/en/us/shop/cameras/hero8-black/CHDHX-801-master.html&quot;&gt;GoPro Hero 8 Black&lt;/a&gt;. Also, this works okay, but the software to use your GoPro as a Webcam is very buggy, every morning I had to do some of the following stuff (in random order): restart GoPro, unplug the cable, restart the program, unplug &amp;#x26; shutdown GoPro, start the program without the GoPro being connected. The image quality was good, and I gained the freedom to move my laptop wherever I want. Before this, it was positioned under my widescreen monitor, now he is to the right of my display.&lt;/p&gt;
&lt;p&gt;During this time the previously mentioned colleague bought a used camera where you can apply different lenses. I have to admit his image quality is awesome, with a natural Bokeh effect. To achieve this, he had to hack his camera which runs Android 2 and that was something I didn&apos;t want to do.&lt;/p&gt;
&lt;p&gt;With this, I had two options left: 1) a new SLR camera which can be easily used as a webcam 2) a top webcam. Option one starts at 500 € without a lens and option two ends at around 250 €. Having in mind that I use it mainly for video calls the decision was easy, but then I had to decide on a webcam. Three have been shortlisted: &lt;a href=&quot;https://www.logitech.com/de-de/products/webcams/streamcam.960-001281.html&quot;&gt;Logitech Streamcam&lt;/a&gt; (160 €), &lt;a href=&quot;https://www.logitech.com/en-gb/products/webcams/brio-4k-hdr-webcam.960-001106.html&quot;&gt;Brio Ultra-HD Pro Business-Webcam&lt;/a&gt; (240 €), &lt;a href=&quot;https://www.razer.com/gb-en/streaming-cameras/razer-kiyo/RZ19-02320100-R3U1&quot;&gt;Razer Kiyo&lt;/a&gt; (110 €).&lt;/p&gt;
&lt;p&gt;I watched some comparison videos to get an understanding of the differences and to find the image I like the most and is worth the money. The winner is the Logitech Streamcam: USB-C cable (unfortunately firmly attached), mid-range price (got it for 120 €), 1/4&quot; mounting thread.&lt;/p&gt;
&lt;p&gt;Most 25 € Full-HD webcams would almost look the same on a small square in your favorite video call software, e.g. &lt;a href=&quot;https://www.aukey.com/products/fhd-webcam-1080p-live-streaming-camera-with-stereo-microphone&quot;&gt;this one&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sampels&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#sampels&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Sampels&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Audio
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/1jPfFNk7pl9RGhFwLPKQDO-qPcwzv1duZ/view?usp=sharing&quot;&gt;Apple Airpod Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/1F_qAQfunPNawBvkAo05kAmx9L-KjkRF6/view?usp=sharing&quot;&gt;Apple Macbook Pro 16&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/1huQ1thtXkuRGjaaytHFkYUU_l8ebZZaR/view?usp=sharing&quot;&gt;Rode NT USB Mini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elgato Ringlight
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/sezazYiPF1U&quot;&gt;Room Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/RmJOWQRzV0g&quot;&gt;Warm Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/-EFDw52akpk&quot;&gt;Cold Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/FjO4sqxct2o&quot;&gt;Default Light&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/v9BVyhclOtk&quot;&gt;Overall Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I had a lot of fun dealing with the topic so it was totally worth it. For now, I have the perfect setup for my requirements. All of this could be a lot cheaper, but this would require more tinkering and is probably not as convenient as this setup. Having a setup like this is for me mainly about fun. I&apos;m still not a streamer or content creator who needs this. No matter how much you want to spend there are two small points you can always follow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Always use a headset&lt;/em&gt;: It can be quite annoying if your counterparts hear themselves in your microphone. Think about a long conference call...&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Turn on your camera&lt;/em&gt;: Not only in these remote times it is nice to see your counterpart. Be the counterpart you would also like to have.
If you want to get a more expensive inspiration I recommend the video &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=rnZ-FHfrpAM&quot;&gt;Next Level Video Calls | Best Homeoffice Setup Money Can Buy&lt;/a&gt;&quot; from Christoph Magnussen.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;I only linked to the manufactures, most of the time it&apos;s more expensive than other retailers. So please check the prices :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks to all my colleagues and friends who had to endure me during the trial and error phase.&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>Docker Compose for NextCloud with Traefik 2 (SSL)</title><link>https://harambasic.de/posts/docker-compose-for-nextcloud-with-traefik-2-ssl</link><guid isPermaLink="true">https://harambasic.de/posts/docker-compose-for-nextcloud-with-traefik-2-ssl</guid><description>I faced some problems to set up NextCloud with Traefik and that&apos;s why I share my docker-compose.yml.</description><pubDate>Wed, 13 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#intro&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Intro&lt;/h2&gt;
&lt;p&gt;I set up &lt;a href=&quot;https://traefik.io/&quot;&gt;Traefik 2&lt;/a&gt; on a &lt;a href=&quot;https://www.netcup.eu/vserver/vps.php#v-server-details&quot;&gt;VServer at Netcup&lt;/a&gt; mainly to use &lt;a href=&quot;https://nextcloud.com/&quot;&gt;Nextcloud&lt;/a&gt;. Since I am neither Docker nor Traefik or NextCloud expert it took some time to set up everything as most of the &lt;code&gt;docker-compose.yml&lt;/code&gt; files I found weren&apos;t working. So here is my short story about setting up NextCloud.&lt;/p&gt;
&lt;h2 id=&quot;complete-docker-composeyml&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#complete-docker-composeyml&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Complete &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml[docker-compose.yml]&quot;&gt;version: &apos;3.7&apos;

services:

  db:
    image: mariadb:latest
    container_name: nextcloud_db
    volumes:
      - nextcloud-db:/var/lib/mysql
    networks:
      - default
    restart: always
    environment:
      TZ: UTC
      MYSQL_ROOT_PASSWORD: SUPER_SECRET
      MYSQL_DATABASE: db
      MYSQL_USER: admin
      MYSQL_PASSWORD: SUPER_SUPER_SECRET

  redis:
    image: redis:latest
    container_name: nextcloud_redis
    restart: always
    networks:
      - default
    volumes:
      - nextcloud-redis:/var/lib/redis

  nextcloud:
    depends_on:
      - redis
      - db
    image: nextcloud:stable
    container_name: nextcloud
    volumes:
      - nextcloud-data:/var/www/html
    networks:
      - web
      - default
    restart: always
    labels:
      - traefik.http.routers.nextcloud.middlewares=nextcloud,nextcloud_redirect
      - traefik.http.routers.nextcloud.tls=true
      - traefik.http.routers.nextcloud.tls.certresolver=lets-encrypt
      - traefik.http.routers.nextcloud.rule=Host(`cloud.YOUR-DOMAIN.com`)
      - traefik.http.middlewares.nextcloud.headers.customFrameOptionsValue=ALLOW-FROM https://YOUR-DOMAIN.com
      - traefik.http.middlewares.nextcloud.headers.contentSecurityPolicy=frame-ancestors &apos;self&apos; YOUR-DOMAIN.com *.YOUR-DOMAIN.com
      - traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011
      - traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true
      - traefik.http.middlewares.nextcloud.headers.stsPreload=true
      - traefik.http.middlewares.nextcloud.headers.customresponseheaders.X-Frame-Options=SAMEORIGIN
      - traefik.http.middlewares.nextcloud_redirect.redirectregex.permanent=true
      - traefik.http.middlewares.nextcloud_redirect.redirectregex.regex=https://(.*)/.well-known/(card|cal)dav
      - traefik.http.middlewares.nextcloud_redirect.redirectregex.replacement=https://$${1}/remote.php/dav/
    environment:
      REDIS_HOST: redis
      MYSQL_HOST: db:3306
      MYSQL_DATABASE: db
      MYSQL_USER: admin
      MYSQL_PASSWORD: SUPER_SUPER_SECRET
      TRUSTED_PROXIES: 172.18.0.1

networks:
  web:
    external: true

volumes:
  nextcloud-data:
  nextcloud-db:
  nextcloud-redis:
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;test-your-set-up-and-security&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#test-your-set-up-and-security&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Test your set up and security&lt;/h2&gt;
&lt;p&gt;After you fired up your Nextcloud you should check if everything is working as expected. NextCloud offers two ways to help you with that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Settings &gt; Administration &gt; Overview&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scan.nextcloud.com/&quot;&gt;Security check&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/posts/docker-compose-for-nextcloud-with-traefik-2-ssh/security_setup_warnings.png&quot; alt=&quot;Nextcloud administration overview&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;usage-of-caldav-and-carddav&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#usage-of-caldav-and-carddav&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Usage of calDav and cardDav&lt;/h2&gt;
&lt;p&gt;It&apos;s quite easy if you use the &lt;code&gt;docker-compose.yml&lt;/code&gt; above. You need your domain, your user and as it is recommended an app password (Settings &gt; Security &gt; &quot;Create new app password&quot;). With these credentials you can go to every client which supports calDav/cardDav. In the screenshot below you can see a calDav set up in the iOS settings.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server: cloud.YOUR-DOMAIN.com&lt;/li&gt;
&lt;li&gt;User: user&lt;/li&gt;
&lt;li&gt;Password: app password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/posts/docker-compose-for-nextcloud-with-traefik-2-ssh/iphone_caldav.png&quot; alt=&quot;iPhone settings calDav example&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;all-the-links-i-found-and-read&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#all-the-links-i-found-and-read&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;All the links I found and read&lt;/h2&gt;
&lt;p&gt;I spent some hours in setting up all of these, here is a list with all the links I used. The DigitalOcean Tutorials are just awesome and as far as I can tell are always up to date. I only would start Traefik as a &lt;code&gt;docker-compose.yml&lt;/code&gt; to be consistent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server&lt;/strong&gt;: &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04&quot;&gt;Initial Server Setup with Ubuntu 20.04&lt;/a&gt;, &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-20-04&quot;&gt;How to Set Up SSH Keys on Ubuntu 20.04&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traefik&lt;/strong&gt;: &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-traefik-v2-as-a-reverse-proxy-for-docker-containers-on-ubuntu-20-04&quot;&gt;How To Use Traefik v2 as a Reverse Proxy for Docker Containers on Ubuntu 20.04&lt;/a&gt;, &lt;a href=&quot;https://mwunderling.com/blog/traefik2.html&quot;&gt;Traefik 2.x configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NextCloud Docker (with Traefik)&lt;/strong&gt;: &lt;a href=&quot;https://github.com/WhiteBahamut/nextcloud&quot;&gt;WhiteBahamut/nextcloud&lt;/a&gt;, &lt;a href=&quot;https://github.com/nextcloud/docker&quot;&gt;nextcloud/docker&lt;/a&gt;, &lt;a href=&quot;https://chriswiegman.com/2020/01/running-nextcloud-with-docker-and-traefik-2/&quot;&gt;Running Nextcloud With Docker and Traefik 2&lt;/a&gt;, &lt;a href=&quot;https://mattsch.com/2020/01/16/notes-on-traefik-v2-nextcloud-etc/&quot;&gt;Notes on traefik v2, Nextcloud, etc.&lt;/a&gt;, &lt;a href=&quot;https://gist.github.com/ismailyenigul/f03b4f5f15e5e61ac5b80905c5d2890a&quot;&gt;ismailyenigul/nextcloud-pgsql-redis-traefikv2-docker-compose.yml&lt;/a&gt;, &lt;a href=&quot;https://github.com/CVJoint/traefik2/blob/master/ymlfiles/nextcloud.yml&quot;&gt;CVJoint/traefik2&lt;/a&gt;, &lt;a href=&quot;https://github.com/pamendoz/personalDockerCompose/blob/master/docker-compose.yml&quot;&gt;pamendoz/personalDockerCompose&lt;/a&gt;, &lt;a href=&quot;https://florianfranke.dev/posts/2018/10/self-hosted-nextcloud-using-docker/&quot;&gt;Self Hosted Nextcloud Using Docker&lt;/a&gt;, &lt;a href=&quot;https://help.nextcloud.com/t/cannot-make-https-work-properly-with-docker-traefik-v-2/88541&quot;&gt;Cannot make https work properly with Docker + Traefik v.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NextCloud problems&lt;/strong&gt;: &lt;a href=&quot;https://help.nextcloud.com/t/nextcloud-really-slow-after-installation/74719/6&quot;&gt;Nextcloud really slow after installation&lt;/a&gt;, &lt;a href=&quot;https://help.nextcloud.com/t/help-add-a-carddav-account-to-macos/37253&quot;&gt;[Help] Add a carddav account to macOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>Posts</category></item><item><title>Add GitHub Actions for testing &amp; linting to your repository</title><link>https://harambasic.de/posts/add-github-actions-for-testing-linting-to-your-repository</link><guid isPermaLink="true">https://harambasic.de/posts/add-github-actions-for-testing-linting-to-your-repository</guid><description>GitHub Actions are easy to configure and should be used in all npm/yarn based projects.</description><pubDate>Mon, 21 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;why-should-you-add-this-github-actions-to-your-repositories&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#why-should-you-add-this-github-actions-to-your-repositories&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Why should you add this GitHub Actions to your repositories?&lt;/h2&gt;
&lt;p&gt;GitHub Actions are there to automate workflows directly in GitHub without the need of setting up a full-blown CI/CD pipeline. You can just use them by adding a file to your root directory. Also, the &lt;a href=&quot;https://github.com/pricing&quot;&gt;pricing&lt;/a&gt; is very accommodating. I think I won&apos;t run into the limits with my private projects especially as there aren&apos;t limitations for public repositories.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/adding-github-actions-for-testing-linting-to-all-my-repositories/checks_passed.png&quot; alt=&quot;Passing GitHub Action Workflow with a successful build on a PR&quot;&gt;&lt;/p&gt;
&lt;p&gt;During the time I worked on the &lt;a href=&quot;https://www.coronawarn.app/en/&quot;&gt;german Corona-Warn-App&lt;/a&gt; I noticed how powerful a CI/CD pipeline is. Therefore, it was clear to me that I want such a safety net for myself. If I&apos;m rushing something or think it&apos;s just a quick fix I would love to see this in the PR and not in production. With these two small checks executed for every PR I&apos;ll spot errors more easily. It also opens up the possibilities for collaborations, as everybody has to fulfill the same checks.&lt;/p&gt;
&lt;h2 id=&quot;adding-github-actions&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#adding-github-actions&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Adding GitHub Actions&lt;/h2&gt;
&lt;h3 id=&quot;prerequisites-in-packagejson&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#prerequisites-in-packagejson&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Prerequisites in package.json&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Check the name of the scripts you want to be executed. In this example, I want to run &lt;code&gt;test&lt;/code&gt; &amp;#x26; &lt;code&gt;lint&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json[package.json]&quot;&gt;{
...
&quot;scripts&quot;: {
    &quot;serve&quot;: &quot;vue-cli-service serve&quot;,
    &quot;build&quot;: &quot;vue-cli-service build&quot;,
    &quot;test&quot;: &quot;vue-cli-service test:unit&quot;,
    &quot;lint&quot;: &quot;vue-cli-service lint&quot;
  }
...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;(Optional) Let &lt;code&gt;build&lt;/code&gt; fail if &lt;code&gt;test&lt;/code&gt; or &lt;code&gt;lint&lt;/code&gt; don&apos;t succeed, for that you need to chain the checks with &lt;code&gt;&amp;#x26;&lt;/code&gt; and the final build step with &lt;code&gt;&amp;#x26;&amp;#x26;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;build&quot;: &quot;npm run lint &amp;#x26; npm run test &amp;#x26;&amp;#x26; vue-cli-service build&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;how-does-the-build-fails-and-why&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#how-does-the-build-fails-and-why&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;How does the build fails and why?&lt;/h4&gt;
&lt;p&gt;&quot;Because npm scripts are spawning a shell process under the hood [...]&quot; (&lt;a href=&quot;https://corgibytes.com/blog/2017/04/18/npm-tips/&quot;&gt;Corgibytes, Kamil Ogórek&lt;/a&gt;) we can use the bash syntax to run our scripts with some additional logic. In this case we are using &lt;code&gt;&amp;#x26;&lt;/code&gt; to run commands in parallel and &lt;code&gt;&amp;#x26;&amp;#x26;&lt;/code&gt; to run commands sequentially (&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Lists.html&quot;&gt;more details&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This means if &lt;code&gt;npm run build&lt;/code&gt; is executed by your build pipeline (e.g. &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; or &lt;a href=&quot;https://vercel.com/dashboard&quot;&gt;Vercel&lt;/a&gt;) it runs the first two commands in parallel and only if they succeed the build will be started.&lt;/p&gt;
&lt;p&gt;It&apos;s redundant as the GitHub Actions run in parallel to the build task, and the results aren&apos;t used for the build. This means the checks happens once on the GitHub Action and a second time on the build. However, since I don&apos;t want a build with lint errors or failing tests I&apos;m okay with this redundancy. It looks like I&apos;m not the only one with this requirement (&lt;a href=&quot;https://github.com/vercel/vercel/discussions/4589&quot;&gt;here&lt;/a&gt; &amp;#x26; &lt;a href=&quot;https://github.com/vercel/vercel/discussions/5420&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&quot;implementation&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#implementation&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Implementation&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/posts/adding-github-actions-for-testing-linting-to-all-my-repositories/checks_failed.png&quot; alt=&quot;GitHub Action - Pull request with a failed test job which lead to a failing build&quot;&gt;&lt;/p&gt;
&lt;p&gt;Just add the following file to your root directory in &lt;code&gt;.github/workflows/&lt;/code&gt;. The name attributes are visible in the PR (see image). You only have to change the last line per job if you want to run something else, e.g. &lt;a href=&quot;https://www.cypress.io/&quot;&gt;Cypress&lt;/a&gt;. So it&apos;s quite easy to adapt it to every other project even if my examples are based on &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt; and &lt;a href=&quot;https://nuxtjs.org/&quot;&gt;Nuxt.js&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://harambasic.de&quot;&gt;harambasic.de&lt;/a&gt; → only &lt;a href=&quot;https://github.com/LukaHarambasic/harambasic.de/pull/22/files#diff-107e910e9f2ebfb9a741fa10b2aa7100cc1fc4f5f3aca2dfe78b905cbd73c0d2&quot;&gt;lint&lt;/a&gt; was added (with this post) as I don&apos;t have tests until now&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jura.education&quot;&gt;jura.education&lt;/a&gt; → &lt;a href=&quot;https://github.com/LukaHarambasic/jura.education/pull/6/files#diff-3ea54af4839eb75404d71b28252bead7e7ec8f676b1f815e1cde02629a75c165&quot;&gt;checks&lt;/a&gt; with a lint and test job were added&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml[.github/workflows/checks.yml]&quot;&gt;name: Checks
on: push
jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: npm install
      - run: npm run lint
  test:
    name: Test (jest)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: npm install
      - run: npm run test
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;My initial commit with these actions was rejected from GitHub as my personal access token in Webstorm didn&apos;t have the permissions to push workflows. So you may need to create a new token for your GitHub client.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#conclusion&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I started adding the above workflow to &lt;a href=&quot;http://jura.education&quot;&gt;jura.education&lt;/a&gt; (&lt;a href=&quot;https://github.com/LukaHarambasic/jura.education/pull/6&quot;&gt;PR&lt;/a&gt;) and with this post the lint workflow will be added to this website. From here I will add the workflows piece by piece to all my repositories.&lt;/p&gt;
&lt;p&gt;I think it&apos;s a super simple way to enhance your code quality for no cost. So let&apos;s give it a try, even for small personal projects.&lt;/p&gt;</content:encoded><category>Posts</category></item><item><title>Almost free setup for NGOs, startups and side projects</title><link>https://harambasic.de/posts/almost-free-setup-for-ngos-startups-and-side-projects</link><guid isPermaLink="true">https://harambasic.de/posts/almost-free-setup-for-ngos-startups-and-side-projects</guid><description>I want to inspire you how you can set up a professional working environment for your next idea with almost no money.</description><pubDate>Wed, 09 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;whats-this-post-about&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#whats-this-post-about&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;What&apos;s this post about?&lt;/h2&gt;
&lt;p&gt;I want to inspire you how you can set up a professional working environment for your next idea with almost no money. To give you a concrete example: I&apos;ll talk over our set up at &lt;a href=&quot;https://active-ambassadors.org&quot;&gt;Active Ambassadors&lt;/a&gt;. All my knowledge, which I have acquired over the last years, has flown into this.&lt;/p&gt;
&lt;p&gt;This post targets someone who has no idea what he/she is doing but also should inspire people with similar setups. Let me know if you have ideas how I can improve this setup even more (&lt;a href=&quot;mailto:hi@harambasic.de&quot;&gt;E-Mail&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/luka_harambasic&quot;&gt;Twitter&lt;/a&gt;). 🙂&lt;/p&gt;
&lt;p&gt;Before we start you should have this points in mind while reading this post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We don&apos;t want to spend money on our IT setup, our goal is to raise awareness for NGOs.&lt;/li&gt;
&lt;li&gt;We work 100% remotely, some of us haven&apos;t even met!&lt;/li&gt;
&lt;li&gt;This post isn&apos;t only there to list the tools, it&apos;s about the stuff we are really using.&lt;/li&gt;
&lt;li&gt;I would follow the same setup the same for a (digital) company, club or side project.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;whats-active-ambassadors&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#whats-active-ambassadors&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;What&apos;s Active Ambassadors?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://active-ambassadors.org/&quot;&gt;Active Ambassadors&lt;/a&gt; is an organization founded by Leonard Schwier and myself. The idea was to raise awareness for NGOs with the skills we have developed over the last years. For that, we&apos;ll send our active ambassadors DIY kits to iron a logo of a NGO of their choice on a jersey. To accomplish this, our team grew as Julia &amp;#x26; Julia joined our journey ❤️&lt;/p&gt;
&lt;p&gt;We don&apos;t make a profit. Currently we pay most of it ourselves. You can see all expenses and income on our &lt;a href=&quot;https://active-ambassadors.org/transparency&quot;&gt;transparency page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Feel free to send us &lt;a href=&quot;mailto:luka@active-ambassadors.org&quot;&gt;an email&lt;/a&gt; or a message on &lt;a href=&quot;https://www.instagram.com/active_ambassadors/&quot;&gt;Instagram&lt;/a&gt; if you have any questions!&lt;/p&gt;
&lt;h2 id=&quot;the-tools-we-use&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#the-tools-we-use&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;The tools we use&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/posts/almost-free-setup-for-ngos-startups-and-side-projects/operations_flow.png&quot; alt=&quot;Flow of all the tools we use&quot;&gt;&lt;/p&gt;
&lt;p&gt;As I&apos;m a big fan of structured content I split our tools into four categories: (1) Communication, (2) Operations, (3) Marketing and (4) Website. I&apos;ll shortly go over them and explain how we use them. We are using all of these tools in the free tier, we only have to pay for the domain &amp;#x26; emails. If you are a registered NGO you even can use some premium tiers for free, e.g. on &lt;a href=&quot;https://slack.com/intl/en-de/help/articles/204368833-Apply-for-the-Slack-for-Nonprofits-discount&quot;&gt;Slack&lt;/a&gt; or &lt;a href=&quot;https://www.google.com/nonprofits/offerings/g-suite/&quot;&gt;Google&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;communication&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#communication&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Communication&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Tools: Slack, Google Meet&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Our main communication tool is &lt;a href=&quot;https://slack.com/intl/en-de/&quot;&gt;Slack&lt;/a&gt;, since we are a rather young team and grew up with messaging solutions no one had a problem to adapt it. I&apos;m personally also a big fan of separating communications, e.g. I don&apos;t want to have discussions about Active Ambassadors mixed up with my private chats in WhatsApp.&lt;/p&gt;
&lt;p&gt;As we use &lt;a href=&quot;https://calendar.google.com/&quot;&gt;Google Calendar&lt;/a&gt; for invitations &lt;a href=&quot;https://meet.google.com/&quot;&gt;Google Meet&lt;/a&gt; was a natural fit for our calls.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/almost-free-setup-for-ngos-startups-and-side-projects/slack.png&quot; alt=&quot;Slack Overview&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see we follow some simple naming conventions, to be honest they are a little overkill, but I&apos;m used to it and I like conventions. These are inspired directly by &lt;a href=&quot;https://slack.com/intl/en-de/blog/collaboration/how-to-use-slack-channels-to-organize-your-work&quot;&gt;Slack&lt;/a&gt; and I used them in several teams. They just work even if everybody needs some time to get used to it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;a-announcements:&lt;/strong&gt; Announcement channels are used to share some information with the whole workspace, e.g. about the christmas party or an all-hands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;b-bots&lt;/strong&gt;: These channels are primarily used by bots which only share updates, e.g. a new comment on instagram, a new order or a closed deal in a CRM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p-projects:&lt;/strong&gt; These are not only for projects as they are &lt;a href=&quot;https://en.wikipedia.org/wiki/Project#Formal_definition_in_the_project-management_realm&quot;&gt;defined&lt;/a&gt;, they also can be use as cross-team communication channels, e.g. for an event organization where multiple teams are needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;r-random:&lt;/strong&gt; Just stuff that doesn&apos;t fit in any other channel, e.g. you can create one for a &lt;a href=&quot;https://en.wikipedia.org/wiki/Progressive_dinner&quot;&gt;running dinner&lt;/a&gt; where everybody can share there meals without spamming other channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other workspaces I also used &lt;strong&gt;t-teams&lt;/strong&gt; and &lt;strong&gt;h-help&lt;/strong&gt; but for us this isn&apos;t currently needed as we are a small team.&lt;/p&gt;
&lt;h3 id=&quot;operations&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#operations&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Operations&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Tools: Airtable, IFTTT&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We moved from &lt;a href=&quot;https://www.google.com/sheets/about/&quot;&gt;Google Sheets&lt;/a&gt; to &lt;a href=&quot;https://airtable.com/&quot;&gt;AirTable&lt;/a&gt; because they offer an API which can be consumed by our website to display expenses and incomes. We have two major categories with five sheets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CRM&lt;/strong&gt; (&lt;a href=&quot;https://en.wikipedia.org/wiki/Customer_relationship_management&quot;&gt;definition&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;Active Ambassadors&lt;/li&gt;
&lt;li&gt;Organisations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finance&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Expenses&lt;/li&gt;
&lt;li&gt;Income&lt;/li&gt;
&lt;li&gt;Cost per DIY kit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our list of Active Ambassadors is somehow a mixture between a CRM and an order system, if a user fills out the form a new entry will be added with all necessary information. The ambassador will also get a confirmation via &lt;a href=&quot;https://mailchimp.com/&quot;&gt;Mailchimp&lt;/a&gt;. The new order is also communicated via Slack, this automation is done via &lt;a href=&quot;https://ifttt.com/home&quot;&gt;IFTTT&lt;/a&gt;. That message in Slack triggers Leonard to start the printing and shipping process. Afterward, the status of the order is reflected manually in the sheet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/almost-free-setup-for-ngos-startups-and-side-projects/airtable_shipping.png&quot; alt=&quot;Airtable - Shipping&quot;&gt;&lt;/p&gt;
&lt;p&gt;The organization&apos;s CRM is inspired by a standard &lt;a href=&quot;https://en.wikipedia.org/wiki/Purchase_funnel&quot;&gt;sales funnel&lt;/a&gt;. In reality, it&apos;s just a &lt;a href=&quot;https://en.wikipedia.org/wiki/Kanban_board&quot;&gt;Kanban board&lt;/a&gt; with four different states: First contact, Negotiation, Won and Lost. This helps us to keep track of organizations we already have contacted and creates transparency within the team.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/almost-free-setup-for-ngos-startups-and-side-projects/airtable_organisations.png&quot; alt=&quot;Airtable - Organisations CRM&quot;&gt;&lt;/p&gt;
&lt;p&gt;I think there isn&apos;t much to say about our finance sheets, nothing fancy, pretty simple, and straight forward. This data is reflected on our &lt;a href=&quot;https://active-ambassadors.org/transparency&quot;&gt;transparency page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/almost-free-setup-for-ngos-startups-and-side-projects/airtable_finance.png&quot; alt=&quot;Airtable - Finances&quot;&gt;&lt;/p&gt;
&lt;p&gt;If &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notions&lt;/a&gt; provides us with the same functionalities to connect other tools I would like to drop AirTable to reduce the number of tools we use.&lt;/p&gt;
&lt;h3 id=&quot;marketing&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#marketing&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Marketing&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Tools: Mailchimp, Later, UNUM&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the beginning, we had a newsletter with &lt;a href=&quot;https://mailchimp.com/&quot;&gt;Mailchimp&lt;/a&gt;, but now all our communication efforts go into &lt;a href=&quot;https://www.instagram.com/active_ambassadors/&quot;&gt;Instagram&lt;/a&gt;. To schedule and plan our posts Julia is using &lt;a href=&quot;https://later.com/&quot;&gt;Later&lt;/a&gt; and &lt;a href=&quot;https://www.unum.la/&quot;&gt;UNUM&lt;/a&gt; and that&apos;s not something I&apos;m familiar with, so if you want I could ask Julia for a guest contribution.&lt;/p&gt;
&lt;h3 id=&quot;knowledgetasks&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#knowledgetasks&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Knowledge/Tasks&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Tools: Notion, Google Drive&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Over the last few years, &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt; has satisfied the desire of productivity junkies who want to create tools for their own needs by not writing a single line of code. It slowly spilled over into the business world, at least it looked like that to me. You can do almost everything: use it as a wiki, build a custom CRM, track your tasks, or use it as a notebook.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/almost-free-setup-for-ngos-startups-and-side-projects/notion.png&quot; alt=&quot;Notion&quot;&gt;&lt;/p&gt;
&lt;p&gt;We decided to use it for our tasks with a simple Kanban board as well for some knowledge sharing. It&apos;s still work in progress, but it&apos;s growing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.google.com/intl/en_zm/drive/&quot;&gt;Google Drive&lt;/a&gt; only exists as data grave, we only save documents (e.g. templates) or pictures, but our knowledge is completely on Notion.&lt;/p&gt;
&lt;h3 id=&quot;website&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#website&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Website&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Tools: Nuxt.js, Netlify, Prismic, GitHub, Netcup, Figma&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The next paragraphs will be very technical, if you aren&apos;t interested in this I still would recommend getting your hands on a domain, even if you aren&apos;t hosting a website. It&apos;s just ten times more professional if you send an email from luka@active-ambassadors.org instead of dungeonmaster99@gmail.com.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I built the website with &lt;a href=&quot;https://nuxtjs.org/&quot;&gt;Nuxt.js,&lt;/a&gt; a framework on top of &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt;. So this is only something for you if you know how to do web development or if you know someone who is able to do it. The website is publicly accessible via &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; the &lt;a href=&quot;https://en.wikipedia.org/wiki/Version_control&quot;&gt;version control system&lt;/a&gt; of my choice. This is linked to &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; where each change is directly deployed without any manual download or build process involved. During the automatic build process, the required data from &lt;a href=&quot;https://prismic.io/&quot;&gt;Prismic&lt;/a&gt; our headless CMS, and AirTable are requested. Also a change to the content in Prismic would trigger a new build. I would like to have something similar for AirTable as all the numbers on our transparency page are consumed from our sheets. Because this isn&apos;t possible I trigger a new build every 24 hours via IFTTT as we don&apos;t rely on instant updates.&lt;/p&gt;
&lt;p&gt;The domain is managed by &lt;a href=&quot;https://www.netcup.de/&quot;&gt;Netcup&lt;/a&gt; which costs us 17.55 € per year, which also contains the email hosting.&lt;/p&gt;
&lt;p&gt;For creating mockups, e.g. to discuss version two of our website, I used &lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt; as everybody can access the files in realtime and edit it or leave a comment. I also used Figma to create our logo.&lt;/p&gt;
&lt;p&gt;Most of this could be replaced by &lt;a href=&quot;https://wordpress.com/&quot;&gt;Wordpress&lt;/a&gt; and a webspace. An example for such a setup can be seen on my mothers organization: &lt;a href=&quot;http://home.respekt-menschen.de/&quot;&gt;Respekt Menschen&lt;/a&gt; (respect humans). I just prefer to have full control over the performance and the layout while going for a &lt;a href=&quot;https://www.gartner.com/en/information-technology/glossary/best-of-breed&quot;&gt;best of breed approach&lt;/a&gt;. Each part of this setup can easily be replaced, e.g. Prismic with &lt;a href=&quot;https://content.nuxtjs.org/&quot;&gt;nuxt/content&lt;/a&gt; or &lt;a href=&quot;https://strapi.io/&quot;&gt;Strapi&lt;/a&gt; (self-hosted).&lt;/p&gt;
&lt;h2 id=&quot;reflection&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#reflection&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Reflection&lt;/h2&gt;
&lt;p&gt;We use a lot of &lt;a href=&quot;https://en.wikipedia.org/wiki/Software_as_a_service&quot;&gt;SaaS&lt;/a&gt; as it is easy to setup and maintain, but I personally think a complete open source approach would better fit our philosophy. And for now I think that&apos;s not realistic as it would increase dramatically the maintenance effort also the costs, e.g. we would have to host servers for alternative solutions. To be honest, the maintenance is the main argument as all of this happens in my free time. If I had the time I would like to drop IFTTT and write my own bots and deploy them on our own server, the problem is just that the outcome would be the same (+ additional effort) without adding value to the NGOs we want to support.&lt;/p&gt;
&lt;p&gt;The other question I&apos;m not completely sure about is if all these tools are necessary? You definitely could run the same organization with phone calls and a notebook, but we like the digital life style and I&apos;m not sure if we could drop one of the tools while staying on the same productivity level.&lt;/p&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; href=&quot;#key-takeaways&quot;&gt;&lt;span class=&quot;icon icon-link&quot;&gt;&lt;/span&gt;&lt;/a&gt;Key takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;The free tier of many tools is completely sufficient.&lt;/li&gt;
&lt;li&gt;Get a fucking domain it doesn&apos;t have to cost 17.55 € a year - there are even cheaper ones, but please get a domain and use it for your emails. I&apos;ll help you for free if you need support!&lt;/li&gt;
&lt;li&gt;Don&apos;t implicitly trust lists of tools, decide for yourself what you and your team needs.&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>Posts</category></item><item><title>Active Ambassadors</title><link>https://harambasic.de/experience/active-ambassadors</link><guid isPermaLink="true">https://harambasic.de/experience/active-ambassadors</guid><description>Non-profit side project raising awareness for NGOs. I co-founded it and built the whole digital setup, from website to automations.</description><pubDate>Sun, 01 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Co-Founder&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Nov 2020 – Dec 2021&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;A friend of mine had the idea that we could do something good with our skills while raising awareness for NGOs. I set up our entire work environment: &lt;a href=&quot;https://slack.com/intl/en-de/&quot;&gt;Slack&lt;/a&gt;, &lt;a href=&quot;https://www.google.com/intl/en_in/drive/&quot;&gt;Google Drive&lt;/a&gt;, &lt;a href=&quot;https://meet.google.com/&quot;&gt;Google Meet&lt;/a&gt;, a website built with &lt;a href=&quot;https://nuxtjs.org/&quot;&gt;Nuxt.js&lt;/a&gt;, &lt;a href=&quot;https://prismic.io/&quot;&gt;Prismic&lt;/a&gt;, and &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;, plus &lt;a href=&quot;https://airtable.com/&quot;&gt;Airtable&lt;/a&gt;, &lt;a href=&quot;https://mailchimp.com/&quot;&gt;Mailchimp&lt;/a&gt;, and &lt;a href=&quot;https://ifttt.com/&quot;&gt;IFTTT&lt;/a&gt;. Early days of me figuring out what I could wire together with cloud tools.&lt;/p&gt;
&lt;p&gt;You can still find it online: &lt;a href=&quot;https://active-ambassadors.org/&quot;&gt;active-ambassadors.org&lt;/a&gt;, &lt;a href=&quot;https://www.instagram.com/active_ambassadors/&quot;&gt;Instagram&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/company/active-ambassadors&quot;&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>Techmob Show</title><link>https://harambasic.de/experience/techmob-show</link><guid isPermaLink="true">https://harambasic.de/experience/techmob-show</guid><description>Podcast where three friends talk tech, mostly entertaining, occasionally informative.</description><pubDate>Sat, 01 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Co-Founder &amp;amp; Host&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Jun 2019 – Jun 2021&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;Three friends needed to talk quite often about technology. Most of the time it could even be described as entertaining. We were also curious about how a podcast works. So why not start one? The Techmob Show was born. The first season contains eight to ten episodes: eight are published, ten are recorded. It&apos;s like Schrödinger&apos;s cat.&lt;/p&gt;
&lt;p&gt;Find it on &lt;a href=&quot;https://www.instagram.com/techmobshow/&quot;&gt;Instagram&lt;/a&gt; and &lt;a href=&quot;https://github.com/Techmob-Show&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item><item><title>SAP</title><link>https://harambasic.de/experience/sap</link><guid isPermaLink="true">https://harambasic.de/experience/sap</guid><description>Enterprise software company providing business solutions for finance, HR, supply chain, and customer experience across industries worldwide.</description><pubDate>Thu, 01 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Technology Consultant&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Oct 2019 – Sep 2021&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;To be honest, I used to think &quot;SAP&quot; was just the name of the arena where the Rhein-Neckar Löwen played Handball. I had zero idea what the company actually did until my grandma took me to their Annual General Meeting. That led to a voluntary internship in 12th grade which turned into something I would have never imagined: me leading parts of a project for all of Germany.&lt;/p&gt;
&lt;p&gt;Fast forward to 2020: I went from a student to the Android Lead for Germany&apos;s official COVID tracing app (Corona-Warn-App) in about 50 days. After the initial release I got to lead the team, and suddenly I was managing 10+ developers under a lot of pressure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;48 Million+ Downloads: Launched and maintained the app half the country used to trace infection chains&lt;/li&gt;
&lt;li&gt;0 to 1 in 50 Days: Built critical public health software with no initial requirements, shipping production hotfixes for millions of users in under 6 hours&lt;/li&gt;
&lt;li&gt;Open Source Wins: I was terrified our code would be torn apart publicly, but we built an amazing community. One of the most active and most knowledgeable community members turned out to be a 16-year-old student. As a little thank you, I helped organize an internship for him.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The whole thing is still public: &lt;a href=&quot;https://www.coronawarn.app/en/&quot;&gt;coronawarn.app&lt;/a&gt;, &lt;a href=&quot;https://github.com/corona-warn-app/cwa-app-android&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://play.google.com/store/apps/details?id=de.rki.coronawarnapp&quot;&gt;Play Store&lt;/a&gt;, &lt;a href=&quot;https://apps.apple.com/de/app/corona-warn-app/id1512595757&quot;&gt;App Store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was a weird time during Covid. We stayed on calls just to hear each other type, played &quot;Among Us&quot; to have some kind of team building (I always got killed first), and my roommate literally cooked and brought food to my desk so I could keep working. Danke Amdi :)&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;&lt;section class=&quot;position-section&quot;&gt;&lt;h2&gt;Multiple Internships&lt;/h2&gt;&lt;p class=&quot;position-dates&quot;&gt;Sep 2016 – Sep 2019&lt;/p&gt;&lt;div class=&quot;position-content&quot;&gt;&lt;p&gt;This is a collection of the 3-month rotations I completed during my &quot;Dual Study&quot; program (Duales Studium). It wasn&apos;t just fetching coffee; the program requires switching between university theory and full-time practical work blocks every quarter. I was integrated as a full team member in every rotation, building a full-stack foundation across UX Design, Engineering, and Consulting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bachelor Thesis (SuccessFactors): Evaluated JavaScript Frontend Frameworks for enterprise use, conducting trend and requirement analysis.&lt;/li&gt;
&lt;li&gt;Analytics Cloud (UX Design): Worked directly with customers to create User Journey Maps and Personas, building clickable prototypes in Sketch.&lt;/li&gt;
&lt;li&gt;Utilities &amp;#x26; Waste (Consulting): My first touchpoint with energy. Built a &quot;Smart Energy Room&quot; showcase collecting sensor data, forecasting (SAP HANA) and visualizing it in a custom SAPUI5 app.&lt;/li&gt;
&lt;li&gt;SuccessFactors (Dev): Developed a SAPUI5 Custom Control enabling content creators to structure content matching their Corporate Identity.&lt;/li&gt;
&lt;li&gt;Global Design (Enablement): Developed an internal &quot;Dribbble-like&quot; platform on WordPress and simplified design processes with SAP Fiori in BUILD.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded><category>Experience</category></item></channel></rss>