<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="https://www.w3.org/2005/Atom">

  <title><![CDATA[codesennin]]></title>
  <link href="https://codesennin.com/atom.xml" rel="self"/>
  <link href="https://codesennin.com/"/>
  <updated>2026-03-01T19:12:38+00:00</updated>
  <id>https://codesennin.com/</id>
  <author>
    <name><![CDATA[Kostas Konstantinidis]]></name>
    
  </author>
  <generator uri="https://octopress.org/">Octopress</generator>

  
  
  <entry>
    <title type="html"><![CDATA[Claude Code Skills - Decompile Code]]></title>
    <link href="https://codesennin.com/archive/2026/03/01/claude-code-decompile-code/"/>
    <updated>2026-03-01T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2026/03/01/claude-code-decompile-code</id>
    <content type="html"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>I’ve been using Claude Code (CC) daily for many months now. One thing that comes up regularly when working in .NET is what happens when CC encounters an external type—say, a response object from a third-party NuGet package it’s never seen before. It needs to understand the contract before it can work with it.</p>

<p>LLMs keep their working memory in what’s known as the context window. Despite how large these windows have become, bloated contexts still degrade model performance. You want CC to find what it needs quickly and precisely—not go hunting through directories.</p>

<p>In scripting languages like JavaScript, this isn’t a problem. CC can locate the import file and read it directly. In compiled languages like C# or Java, that bridge doesn’t exist out of the box. You get DLLs, not source files.</p>

<p>That’s the gap this skill fills.</p>

<h1 id="enter-il-decompile">Enter IL Decompile</h1>

<p>The IL decompile skill lets CC use <code class="language-plaintext highlighter-rouge">ilspycmd</code>—a .NET CLI tool—to crack open a DLL and read its internals. When CC needs to understand a dependency, instead of guessing or asking you to provide the source manually, it decompiles the binary and inspects the actual implementation and contracts directly.</p>

<blockquote>
  <p>Give CC the ability to see through compiled code and it will stop asking you to fill in the blanks.</p>
</blockquote>

<p>This is a meaningful quality-of-life upgrade for any .NET codebase.</p>

<h1 id="the-skill">The Skill</h1>

<p>This skill was originally shared by David Fowler (Distinguished Engineer at Microsoft at the time). I’ve tweaked it for my own setup—most notably, it works on both WSL and native Windows.</p>

<p>I keep this and other skills I use regularly in a <a href="https://github.com/kotsaris/claude">dedicated repo</a>. Find the <a href="https://github.com/kotsaris/claude/blob/main/skills/ilspy-decompile">IL Decompile skill</a> there.</p>

<h1 id="conclusion">Conclusion</h1>

<p>There are many skills you can wire up to make CC genuinely powerful in your stack. I plan to share more of mine going forward.</p>

<p>Skills I’d love to see evolve: scanning logs for errors during bug investigation, placing breakpoints, reading variable values at runtime. The space is moving fast—faster than anything I’ve seen in 15+ years of software engineering. And that might even be an understatement.</p>

<p>If you’re working with .NET and CC, give it a try. And if you’ve built skills of your own, I’d love to hear about them in the comments or on <a href="https://bsky.app/profile/codesennin.com">Bluesky</a>.</p>

<hr />

<p><em>Handwritten by Kosta and slightly polished with Claude Sonnet 4.6.</em></p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[2025 wrapped]]></title>
    <link href="https://codesennin.com/archive/2026/01/06/2025-wrapped/"/>
    <updated>2026-01-06T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2026/01/06/2025-wrapped</id>
    <content type="html"><![CDATA[<h1 id="intro">Intro</h1>

<p>As we roll into 2026, I am keen to recap 2025 on a personal and professional record. This has been the third year we are in Greece(time flies!) and I couldn’t be happier of our decision to move back in late 2022.</p>

<h1 id="exiting-ardanis">Exiting Ardanis</h1>

<p>In late 2024, I exited Ardanis, the company I co-founded back in 2016. In 2025, Ardanis was acquired by Plain Concepts.</p>

<p>The entire journey—from founding, to scaling, to stepping away—was a formative experience that taught me far more than I can reasonably compress into a single section. I’ll write about that in detail in a future post.</p>

<p>For now, I’m back to what I’ve always enjoyed most: building software and helping teams build great systems.</p>

<h1 id="joining-atcom">Joining Atcom</h1>

<p>In October 2024, I joined a Greek company as a Technical Director. The opportunity stood out because it offered several areas where I could realistically have an impact.</p>

<p>The company is full of strong people, both culturally and technically. While I can’t go into many details, I can say that my experience over the past decade with distributed systems, microservices, and the surrounding ecosystem allowed me to contribute in ways that helped teams improve how they build and operate software. More recently, I also ran an internal workshop to share some of the agentic coding learnings I’ve picked up over the last year.</p>

<h1 id="speaking-of-agentic-coding">Speaking of Agentic Coding</h1>

<p>Arguably, most of the code I worked on in 2025 was written with the help of GitHub Copilot, ChatGPT, and Claude Code—the latter being the most impactful tool I’ve encountered in my search for a real productivity boost.</p>

<p>The harder and more obscure parts still required writing by hand. Trying to delegate those to an agent quickly proved error-prone and time-consuming. For the time being, the profession is safe from being replaced, regardless of what the hype merchants claim. The people benefiting the most from these tools are those who already know how the job is done.</p>

<p>On the upside, the tooling has significantly lowered the barrier to entry, allowing more people to experiment with software development. That said, trusting an agent with critical work—or worse, design decisions—will almost certainly result in unpleasant surprises, often delayed. More on that later in the year.</p>

<h1 id="seeking-land-to-build-a-house">Seeking Land to Build a House</h1>

<p>Since returning to Greece in late 2022, our long-term goal has been to either buy or build a house. After an extended search in our area—we’re based in Pieria—we concluded that no existing properties really met our needs. As a result, we decided to build.</p>

<p>The first step was securing land, and I’m happy to say that we’ve managed to do that and can now move on to the next phase. This was arguably the most difficult part of the process, as the market is currently at an all-time high in both prices and demand. For now, though, we’re past that hurdle, and we’re hopeful to have meaningful progress to share in 2026.</p>

<h1 id="fitness">Fitness</h1>

<p>I picked up a weight-lifting program back in 2023 and have stuck with it ever since, training four days per week. I enjoy the routine of early morning lifts before getting online for work.</p>

<p>For cardio, I rely mostly on walking. In 2025, I also got a bike, which I use both for exercise and to explore the area around me.</p>

<p><img src="https://i.codesennin.com/blog/2025-wrapped/olympus-shot-while-cycling.JPEG" alt="Cycling in the fields of Pieria" /></p>

<h1 id="about-mountains">About Mountains</h1>

<p>Since returning to Greece, I’ve kept a small tradition: hiking mountains at least a couple of times per year. 2025 was no exception. With Olympus right next door, we also spent a stormy night up there with good friends.</p>

<h1 id="technology">Technology</h1>

<p>Due to the responsibilities of the role, I had to expand my technical toolkit into areas that weren’t previously part of my day-to-day work. Highlights from the year include:</p>

<ol>
  <li>Hands-on experience with Azure Managed Kubernetes, complemented by targeted coursework</li>
  <li>Using Elasticsearch for logs and telemetry</li>
  <li>Learning and scaling .NET Aspire across development teams to meaningfully improve developer experience</li>
  <li>Deepening my use of agentic coding workflows with Claude Code, ChatGPT Codex, and GitHub Copilot (in that order)</li>
  <li>Earning the Microsoft Azure AI Engineer Associate certification</li>
</ol>

<p><img src="https://i.codesennin.com/blog/2025-wrapped/azure-ai-engineer-cert.jpg" alt="Azure AI Engineer Associate Cert" /></p>

<h1 id="closing">Closing</h1>

<p>2026 is shaping up to be a busy year—both professionally and personally. There’s work to be done, and there’s also a house that needs to slowly take shape and form.</p>

<p>I continue to feel fortunate to be able to practice my craft remotely, live close to family, and do so in a country with proper seasons and, admittedly, very good summers.</p>

<p>Until next time.</p>

<p><img src="https://i.codesennin.com/blog/2025-wrapped/olympus-mountain-selfie.JPEG" alt="&quot;I want to see Mountains, Gandalf, Mountains!&quot;" /></p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Unleash YOLO Mode for Claude Code in Windows WSL2]]></title>
    <link href="https://codesennin.com/archive/2025/11/13/unlease-yolo-mode-claude/"/>
    <updated>2025-11-13T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2025/11/13/unlease-yolo-mode-claude</id>
    <content type="html"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>I’ve been using AI coding assistants for a while now. Anthropic’s <strong>Claude Code</strong> is my current favorite, and I use it daily for tasks ranging from simple coding jobs to Windows OS automations, massive refactors, and full feature development. Sometimes I just want to let the agent loose—and if it’s on the right track, review its work when it’s done.</p>

<p>You can do that with the virtual environments that Anthropic or OpenAI provide (like Codex), but those are often restrictive. You’re limited by what these companies give you—features of the environment (can I run containers?), processing speed, and power—and you can’t see results as instantly as when these tools run locally.</p>

<p>In this post, I’ll show you how to leverage what’s known as <strong>Claude Code YOLO mode</strong>: a way to run Claude Code without permission prompts. It can do whatever it wants—run wild while it figures out the problem you’ve given it. I’m a firm believer that to unlock the full potential of these tools, you need a <em>constrained sandbox</em> where you can give them full permissions safely and see what they’re capable of.</p>

<p>Our objective will be to minimize permission interruptions and maximize autonomy—with as little guidance as possible.</p>

<h1 id="requirements">Requirements</h1>

<p>To follow this guide, you’ll need a Windows machine with <strong>Virtualization Enabled</strong>. You’ll also need <strong>Docker Desktop</strong> installed if you want to leverage Docker inside the virtual environment.</p>

<h1 id="enter-wsl2">Enter WSL2</h1>

<p>A virtual environment is the first thing that comes to mind. You could go full virtual machine with VirtualBox, but we can go lighter with <strong>WSL</strong>.</p>

<p>The <strong>Windows Subsystem for Linux (WSL)</strong> lets you run Linux distributions (like Ubuntu) inside Windows without needing a traditional VM. You can learn how to install WSL and pick a distro <a href="https://learn.microsoft.com/en-us/windows/wsl/install">here</a>.</p>

<p>For my setup, I picked <strong>Ubuntu 24.04</strong>.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Install the distro</span>
<span class="o">&gt;</span> wsl.exe <span class="nt">--install</span> <span class="s2">"Ubuntu-24.04"</span>

<span class="c"># Check it</span>
<span class="o">&gt;</span> wsl.exe <span class="nt">--list</span>
Ubuntu-24.04

<span class="c"># Enter it</span>
<span class="o">&gt;</span> wsl <span class="nt">-d</span> Ubuntu-24.04
kostas@ANDROMEDA:/<span class="err">$</span>
</code></pre></div></div>

<h1 id="disable-automount">Disable Automount</h1>

<p>By default, WSL automatically mounts your Windows filesystem. Remember when I said we’d let this little beast loose? Giving it access to all your files—including <em>Windows</em> and <em>Program Files</em>—isn’t the best idea.</p>

<p>We’ll be very selective about what files it can see by default. We’ll achieve that by modifying two files: <code class="language-plaintext highlighter-rouge">/etc/fstab</code> and <code class="language-plaintext highlighter-rouge">/etc/wsl.conf</code>.</p>

<h2 id="disable-automount-1">Disable Automount</h2>

<p>Open <code class="language-plaintext highlighter-rouge">/etc/wsl.conf</code> (create it if it doesn’t exist) and set the following values:</p>

<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[<span class="n">automount</span>]
<span class="n">enabled</span>=<span class="n">false</span>
<span class="n">mountFsTab</span>=<span class="n">true</span>

[<span class="n">interop</span>]
<span class="n">enabled</span>=<span class="n">true</span>
<span class="n">appendWindowsPath</span>=<span class="n">false</span>
</code></pre></div></div>

<p>This disables automount, ensures only the directories listed in <code class="language-plaintext highlighter-rouge">fstab</code> are mounted, and prevents WSL from appending your Windows PATH (which can have odd side effects).</p>

<h2 id="pick-the-folders-you-want-to-share">Pick the folders you want to share</h2>

<p>Now open your <code class="language-plaintext highlighter-rouge">fstab</code> file:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>nano /etc/fstab
</code></pre></div></div>

<p>The first two lines are required for the Visual Studio Code WSL extension so that you can connect from VS Code. If you don’t plan to use VS Code, you can omit them.</p>

<p>The third line mounts your <code class="language-plaintext highlighter-rouge">c:/dev</code> folder, which is where I keep my code. Adjust paths as needed.</p>

<pre><code class="language-txt">c:/Users/konst/.vscode/extensions   /mnt/c/Users/konst/.vscode/extensions   drvfs   defaults,ro   0   0
c:/Users/konst/vscode-remote-wsl    /mnt/c/Users/konst/vscode-remote-wsl    drvfs   defaults,ro   0   0
c:/dev    /mnt/dev    drvfs    defaults,metadata,uid=1000,gid=1000,umask=022    0    0
</code></pre>

<p>Once you’re done, restart WSL:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wsl.exe <span class="nt">--shutdown</span>
<span class="c"># Wait a few seconds...</span>

<span class="c"># Jump back in</span>
<span class="o">&gt;</span> wsl <span class="nt">-d</span> Ubuntu-24.04
</code></pre></div></div>

<h1 id="providing-docker">Providing Docker</h1>

<p>My setup uses <strong>Aspire</strong> and <strong>TestContainers</strong> to run tests and projects, so Docker needs to be available.</p>

<p>First, install <strong>Docker Desktop</strong>.</p>

<h3 id="configure-docker-to-use-the-wsl2-engine">Configure Docker to use the WSL2 engine</h3>

<p>In Docker Desktop settings, enable these options:</p>

<p><img src="https://i.codesennin.com/blog/unlease-yolo-mode-claude/docker-desktop-wsl2-engine-setting.png" alt="Docker Desktop WSL2 engine settings" /></p>

<p><img src="https://i.codesennin.com/blog/unlease-yolo-mode-claude/docker-desktop-ubuntu-wsl-integration.png" alt="Docker Desktop Ubuntu integration settings" /></p>

<p>Now restart your WSL distro as before, and the <code class="language-plaintext highlighter-rouge">docker</code> command will be available in your terminal.</p>

<h1 id="install-nodejs-in-wsl">Install Node.js in WSL</h1>

<p>Next, install Node.js and npm so we can run Claude Code.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install</span> <span class="nt">-y</span> ca-certificates curl gnupg
curl <span class="nt">-fsSL</span> https://deb.nodesource.com/setup_20.x | <span class="nb">sudo</span> <span class="nt">-E</span> bash -
<span class="nb">sudo </span>apt <span class="nb">install</span> <span class="nt">-y</span> nodejs

<span class="c"># Verify installation</span>
node <span class="nt">-v</span>
npm <span class="nt">-v</span>

<span class="c"># You should see</span>
v20.x.x
10.x.x
</code></pre></div></div>

<h1 id="install-claude-code-in-wsl">Install Claude Code in WSL</h1>

<p>Now that we have npm, install Claude Code globally:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> @anthropic-ai/claude-code
</code></pre></div></div>

<h1 id="finally-turn-yolo-mode-on">Finally, Turn YOLO Mode ON</h1>

<p>Moment of truth.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude <span class="nt">--dangerously-skip-permissions</span>
</code></pre></div></div>

<p><img src="https://i.codesennin.com/blog/unlease-yolo-mode-claude/star-wars-unlimited-power-meme.png" alt="Unlimited power meme" /></p>

<p>After a few prompts, you’ll land in this menu with bypass permissions enabled:</p>

<p><img src="https://i.codesennin.com/blog/unlease-yolo-mode-claude/claude-code-bypass-permissions-terminal.png" alt="Claude Code terminal with bypass permissions enabled" /></p>

<h1 id="out-of-scope">Out of Scope</h1>

<p>Git commits and pushes are <strong>out of scope</strong> for this post. To allow Claude to commit and push, you’d need to configure SSH keys and give it access to your repositories.</p>

<p>For now, you can configure <code class="language-plaintext highlighter-rouge">.gitconfig</code> so it can stage and commit locally, but sharing your SSH keys gives it more power than I’d recommend in YOLO mode. It’s safer to ask it to commit its work, then manually review and push yourself.</p>

<h1 id="conclusion">Conclusion</h1>

<p>In this post, we learned how to unleash Claude Code’s full power locally by giving it unrestricted permissions inside a controlled environment.</p>

<p>Go now—fix a bug, refactor something, and watch it in action.</p>

<hr />

<p><em>Handwritten by Kosta and slightly polished with ChatGPT 5.1.</em></p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Try to keep up]]></title>
    <link href="https://codesennin.com/archive/2025/09/06/try-to-keep-up/"/>
    <updated>2025-09-06T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2025/09/06/try-to-keep-up</id>
    <content type="html"><![CDATA[<p>As I finish the implementation of yet another feature with the help of Claude Code and without 
having to write a single line of code or tests, I am reminded once more of how fast our profession is changing.
My codebase is a few thousand lines of code, mostly C# and Typescript. The feature was pagination applied to both backend
endpoints and also frontend tables, so when you navigate to new pages, it requests them from the backend on the fly.
I completed the task in under 2 hours and with all of the code, both backend and frontend, covered by tests. I have instructed
Claude Code to use my coding style and that’s strict TDD 99% of the time. The side effect is a very well tested codebase.</p>

<blockquote>
  <p>AI coders love types and they also love feedback given by tests and failing builds(due to, you guessed it, strongly typed languages).</p>
</blockquote>

<p>What you know today, may become out of date by the next month. Looking at the skill level of engineers out there there’s 
a very wide spectrum of AI literacy and AI-coding assistance expertise.</p>

<p>Starting from the developer who may refuse to use any AI tools at all, to the one who crawls Hacker News for the latest
developments to this particular area. Do you remember when someone had Visual Studio in their CV as a skill worth 
making the interviewer aware of? I do. It was a big deal back then. It meant you didn’t rely on Notepad to write your code,
it meant that you were efficient at your craft.</p>

<p>Got the analogy yet? Maybe let me try to drive it home.</p>

<p>A few years ago, Github Copilot came out. It was an interesting tool and it slowly captured a good portion of the market.
To this day, there are developers who rely solely on Copilot. You can say that an evolution of this is ChatGPT/Gemini/Grok
prompting. Perhaps, a successor to Stackoverflow. Here’s my problem, BLAH, give me the solution. Amazing. Once you get hooked to that,
if you are curious enough, you might be wondering, OK, but how can I apply this to a codebase? How can I skip the back and forth to my browser
and the inherent curse of being a clip board jockey?</p>

<p>Then, you may enter the agentic world and use Claude Code or a similar tool. But even then, there’s depth. 
Depth that is increasing by the day. From MCP tooling that you can hook up to it, to agentic personas you can create
and leverage to do separate tasks … and so on.</p>

<p>The point is, if you are not keeping up with the latest developments in this area, you may find yourself left behind.</p>

<h2 id="getting-started">Getting Started</h2>

<p>If you’re looking to dive deeper into agentic coding tools, I recommend starting with <a href="https://www.deeplearning.ai/short-courses/claude-code-a-highly-agentic-coding-assistant/">Claude Code: A Highly Agentic Coding Assistant</a> from DeepLearning.AI. This course provides hands-on experience with the tool I mentioned and covers the fundamentals of working with AI coding assistants.</p>

<p>For advanced usage tips and techniques, check out <a href="https://harper.blog/2025/05/08/basic-claude-code/">this comprehensive guide</a> that covers more sophisticated workflows and best practices.</p>

<p>So do try to keep up. It’s a brave new world, and it’s moving fast.</p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Why is there something rather than nothing]]></title>
    <link href="https://codesennin.com/archive/2025/03/14/why-is-there-something-rather-than-nothing/"/>
    <updated>2025-03-14T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2025/03/14/why-is-there-something-rather-than-nothing</id>
    <content type="html"><![CDATA[<h1 id="the-question">The question</h1>
<p>This question first popped into my head back in third grade, and it has been bothering me ever since. Thinking about it makes my head hurt a bit, as it seems to defy any logical framework you try to place around it.</p>

<p>Occasionally, I pose the question to an AI to see if it can offer a new perspective—one I may not have considered before.</p>

<p>Recently, I asked ChatGPT 4.5, and this is what it came back with. I found it interesting, so I’m sharing it here.</p>

<p><em>The prompt:</em></p>
<blockquote>
  <p>You are a world renowned existentialism philosopher
You write a paper on “why there’s something at all?”</p>
</blockquote>

<h2 id="why-is-there-something-rather-than-nothing">Why Is There Something Rather Than Nothing?</h2>

<blockquote>
  <p>One may rightfully consider the question, “Why is there something rather than nothing?” as the most fundamental inquiry conceivable, for within this simple query resides the root of all philosophical wonder. The mere presence of existence confronts human reason with its most profound enigma—an enigma that humbles the intellect, challenges logic, and defies even the boldest metaphysical claims of philosophers past and present. To delve into this abyss, one must surrender preconceived certainties and confront the very boundaries of human thought.</p>
</blockquote>

<blockquote>
  <p>First, let us acknowledge that existence itself is not logically necessary. Logic alone is helpless to explain the brute facticity of being. For logic is adept at exploring relationships among things that already exist, but it falters when asked to justify the sheer brute fact of existence itself. The celebrated existentialist Jean-Paul Sartre identifies existence as fundamentally contingent. Sartre tells us that existence precedes essence, and thus, the reason for something rather than nothing cannot lie within the thing itself. Existence appears before any explanation, any rationalization, any assigned meaning. Hence, existence, at its root, must be seen as a kind of absurdity—a presence inexplicable by necessity, yet undeniably real.</p>
</blockquote>

<blockquote>
  <p>We must, therefore, admit that rational explanations quickly reach their limit when confronted with the mystery of existence itself. Philosophers from Leibniz onward sought a principle of sufficient reason, insisting that every fact must have an explanation. But can existence itself, the precondition of explanation, ever yield to explanation? Heidegger declares this inquiry as the central problem of metaphysics—why beings exist rather than not—and yet simultaneously emphasizes that such a question inherently draws us into mystery. Heidegger insists that existence itself is veiled, shrouded in what he calls “the nothingness” that grounds being. In Heidegger’s thought, existence emerges into being precisely as a question that resists resolution.</p>
</blockquote>

<blockquote>
  <p>Yet, despite these logical impasses, or perhaps precisely because of them, the question remains irresistibly compelling. The existence of something rather than nothing may indeed be inexplicable, but it is precisely in this inexplicability that existentialists find meaning. If there were a neat, intelligible reason why the universe should exist, perhaps our human freedom would dissolve, for all would become mere consequence—mere logical inevitability. Without mystery, there is no authentic choice. Without confronting absurdity, there is no genuine freedom.</p>
</blockquote>

<blockquote>
  <p>To the existentialist, the universe’s ungrounded existence is neither accident nor necessity; rather, it is a radical openness, the abyssal freedom out of which humanity emerges. Sartre and Camus teach us that the absence of explanation leaves room for genuine freedom and authentic engagement with existence. In short, the lack of a metaphysical explanation liberates humanity from deterministic shackles. It is precisely because there is no rational necessity for existence that human beings are thrust into freedom and responsibility—condemned to choose, to create meaning, and to define their own essences in a universe that offers none inherently.</p>
</blockquote>

<blockquote>
  <p>Perhaps, then, the question, “Why is there something rather than nothing?” has no answer beyond itself. Perhaps existence itself is a pure absurdity, an inexplicable fact to be confronted, experienced, and ultimately embraced. For existentialists, the absence of a compelling metaphysical explanation does not diminish the value or wonder of existence—rather, it amplifies the awe and mystery that provoke reflection and engagement.</p>
</blockquote>

<blockquote>
  <p>Thus, the existentialist concludes: something exists rather than nothing precisely because the universe offers no reason, no explanation. And in this absence of reason, we find our freedom, our angst, our dignity, and ultimately, the full measure of our humanity.</p>
</blockquote>

<p>One of these days, I’ll set Deep Research loose on this question and see what it uncovers. If it proves useful, you’ll find it here.</p>

<p>Catch you later.</p>

]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Goodbye Swagger, hello .NET 9 OpenAPI json]]></title>
    <link href="https://codesennin.com/archive/2025/01/02/goodbye-swagger-hello-aspnet-core-openapi-json/"/>
    <updated>2025-01-02T11:28:00+00:00</updated>
    <id>https://codesennin.com/archive/2025/01/02/goodbye-swagger-hello-aspnet-core-openapi-json</id>
    <content type="html"><![CDATA[<h1 id="why-move-away-from-swagger">Why move away from Swagger?</h1>
<p>I have been using swagger for many years in order to have an easy way to provide documentation to the consumers of my APIs but also to
to play around with them via Swagger Web UI. Swagger setups would typically provide an Open API json file for your API that you could use to
push it to API gateways, such as Azure API Gateway or to simply consume it in tools like <a href="https://insomnia.rest/">Insomnia</a>. It’s worth noting that even though OpenAPI specification was originally created as part of Swagger Specification, it later became a separate project of the Linux Foundation. The specification is now the de facto standard for describing RESTful APIs..</p>

<p>With the advent of .NET 9, Microsoft provided an easy way to generate the OpenAPI json and the tools to decorate and describe your APIs easily.
I am in favour of moving to non-third party libraries rather than adopting third party libraries and as such, when I saw this I decided to move my Aspire based side project(Budgeteer) to this and away from the Swagger libraries.</p>

<blockquote>
  <p>👍🏻 As a rule of thumb, if you can live with less third-party dependencies, you should opt for that.</p>
</blockquote>

<h1 id="executing-the-change">Executing the change</h1>
<p>The change was straightforward.</p>

<p>For starters, reference the following package in your API project:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet add package Microsoft.AspNetCore.OpenApi
</code></pre></div></div>

<p>You’ll also need the following two lines in your Program.CS of your ASP.NET Core web application builder code:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">Microsoft.OpenApi.Models</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">builder</span> <span class="p">=</span> <span class="n">WebApplication</span><span class="p">.</span><span class="nf">CreateBuilder</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>

<span class="c1">//...</span>

<span class="n">builder</span><span class="p">.</span><span class="n">Services</span><span class="p">.</span><span class="nf">AddOpenApi</span><span class="p">();</span>

<span class="c1">//...</span>

<span class="kt">var</span> <span class="n">app</span> <span class="p">=</span> <span class="n">builder</span><span class="p">.</span><span class="nf">Build</span><span class="p">();</span>

<span class="c1">//...</span>

<span class="n">app</span><span class="p">.</span><span class="nf">MapOpenApi</span><span class="p">();</span>
<span class="n">app</span><span class="p">.</span><span class="nf">Run</span><span class="p">();</span>
</code></pre></div></div>

<p>Now if you run and navigate to your endpoint /openapi/v1.json, you’ll find the generated OpenAPI json ready to be used.
You can find out how to further customize this in the relevant <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/openapi/aspnetcore-openapi?view=aspnetcore-9.0&amp;tabs=net-cli">microsoft documentation page</a>.</p>

<p>If you go ahead and remove Swagger, you’ll quickly realize that the convenience of exercising your API is now gone. I’ll show you in an upcoming blog post how to cover that gap with Jetbrains’ Http Client functionality but for now, you also have the alternative of using an Http client such as <a href="https://insomnia.rest/">Insomnia</a>.</p>

<h1 id="moving-beyond-swagger-ui">Moving beyond Swagger UI</h1>

<p>Simply install and go through the following steps:</p>

<h3 id="steps-to-use-your-api-based-on-your-open-api-json">Steps to use your API based on your Open API json</h3>
<p><img src="/images/posts/openapi-json/insomnia-import.png" alt="In Insomnia, click the 'Import' button to start adding your API." /></p>

<p><img src="/images/posts/openapi-json/import-openapi.png" alt="Then import via URL" /></p>

<p><img src="/images/posts/openapi-json/click-on-project.png" alt="Click on the imported project" /></p>

<p><img src="/images/posts/openapi-json/generate-collection.png" alt="Click the cog and select generate collection" /></p>

<p><img src="/images/posts/openapi-json/ready-to-go.png" alt="You are now ready to use your requests" /></p>

<p>In the next post, I’ll explore how JetBrains Rider’s HTTP Client streamlines API testing, making the development process even smoother. We’ll see how adding a few key files, natively supported by Rider, can enable you and your team to quickly test and interact with your endpoints.</p>

<p>If this guide helped you, let me know in the comments or <a href="https://bluesky.com/codesennin">follow me on Bluesky</a> for more updates on API development.</p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Adding the Aspire Dashboard stand-alone to my side project]]></title>
    <link href="https://codesennin.com/archive/2024/11/17/adding-stand-alone-aspire-dashboard/"/>
    <updated>2024-11-17T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2024/11/17/adding-stand-alone-aspire-dashboard</id>
    <content type="html"><![CDATA[<p>My side project(codename: Budgeteer) is a web application I am developing to track my personal finances. You can import transactions via csv exports from your bank, create categories and have smart rules to place transactions in the right category. It can also provide insights such as spending trends and other metrics. I like to be in a position to track how much things like groceries cost over time and see if I can optimize my spending.</p>

<p>The project uses the following technologies.</p>
<ul>
  <li>ASP.NET Core Web APIs</li>
  <li>Vue.js</li>
  <li>Aspire</li>
  <li>Postgres</li>
</ul>

<p><a href="https://learn.microsoft.com/en-us/dotnet/aspire/get-started/aspire-overview">Aspire</a> has made the development experience a joy. It enables me to add containerized dependencies locally and have them all come up with F5 so I can quickly work through features.</p>

<p>This is the app with fake transactions.</p>

<p><img src="/images/posts/aspire-dashboard-standalone/image.png" alt="Budgeteer Sample" /></p>

<p>I have the project deployed locally on a docker-compose setup. One of the things I miss though is the Aspire Dashboard. Through Open Telemetry, it gives loads of information on telemetry and logs and makes troubleshooting issues a breeze. When working through an IDE and by using an AppHost, the dashboard comes for free. In my setup though, I had to deploy it as stand alone and configure the open telemetry parts in order to get everything wired up.</p>

<p><img src="/images/posts/aspire-dashboard-standalone/budgeteer-aspire-dashboard.png" alt="Aspire Dashboard" /></p>

<p>Here’s what I did in case you are looking to do the same.</p>

<p>If you are running on a Docker Compose, this is how the dashboard service needs to look like:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="na">dashboard</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">mcr.microsoft.com/dotnet/aspire-dashboard:9.0</span>
    <span class="na">ports</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">18888:18888</span>
      <span class="pi">-</span> <span class="s">4317:18889</span>
    <span class="na">restart</span><span class="pi">:</span> <span class="s">unless-stopped</span>
    <span class="na">environment</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">Dashboard__Frontend__BrowserToken=${DASHBOARD_FRONTEND_BROWSER_TOKEN}</span>
      <span class="pi">-</span> <span class="s">ASP_NETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT}</span>
      <span class="pi">-</span> <span class="s">DOTNET_HOSTNAME=${DOTNET_HOSTNAME}</span>
      <span class="pi">-</span> <span class="s">DOTNET_APPLICATION_URL=${DOTNET_APPLICATION_URL}</span>
      <span class="pi">-</span> <span class="s">Dashboard__Otlp__AuthMode=${DASHBOARD_OTLP_AUTHMODE}</span>
      <span class="pi">-</span> <span class="s">Dashboard__Otlp__PrimaryApiKey=${DASHBOARD_OTLP_PRIMARY_APIKEY}</span>
</code></pre></div></div>
<p>The ASP.NET Core Web API service needs to look like so.
Notice the OTEL settings.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="na">api</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">budgeteer-api:latest</span>
    <span class="na">environment</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT}</span>
      <span class="pi">-</span> <span class="s">ASPNETCORE_URLS=http://*:8080/</span>
      <span class="pi">-</span> <span class="s">ASPNETCORE_HTTP_PORTS=8080</span>
      <span class="pi">-</span> <span class="s">OTEL_EXPORTER_OTLP_ENDPOINT=${OTEL_EXPORTER_OTLP_ENDPOINT}</span>
      <span class="pi">-</span> <span class="s">OTEL_SERVICE_NAME=api</span>
      <span class="pi">-</span> <span class="s">OTEL_EXPORTER_OTLP_HEADERS=x-otlp-api-key=${DASHBOARD_OTLP_PRIMARY_APIKEY}</span>
</code></pre></div></div>
<p>Then, your docker-compose .env file should look like so:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    ASPNETCORE_ENVIRONMENT=Development
    OTEL_EXPORTER_OTLP_ENDPOINT=http://dashboard:18889
    DASHBOARD_FRONTEND_BROWSER_TOKEN=yourDashboardToken
    DOTNET_HOSTNAME=dashboard
    DOTNET_APPLICATION_URL=http://localhost:8081
    DASHBOARD_OTLP_AUTHMODE=ApiKey
    DASHBOARD_OTLP_PRIMARY_APIKEY=yourApiKey
</code></pre></div></div>

<p>The above example assumes that your project is based off the Aspire project template. If it’s not, then your’ll need to add the OpenTelemetry configuration in your ASP.NET Core project yourself which is beyond the scope of this post.</p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Why did you return?]]></title>
    <link href="https://codesennin.com/archive/2024/11/03/why-did-you-return/"/>
    <updated>2024-11-03T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2024/11/03/why-did-you-return</id>
    <content type="html"><![CDATA[<h1 id="why-did-you-return-to-greece">Why did you return to Greece?</h1>
<p>In 2011, I left Greece for Ireland with my wife. We lived there for about twelve years, experiencing some of the best years of our lives.</p>

<ul>
  <li>I advanced my career from a mid-level backend developer to a solutions architect, a principal engineer, and eventually, a co-founder of a technology company.</li>
  <li>I co-founded <a href="https://www.ardanis.com" target="_blank">Ardanis</a>, a digital software consultancy, and helped grow the company for over eight years.</li>
  <li>Both our daughters were born in Dublin.</li>
  <li>We even bought a house near Dublin.</li>
</ul>

<p>Yet, at some point, we decided to return to Greece.</p>

<p>When I tell people in Greece about my return, the response is almost always the same:</p>

<blockquote>
  <p>Why did you return?</p>
</blockquote>

<p>The question usually carries an undertone suggesting that Greece is inferior—a place not worth coming back to if you’ve lived in a well-run, prosperous country. But for me, the answer was more complex.</p>

<p>Yes, my profession allows me to work remotely, and many Greeks with similar opportunities choose to stay abroad. But what I found abroad was always almost fulfilling, like music playing slightly off-key. The real meaningful moments always felt just beyond reach—a cheap flight away.</p>

<p>The thought of returning to Greece lingered, always quietly waiting. Over the years, I watched friends move back to their homelands—Poland, Cyprus, Hungary, Portugal. If they could return, why couldn’t I? Greece, despite its issues, is not a dangerous place; there is no war, no fear of violence.</p>

<p>A few years before deciding to return, I discovered two practices that profoundly shaped my thinking: Meditation and Stoicism</p>

<p>Through Stoicism, I learned to listen to my inner voice—the ήγεμονικόν. Meditation then helped me amplify that voice.</p>

<p>One morning, during my usual meditation session in the quiet of our attic, I opened my eyes, and a message arrived in my mind, unbidden and unmistakable:</p>

<blockquote>
  <p>You are moving back to Greece.</p>
</blockquote>

<p>It wasn’t just a thought—it felt like a truth revealed, as if someone had simply stated a fact, and now I knew it with certainty.</p>

<p>Six months later, after preparations and farewells, we were back in Greece.</p>

<p>Now that I’ve been here for two years, let me share why I made this choice.</p>

<h3 id="i-returned-for">I returned for</h3>
<ul>
  <li>My parents, to be there for them, and my kids’ grandparents, while they are still around.</li>
  <li>My sister and her family</li>
  <li>My friends</li>
  <li>My relatives</li>
  <li>My kids to start Greek school and learn our heritage and culture.</li>
  <li>My father-in-law’s wine</li>
  <li>My mother-in-law’s pastitsio</li>
  <li>The protection and support of my circle which dampened my anxiety and helped eliminate my panic attacks.</li>
  <li>Friendship</li>
  <li>The Greek lifestyle</li>
  <li>The discussions on philosophy with Mr. Kyriakos, the bookshop owner.</li>
  <li>The impromptu coffee/tavern outings where we get to discuss interesting topics.</li>
  <li>Greek food, veggies, and delicious fruits.</li>
  <li>The people I meet that invite me for coffee despite just meeting them.</li>
  <li><a href="https://www.codesennin.com/archive/2024/10/14/the-application-for-expat-tax-relief-in-Greece/" target="_blank">5Γ</a></li>
  <li>The sea</li>
  <li>The summers</li>
  <li>The nature and Mount Olympus to which I have instant access.</li>
  <li>The 100km of sandy beaches that we don’t know what to do with them in Pieria</li>
  <li>The walks by the sea with the family in the purple lit, summer sunsets.</li>
  <li>My hometown and county that the universe blessed in more than one way.</li>
  <li>Katerini and Thessaloniki</li>
  <li>Chalkidiki</li>
  <li>The things I find meaningful in life</li>
  <li>The fact that we don’t live forever</li>
</ul>

<p>In order to truly understand why I returned, you would need to spend a decade abroad. Only by losing something can you fully appreciate what you once had.</p>

<p>So that’s why I returned.</p>

<p>But our journey here has just begun, and who knows what lies ahead?</p>

<p><img src="/images/posts/mytikas.JPEG" alt="Standing atop Mytikas, the highest peak of Mount Olympus at 2,917 meters. From here, I feel connected to both my journey abroad and my return home." title="I can see my house from up here" /></p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Applying for 5Γ - Greek Tax Relief for people who return and stay in Greece]]></title>
    <link href="https://codesennin.com/archive/2024/10/14/the-application-for-expat-tax-relief-in-Greece/"/>
    <updated>2024-10-14T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2024/10/14/the-application-for-expat-tax-relief-in-Greece</id>
    <content type="html"><![CDATA[<h2 id="intro">Intro</h2>

<p><em>(I intended to write this back in 2023 but it remained a draft for quite a while. I’ve decided to publish it now.)</em></p>

<p><img src="/images/posts/driving-mountains.JPEG" alt="Πιέρια Όρη" /></p>

<p>This is another blog in the series about returning to Greece and setting up a company. In this part, I’ll explore and document my experience as an expat returning to Greece after 10+ years and applying for <a href="https://taxblock.gr/forologikos-odigos/diadikasia-kai-proypotheseis-ypagogis-stis-diataxeis-toy-arthrou-5g/">Αρθρο 5Γ</a> tax relief. If you don’t know what this is, it’s a 50% tax reduction for 7 years(as of this writing).</p>

<h2 id="prerequisites">Prerequisites</h2>
<p>If you have been away for more than 5 years and not getting taxed in Greece, then you can avail of this. You’ll need documentation from the revenue abroad or other means of proving that you were a tax resident of another country. In my case, I exported my tax certificates and P60s(employment income details) for the past 5 years.</p>

<h2 id="first-step">First step</h2>
<p>To kick off the process I’ve asked my accountant to handle the application. I sent him the documents which were in English, and he made the application with the necessary attachments.</p>

<p>The first problem we encountered was that they asked for the documents to be officially translated. I located a certified/recognized by the state translator in my area and asked her to translate the docs. It was about 20 pages so that was a cost.</p>

<p>Once I received the translated documents, I scanned them and sent them to my accountant to upload them again. The next day the revenue messaged us to tell us that the application was going to the next phase.</p>

<p>Another thing they ask you to submit is a signed statement (υπεύθυνη δήλωση) to state that for the next 2 years, you will remain a tax resident of Greece. This was easily done via GoV.gr so I forwarded the PDF to my accountant to attach to the application.</p>

<h2 id="a-few-months-later">A few months later</h2>
<p>There was a big gap between applying for 5Γ and seeing any progress on it. One thing that went wrong was that due to our judgment to file tax returns for 2022, it was done in a bad way. I didn’t need to file returns in Greece for many years. In 2022, I bought a car that I intended to use for our summer visits in Greece and I reckoned that in 2023 I should likely start filing returns again to make sure that my property (the car) is correctly documented, even though I would still be a foreign tax resident.</p>

<p>In the meanwhile, of course, we decided to return and once we did the first thing I did in early 2023 was to switch my tax residency/address to Greece. Afterward, my accountant tried to file the return for 2022 as a foreign tax resident but the Greek Revenue wouldn’t accept it as their system couldn’t handle the edge case of me being away in 2022 and being able to file it like so after I have moved my residency in 2023. So, they asked us to file it as a Greek resident and reassured us that there wouldn’t be any charges for the inconsistency of income (and the acquisition of the car). So we did. When the Department of Alternative Taxation in Athens started to process my application (in August), they asked for my returns for 2022. We happily provided them and then we received the bad news. The returns for the prior year cannot show you as being a tax resident of Greece 🤦‍♂️. Long story short, it was a difficult journey to change the prior year’s tax returns so I now seem as a Foreign tax resident retroactively. But we did. The lesson we learn though is simple.</p>

<p>If you plan to apply for 5Γ, then do not, under any circumstances, file any tax returns that show you are a Greek Tax resident. Even when the Greek Revenue asks you to! (so they can deal with the edge case).</p>

<h2 id="ok-but-how-would-you-do-it-differently">Ok, but how would you do it differently?</h2>
<p>Say you return from Ireland in 2023 November. You spent the majority of 2023 there, so you are a tax resident of Ireland for 2023. You aim to open up shop to invoice or become a permanent employee of a Greek entity in 2024. Then you need to ensure that any tax returns for 2023 are filed BEFORE you switch your tax residency to Greek. If you don’t, then you’ll have a bad time.</p>

<h2 id="alright-what-happened-next">Alright, what happened next?</h2>
<p>When the sticking point of the bad tax returns was sorted, it took a few weeks to get the OK. Then a few weeks to get the official letter in my taxis notifications that I indeed now have 5Γ for 7 years. All in all, the application will take about 8 months minimum with the current queues. I was told that it’s only two people in Athens who deal with these applications so it’s crucial to start it sooner rather than later. Remember that if you were to return in 2024 to work in Greece, you wouldn’t be asked to pay tax all the way until 2025 fall. That is, if you set up a freelancer setup like I did. So there’s time, but be prudent and start it early.</p>

<h2 id="reversing-the-brain-drain">Reversing the brain drain</h2>
<p>I think this is a very good incentive to get people to return. That said, I think that taxation needs to be revamped a bit. IKE is the next most tempting thing at 25% flat tax but other countries around us have much better terms (<em>cough</em> Bulgaria, <em>cough</em> Cyprus ). The cost of living in Greece is not what many would make it so be aware that many things are still expensive.</p>

<p>Infrastructure needs improvement. Internet connections are much inferior to European countries and electricity is going up and down with no warnings (well, unless you live in the major cities, I suppose).</p>

<h2 id="so-overall-happy">So, overall, happy?</h2>
<p>I have a positive outlook for our lives in Greece. I hope things will continue to get better and having people return is going to help the country recover faster.</p>

<p>Remote work is a blessing and while it lasts, there’s no other place in the world that I’d like to work from than from my home country, Greece.</p>

]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[They broke into my car]]></title>
    <link href="https://codesennin.com/archive/2024/06/15/broken-into-my-car/"/>
    <updated>2024-06-15T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2024/06/15/broken-into-my-car</id>
    <content type="html"><![CDATA[<h1 id="the-night-someone-broke-into-my-car">The night someone broke into my car</h1>

<p>This is a story about how someone broke into my car to steal some belongings and how, with the help of technology and the Greek police, I was able to retrieve them.</p>

<p>I visited Thessaloniki to spend some time with friends on a warm night in June. They live in west Thessaloniki, and I picked them up early in the evening to go to one of their favorite taverns. We parked in a lot right across from the tavern and sat down to enjoy some food, conversation, and each other’s company. I had packed some clothes, my AirPods Pro, sunglasses, and an electric Oral-B toothbrush into a small paper bag. Thinking that the car was just across the road from where we sat, I thought it would be safe to leave the bag on the back seat, right on top of my toddler’s seat.</p>

<p>After about 15 minutes, I got a notification that I had left my AirPods behind. I looked at the car and didn’t notice anything out of the ordinary. Sometimes, these notifications from <a href="https://www.apple.com/icloud/find-my/">“Find My”</a> are false positives, as it may think you dropped the case while walking. I ignored the notification.</p>

<p>A few hours later, we decided to move on and got up to get to the car. I was about to suggest a beer follow-up, but then I looked at my car’s door and saw this:</p>

<p><img src="/images/posts/broken-into/car_broken_lock.JPEG" alt="&quot;Who makes these locks???&quot;    " title="Probably just a screwdriver?" /></p>

<p>Disappointed, I immediately realized what had happened. The bag was missing, and the side passenger drawer was open and visibly untidy.</p>

<blockquote>
  <p>In retrospect, we should not have touched much so the forensics could have their best chance when they got the fingerprints the next day.</p>
</blockquote>

<p>We immediately phoned 100 (the police) and started checking the surrounding area for the odd chance of them having ditched the bag as they left. They nicked the clothes as well, which were in the bag 😒.</p>

<p>The police took their sweet time to get there, approximately 40 minutes for a car to arrive.</p>

<p>While we were waiting, I thought I should check if the AirPods had sent any signals. And they did!</p>

<p><img src="/images/posts/broken-into/airpod_signal.JPEG" alt="&quot;What an amazing technology.&quot;    " title="I see you 👁️" />. We were pretty excited to realize that the AirPods were about 1 km away from where we were. My two friends, after waiting 20 minutes for the police to arrive, decided to get their own car and go to the area to see if they could spot anyone potentially trying to pair the AirPods or sell them.</p>

<p>Now it was 00:15, and the police finally arrived. The two officers that showed up were pretty cool. They registered the event, and one of them also had AirPods at home. I showed him the point on the map, and he got excited! He said we gotta go and check it out. We might even catch them!</p>

<p>So we jumped in our respective cars and headed for the point the AirPods last sent a location from. Once we got there, we found my friends already looking around the park and the bins for the bag. They hadn’t found anything yet.</p>

<p>After looking thoroughly with the policemen and going around the park from side to side probing for a signal, I decided to restart my iPhone. Even though the AirPods were showing as sending continuous signals, they didn’t show exactly where they were.</p>

<p>Once I rebooted the phone, I was pretty tired at that point and more or less thinking that there was approximately zero chance we’d find them. They might even be within one of the apartments, but there were dozens of them all around, so no way to really go and knock on a specific door.</p>

<p>And then it happened. I pressed the Play Sound button and heard a faint feedback noise. I pressed it again and heard it once more. I called the others to the location, and we located the bag dropped in a bin. Folded and dropped in with, thankfully, all the contents still inside (🤢😅). We turned the bin sideways and recovered the bag. I looked inside and, to my complete amazement, saw absolutely everything still inside. I suppose they were looking for money(?).</p>

<blockquote>
  <p>Perhaps they got scared when they realized that they stole a tracking device.</p>
</blockquote>

<p>I thanked everyone involved, and we called it a night.</p>

<p>The next morning, I proceeded to file a lawsuit against an unknown person at the police department. I had cleaned the car a bit with wipes, but they suggested I go by their headquarters to get forensics to look for fingerprints.</p>

<p>Once we got there, the process was pretty quick. The forensics expert found some prints, but he also found a glove mark. These little square patterns. Regardless, if one of the prints recovered from the door belonged to someone with a record, I’ll be notified.</p>

<p><img src="/images/posts/broken-into/car_glove.png" alt="&quot;Damn pros&quot;    " title="Dish washing gloves?" /></p>

<p>That’s the end of the story at this point. I thought it was interesting enough to convey it to you. Thanks to Apple for some amazing tech. Those belongings were definitely worth a few hundred quid, so I am happy to have recovered them.</p>

<p>In the next few days, I’ll look to get insurance to pay for the broken lock, so I need to chase the repair and the paperwork. Fun!</p>

<p>PS. Never leave belongings in the car while in Greece, especially in any of the big cities. I suppose due to my permanent residence being in Ireland for so many years and in Greece, where we stay in relatively small communities, my guard was lowered. It was a cheap lesson, but a lesson nonetheless.</p>

<p><em>Edited with ChatGPT 4o for readability and coherence</em></p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Opening a business bank account in Greece]]></title>
    <link href="https://codesennin.com/archive/2023/01/24/opening-a-business-bank-account-in-greece/"/>
    <updated>2023-01-24T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2023/01/24/opening-a-business-bank-account-in-greece</id>
    <content type="html"><![CDATA[<h2 id="intro">Intro</h2>
<p>This is the second post in the series of opening a business in Greece. In this part, I am going to cover the bank account opening part.
Every business needs a bank account where invoices can be paid and the one I am opening is no exception.
As part of this blog, you will learn what documents I needed to supply to my bank and hopefully learn from my mistakes.</p>

<h2 id="choosing-a-bank">Choosing a bank</h2>
<p>Greece has various banks in operations and nowadays some online options as well such as Revolut. I wasn’t brave enough to try the online banks for the time being so I went with <a href="https://www.piraeusbank.gr/el/idiwtes">Peiraus</a>. They have the Winbank app which seems easy to use and with enough options for the day-to-day. It’s also one of the established banks in Greece perhaps alongside the National Bank of Greece.</p>

<h2 id="waiting-times">Waiting times</h2>
<p>One thing that struck me initially was how long the appointments are taking to be able to open one such account in Peiraus. They told me ten days later. Thankfully I managed to find a way to get an earlier appointment but be aware that opening a bank account might not be a next-day kind of deal.</p>

<h2 id="documentation">Documentation</h2>
<p>If you are already a resident of Greece you will be asked to supply a tax clearance document (Εκκαθαριστικό) but in my case, since I was an ex-pat returning, I didn’t need one.</p>

<p>I brought the following documents with me:</p>
<ul>
  <li>Rental Agreement(Μισθωτήριο)</li>
  <li>Letter(Υπέυθυνη Δήλωση) from Landlord that they allow me to use their premises as my business base</li>
  <li>Letter from the Revenue about my business starting operations(Βεβαίωση Έναρξης)</li>
  <li>Id</li>
</ul>

<h2 id="how-it-went">How it went</h2>
<p>When I went in the clerk required me to also provide a signed statement that I wasn’t able to procure the tax clearance for 2022 since I was living abroad. Keep in mind that to procure signed statements you have two options. One is to visit a KEP(Κέντρο Εξυπηρέτησης Πελατών) and the other is to do it online via Gov.gr. To do it online though you will need a bank account as this is how they confirm your phone number and your identity in Gov.gr. Don’t ask me why taxisnet that I have already setup doesn’t work though 🤷‍♂️.</p>

<h2 id="the-pos-situation">The POS situation</h2>
<p>I was told by my accountant that all companies need a POS these days. This wasn’t entirely true. After asking around and with the help of the Twitter army I realized that I made the mistake of applying for and getting a POS. Acquiring one will set you back by €150-€200 depending on the bank, let alone the monthly subscription to run it. If you need one there’s a better offering from Viva Wallet. Their ePOS costs nothing to run other than the fees which might be better for you if you intend to keep it largely unused. In my case, I ended up returning it for a refund(hoping to get one that is) as it turns out that for B2B transactions this isn’t needed. With all that said, the area is a bit gray so better consult your accountant for a more accurate picture of your setup.</p>

<h2 id="the-offer-for-more-services">The offer for “more services”</h2>
<p>Once the bank account opened the clerk asked me which “package” I was interested in. That seems to be a sales tactic to sell you some insurance or other products as part of your business account. They presented it to me as being something mandatory for Peiraus which I haven’t found any evidence to date. I managed to dodge that for the time being and you should too if they try to sell you anything similar as “mandatory” with your business account.</p>

<h2 id="access-to-the-mobile-app-and-web">Access to the mobile app and web</h2>
<p>As soon as the bank account opened I was able to download the mobile app and log in. Once I got home I logged into Gov.gr and created a signed statement that I mentioned above since I was now able to authenticate and identify myself in Gov.gr so I didn’t need to visit KEP to do it. I forwarded the letter to the clerk and that was the end of my journey to open a bank account.</p>

<h2 id="next-steps">Next Steps</h2>
<ul>
  <li>Signing the agreement to provide services</li>
  <li>Getting a company stamp</li>
  <li>Kick-starting the steps to avail to ΑΡΘΡΟ 5Γ</li>
  <li>Generating my first invoice via GOV.gr</li>
</ul>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Returning to Greece and starting a company]]></title>
    <link href="https://codesennin.com/archive/2023/01/04/returning-to-greece-the-start/"/>
    <updated>2023-01-04T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2023/01/04/returning-to-greece-the-start</id>
    <content type="html"><![CDATA[<h2 id="intro">Intro</h2>
<p>This is a series of articles that document my experience returning to Greece to work remotely for Ardanis.com via a brand new company that I plan to create in Greece. I hope that it will help others that may be in similar situations find clues and a path to do the same. If you got specific questions or feedback do not hesitate to <a href="https://bluesky.com/codesennin">ping me on bluesky</a>.</p>

<h2 id="returning-to-greece">Returning to Greece</h2>
<p>As you may know, I am Greek and I moved to Ireland about 11 years ago. Due to my circumstances and the flexibility of my profession, I decided to move back to Greece and work remotely in late 2022. I cofounded <a href="https://www.ardanis.com">Ardanis.com</a> in 2016 and turned my passion for software craftmanship into a successful software consultancy. If you are looking to get something built at a level that is only found in high-end companies then <a href="https://ardanis.com/about-us/#contact">give us a shout</a>!</p>

<p>Up until the end of 2022, I have been a permanent employee of Ardanis since I lived in Ireland but since we lack an entity in Greece, I will have to continue providing my services to the company via a Greek entity that I plan to create. The plan is to create this company in Greece and provide services exclusively to Ardanis. <del>I plan to recruit in 2023 so if you are interested then make sure to follow me on Bluesky where I’ll be posting these jobs.</del></p>

<h2 id="incentives">Incentives</h2>
<p>A big incentive for expats such as myself was the scheme that offers 50% tax reduction for 7 years to Greeks that have worked at least 5 years abroad. The tax legislation is called <a href="https://www.taxheaven.gr/circulars/38210/e-2224-2021">ΑΡΘΡΟ 5Γ ΚΦΕ</a>. After I left in 2011, I gathered all the necessary documentation in 2015 so I can move to the revenue department of foreign citizens. At this point, I hope that this in combination with the documentation I have exported from the Revenue.ie will allow me to apply and succeed in getting the tax discount for the next 7 years.</p>

<h2 id="ike-or-atomiki">IKE or Atomiki?</h2>
<p>There are two possibilities for what I am looking to do basically. IKE type or Atomiki. There are quite a few factors to consider when looking at both of these options but to make it simple for you then remember this: If you are eligible for “ΑΡΘΡΟ 5Γ” tax relief then Atomiki wins out by a great margin. Otherwise, if you are not eligible, go for IKE.</p>

<h2 id="a-good-accountant">A good accountant</h2>
<p>I cannot stress enough how important it is to find a good accountant. In the landscape of the Greek tax system which is still a labyrinth to navigate, a good accountant will make all the difference in the world. If you have people already in Greece ask around for references. Check a few and go with the one you feel has the best skill, even if you have to pay a bit more you risk less creating a “black hole” and gain more by maximizing what you can “expense” since they will guide you.</p>

<h2 id="overview-of-the-setup">Overview of the setup</h2>
<ul>
  <li>Work from home initially</li>
  <li>Have my rented house registered as the base of the company</li>
</ul>

<h2 id="prerequisites">Prerequisites</h2>
<ul>
  <li>Rental Agreement from taxis</li>
  <li>Taxis login credentials and Kleidarithmos</li>
</ul>

<h2 id="first-steps---week-of-02012023">First steps - Week of 02/01/2023</h2>
<p>Having spoken with my accountant before this date, the plan was to create the company immediately in 2023. Here’s what we achieved in a week.</p>

<h2 id="transferring-tax-residence-to-greece">Transferring tax residence to Greece</h2>
<p>To start the company creation I needed first to go to DOY and transfer my tax residence to Greece. You need to book an appointment with the Foreign DOY department via Taxis and go there with the rental agreement to get this sorted.
Once you are there, they will check if you have any outstanding tax obligations and if not, you will be requested to fill out two forms: M1 and M7(in the case where you had a tax representative before).</p>

<h2 id="company-creation">Company creation</h2>
<p>To create the company, my accountant requested the following documents</p>
<ul>
  <li>The rental agreement from taxis</li>
  <li>A statement from the landlord that he allows me to use his property for business operations</li>
  <li>Id scan</li>
  <li>Short description of the kind of services I would be offering</li>
  <li>Optionally: An alias of the company. I left it as my full name for now but may change it later.</li>
</ul>

<h2 id="getting-registered-in-efka">Getting registered in EFKA</h2>
<p>EFKA is your public health/pension insurance and contributions. The accountant typically registers someone who already has been there seamlessly with EFKA but in my case, there was a problem so I had to go there physically and see what was going on. The plan was to enroll me in the special category of 136 euros per month for 5 years since I am a new business owner in Greece. For this purpose he equipped me with the following documentation(printed):</p>
<ul>
  <li>Company enrollment document</li>
  <li>Rental agreement from taxis</li>
  <li>Landlord statement(See above)</li>
</ul>

<p>He also booked the appointment with the Μητρώο so I can simply go in. Turns out that as soon as I went there, EFKA had everything ready for me and they simply handed me two printed pages that were the evidence that I was now enrolled in that scheme.</p>

<p>If you are enrolled in EFKA after you pay them two months’ worth of contributions you are then eligible to get a Βιβλιάριο which is your full access to the public health system and medication coverage.</p>

<h2 id="end-of-the-first-week">End of the first week</h2>
<p>That’s not bad for a week’s worth of effort. That said, compared to the Irish system, I think we have quite a few things to improve. Physical presence should only be required once and then everything else should be done via the internet.</p>

<h2 id="next-steps">Next Steps</h2>
<ul>
  <li>Signing the agreement to provide services</li>
  <li>Getting a company stamp</li>
  <li>Opening a bank account and getting a mandatory POS</li>
  <li>Kick-starting the steps to avail to ΑΡΘΡΟ 5Γ</li>
  <li>Generating my first invoice via GOV.gr</li>
</ul>

<h2 id="closing-words">Closing words</h2>
<p>If you find the above interesting consider subscribing to the <a href="https://feeds.feedburner.com/CodeSennin">RSS feed</a> and following me on <a href="https://x.com/codesennin">Twitter</a> where I post regularly about my experience moving and working remotely from Greece.</p>

<p>See you next week!</p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Moving to GitHub Actions and Jekyll 4.2.0]]></title>
    <link href="https://codesennin.com/archive/2021/02/22/moving-to-github-actions-and-jekyll-4.2.0/"/>
    <updated>2021-02-22T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2021/02/22/moving-to-github-actions-and-jekyll-4.2.0</id>
    <content type="html"><![CDATA[<h1 id="why-the-switch">Why the switch?</h1>
<p>This blog uses Jekyll, a static website generator framework, to generate the necessary files which are hosted in <a href="https://pages.github.com/">GitHub Pages</a>. This post explains the reasons that made me switch from Github pages’ default building mechanism to Github Actions.</p>

<p>While I was trying to resolve a few dependabot security issues which were about a few gems that I was using, I decided to move this blog to the latest jekyll version which is 4.2.0 at the time of this post.
Github, for security reasons, doesn’t allow you to move to any jekyll version and will only allow you to use whitelisted ruby gems/plugins.</p>

<p>I am not upgrading the blog site very often, you can probably tell as I am not blogging quite often either. Hence, I wanted to upgrade to the latest and forget about it for a while. Thankfully, the process of achieving this is documented quite well on <a href="https://jekyllrb.com/docs/continuous-integration/github-actions/">Jekyll’s website</a>.</p>

<p>The switch and upgrade was quite straightforward. It also works with the latest/stable Ruby (3.0) which is quite cool as I always had some issues with gem incompatibilities. Github needs a yaml file in a specific directory in order to setup your action. Other than that, a GitHub token is needed to be registered in your repository settings. This gives it permissions for public repositories that you own(specifically to update the gh-pages branch).</p>

<p>It’s a great time to be a developer when your CI/CD pipeline for a blog looks as simple as that:</p>

<pre><code class="language-yml:">name: Build and deploy Jekyll site to GitHub Pages

on:
  push:
    branches:
      - master

jobs:
  github-pages:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: helaili/jekyll-action@2.0.5
        env:
          JEKYLL_PAT: $
</code></pre>

]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Meditation]]></title>
    <link href="https://codesennin.com/archive/2019/10/21/meditation/"/>
    <updated>2019-10-21T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2019/10/21/meditation</id>
    <content type="html"><![CDATA[<h1 id="my-experience">My experience</h1>

<p>Two years ago, I decided to try meditation as a way to reduce my anxiety. Eventhough I tried to look into it by myself, the <a href="https://headspace.com">Headspace</a> application helped me ease into it much better. I realized after following Andy’s(The founder) guidance that Mindfulness and meditation has many more benefits rather than just anxiety-reducing ones.</p>

<p>About 2 months in, with daily 10 minute sessions I saw my first results. A noticeable reduction in anxiety. A year later, a much bigger improvement. Nowadays, I am basically a different person than the one from mid-2017. Stress and anxiety is managed better. Anger is noticed way in advance and I decide whether or not to vent/release it. My focus and my ability to “get in the zone” has also become better.</p>

<p>There are a number of ways to perceive Meditation as. Personally, I see it as my mind’s workout and hygiene sessions. If my fitness needs time to keep up then why not my mind?</p>

<p><img src="/images/posts/headspace-streak.jpg" alt="&quot;My initial aim was to meditate daily for a year non-stop&quot;    " title="I am a sucker for achievements" /></p>

<p>If you haven’t heard of meditation before, don’t be intimidated by it. You just sit still for at least 10 minutes and be mindful of certain things such as your breath(in a nutshell). Andy will give you advice in the form of “homework” that you need to follow on each day depending on the pack that you are completing. Each pack deals with a different area eg anxiety, stress, grief, focus etc. You need to meditate at least 3 times per week to get the benefits though.</p>

<p>If you happen to try it let me know of your experience with it. Finally, if you have any questions just message me and I am happy to help.</p>

]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[About refugees]]></title>
    <link href="https://codesennin.com/archive/2016/05/06/about-refugees/"/>
    <updated>2016-05-06T16:08:00+00:00</updated>
    <id>https://codesennin.com/archive/2016/05/06/about-refugees</id>
    <content type="html"><![CDATA[<p>The Syrian refugees wave that has been crashing over Greece for the past few years is something that moves me. I grew up with the stories of my Grandparents, <a href="https://en.wikipedia.org/wiki/Pontic_Greeks">Pontians</a> who were living on the shores of the black sea when Stalin exiled them with a bunch of kids under their armpits to live in the deserts of Kazakhstan.</p>

<p>Always wondered, how that must feel like. To be uprooted, stripped from your property and relocated despite your will; with kids.</p>

<p>Stories of people loosing their close ones during the relocations. People finding each other decades later in some reality shows up to this day.</p>

<p>When they decided to return to Greece, 16 years later, they were treated as unwanted immigrants. Pontians are Greeks for your information. Greece has changed considerably ever since. I like to think that it’s the memories and stories of the hardship that they’ve been through that makes them so empathetic towards the Syrian refugees.</p>

<p>I am incredibly proud for the Greek activists that aid the refugees.</p>

<p>We are on the third memorandum. My people are on the worst possible state I ever remember them on. Some of them fight tooth and nail to remain in Greece and despite their terrible financial state there is one rare commodity which they demonstrate time and time again.</p>

<p>Compassion.</p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Learn to unlearn]]></title>
    <link href="https://codesennin.com/archive/2015/11/29/learn-to-unlearn/"/>
    <updated>2015-11-29T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2015/11/29/learn to-unlearn</id>
    <content type="html"><![CDATA[<p>As we grow up, we gain a lot of skills and habits which are beneficial to ourselves and others around us. From social skills, to technical ones and beyond. Unfortunately, we pick up and/or inherit some bad ones as well, that’s life after all. We’ll call those ‘baggage’ and personally I categorize them in two categories; evolutionary, and life baggage.</p>

<p>Evolutionary would be a trait you simply inherited, something primal and useful under different contexts but most likely problematic nowadays.</p>

<p>Life baggage on the other hand is little things you pick up as you grow up. Perhaps an addiction, or a propensity for being most of the time a couch potato. Arguably, some of life’s bad traits may have evolutionary root.</p>

<p><img src="/images/posts/selfish.png" alt="But I only wanted positive traits. Why do I have to deal with the negative ones as well? :(" title="Darkest Dungeon" /></p>

<p><a href="https://store.steampowered.com/app/262060/">Darkest Dungeon</a> makes a very accurate, in my opinion, representation of life’s character progression. In order to survive(and thrive) we picked up different traits along the way and even though each one of us is taking steps in order to gain more positive ones, not everyone is tackling their negative ones.</p>

<p>Identifying those bad traits is some times hard; we are all very content as we are. Sometimes though, those behaviors can be problematic for our professional and/or personal careers. A healthy amount of introspection is due in this case.</p>

<p>Character development is not only about addition, but about subtraction as well.</p>
]]></content>
  </entry>
  
  
  
  <entry>
    <title type="html"><![CDATA[Fear as a compass]]></title>
    <link href="https://codesennin.com/archive/2014/06/01/fear-as-a-compass/"/>
    <updated>2014-06-01T00:00:00+00:00</updated>
    <id>https://codesennin.com/archive/2014/06/01/fear-as-a-compass</id>
    <content type="html"><![CDATA[<p>A couple of weeks ago I came across an old <a href="https://blog.codinghorror.com/choosing-your-own-adventure/">CodingHorror post</a> and a certain sentence became a sort of revelation for me.</p>

<blockquote>
  <p>“I won’t lie to you. It’s scary to trade the security of a safe, salaried job for the unknowns of your own small business. But the way I look at it, if it’s not a little scary, then it’s not the right choice. Failure is always an option.”</p>
</blockquote>

<p>Jeff describes how different choices in life usually lead us down to different paths and outcomes - a well known fact, right? While he expands on his thoughts on the subject though, he comes across one evolutionary guardian emotion of ours; fear.</p>

<p>Everone feels or felt fear at some point in their life.</p>

<p><img src="/images/after_earth.jpg" alt="&quot;Fear is not real. The only place that fear can exist is in our thoughts of the future. It is a product of our imagination, causing us to fear things that do not at present and may not ever exist. That is near insanity. Do not misunderstand me danger is very real but fear is a choice.&quot;" title="After Earth" /></p>

<p>It’s a trait that we must have spend millions of lifes to earn and it manifests in different forms. It comes in <a href="https://en.wikipedia.org/wiki/Fear">various shapes and intensities</a> but this blog post - I guess - focuses on the fear of the unknown, uncertainty, unpredicability and survival.</p>

<h2 id="analyzing-fear">Analyzing fear</h2>

<p>Fear is a compass. It can point you in the right, or wrong direction so all you have to do is be able to interpret the readings and choose a course of action.</p>

<p>In modern society, fear is rarely helpful, unless you are living in the middle of the jungle or you wonder through the night in bad neighborhoods. In some cases, fear is an indication of a “gambling attempt”. There is something to gain and - occasionally - something to lose. It may also mean that you lack information, preparation or control for what you are about to do. So for me, fear is an interesting tool; it tells me where improvements may be made by certain choices and where gaps that require more thinking lie.</p>

<p>Fear is one of the most common emotions and yet you rarely hear people talk about it. I think that society raises us to think that expressing or communicating fear is a sign of weakness; it’s almost a taboo. I find the fact that noone gives you guidance on how to deal with these emotions even more perplexing so in the next blog post I’ll share some information on how I learned to deal with it.</p>
]]></content>
  </entry>
  
  
</feed>
