<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Piotr Stachowski</title>
    <description>The latest articles on DEV Community by Piotr Stachowski (@kluchol1922).</description>
    <link>https://dev.to/kluchol1922</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F993985%2F2646e206-1019-43c4-9772-fca311d45e36.png</url>
      <title>DEV Community: Piotr Stachowski</title>
      <link>https://dev.to/kluchol1922</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kluchol1922"/>
    <language>en</language>
    <item>
      <title>Running Local LLMs on Apple Silicon: MLX Framework, mlx-community, and the Ultimate Mac Model Selection Guide</title>
      <dc:creator>Piotr Stachowski</dc:creator>
      <pubDate>Wed, 22 Jul 2026 20:47:22 +0000</pubDate>
      <link>https://dev.to/kluchol1922/running-local-llms-on-apple-silicon-mlx-framework-mlx-community-and-the-ultimate-mac-model-3ejb</link>
      <guid>https://dev.to/kluchol1922/running-local-llms-on-apple-silicon-mlx-framework-mlx-community-and-the-ultimate-mac-model-3ejb</guid>
      <description>&lt;h3&gt;
  
  
  Introduction: Why MLX is a Game Changer for Mac AI
&lt;/h3&gt;

&lt;p&gt;Running Large Language Models (LLMs) locally on consumer hardware used to require massive multi-GPU server rigs or complex CUDA setups. However, Apple Silicon (M1 - M5) changed the game with &lt;strong&gt;Unified Memory Architecture (UMA)&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Unlike traditional PC architectures where the CPU and discrete GPU maintain separate memory pools and bottleneck over PCIe buses, Apple Silicon grants the CPU, GPU, and Neural Engine direct zero copy access to the exact same high-bandwidth RAM (up to 800 GB/s on M-series Ultra chips).&lt;/p&gt;

&lt;p&gt;To capitalize on UMA, Apple released &lt;strong&gt;MLX&lt;/strong&gt; open-source array framework designed specifically for machine learning on Apple Silicon. Modeled with PyTorch-like APIs and leveraging Metal performance shaders, MLX enables blazing-fast local LLM inference and fine-tuning directly on your Mac with zero compilation friction.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What is mlx-community on Hugging Face?
&lt;/h3&gt;

&lt;p&gt;While the core &lt;code&gt;mlx&lt;/code&gt; package provides the mathematical runtime engine, downloading raw weights and manually quantizing models can be cumbersome. &lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;mlx-community&lt;/strong&gt; on Hugging Face:&lt;br&gt;
👉 &lt;strong&gt;Official Hugging Face Hub&lt;/strong&gt;: &lt;a href="https://huggingface.co/mlx-community" rel="noopener noreferrer"&gt;https://huggingface.co/mlx-community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;mlx-community&lt;/code&gt; repository is a central hub maintained by open-source contributors and Apple engineers. It hosts thousands of  open-source models pre-converted into the native MLX format with optimized 4-bit, 8-bit, and FP16 quantization scheme choices.&lt;/p&gt;

&lt;p&gt;Popular models ready to run instantly include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Meta Llama 3.1 &amp;amp; 3.3&lt;/strong&gt; (8B, 70B)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5 &amp;amp; Qwen 2.5 Coder&lt;/strong&gt; (1.5B, 7B, 14B, 32B, 72B)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek-R1 Distillations&lt;/strong&gt; (Qwen-1.5B, Qwen-14B, Llama-70B)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma 2&lt;/strong&gt; (2B, 9B, 27B)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral &amp;amp; Mixtral MoE&lt;/strong&gt; (7B, 8x7B, 8x22B)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Phi-3.5 &amp;amp; Phi-4&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. How to Use MLX on Mac: Step-by-Step Quickstart
&lt;/h3&gt;

&lt;p&gt;Getting started with MLX takes less than two minutes in your Mac terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Install the MLX LM Package
&lt;/h3&gt;

&lt;p&gt;Ensure you are running newest macOS on an Apple Silicon Mac with Python 3.10 or newer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the official MLX LLM helper tool&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;mlx-lm

&lt;span class="c"&gt;# Verify installation and test a prompt directly from CLI&lt;/span&gt;
mlx_lm.generate &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--model&lt;/span&gt; mlx-community/Qwen2.5-7B-Instruct-4bit &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Explain quantum superposition in 3 simple sentences."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Using MLX in Python Scripts
&lt;/h3&gt;

&lt;p&gt;For building local apps, CLI tools, or background agent workflows, &lt;code&gt;mlx_lm&lt;/code&gt; provides an intuitive Python API with lazy weight loading and streaming support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mlx_lm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt;

&lt;span class="c1"&gt;# Load model and tokenizer directly from the mlx-community hub
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mlx-community/Meta-Llama-3.1-8B-Instruct-4bit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Generate response with streaming output
&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a clean Python function for calculating Fibonacci using dynamic programming.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. How to Choose the Right Model for Your Mac (RAM Sizing Guide)
&lt;/h3&gt;

&lt;p&gt;Choosing the right model for your Mac requires understanding your Mac's &lt;strong&gt;Unified Memory (RAM)&lt;/strong&gt; budget and quantization levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Overhead &amp;amp; The 75% Rule
&lt;/h3&gt;

&lt;p&gt;macOS reserves ~4 GB to 6 GB of RAM for the display server, window management, and background applications. Furthermore, macOS enforces a default process limit restricting any single application to ~75% of total RAM (though this can be raised via &lt;code&gt;sysctl iogpu.wired_mem_limit&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Calculation Rule of Thumb
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;4-bit Quantization (INT4)&lt;/strong&gt;: Requires &lt;strong&gt;~0.7 GB RAM per Billion parameters&lt;/strong&gt;. (Best balance of speed, low memory footprint, and ~95% intelligence retention).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8-bit Quantization (INT8)&lt;/strong&gt;: Requires &lt;strong&gt;~1.2 GB RAM per Billion parameters&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Precision (FP16)&lt;/strong&gt;: Requires &lt;strong&gt;~2.1 GB RAM per Billion parameters&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mac RAM Sizing Matrix Table
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;16 GB Unified Memory (Base M1/M2/M3/M4, MacBook Air, Mac mini)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recommended Models&lt;/strong&gt;: 7B to 9B parameters in 4-bit quantization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top Picks&lt;/strong&gt;: &lt;code&gt;mlx-community/Meta-Llama-3.1-8B-Instruct-4bit&lt;/code&gt;, &lt;code&gt;mlx-community/Qwen2.5-7B-Instruct-4bit&lt;/code&gt;, &lt;code&gt;mlx-community/gemma-2-9b-it-4bit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected Speed&lt;/strong&gt;: 35–60 tokens/second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM Footprint&lt;/strong&gt;: ~5.5 GB (leaves 10 GB free for Chrome and IDEs).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;24 GB / 36 GB Unified Memory (M2/M3/M4 Pro &amp;amp; Max)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recommended Models&lt;/strong&gt;: 14B 4-bit/8-bit or 32B 4-bit models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top Picks&lt;/strong&gt;: &lt;code&gt;mlx-community/Qwen2.5-14B-Instruct-4bit&lt;/code&gt;, &lt;code&gt;mlx-community/DeepSeek-R1-Distill-Qwen-14B-4bit&lt;/code&gt;, &lt;code&gt;mlx-community/Qwen2.5-32B-Instruct-4bit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected Speed&lt;/strong&gt;: 25–45 tokens/second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM Footprint&lt;/strong&gt;: ~10 GB to 20 GB.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;64 GB / 96 GB Unified Memory (M1/M2/M3/M4 Max &amp;amp; Ultra)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recommended Models&lt;/strong&gt;: 32B 8-bit or 70B 4-bit models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top Picks&lt;/strong&gt;: &lt;code&gt;mlx-community/Meta-Llama-3.1-70B-Instruct-4bit&lt;/code&gt;, &lt;code&gt;mlx-community/DeepSeek-R1-Distill-Llama-70B-4bit&lt;/code&gt;, &lt;code&gt;mlx-community/Qwen2.5-Coder-32B-Instruct-8bit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected Speed&lt;/strong&gt;: 18–30 tokens/second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM Footprint&lt;/strong&gt;: ~38 GB to 48 GB.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;128 GB to 192 GB Unified Memory (Mac Studio &amp;amp; Mac Pro Ultra)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recommended Models&lt;/strong&gt;: 70B 8-bit, 120B+ models, or multi-model agent ensembles running concurrently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top Picks&lt;/strong&gt;: &lt;code&gt;mlx-community/Meta-Llama-3.3-70B-Instruct-8bit&lt;/code&gt;, &lt;code&gt;mlx-community/Mixtral-8x22B-Instruct-v0.1-4bit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected Speed&lt;/strong&gt;: 15–25 tokens/second.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;+--------------------+-------------------------+----------------------------------------------+--------------------+
| Mac RAM Capacity   | Max Model Parameter Size| Recommended mlx-community Model Path         | Generation Speed   |
+--------------------+-------------------------+----------------------------------------------+--------------------+
| 16 GB UMA          | 7B - 9B (4-bit)         | mlx-community/Meta-Llama-3.1-8B-Instruct-4bit | 35 - 60 tok/sec    |
| 24 GB / 36 GB UMA  | 14B - 32B (4-bit)       | mlx-community/Qwen2.5-32B-Instruct-4bit      | 25 - 45 tok/sec    |
| 64 GB / 96 GB UMA  | 70B (4-bit) / 32B (8-bit)| mlx-community/DeepSeek-R1-Distill-Llama-70B | 18 - 30 tok/sec    |
| 128 GB+ UMA        | 70B (8-bit) / 120B+     | mlx-community/Meta-Llama-3.3-70B-8bit        | 15 - 25 tok/sec    |
+--------------------+-------------------------+----------------------------------------------+--------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Quantization &amp;amp; Bandwidth Bottlenecks
&lt;/h3&gt;

&lt;p&gt;Why is 4-bit quantization so effective on Apple Silicon? &lt;/p&gt;

&lt;p&gt;In Large Language Model inference, generation speed is almost entirely &lt;strong&gt;memory-bandwidth bound&lt;/strong&gt;, rather than compute bound. Every token generated requires streaming the entire model weight tensor from Unified RAM into the GPU cores.&lt;/p&gt;

&lt;p&gt;By compressing model weights from 16-bit float to 4-bit integer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The model memory size drops by &lt;strong&gt;75%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The amount of data that must travel over the memory bus per token is reduced 4x.&lt;/li&gt;
&lt;li&gt;On a MacBook Pro with 300 GB/s bandwidth, an 8B 4-bit model (~4.5 GB) achieves up to 60+ tokens/second!
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Fine-tune an MLX model on custom JSONL dataset using LoRA locally&lt;/span&gt;
mlx_lm.lora &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--model&lt;/span&gt; mlx-community/Meta-Llama-3.1-8B-Instruct-4bit &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--data&lt;/span&gt; ./my_dataset &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--train&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--iters&lt;/span&gt; 600 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--batch-size&lt;/span&gt; 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion &amp;amp; Resources
&lt;/h3&gt;

&lt;p&gt;Apple Silicon combined with &lt;strong&gt;MLX&lt;/strong&gt; and &lt;strong&gt;mlx-community&lt;/strong&gt; provides the most frictionless, high-performance local AI ecosystem available today. By matching model parameter counts to your Mac's unified memory tier and choosing 4-bit quantization, you can run private, latency-free LLM intelligence right on your workstation.&lt;/p&gt;

&lt;p&gt;Explore the models and join the local AI revolution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;Hugging Face Hub&lt;/strong&gt;: &lt;a href="https://huggingface.co/mlx-community" rel="noopener noreferrer"&gt;https://huggingface.co/mlx-community&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;MLX GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/ml-explore/mlx" rel="noopener noreferrer"&gt;https://github.com/ml-explore/mlx&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;MLX LM Documentation&lt;/strong&gt;: &lt;a href="https://github.com/ml-explore/mlx-examples/tree/main/llms/mlx_lm" rel="noopener noreferrer"&gt;https://github.com/ml-explore/mlx-examples/tree/main/llms/mlx_lm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AI Commit: Crafting an Automated Git Commit Message Generator for Neovim</title>
      <dc:creator>Piotr Stachowski</dc:creator>
      <pubDate>Wed, 15 Jul 2026 18:06:15 +0000</pubDate>
      <link>https://dev.to/kluchol1922/ai-commit-crafting-an-automated-git-commit-message-generator-for-neovim-1ia5</link>
      <guid>https://dev.to/kluchol1922/ai-commit-crafting-an-automated-git-commit-message-generator-for-neovim-1ia5</guid>
      <description>&lt;p&gt;A deep dive into how I built the ai_commit plugin for Neovim (nvim) using asynchronous system subprocesses, specialized prompt engineering, and external LLM APIs with zero heavy language wrappers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction &amp;amp; Repository
&lt;/h3&gt;

&lt;p&gt;Writing meaningful, informative, and standardized git commit messages is one of those daily disciplines that keeps codebases healthy—but it's also a point of constant friction. Developers often write rushed commits like &lt;code&gt;fix issue&lt;/code&gt;, &lt;code&gt;wip&lt;/code&gt;, or &lt;code&gt;refactor some stuff&lt;/code&gt; to move on quickly, which turns the git history into an uninformative timeline.&lt;/p&gt;

&lt;p&gt;While there are many CLI utilities and heavy node-based wrappers that solve this problem externally, doing so requires switching context away from your editor. As an avid Neovim user, I wanted a solution integrated directly into my editing workspace. &lt;/p&gt;

&lt;p&gt;The plugin is fully open-source and easy to integrate:&lt;br&gt;
👉 &lt;strong&gt;Official GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/klusekP/ai_commit" rel="noopener noreferrer"&gt;https://github.com/klusekP/ai_commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal was clear: select or stage files, type a simple Neovim command (like &lt;code&gt;:AICommit&lt;/code&gt;), and let Neovim automatically request an intelligent, conventional-commit-formatted message based on the actual code diff and inject it right into Neovim's active commit buffer.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Core Plugin Architecture
&lt;/h3&gt;

&lt;p&gt;To build a native Neovim plugin, we need to balance performance with user experience. A naive synchronous HTTP request would freeze Neovim completely during the network round-trip, resulting in a laggy editor. &lt;/p&gt;

&lt;p&gt;Therefore, &lt;code&gt;ai_commit&lt;/code&gt; uses a fully asynchronous subprocess model. Here is the operational pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Change Detection&lt;/strong&gt;: The plugin verifies if there are staged changes by spawning &lt;code&gt;git diff --staged --name-only&lt;/code&gt; as an asynchronous background job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff Ingestion&lt;/strong&gt;: If changes are staged, it executes &lt;code&gt;git diff --staged&lt;/code&gt; to harvest the precise code additions and deletions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload Construction&lt;/strong&gt;: It bundles the raw diff with a highly tailored system prompt, ensuring the LLM formats the response strictly following the &lt;strong&gt;Conventional Commits&lt;/strong&gt; specification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous Dispatch&lt;/strong&gt;: Rather than relying on a heavy Python, Node, or Rust binary, Neovim spawns a non-blocking &lt;code&gt;curl&lt;/code&gt; process in the background.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buffer Injection&lt;/strong&gt;: Once &lt;code&gt;curl&lt;/code&gt; exits with a successful response, Neovim processes the JSON, extracts the commit message, and populates either the active commit buffer or opens a floating menu for user review.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Technical Prerequisites &amp;amp; Dependencies
&lt;/h3&gt;

&lt;p&gt;One of the core design goals of &lt;code&gt;ai_commit&lt;/code&gt; was minimal bloat. To install and run the plugin, only a handful of ubiquitous system dependencies are required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neovim (v0.8.0 or newer)&lt;/strong&gt;: Required for modern Lua APIs, job control spawning, and floating buffer manipulation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git CLI&lt;/strong&gt;: The system must have &lt;code&gt;git&lt;/code&gt; installed in the system PATH, as the plugin runs subprocesses to retrieve diff metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;curl (System Utility)&lt;/strong&gt;: The plugin issues direct network requests using the standard &lt;code&gt;curl&lt;/code&gt; command-line tool. This avoids needing external Lua HTTP socket libraries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plenary.nvim (Optional but Standard)&lt;/strong&gt;: Used for elegant asynchronous job coordination and cleaner network requests. Most Neovim users already have Plenary as a dependency for Telescope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Access Token&lt;/strong&gt;: A valid API key for your chosen provider (such as OpenAI, Anthropic, Gemini, or a locally hosted Ollama instance running llama3).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Complete Installation &amp;amp; Configuration Guide
&lt;/h3&gt;

&lt;p&gt;Integrating &lt;code&gt;ai_commit&lt;/code&gt; into your Neovim configuration is simple and supports standard modern package managers.&lt;/p&gt;
&lt;h3&gt;
  
  
  Installation via lazy.nvim
&lt;/h3&gt;

&lt;p&gt;Add this plugin declaration block directly to your plugins directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Neovim Plugin Integration using lazy.nvim&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"klusekP/ai_commit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"nvim-lua/plenary.nvim"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;-- optional helper library&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ai_commit"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"openai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;-- Options: "openai" | "gemini" | "ollama"&lt;/span&gt;
      &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gpt-4o-mini"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;-- Model alias to invoke&lt;/span&gt;
      &lt;span class="n"&gt;prompt_language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;-- Output language: "en" (English) or "pl" (Polish)&lt;/span&gt;
      &lt;span class="n"&gt;temperature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;-- Generative creativity scale&lt;/span&gt;
      &lt;span class="n"&gt;key_maps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;generate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ca"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;-- Custom keymap to trigger generation&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Provider Setup &amp;amp; Custom Prompts
&lt;/h3&gt;

&lt;p&gt;The plugin is highly versatile and lets you leverage cloud APIs or locally run LLMs with ease.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: The plugin reads your API tokens directly from your environment variables, keeping your secrets out of your public dotfile repository (e.g., loads &lt;code&gt;$OPENAI_API_KEY&lt;/code&gt; or &lt;code&gt;$GEMINI_API_KEY&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama (Local Offline Mode)&lt;/strong&gt;: Set &lt;code&gt;provider = "ollama"&lt;/code&gt; and configure your local address (usually &lt;code&gt;http://localhost:11434&lt;/code&gt;) to run completely offline without an internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polish Language Output&lt;/strong&gt;: Setting &lt;code&gt;prompt_language = "pl"&lt;/code&gt; forces the system prompt to instruct the model to write clean, polish conventional commits, which is rare in other standard tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Command API &amp;amp; Keybindings
&lt;/h3&gt;

&lt;p&gt;Once configured, the plugin exposes clean, native command-line bindings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;:AICommit&lt;/code&gt; - Triggers the asynchronous diff capture, calls the LLM, and populates the current buffer with the conventional commit message.&lt;/li&gt;
&lt;li&gt;Keymaps configured under &lt;code&gt;key_maps.generate&lt;/code&gt; (such as &lt;code&gt;&amp;lt;leader&amp;gt;ca&lt;/code&gt;) let you execute this workflow instantly with simple keystrokes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures a rapid cycle where you stage changes with your preferred git UI (like fugitive or neogit), open your commit message editor, hit your keymap, and immediately commit your changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;By bypassing heavy external runtimes and leveraging Neovim's built-in asynchronous job control coupled with direct API endpoints, &lt;code&gt;ai_commit&lt;/code&gt; provides a lightning-fast, zero-bloat workflow that keeps your git timeline pristine and readable. &lt;/p&gt;

&lt;p&gt;Check out the repository, install it today, and start generating professional, structured commit messages in your preferred language!&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Star the project on GitHub&lt;/strong&gt;: &lt;a href="https://github.com/klusekP/ai_commit" rel="noopener noreferrer"&gt;https://github.com/klusekP/ai_commit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>git</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Expiring Trip Links: Designing a Secure, High-Performance Location Sharing System with Python and Redis</title>
      <dc:creator>Piotr Stachowski</dc:creator>
      <pubDate>Wed, 15 Jul 2026 17:59:05 +0000</pubDate>
      <link>https://dev.to/kluchol1922/expiring-trip-links-designing-a-secure-high-performance-location-sharing-system-with-python-and-43gn</link>
      <guid>https://dev.to/kluchol1922/expiring-trip-links-designing-a-secure-high-performance-location-sharing-system-with-python-and-43gn</guid>
      <description>&lt;p&gt;How to build an elegant web-tracking architecture for unauthenticated guests that self-destructs after arrival, ensuring strict privacy and database efficiency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2fqd1sztsmgtf995qu89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2fqd1sztsmgtf995qu89.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Real-time location tracking has become a standard expectation in modern logistics, ride-hailing, and delivery services. When a user is on a trip, they often want to share their progress with a friend or family member.&lt;/p&gt;

&lt;p&gt;However, sharing live telemetry raises critical architectural and privacy challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unauthenticated Access&lt;/strong&gt;: The recipient (guest) should be able to view the trip instantly on a web browser without downloading an app, creating an account, or authenticating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Privacy&lt;/strong&gt;: The tracking link must only be valid during the active trip. Once the vehicle arrives or the ride is cancelled, the link must immediately expire, preventing any further location leakage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Performance&lt;/strong&gt;: GPS coordinates are high-frequency data streams (often pinging every 1-3 seconds). Querying or writing this directly to a primary relational database creates unnecessary write amplification and can easily degrade system performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this article, we'll design an elegant, secure, and production-ready system architecture using &lt;strong&gt;Python and Redis&lt;/strong&gt; to generate self-expiring cryptographic hash links that allow guests to monitor trips with zero friction.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Core System Architecture Flow
&lt;/h3&gt;

&lt;p&gt;To build this system efficiently, we separate the internal authenticated state from the public guest state. &lt;/p&gt;

&lt;p&gt;We introduce a fast, in-memory caching layer (&lt;strong&gt;Redis&lt;/strong&gt;) that sits between our web servers and the main database. &lt;/p&gt;

&lt;p&gt;Here is how the lifecycle of a shared trip link works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trip Initialization&lt;/strong&gt;: When a trip is activated, the core mobile app initiates location sharing. The server takes the &lt;code&gt;trip_id&lt;/code&gt;, &lt;code&gt;timestamp&lt;/code&gt;, and estimated &lt;code&gt;duration&lt;/code&gt;, and generates a secure, unique tracking &lt;strong&gt;Hash&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching in Redis&lt;/strong&gt;: The server maps this Hash to the active Trip ID in Redis, setting a &lt;strong&gt;Time-To-Live (TTL)&lt;/strong&gt; equal to the trip's estimated duration plus a small buffer (e.g., 15 minutes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public URL Dispatch&lt;/strong&gt;: The server returns a lightweight web link: &lt;code&gt;https://track.services.com/share/{hash}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Coordinates&lt;/strong&gt;: As the vehicle moves, its telematics system pushes GPS updates. These coordinates are written directly to Redis (as a fast key-value or Geo-spatial data structures), keeping our main database clean of transient telemetry slop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guest Web Portal&lt;/strong&gt;: The guest opens the link in their browser. The web frontend queries the backend with the hash. The backend does a single &lt;code&gt;O(1)&lt;/code&gt; lookup in Redis to verify the hash is active, retrieves the latest coordinate, and sends it to the guest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Eviction&lt;/strong&gt;: Once the trip concludes or the Redis TTL expires, Redis automatically evicts the hash. Any subsequent request to the guest link instantly returns a 404 (Not Found) or 410 (Expired), securing the driver's privacy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3sz2kyu2qclauqwaxpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3sz2kyu2qclauqwaxpf.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Generating the Expiring Secure Hash
&lt;/h3&gt;

&lt;p&gt;We generate the public hash in a way that prevents URL guessing (enumeration attacks). Instead of using auto-incrementing integers or predictable IDs, we combine a cryptographically secure random value, the trip's metadata, and a timestamp, then hash them using SHA-256. &lt;/p&gt;

&lt;p&gt;By including the timestamp and a random salt, we ensure that even if the same user takes the same trip multiple times, the generated shareable links are completely unique and non-linkable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;secrets&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_trip_share_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Generates a cryptographically secure, non-guessable hash for guest sharing.
    Incorporates current epoch timestamp and secure high-entropy random bytes.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Generate 16 bytes of cryptographically secure random salt
&lt;/span&gt;    &lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;token_hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Create unique string representation
&lt;/span&gt;    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Generate SHA-256 hash
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Fast Storage &amp;amp; TTL Management in Redis
&lt;/h3&gt;

&lt;p&gt;Once the hash is generated, we store it in Redis. We map the hash to the underlying &lt;code&gt;trip_id&lt;/code&gt; and set a time-to-live (TTL). This ensures that we don't have to clean up links manually; Redis handles memory reclamation natively.&lt;/p&gt;

&lt;p&gt;We use two Redis keys for this design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;share:hash:{hash}&lt;/code&gt; -&amp;gt; A string containing the &lt;code&gt;trip_id&lt;/code&gt; (with a TTL of &lt;code&gt;duration + buffer&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trip:coords:{trip_id}&lt;/code&gt; -&amp;gt; A Redis hash or a simple string holding the latest GPS coordinates (lat, lng, heading, speed).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When a guest requests tracking updates via the hash, the server first resolves the hash to a &lt;code&gt;trip_id&lt;/code&gt; from Redis, and then fetches the coordinates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;

&lt;span class="c1"&gt;# Establish connection to Redis
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decode_responses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register_share_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration_seconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Registers a shareable hash in Redis mapped to its underlying Trip ID.
    Enforces a secure TTL (time-to-live) so that links self-destruct automatically.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;safety_buffer_seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;  &lt;span class="c1"&gt;# 15-minute buffer
&lt;/span&gt;    &lt;span class="n"&gt;total_ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;duration_seconds&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;safety_buffer_seconds&lt;/span&gt;

    &lt;span class="c1"&gt;# Store the mapping hash -&amp;gt; trip_id with TTL in a single atomic transaction
&lt;/span&gt;    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;share:hash:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;total_ttl&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[Redis] Registered share:hash:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;... mapped to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (TTL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_ttl&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Designing the API Routes (FastAPI/Python)
&lt;/h3&gt;

&lt;p&gt;On our API gateway, we expose two primary endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /api/trips/share&lt;/code&gt;: An authenticated endpoint used by the mobile client to initiate sharing, generate a hash, and register it in Redis.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /api/share/{hash}&lt;/code&gt;: A public, unauthenticated endpoint accessed by the guest's browser to fetch the active trip's real-time location.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By decoupling the guest endpoint, we avoid hitting the main relational database completely on telemetry reads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ShareRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;duration_minutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/trips/share&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiate_share&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ShareRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Mobile client triggers location sharing. Generates the hash and caches in Redis.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;share_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_trip_share_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;duration_seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration_minutes&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;

        &lt;span class="c1"&gt;# Save mapping to Redis
&lt;/span&gt;        &lt;span class="nf"&gt;register_share_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration_seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tracking_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://track.services.com/share/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expires_in_seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;duration_seconds&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to initialize sharing link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/share/{share_hash}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_guest_tracking&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Public web portal fetches active trip location (Unauthenticated).
    Returns 410 Gone if the Redis TTL expired or link doesn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t exist.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. Resolve hash to trip_id in Redis (O(1) search)
&lt;/span&gt;    &lt;span class="n"&gt;trip_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;share:hash:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;share_hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTP_410_GONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This tracking link has expired or is invalid.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Fetch coordinate stream or last coordinates
&lt;/span&gt;    &lt;span class="n"&gt;coords_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trip:coords:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;coordinates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coords_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;coords_data&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trip_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;trip_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coordinates&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;coordinates&lt;/span&gt;  &lt;span class="c1"&gt;# e.g. {"lat": 37.77, "lng": -122.41}
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Production Security &amp;amp; Scaling Considerations
&lt;/h3&gt;

&lt;p&gt;To run this solution robustly at a large scale, keep these security and optimization practices in mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting on Guest Endpoint&lt;/strong&gt;: Since the guest endpoint &lt;code&gt;GET /api/share/{hash}&lt;/code&gt; is unauthenticated, it is open to public scrapers. Implement strong IP-based rate limiting (e.g., using Redis-based token bucket algorithms) to prevent denial of service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obfuscate Internal IDs&lt;/strong&gt;: Even if the hash is secure, avoid returning internal postgres UUIDs or raw driver names to the client unless necessary. Keep the payload returned to the guest strictly stripped of private user and driver fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geo-fencing Expire Trigger&lt;/strong&gt;: Rather than relying purely on time-based TTL, the backend server can actively listen to a 'Trip Arrived' event from the matching service. Upon receiving this event, the server can fire a &lt;code&gt;r.delete(f"share:hash:{share_hash}")&lt;/code&gt; command to immediately disable the link the exact second the customer arrives at their destination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis Replica Scaling&lt;/strong&gt;: At high scales (millions of concurrent guest sessions), read traffic will dominate. You can scale your system horizontally by routing guest API read requests to read-only Redis replica instances, reserving the Redis master strictly for coordinates writes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;By leveraging &lt;strong&gt;Redis TTL and SHA-256 cryptographic hashes&lt;/strong&gt;, we've built a high-performance location-sharing architecture that is secure by design. &lt;/p&gt;

&lt;p&gt;This approach minimizes read operations on your primary relational databases, maintains absolute privacy for the user after their ride completes, and scales horizontally with ease.&lt;/p&gt;

&lt;p&gt;This architecture forms the backbone of modern on-demand tracking features, balancing user experience, security, and developer sanity perfectly.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
