<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xml:base="http://localhost:8080/">
  <title>Sven Malvik&#39;s Blog</title>
  <subtitle>Insights about AI leadership, tech, and trance music - sharing my journey at the intersection of technology and music.</subtitle>
  <link href="http://localhost:8080/feed.xml" rel="self" />
  <link href="http://localhost:8080/" />
  <updated>2025-01-05T20:43:19Z</updated>
  <id>http://localhost:8080/</id>
  <author>
    <name>Sven Malvik</name>
  </author>
	<entry>
      <title>How I write Git commit messages</title>
      <link href="http://localhost:8080/blog/how-i-write-git-commit-messages/" />
      <updated>2025-01-05T00:00:00Z</updated>
      <id>http://localhost:8080/blog/how-i-write-git-commit-messages/</id>
      <content type="html">
				&lt;h1 id=&quot;crafting-better-git-commit-messages-with-ai-🚀&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/how-i-write-git-commit-messages/#crafting-better-git-commit-messages-with-ai-%F0%9F%9A%80&quot; class=&quot;heading-anchor&quot;&gt;Crafting Better Git Commit Messages with AI 🚀&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Hey fellow developers! Today, I want to share something that’s been a game-changer in my daily workflow - how I craft meaningful Git commit messages using AI, without relying on GitHub Copilot.&lt;/p&gt;&lt;h2 id=&quot;quick-method-in-cursor&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/how-i-write-git-commit-messages/#quick-method-in-cursor&quot; class=&quot;heading-anchor&quot;&gt;Quick Method in Cursor&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Listen! 🎯 While writing this post, I stumbled upon this quick way to generate commit messages:&lt;/p&gt;&lt;ol class=&quot;list&quot;&gt;&lt;li&gt;Open Cursor’s Source Control panel (look for the branch/Y-shaped icon in the sidebar)&lt;/li&gt;&lt;li&gt;Find the commit message input field&lt;/li&gt;&lt;li&gt;Click the AI-generated commit message button (it looks like a star ⭐)&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;my-personal-method-using-cursor-chat&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/how-i-write-git-commit-messages/#my-personal-method-using-cursor-chat&quot; class=&quot;heading-anchor&quot;&gt;My Personal Method: Using Cursor Chat&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;But here’s how I personally prefer to do it:&lt;/p&gt;&lt;ol class=&quot;list&quot;&gt;&lt;li&gt;📝 Open Cursor’s Chat&lt;/li&gt;&lt;li&gt;🔍 Ensure no file is in the context&lt;/li&gt;&lt;li&gt;⚡️ Type &lt;code&gt;@PR&lt;/code&gt; and hit Enter (this adds @PR (Diff with Main Branch) to the context)&lt;/li&gt;&lt;li&gt;💬 Use this magic prompt:&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You are an engineer who wants to commit changes to the remote codebase. Your job is it to provide a short commit message about the recent changes as a one-liner.&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;✨ Hit Enter and voilà - perfect commit messages every time!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now that I think about it, I could probably create a Cursor extension to automate this whole process with a single keystroke. Maybe that’ll be my next project!&lt;/p&gt;&lt;p&gt;And that’s it! While both methods use AI to generate commit messages, there’s an interesting difference: my personal method always creates a concise one-liner, while the quick method might generate multi-line messages.&lt;/p&gt;&lt;p&gt;Listen! 💡 I personally prefer the one-liner approach as it keeps my git history clean and scannable. But now you know both methods - try them out and see which style works better for your workflow!&lt;/p&gt;&lt;p&gt;~Sven&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Azure API Management Challenges: Finding the Right Path</title>
      <link href="http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/" />
      <updated>2025-01-03T00:00:00Z</updated>
      <id>http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/</id>
      <content type="html">
				&lt;p&gt;Hey cloud architects! 👋&lt;/p&gt;&lt;p&gt;Following up on &lt;a href=&quot;http://localhost:8080/blog/vippsi-gets-smarter-expanding-file-support/&quot;&gt;yesterday’s post&lt;/a&gt; about our document processing system, I wanted to share some interesting challenges we’ve encountered with Azure API Management (APIM) and the solutions we’re exploring.&lt;/p&gt;&lt;h2 id=&quot;the-challenge&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/#the-challenge&quot; class=&quot;heading-anchor&quot;&gt;The Challenge&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;While implementing our document processing system, we’ve hit a limitation with Azure API Management: it struggles with payloads larger than 100kB. This presents an interesting architectural decision point for our system.&lt;/p&gt;&lt;h2 id=&quot;attempted-solutions&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/#attempted-solutions&quot; class=&quot;heading-anchor&quot;&gt;Attempted Solutions&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There’s actually a policy-based approach in APIM that supposedly handles larger payloads:&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;validate-content&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;unspecified-content-type-action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ignore&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;max-size&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;4194304&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However, this solution comes with its own set of challenges:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;The policy doesn’t seem to work reliably in practice&lt;/li&gt;&lt;li&gt;It adds another layer of complexity to our APIM policies&lt;/li&gt;&lt;li&gt;When combined with CORS handling, the policies become increasingly complex&lt;/li&gt;&lt;li&gt;Policy maintenance becomes a significant overhead&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;current-workaround&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/#current-workaround&quot; class=&quot;heading-anchor&quot;&gt;Current Workaround&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;As a temporary measure, we’ve implemented a simple file size limit of 100kB. While this gets us moving, it’s clearly not the long-term solution we need for handling larger documents effectively.&lt;/p&gt;&lt;h2 id=&quot;the-path-forward&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/#the-path-forward&quot; class=&quot;heading-anchor&quot;&gt;The Path Forward&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’m exploring a more robust approach:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;Moving files to Azure Storage Account&lt;/li&gt;&lt;li&gt;Maintaining only references in local IndexDB&lt;/li&gt;&lt;li&gt;Preserving user privacy by avoiding direct user-file associations&lt;/li&gt;&lt;li&gt;Bypassing APIM size limitations entirely&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While we could technically increase APIM’s limit to 4MB through a support ticket, I’m leaning towards the Storage Account solution as it provides better scalability and architectural cleanliness. This would also help us avoid the complexity trap of managing intricate APIM policies.&lt;/p&gt;&lt;h2 id=&quot;deep-dive-into-apim&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/azure-api-management-challenges-finding-the-right-path/#deep-dive-into-apim&quot; class=&quot;heading-anchor&quot;&gt;Deep Dive into APIM&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;http://localhost:8080/assets/images/PD6uaSZcxS-440.webp 440w&quot; sizes=&quot;90vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;Mastering Azure API Management book cover&quot; src=&quot;http://localhost:8080/assets/images/PD6uaSZcxS-440.jpeg&quot; width=&quot;440&quot; height=&quot;621&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;If you’re interested in mastering Azure API Management and want to learn more about handling these kinds of challenges (and many others), check out my book &lt;a href=&quot;https://www.amazon.com/Mastering-Azure-API-Management-Implementing/dp/1484280105&quot; rel=&quot;noopener&quot;&gt;“Mastering Azure API Management”&lt;/a&gt;. It covers everything from basic setup to advanced scenarios, including detailed discussions about policies, security, and architectural best practices.&lt;/p&gt;&lt;p&gt;Stay tuned as we continue to evolve our document processing architecture!&lt;/p&gt;&lt;p&gt;~ Sven&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Vippsi Gets Smarter: Expanding File Support</title>
      <link href="http://localhost:8080/blog/vippsi-gets-smarter-expanding-file-support/" />
      <updated>2025-01-02T00:00:00Z</updated>
      <id>http://localhost:8080/blog/vippsi-gets-smarter-expanding-file-support/</id>
      <content type="html">
				&lt;p&gt;Hey AI enthusiasts! 👋&lt;/p&gt;&lt;p&gt;I’ve been heads down working on Vippsi, our internal AI-powered conversation tool, and wanted to share what I’ve been up to. Imagine having a natural conversation with your entire organization’s knowledge base - asking questions about policies, documentation, or reports, and getting instant, contextual responses. Instead of scanning through hundreds of pages, you can simply ask questions in plain language and get precise answers drawn directly from your documents.&lt;/p&gt;&lt;p&gt;As a financial services company, Vipps MobilePay faces unique challenges with AI adoption. While solutions like OpenAI, Anthropic, or Google offer powerful capabilities, they aren’t always suitable for our needs. Financial institutions require stringent compliance measures and data privacy guarantees, while keeping costs manageable at scale. That’s why we’re building Vippsi as a custom solution that puts privacy and compliance first.&lt;/p&gt;&lt;h2 id=&quot;work-in-progress&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/vippsi-gets-smarter-expanding-file-support/#work-in-progress&quot; class=&quot;heading-anchor&quot;&gt;Work in Progress&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We’re expanding Vippsi to support multiple file formats:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;PDF documents&lt;/li&gt;&lt;li&gt;Word documents (DOCX)&lt;/li&gt;&lt;li&gt;PowerPoint presentations (PPTX)&lt;/li&gt;&lt;li&gt;Plain text files (TXT)&lt;/li&gt;&lt;li&gt;More formats coming soon&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;technical-architecture&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/vippsi-gets-smarter-expanding-file-support/#technical-architecture&quot; class=&quot;heading-anchor&quot;&gt;Technical Architecture&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Let me explain how we’re handling your documents behind the scenes. When you upload a file, it’s processed in our backend but - and this is crucial - we never store anything. Think of it like having a conversation with someone who can read your document, answer your questions, but immediately forgets everything once you’re done.&lt;/p&gt;&lt;p&gt;Your files and conversations stay right in your browser using IndexDB storage. When you chat about a document, we convert its content to base64 format (a way to represent binary data as text) and stream it back to your browser. This base64 version gets stored locally and is used in your future conversations, making subsequent interactions quick and efficient while keeping everything on your device.&lt;/p&gt;&lt;p&gt;Here’s where it gets clever: Each time you ask a new question, your browser sends the base64 encoded content, which is much smaller than the original document. No need for storage on our end, no conversation history to worry about - everything stays private and under your control.&lt;/p&gt;&lt;h2 id=&quot;current-status-and-next-steps&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/vippsi-gets-smarter-expanding-file-support/#current-status-and-next-steps&quot; class=&quot;heading-anchor&quot;&gt;Current Status &amp;amp; Next Steps&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The backend architecture is ready, while frontend work continues:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;Optimizing file upload experience&lt;/li&gt;&lt;li&gt;Implementing streaming UI feedback&lt;/li&gt;&lt;li&gt;Fine-tuning document conversations&lt;/li&gt;&lt;li&gt;Adding support for more formats&lt;/li&gt;&lt;li&gt;Enhancing conversation quality&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stay tuned for more updates as we continue to enhance Vippsi’s capabilities!&lt;/p&gt;&lt;p&gt;~ Sven&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Welcome to My New Digital Home</title>
      <link href="http://localhost:8080/blog/welcome-to-my-new-digital-home/" />
      <updated>2025-01-01T00:00:00Z</updated>
      <id>http://localhost:8080/blog/welcome-to-my-new-digital-home/</id>
      <content type="html">
				&lt;p&gt;Hey everyone! 👋&lt;/p&gt;&lt;p&gt;I’m excited to launch my new website where I’ll be sharing my journey at the intersection of AI and trance music. This space will be my digital garden where I cultivate ideas, share experiences, and connect with like-minded people.&lt;/p&gt;&lt;h2 id=&quot;what-to-expect&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/welcome-to-my-new-digital-home/#what-to-expect&quot; class=&quot;heading-anchor&quot;&gt;What to Expect&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here’s what you’ll find on this site:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;&lt;strong&gt;AI Leadership&lt;/strong&gt;: Insights from my work leading the AI Platform Team at Vipps MobilePay, where we’re using AI to simplify complex workflows&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Trance Music&lt;/strong&gt;: Weekly updates about my latest mixes, featuring both classic anthems and fresh progressive tunes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tech Insights&lt;/strong&gt;: Thoughts about technology, leadership, and the future of AI&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Personal Updates&lt;/strong&gt;: Stories and experiences from my life in Norway&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;why-this-site&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/welcome-to-my-new-digital-home/#why-this-site&quot; class=&quot;heading-anchor&quot;&gt;Why This Site?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I believe in the power of sharing knowledge and experiences. Whether it’s discussing how we’re implementing AI solutions at Vipps MobilePay or sharing the story behind my latest trance mix, this site is where I’ll keep track of my journey.&lt;/p&gt;&lt;h2 id=&quot;stay-connected&quot;&gt;&lt;a href=&quot;http://localhost:8080/blog/welcome-to-my-new-digital-home/#stay-connected&quot; class=&quot;heading-anchor&quot;&gt;Stay Connected&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The best way to keep up with my content is to:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;Follow me on &lt;a href=&quot;https://www.linkedin.com/in/svenmalvik&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt; for tech updates&lt;/li&gt;&lt;li&gt;Subscribe to my &lt;a href=&quot;https://www.youtube.com/@svenmalvik&quot; rel=&quot;noopener&quot;&gt;YouTube channel&lt;/a&gt; for weekly trance mixes&lt;/li&gt;&lt;li&gt;Check back here regularly for in-depth articles and insights&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Looking forward to sharing this journey with you!&lt;/p&gt;&lt;p&gt;~ Sven&lt;/p&gt;
 			</content>
    </entry></feed>