<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on paval.io</title><link>https://danielpaval.github.io/posts/</link><description>Recent content in Posts on paval.io</description><generator>Hugo -- 0.145.0</generator><language>en</language><lastBuildDate>Sat, 29 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://danielpaval.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Pull Request Code Review in GitHub Actions</title><link>https://danielpaval.github.io/posts/2025-08-20-pull-request-code-review-in-github-actions/</link><pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-08-20-pull-request-code-review-in-github-actions/</guid><description>&lt;p>As a followup to &lt;a href="https://danielpaval.github.io/posts/2025-08-08-openai-codex-in-github-actions/">OpenAI Codex CLI in GitHub Actions&lt;/a> this new workflow automates pull request code reviews:&lt;/p>
&lt;p>&lt;img alt="pr-review-comment.png" loading="lazy" src="https://danielpaval.github.io/posts/2025-08-20-pull-request-code-review-in-github-actions/pr-review-comment.png">&lt;/p>
&lt;p>Check out this &lt;a href="https://github.com/danielpaval/ai-workflow-use-cases/blob/main/.github/workflows/codex-pr-review.yml">demo repo&lt;/a> that uses OpenAI Codex CLI + MCPs in GitHub Actions.&lt;/p></description></item><item><title>Markdown to Confluence Sync Workflow</title><link>https://danielpaval.github.io/posts/2025-11-29-markdown-to-confluence-sync/</link><pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-11-29-markdown-to-confluence-sync/</guid><description>&lt;p>I wanted to jot down a few notes about the &lt;a href="https://github.com/danielpaval/markdown-to-confluence/blob/main/.github/workflows/sync-to-confluence.yml">&lt;code>Sync to Confluence&lt;/code> workflow&lt;/a> that keeps the &lt;code>markdown-to-confluence&lt;/code> docs mirrored in Atlassian.&lt;/p>
&lt;h2 id="why-its-handy">Why it&amp;rsquo;s handy&lt;/h2>
&lt;p>Keeping authoring in Markdown means the docs stay right beside the codebase, so assistants like GitHub Copilot (and other IDE-aware agents) can ingest real project guidance without leaving the editor. The same repo search powers autocomplete, inline explanations, and context-aware chat, which is way faster than switching to a browser tab and hunting through Confluence. Non-developers still get the polished Confluence pages produced by the workflow, so stakeholders have a familiar place to read without digging into Git.&lt;/p></description></item><item><title>Embedding Apache Superset Dashboards</title><link>https://danielpaval.github.io/posts/2025-10-07-superset-embed-demo/</link><pubDate>Tue, 07 Oct 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-10-07-superset-embed-demo/</guid><description>&lt;p>A demonstration project showing how to embed Apache Superset dashboards into external applications using the Superset SDK.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;a href="https://superset.apache.org/">Apache Superset&lt;/a> is a powerful open-source data exploration and visualization platform. This demo project showcases how to embed Superset dashboards into a Spring Boot application, enabling seamless integration of analytics dashboards into your own applications.&lt;/p>
&lt;p>&lt;strong>Repository&lt;/strong>: &lt;a href="https://github.com/danielpaval/superset-embed-demo">danielpaval/superset-embed-demo&lt;/a>&lt;/p>
&lt;h2 id="project-stack">Project Stack&lt;/h2>
&lt;p>The project combines several technologies:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Apache Superset&lt;/strong> (Python) - The analytics platform&lt;/li>
&lt;li>&lt;strong>Spring Boot&lt;/strong> (Java) - Backend application framework&lt;/li>
&lt;li>&lt;strong>Docker&lt;/strong> - Containerized deployment&lt;/li>
&lt;li>&lt;strong>Gradle&lt;/strong> - Build automation&lt;/li>
&lt;/ul>
&lt;h2 id="key-configuration">Key Configuration&lt;/h2>
&lt;p>To enable embedding Superset dashboards, several configuration changes are required:&lt;/p></description></item><item><title>Spring Boot API Demo</title><link>https://danielpaval.github.io/posts/2025-10-07-spring-boot-api-demo/</link><pubDate>Tue, 07 Oct 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-10-07-spring-boot-api-demo/</guid><description>&lt;p>This WIP &lt;a href="https://github.com/danielpaval/spring-boot-api-demo">spring-boot-api-demo&lt;/a> repo gathers reusable components and common practices in building Spring Boot applications all the way from exposing a REST API to the ultimate SQL Server-based JPA persistence.&lt;/p></description></item><item><title>OpenAI Codex in GitHub Actions</title><link>https://danielpaval.github.io/posts/2025-08-08-openai-codex-in-github-actions/</link><pubDate>Fri, 08 Aug 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-08-08-openai-codex-in-github-actions/</guid><description>&lt;p>Check out this &lt;a href="https://github.com/danielpaval/ai-workflow-use-cases">demo repo&lt;/a> that uses OpenAI Codex + MCPs in GitHub Actions:&lt;/p>
&lt;p>&lt;img alt="github-actions-workflow.png" loading="lazy" src="https://danielpaval.github.io/posts/2025-08-08-openai-codex-in-github-actions/github-actions-workflow.png">&lt;/p></description></item><item><title>Structurizr vs LikeC4</title><link>https://danielpaval.github.io/posts/2025-05-11-structurizr-vs-likec4/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-05-11-structurizr-vs-likec4/</guid><description>&lt;blockquote>
&lt;p>This WIP post compares Structurizr and LikeC4 with a focus on their export capabilities.&lt;/p>&lt;/blockquote>
&lt;h1 id="2-export">2. Export&lt;/h1>
&lt;h2 id="21-export-to-static-site">2.1 Export to Static Site&lt;/h2>
&lt;h3 id="structurizr">Structurizr&lt;/h3>
&lt;p>Prerequisites:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://graphviz.org">Graphviz&lt;/a> dot&lt;/li>
&lt;/ul>
&lt;p>Command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>structurizr export -workspace workspace.dsl -format static
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img alt="structurizr-export-static.png" loading="lazy" src="https://danielpaval.github.io/posts/2025-05-11-structurizr-vs-likec4/structurizr-export-static.png">&lt;/p>
&lt;p>Conlusions:&lt;/p>
&lt;ul>
&lt;li>⚠️ The static export of Structurizr is a very trimmed version of the Lite version, without the top menu, just the navigation feature starting with the top context diagram&lt;/li>
&lt;/ul>
&lt;h3 id="likec4">LikeC4&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>likec4 build -o ./dist
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="22-export-to-svgpng">2.2 Export to SVG/PNG&lt;/h2>
&lt;h3 id="structurizr-1">Structurizr&lt;/h3>
&lt;p>Structurizr CLI can export to &lt;code>SVG&lt;/code> or &lt;code>PNG&lt;/code> format via a Node.js and Puppeteer &lt;a href="https://github.com/structurizr/puppeteer">workaround&lt;/a>:&lt;/p></description></item><item><title>Mermaid CLI</title><link>https://danielpaval.github.io/posts/2025-04-14-mermaid-cli/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-04-14-mermaid-cli/</guid><description>&lt;p>Let&amp;rsquo;s see how Mermaid&amp;rsquo;s CLI can generate images from diagrams:&lt;/p>
&lt;ol>
&lt;li>&lt;code>npm install -g @mermaid-js/mermaid-cli&lt;/code>&lt;/li>
&lt;li>&lt;code>mmdc -i .\sequence_diagram.mmd -o sequence_diagram.png&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>Output:&lt;/p>
&lt;p>&lt;img alt="sequence_diagram.png" loading="lazy" src="https://danielpaval.github.io/posts/2025-04-14-mermaid-cli/sequence_diagram.png">&lt;/p></description></item><item><title>Hello, Mermaid!</title><link>https://danielpaval.github.io/posts/2025-04-13-hello-mermaid/</link><pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-04-13-hello-mermaid/</guid><description>&lt;p>Let&amp;rsquo;s try Hugo&amp;rsquo;s support of mermaid diagrams:&lt;/p>
&lt;pre class="mermaid">
---
config:
look: neo
theme: neo
---
sequenceDiagram
Alice-&amp;gt;&amp;gt;John: Hello John, how are you?
John--&amp;gt;&amp;gt;Alice: Great!
Alice-)John: See you later!
&lt;/pre>
&lt;p>Hugo does not include out-of-the-box support for Mermaid diagrams, but it can be easily customized:&lt;/p>
&lt;blockquote>
&lt;p>See &lt;a href="https://github.com/danielpaval/danielpaval.github.io/tree/master/layouts">https://github.com/danielpaval/danielpaval.github.io/tree/master/layouts&lt;/a> external to defined theme&lt;/p>&lt;/blockquote>
&lt;p>&lt;strong>layouts/_default/_markup/render-codeblock-mermaid.html&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">pre&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;mermaid&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {{ .Inner | htmlEscape | safeHTML }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">pre&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{ .Page.Store.Set &amp;#34;hasMermaid&amp;#34; true }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>layouts/_default/baseof.html&lt;/strong> before &lt;code>&amp;lt;/body&amp;gt;&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>{{ if .Store.Get &amp;#34;hasMermaid&amp;#34; }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">script&lt;/span> &lt;span style="color:#a6e22e">type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;module&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">import&lt;/span> &lt;span style="color:#a6e22e">mermaid&lt;/span> &lt;span style="color:#a6e22e">from&lt;/span> &lt;span style="color:#e6db74">&amp;#39;https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">mermaid&lt;/span>.&lt;span style="color:#a6e22e">initialize&lt;/span>({ &lt;span style="color:#a6e22e">startOnLoad&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">script&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>JSON Event Data Audit Demo</title><link>https://danielpaval.github.io/posts/2025-03-16-json-event-data-audit-demo/</link><pubDate>Sun, 16 Mar 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-03-16-json-event-data-audit-demo/</guid><description>&lt;h1 id="context">Context&lt;/h1>
&lt;p>The opportunity for this analysis originated with the need to ingest highly-dynamic unstructured data produced by
various events and be able to efficiently report on it both programmatically and to (business) users. In an ecommerce
scenario, an event could be a customer registration, an order, a shipment, a return, etc.:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;REGISTRATION&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;data&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Jane Smith&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;email&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;jane.smith@example.com&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;phone&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;987-654-3210&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;addresses&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;default&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;street&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1742 Waverley Drive&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;city&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Palo Alto&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;state&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;CA&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;zip&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">94301&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;country&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;United States&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;code&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;US&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="tldr">TLDR&lt;/h1>
&lt;h1 id="chain-of-thought--prototyping">Chain of Thought &amp;amp; Prototyping&lt;/h1>
&lt;p>The following steps roughly show the evolution of my ideas and solution components along the way. In order to proceed
with an objective evaluation of improvements I tried to rely on a core set of non-functional metrics:&lt;/p></description></item><item><title>To Envoy or not to Envoy</title><link>https://danielpaval.github.io/posts/2025-03-05-to-envoy-or-not-to-envoy/</link><pubDate>Wed, 05 Mar 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-03-05-to-envoy-or-not-to-envoy/</guid><description>&lt;p>I recently came across the need for a reusable microservice in the form of an OCI / Docker image to meet different authentication and authorization requirements depending on the end project and environment. While the current limited set of possible security configurations is handled by the microservice itself, I analyzed the possibility of delegating this aspect to a specialized sidecar container living in the same Kubernetes pod.&lt;/p>
&lt;p>After a bit of prompt engineering and wanting to consider something else than NGINX I decided to first try &lt;a href="https://www.envoyproxy.io/">Envoy Proxy&lt;/a>. Long story short, here&amp;rsquo;s a Docker Compose setup:&lt;/p></description></item><item><title>Claude Code - Hello world!</title><link>https://danielpaval.github.io/posts/2025-03-02-claude-code-hello-world/</link><pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-03-02-claude-code-hello-world/</guid><description>&lt;p>As I heard about Claude Code at the end of this week&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>, I wanted to try it out myself. It took a bit of time to get the CLI going as Claude Code only works on Linux, and my WSL Node.js setup was both old and misconfigured.&lt;/p>
&lt;p>The task I put it up to was to help me show the hidden posts of this Hugo site, as I had no clues. Honestly, I was surprised to hit a speed bump already, having to buy some token credits first ($5) without any trial. But then it correctly suggested that I forgot about the &lt;code>draft: true&lt;/code> front matter field I had copy-pasted in multiple locations.&lt;/p></description></item><item><title>Hugo vs Jekyll</title><link>https://danielpaval.github.io/posts/2025-03-01-hugo-vs-jekyll/</link><pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-03-01-hugo-vs-jekyll/</guid><description>&lt;p>I just got to make a bit of progress on building a technical blog which is something I started to think about a few years ago. Back at the beginning, the focus was on getting familiar with static site generators, mainly Jekyll and Hugo.&lt;/p>
&lt;p>Now, I&amp;rsquo;m going with Hugo for, mostly, simplicity:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Feature&lt;/th>
&lt;th>Hugo 🏎️&lt;/th>
&lt;th>Jekyll 📝&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Performance&lt;/strong>&lt;/td>
&lt;td>⚡ Extremely fast (built with Go)&lt;/td>
&lt;td>🚶 Slower (built with Ruby)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Installation&lt;/strong>&lt;/td>
&lt;td>✅ Single binary, no dependencies&lt;/td>
&lt;td>❌ Requires Ruby and Bundler&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Templates&lt;/strong>&lt;/td>
&lt;td>⚠️ Uses Go templates (harder to learn)&lt;/td>
&lt;td>✅ Uses Liquid templates (easier)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Content Format&lt;/strong>&lt;/td>
&lt;td>✅ Markdown, TOML/YAML/JSON&lt;/td>
&lt;td>✅ Markdown, YAML&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Plugins&lt;/strong>&lt;/td>
&lt;td>❌ No plugin system (built-in features only)&lt;/td>
&lt;td>✅ Supports plugins for more functionality&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>GitHub Pages&lt;/strong>&lt;/td>
&lt;td>⚠️ Requires extra setup&lt;/td>
&lt;td>✅ Natively supported&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ease of Use&lt;/strong>&lt;/td>
&lt;td>❌ Steeper learning curve&lt;/td>
&lt;td>✅ Easier for beginners&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Best For&lt;/strong>&lt;/td>
&lt;td>🚀 Speed, large sites, developers&lt;/td>
&lt;td>✍️ Blogs, simple websites, GitHub Pages&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Anthropic Model Context Protocol (MCP)</title><link>https://danielpaval.github.io/posts/2025-02-28-anthropic-mcp/</link><pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2025-02-28-anthropic-mcp/</guid><description>&lt;h1 id="elasticsearch">Elasticsearch&lt;/h1>
&lt;ol>
&lt;li>Install Python&lt;/li>
&lt;li>Install &lt;code>uv&lt;/code>: &lt;code>pip install uv&lt;/code>&lt;/li>
&lt;li>Clone &lt;a href="https://github.com/cr7258/elasticsearch-mcp-server">https://github.com/cr7258/elasticsearch-mcp-server&lt;/a>&lt;/li>
&lt;li>Setup Claude&lt;/li>
&lt;/ol>
&lt;h2 id="uvx-setup">uvx Setup&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;mcpServers&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;elasticsearch&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;uvx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;args&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;elasticsearch-mcp-server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;env&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ELASTIC_HOST&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;http://localhost:9200&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ELASTIC_USERNAME&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;elastic&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ELASTIC_PASSWORD&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;changeme&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="uv-setup">uv Setup&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;mcpServers&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;elasticsearch&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;uv&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;args&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;--directory&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;C:\\Repositories\\mcp\\elasticsearch-mcp-server&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;run&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;elasticsearch-mcp-server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;env&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ELASTIC_HOST&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;http://localhost:9200&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ELASTIC_USERNAME&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;elastic&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ELASTIC_PASSWORD&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;changeme&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="file-system">File System&lt;/h1>
&lt;h2 id="setup">Setup&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;mcpServers&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;filesystem&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;npx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;args&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;-y&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;@modelcontextprotocol/server-filesystem&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;C:\\Users\\dani\\Desktop&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="atlassian">Atlassian&lt;/h1></description></item><item><title>Win32 Epoch (1/1/1601)</title><link>https://danielpaval.github.io/posts/2022-06-18-win32-epoch/</link><pubDate>Sat, 18 Jun 2022 00:00:00 +0000</pubDate><guid>https://danielpaval.github.io/posts/2022-06-18-win32-epoch/</guid><description>&lt;blockquote>
&lt;p>ℹ️ This is a quick blog post to mainly play with Jekyll.&lt;/p>&lt;/blockquote>
&lt;p>Not long ago Windows on my laptop reported that Skype was last used on &lt;em>1/1/1601&lt;/em>.. While I rarely use Skype now-a-days, it surely wasn&amp;rsquo;t that long! January 1&lt;!-- raw HTML omitted -->st&lt;!-- raw HTML omitted --> does hint at some kind of a date baseline, just like the Unix epoch, but why &lt;em>1601&lt;/em>?&lt;/p>
&lt;p>&lt;img alt="Image description" loading="lazy" src="https://danielpaval.github.io/posts/2022-06-18-win32-epoch/win32-epoch-cleanup.png">&lt;/p>
&lt;p>Of course, this was a quick answer to look up and it turns out to be that &lt;em>&amp;ldquo;1601 was the first year of the 400-year Gregorian calendar cycle at the time Windows NT was made&amp;rdquo;&lt;/em>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>. More specifically, &lt;em>&amp;ldquo;The &lt;code>FILETIME&lt;/code> structure records time in the form of 100-nanosecond intervals since January 1, 1601&amp;rdquo;&lt;/em>&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>.&lt;/p></description></item></channel></rss>