<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>HavenApps - development</title>
    <subtitle>Apps for macOS and iOS that feel at home. Local first, no subscriptions, no tracking.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://havenapps.net/tags/development/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://havenapps.net"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-28T17:00:00+00:00</updated>
    <id>https://havenapps.net/tags/development/atom.xml</id>
    <entry xml:lang="en">
        <title>HavenAcknowledgments is now open source</title>
        <published>2026-03-28T17:00:00+00:00</published>
        <updated>2026-03-28T17:00:00+00:00</updated>
        
        <author>
          <name>
            
              HavenApps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://havenapps.net/blog/announcing-havenacknowledgments/"/>
        <id>https://havenapps.net/blog/announcing-havenacknowledgments/</id>
        
        <content type="html" xml:base="https://havenapps.net/blog/announcing-havenacknowledgments/">&lt;p&gt;HavenApps has released &lt;a href=&quot;&#x2F;packages&#x2F;havenacknowledgments&#x2F;&quot;&gt;HavenAcknowledgments&lt;&#x2F;a&gt;, an open source Swift package that shows licence notices for your dependencies.&lt;&#x2F;p&gt;
&lt;p&gt;It scans your Package.resolved file at build time, detects each licence type, and gives you a SwiftUI view your users can browse. It recognises more than 25 licence types through SPDX identifiers.&lt;&#x2F;p&gt;
&lt;p&gt;The view uses native navigation on each platform. NavigationSplitView on macOS, NavigationStack on iOS. It includes search, so users can find a specific package fast.&lt;&#x2F;p&gt;
&lt;p&gt;If you have vendored code or dependencies outside of Swift Package Manager, you can add those licences by hand.&lt;&#x2F;p&gt;
&lt;p&gt;The package is translated into 50 languages, including right-to-left scripts.&lt;&#x2F;p&gt;
&lt;p&gt;The code is on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Haven-Apps&#x2F;HavenAcknowledgments&quot;&gt;GitHub&lt;&#x2F;a&gt; under the BSD 3-Clause licence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>HavenDevice is now open source</title>
        <published>2026-03-24T17:00:00+00:00</published>
        <updated>2026-03-24T17:00:00+00:00</updated>
        
        <author>
          <name>
            
              HavenApps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://havenapps.net/blog/announcing-havendevice/"/>
        <id>https://havenapps.net/blog/announcing-havendevice/</id>
        
        <content type="html" xml:base="https://havenapps.net/blog/announcing-havendevice/">&lt;p&gt;HavenApps has released &lt;a href=&quot;&#x2F;packages&#x2F;havendevice&#x2F;&quot;&gt;HavenDevice&lt;&#x2F;a&gt;, an open source Swift package that collects device and app information in one place.&lt;&#x2F;p&gt;
&lt;p&gt;Call &lt;code&gt;HavenDevice.current()&lt;&#x2F;code&gt; and you get a struct with more than 40 fields. Hardware specs, OS version, app metadata, battery level, screen size, locale, and system resources. One call, one struct.&lt;&#x2F;p&gt;
&lt;p&gt;The struct conforms to Codable, so you can encode it to JSON and send it along with diagnostics or crash reports.&lt;&#x2F;p&gt;
&lt;p&gt;It has no outside dependencies. Just Foundation and system frameworks.&lt;&#x2F;p&gt;
&lt;p&gt;Where a platform supports it, the package reads extra data such as dark mode status, vendor identifiers, and jailbreak detection.&lt;&#x2F;p&gt;
&lt;p&gt;The code is on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Haven-Apps&#x2F;HavenDevice&quot;&gt;GitHub&lt;&#x2F;a&gt; under the BSD 3-Clause licence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>HavenGPXParser is now open source</title>
        <published>2026-03-20T17:00:00+00:00</published>
        <updated>2026-03-20T17:00:00+00:00</updated>
        
        <author>
          <name>
            
              HavenApps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://havenapps.net/blog/announcing-havengpxparser/"/>
        <id>https://havenapps.net/blog/announcing-havengpxparser/</id>
        
        <content type="html" xml:base="https://havenapps.net/blog/announcing-havengpxparser/">&lt;p&gt;HavenApps has released &lt;a href=&quot;&#x2F;packages&#x2F;havengpxparser&#x2F;&quot;&gt;HavenGPXParser&lt;&#x2F;a&gt;, an open source Swift package for working with GPX files.&lt;&#x2F;p&gt;
&lt;p&gt;It reads, validates, and writes GPX 1.1 documents. The parser uses streaming so large files do not fill up memory.&lt;&#x2F;p&gt;
&lt;p&gt;You can check a GPX file against the 1.1 standard and get clear error messages when something is wrong. You can also build GPX documents in code and export them as XML.&lt;&#x2F;p&gt;
&lt;p&gt;The package comes with SwiftUI views for drawing tracks and waypoints on a map through MapKit.&lt;&#x2F;p&gt;
&lt;p&gt;It guards against XML attacks with limits on entity expansion, nesting depth, and file size.&lt;&#x2F;p&gt;
&lt;p&gt;The code is on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Haven-Apps&#x2F;HavenGPXParser&quot;&gt;GitHub&lt;&#x2F;a&gt; under the BSD 3-Clause licence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>HavenOPML is now open source</title>
        <published>2026-03-19T17:00:00+00:00</published>
        <updated>2026-03-19T17:00:00+00:00</updated>
        
        <author>
          <name>
            
              HavenApps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://havenapps.net/blog/announcing-havenopml/"/>
        <id>https://havenapps.net/blog/announcing-havenopml/</id>
        
        <content type="html" xml:base="https://havenapps.net/blog/announcing-havenopml/">&lt;p&gt;HavenApps has released &lt;a href=&quot;&#x2F;packages&#x2F;havenopml&#x2F;&quot;&gt;HavenOPML&lt;&#x2F;a&gt;, an open source Swift package for reading and writing OPML files.&lt;&#x2F;p&gt;
&lt;p&gt;It supports both OPML 1.0 and 2.0. You can import an OPML file into structured outlines and export them back as valid XML. The package includes depth-first traversal helpers for walking nested outlines.&lt;&#x2F;p&gt;
&lt;p&gt;It is written in pure Swift with no outside dependencies. An actor-isolated service handles concurrent access safely.&lt;&#x2F;p&gt;
&lt;p&gt;The parser prevents XXE attacks, caps input at 10 megabytes, and limits nesting to 128 levels.&lt;&#x2F;p&gt;
&lt;p&gt;HavenOPML is what &lt;a href=&quot;&#x2F;apps&#x2F;haven-feeds&#x2F;&quot;&gt;Haven Feeds&lt;&#x2F;a&gt; uses when you import or export your feed subscriptions.&lt;&#x2F;p&gt;
&lt;p&gt;The code is on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Haven-Apps&#x2F;HavenOPML&quot;&gt;GitHub&lt;&#x2F;a&gt; under the BSD 3-Clause licence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>HavenFeedParser is now open source</title>
        <published>2026-03-19T16:00:00+00:00</published>
        <updated>2026-03-19T16:00:00+00:00</updated>
        
        <author>
          <name>
            
              HavenApps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://havenapps.net/blog/announcing-havenfeedparser/"/>
        <id>https://havenapps.net/blog/announcing-havenfeedparser/</id>
        
        <content type="html" xml:base="https://havenapps.net/blog/announcing-havenfeedparser/">&lt;p&gt;HavenApps has released &lt;a href=&quot;&#x2F;packages&#x2F;havenfeedparser&#x2F;&quot;&gt;HavenFeedParser&lt;&#x2F;a&gt;, an open source Swift package for reading web feeds.&lt;&#x2F;p&gt;
&lt;p&gt;It supports RSS 2.0, Atom 1.0, and JSON Feed 1.1. You give it a URL, and it fetches the feed, works out the format, and hands back structured data. It handles caching with ETags and conditional requests, so it only downloads content when something has changed.&lt;&#x2F;p&gt;
&lt;p&gt;The package is written in pure Swift with no outside dependencies. It uses actors for thread safety and includes protections against SSRF attacks.&lt;&#x2F;p&gt;
&lt;p&gt;It also reads iTunes and podcast metadata, so you can use it for podcast apps too.&lt;&#x2F;p&gt;
&lt;p&gt;HavenFeedParser is what powers &lt;a href=&quot;&#x2F;apps&#x2F;haven-feeds&#x2F;&quot;&gt;Haven Feeds&lt;&#x2F;a&gt;. I built it for the app and now I am sharing it.&lt;&#x2F;p&gt;
&lt;p&gt;The code is on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Haven-Apps&#x2F;HavenFeedParser&quot;&gt;GitHub&lt;&#x2F;a&gt; under the BSD 3-Clause licence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
