<?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: Sudhir Gadhvi</title>
    <description>The latest articles on DEV Community by Sudhir Gadhvi (@sudhir_gadhvi_3312ebf1edf).</description>
    <link>https://dev.to/sudhir_gadhvi_3312ebf1edf</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3599653%2Fd937d1f1-9aba-4674-8cee-a6517b51ce36.jpg</url>
      <title>DEV Community: Sudhir Gadhvi</title>
      <link>https://dev.to/sudhir_gadhvi_3312ebf1edf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sudhir_gadhvi_3312ebf1edf"/>
    <language>en</language>
    <item>
      <title>Building a Vernacular AI Preprocessing Layer for Indian Code-Mixed Text</title>
      <dc:creator>Sudhir Gadhvi</dc:creator>
      <pubDate>Sat, 28 Feb 2026 07:31:45 +0000</pubDate>
      <link>https://dev.to/sudhir_gadhvi_3312ebf1edf/building-a-vernacular-ai-preprocessing-layer-for-indian-code-mixed-text-3c5b</link>
      <guid>https://dev.to/sudhir_gadhvi_3312ebf1edf/building-a-vernacular-ai-preprocessing-layer-for-indian-code-mixed-text-3c5b</guid>
      <description>&lt;p&gt;Most AI demos assume clean text. Production inputs are messy: mixed script, mixed language, spelling variation, and transliteration drift. I built open-vernacular-ai-kit to solve this layer before retrieval, routing, and LLM generation.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SudhirGadhvi" rel="noopener noreferrer"&gt;
        SudhirGadhvi
      &lt;/a&gt; / &lt;a href="https://github.com/SudhirGadhvi/open-vernacular-ai-kit" rel="noopener noreferrer"&gt;
        open-vernacular-ai-kit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Clean Indian code-mixed text before it reaches your LLM.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Open Vernacular AI Kit&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/SudhirGadhvi/open-vernacular-ai-kit/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/SudhirGadhvi/open-vernacular-ai-kit/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://sudhirgadhvi.github.io/open-vernacular-ai-kit/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cec95147910ed217780a2c277e1de1189ec080ff130feb3e9f9cbf7dac84ba8a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d47697448756225323050616765732d626c7565" alt="Docs"&gt;&lt;/a&gt;
&lt;a href="https://github.com/SudhirGadhvi/open-vernacular-ai-kit/pyproject.toml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0cd8916b01356467a0b711718fac3643b3af186d03e78e57585f89736e9eee4c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e322e302d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/SudhirGadhvi/open-vernacular-ai-kit/pyproject.toml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e801a66299d2c15286fe0fee660d9ffa666c1c5576e5e1536acc07b49ce8ac8f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31302532422d626c7565" alt="Python"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;open-vernacular-ai-kit&lt;/code&gt; is an open-source SDK + CLI for cleaning up Indian vernacular-English code-mixed
text. This release is India-first with Sarvam AI integrations, and is designed to expand globally in
future updates with community-contributed language and provider adapters
It is designed for messy WhatsApp-style inputs where vernacular text might appear in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;native script (example: ગુજરાતી)&lt;/li&gt;
&lt;li&gt;Romanized vernacular text (example: Gujlish)&lt;/li&gt;
&lt;li&gt;Mixed script in the same sentence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is to normalize text &lt;em&gt;before&lt;/em&gt; sending it to downstream models (Sarvam-M / Mayura /
Sarvam-Translate), and to provide a reusable open-source foundation for vernacular AI workflows
Global language/provider expansion is planned and PR-friendly.&lt;/p&gt;
&lt;p&gt;This repo is alpha-quality but SDK-first: the public API centers on &lt;code&gt;CodeMixConfig&lt;/code&gt; + &lt;code&gt;CodeMixPipeline&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Quick example:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;gck codemix &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;maru business plan ready chhe!!!&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; -&amp;gt; મારું business plan ready છે!!&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What We Solve&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This project is a production-oriented normalization layer for India-focused AI…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/SudhirGadhvi/open-vernacular-ai-kit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>ai</category>
      <category>rag</category>
      <category>llm</category>
      <category>vernacluar</category>
    </item>
    <item>
      <title>Building SwiftCacheSDK: A Lightweight Image Caching Library for iOS</title>
      <dc:creator>Sudhir Gadhvi</dc:creator>
      <pubDate>Thu, 06 Nov 2025 19:25:03 +0000</pubDate>
      <link>https://dev.to/sudhir_gadhvi_3312ebf1edf/building-swiftcachesdk-a-lightweight-image-caching-library-for-ios-265c</link>
      <guid>https://dev.to/sudhir_gadhvi_3312ebf1edf/building-swiftcachesdk-a-lightweight-image-caching-library-for-ios-265c</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;While building iOS apps, I've always relied on image caching libraries like Kingfisher or SDWebImage. They're great, but I noticed a few pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Binary Size&lt;/strong&gt;: &lt;strong&gt;&lt;em&gt;Kingfisher&lt;/em&gt;&lt;/strong&gt; adds ~500KB, &lt;strong&gt;&lt;em&gt;SDWebImage&lt;/em&gt;&lt;/strong&gt; ~800KB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL Support&lt;/strong&gt;: Limited time-to-live control for cached images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Swift&lt;/strong&gt;: Not fully utilizing async/await patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt;: Often using features I don't need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build &lt;strong&gt;SwiftCacheSDK&lt;/strong&gt; - a lightweight, zero-dependency image caching library that focuses on the essentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Design Goals
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Dependencies&lt;/strong&gt;: 100% Apple native APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight&lt;/strong&gt;: &amp;lt; 150KB binary size impact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Swift&lt;/strong&gt;: Full async/await support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swift 6 Ready&lt;/strong&gt;: Compatible with strict concurrency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL Support&lt;/strong&gt;: Automatic cache expiration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to Use&lt;/strong&gt;: Drop-in replacement for existing solutions&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Three-Tier Caching Strategy
&lt;/h3&gt;

&lt;p&gt;SwiftCache implements a three-tier cache system:&lt;/p&gt;

&lt;p&gt;Memory Cache (NSCache)&lt;br&gt;
    ↓ (miss)&lt;br&gt;
Disk Cache (FileManager)&lt;br&gt;
    ↓ (miss)&lt;br&gt;
Network (URLSession)&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Memory Cache
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;NSCache&lt;/code&gt; for automatic eviction under memory pressure&lt;/li&gt;
&lt;li&gt;Fastest access (~1ms)&lt;/li&gt;
&lt;li&gt;Survives within app session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;private let memoryCache = NSCache&amp;lt;NSString, CacheEntry&amp;gt;()&lt;br&gt;
private func setupMemoryCache() {&lt;br&gt;
    memoryCache.totalCostLimit = configuration.memoryCacheLimit&lt;br&gt;
    memoryCache.countLimit = configuration.memoryCacheCountLimit&lt;br&gt;
    memoryCache.name = "com.swiftcache.memory"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Disk Cache
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;FileManager-based persistent storage&lt;/li&gt;
&lt;li&gt;LRU eviction when size limit reached&lt;/li&gt;
&lt;li&gt;SHA-256 hashed filenames to avoid collisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;private func diskCacheURL(for key: String) -&amp;gt; URL {&lt;br&gt;
    let hash = sha256Hash(of: key)&lt;br&gt;
    return diskCacheDirectory.appendingPathComponent("\(hash).jpg")&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Network Layer
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Built on URLSession with URLCache&lt;/li&gt;
&lt;li&gt;Automatic retry and error handling&lt;/li&gt;
&lt;li&gt;Cancellable requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Simple UIKit Integration
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;import SwiftCache&lt;br&gt;
// Simple usage&lt;br&gt;
imageView.sc.setImage(with: url)&lt;br&gt;
// With placeholder and completion&lt;br&gt;
imageView.sc.setImage(&lt;br&gt;
    with: url,&lt;br&gt;
    placeholder: UIImage(systemName: "photo")&lt;br&gt;
) { result in&lt;br&gt;
    switch result {&lt;br&gt;
    case .success(let image):&lt;br&gt;
        print("Loaded: \(image.size)")&lt;br&gt;
    case .failure(let error):&lt;br&gt;
        print("Error: \(error)")&lt;br&gt;
    }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. SwiftUI Native Support
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;import SwiftCache&lt;br&gt;
struct ContentView: View {&lt;br&gt;
    var body: some View {&lt;br&gt;
        CachedImage(url: imageURL) {&lt;br&gt;
            ProgressView()&lt;br&gt;
        }&lt;br&gt;
        .frame(width: 300, height: 300)&lt;br&gt;
    }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Async/Await (iOS 15+)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Task {&lt;br&gt;
    do {&lt;br&gt;
        let image = try await imageView.sc.setImage(with: url)&lt;br&gt;
        print("Image loaded!")&lt;br&gt;
    } catch {&lt;br&gt;
        print("Failed: \(error)")&lt;br&gt;
    }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. TTL Support
&lt;/h3&gt;

&lt;p&gt;One unique feature is built-in TTL (time-to-live) support:&lt;/p&gt;

&lt;p&gt;// Configure global TTL&lt;br&gt;
&lt;code&gt;SwiftCache.shared.configure { config in&lt;br&gt;
    config.defaultTTL = 3600 // 1 hour&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;// Or per-image TTL&lt;br&gt;
&lt;code&gt;imageView.sc.setImage(with: url, ttl: 600) // 10 minutes&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Progressive Loading
&lt;/h3&gt;

&lt;p&gt;Show thumbnails while loading full images:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;imageView.sc.setImageProgressive(&lt;br&gt;
    with: fullImageURL,&lt;br&gt;
    thumbnailURL: thumbnailURL&lt;br&gt;
)&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Built-in Analytics
&lt;/h3&gt;

&lt;p&gt;Track cache performance:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;let metrics = SwiftCache.shared.getMetrics()&lt;br&gt;
print("Hit rate: \(metrics.hitRate * 100)%")&lt;br&gt;
print("Avg load time: \(metrics.averageLoadTime * 1000)ms")&lt;br&gt;
print("Memory hits: \(metrics.memoryHits)")&lt;br&gt;
print("Disk hits: \(metrics.diskHits)")&lt;br&gt;
print("Network hits: \(metrics.networkHits)")&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Swift 6 Concurrency
&lt;/h3&gt;

&lt;p&gt;Getting the code to compile without warnings in Swift 6 strict concurrency mode was challenging. The main issues:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: UIImageView properties are main-actor isolated&lt;/p&gt;

&lt;p&gt;// ❌ This fails in Swift 6&lt;br&gt;
&lt;code&gt;imageView?.image = placeholder&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Wrap in MainActor&lt;/p&gt;

&lt;p&gt;// ✅ Swift 6 compatible&lt;br&gt;
&lt;code&gt;await MainActor.run {&lt;br&gt;
    imageView?.image = placeholder&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Async/Await Bridge
&lt;/h3&gt;

&lt;p&gt;SwiftCache uses completion handlers internally but provides async/await APIs:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public func setImage(with url: URL) async throws -&amp;gt; UIImage {&lt;br&gt;
    try await withCheckedThrowingContinuation { continuation in&lt;br&gt;
        SwiftCache.shared.loadImage(from: url) { result in&lt;br&gt;
            continuation.resume(with: result)&lt;br&gt;
        }&lt;br&gt;
    }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Memory Management
&lt;/h3&gt;

&lt;p&gt;Automatic memory cleanup on lifecycle events:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;NotificationCenter.default.addObserver(&lt;br&gt;
    self,&lt;br&gt;
    selector: #selector(handleMemoryWarning),&lt;br&gt;
    name: UIApplication.didReceiveMemoryWarningNotification,&lt;br&gt;
    object: nil&lt;br&gt;
)&lt;br&gt;
@objc private func handleMemoryWarning() {&lt;br&gt;
    memoryCache.removeAllObjects()&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Disk Cache Cleanup (LRU)
&lt;/h3&gt;

&lt;p&gt;When disk cache exceeds limit, clean up oldest accessed files:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;private func cleanupDiskCacheIfNeeded() {&lt;br&gt;
    let sortedFiles = files.sorted { file1, file2 in&lt;br&gt;
        let date1 = file1.contentAccessDate ?? .distantPast&lt;br&gt;
        let date2 = file2.contentAccessDate ?? .distantPast&lt;br&gt;
        return date1 &amp;lt; date2&lt;br&gt;
    }&lt;br&gt;
    // Remove oldest files until we're at 75% of limit&lt;br&gt;
    for fileURL in sortedFiles {&lt;br&gt;
        guard sizeToClean &amp;gt; targetSize else { break }&lt;br&gt;
        try? fileManager.removeItem(at: fileURL)&lt;br&gt;
        sizeToClean -= fileSize&lt;br&gt;
    }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Performance Comparison
&lt;/h2&gt;

&lt;p&gt;Benchmarked on iPhone 14 Pro, iOS 17:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;SwiftCache&lt;/th&gt;
&lt;th&gt;Kingfisher&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Binary Size&lt;/td&gt;
&lt;td&gt;150KB&lt;/td&gt;
&lt;td&gt;500KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Hit&lt;/td&gt;
&lt;td&gt;~1ms&lt;/td&gt;
&lt;td&gt;~5ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk Hit&lt;/td&gt;
&lt;td&gt;~10ms&lt;/td&gt;
&lt;td&gt;~15ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Load&lt;/td&gt;
&lt;td&gt;~200ms&lt;/td&gt;
&lt;td&gt;~200ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Usage&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🎓 What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. NSCache is Powerful
&lt;/h3&gt;

&lt;p&gt;Apple's NSCache handles memory management beautifully - no need to reinvent the wheel.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Swift 6 Concurrency is Worth It
&lt;/h3&gt;

&lt;p&gt;The strict checking caught several potential race conditions early.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Zero Dependencies is Achievable
&lt;/h3&gt;

&lt;p&gt;You don't always need external frameworks. Foundation and UIKit provide powerful APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. API Design Matters
&lt;/h3&gt;

&lt;p&gt;Making the API intuitive (&lt;code&gt;imageView.sc.setImage&lt;/code&gt;) encourages adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Documentation is Key
&lt;/h3&gt;

&lt;p&gt;Good docs (README, examples, migration guides) make or break open source projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔮 Future Plans (v1.1.0)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Combine support for reactive streams&lt;/li&gt;
&lt;li&gt;GIF animation support&lt;/li&gt;
&lt;li&gt;WebP format support&lt;/li&gt;
&lt;li&gt;Custom image processors&lt;/li&gt;
&lt;li&gt;Network reachability awareness&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Try It Out
&lt;/h2&gt;

&lt;p&gt;SwiftCache is available now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/SudhirGadhvi/SwiftCache-SDK" rel="noopener noreferrer"&gt;github.com/SudhirGadhvi/SwiftCache-SDK&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt;: Swift Package Manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;dependencies: [&lt;br&gt;
    .package(url: "&lt;a href="https://github.com/SudhirGadhvi/SwiftCache-SDK" rel="noopener noreferrer"&gt;https://github.com/SudhirGadhvi/SwiftCache-SDK&lt;/a&gt;", from: "1.0.0")&lt;br&gt;
]&lt;/p&gt;

&lt;h2&gt;
  
  
  💭 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building SwiftCache taught me that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes "less is more"&lt;/li&gt;
&lt;li&gt;Modern Swift is incredibly powerful&lt;/li&gt;
&lt;li&gt;The iOS community appreciates lightweight solutions&lt;/li&gt;
&lt;li&gt;Open source is about solving real problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building iOS apps that load images, give SwiftCache a try. And if you have feedback or want to contribute, I'd love to hear from you!&lt;/p&gt;




&lt;p&gt;⭐ If you found this useful, &lt;a href="https://github.com/SudhirGadhvi/SwiftCache-SDK" rel="noopener noreferrer"&gt;give it a star on GitHub&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;💬 Questions or feedback? Drop a comment below or open a discussion on GitHub.&lt;/p&gt;

&lt;p&gt;🐦 Follow me on Twitter: &lt;a href="https://x.com/SudhirGadhvi7" rel="noopener noreferrer"&gt;@SudhirGadhvi&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>opensource</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
