NNovaNetworkClientSwift networkingGitHub ↗

Production networking for Swift 6.2+

Stop rebuilding your network layer.

NovaNetworkClient turns typed requests, shared work, cancellation, resilience, authentication, offline delivery, and realtime connections into one coherent system.

✓ Zero third-party runtime dependencies · Apache 2.0
Request pipeline
A
ProfileViewGET /users/42
→
B
HeaderViewGET /users/42
→
ONE SHARED TASKRequest fingerprintGET · /users/42 · public
RetryCacheAuthMetrics
200One response, two typed values
451automated tests
90%+unit coverage policy
3library products
0third-party dependencies

The real problem

Networking starts simple.
Production doesn't.

01

Duplicate work

Multiple screens ask for the same resource and quietly multiply traffic, decoding, and battery cost.

02

Policy sprawl

Retry loops, cache rules, auth locks, and cancellation flags accumulate across services and view models.

03

Invisible failure modes

Offline writes, reconnects, rate limits, and token expiry appear only after the happy path ships.

One execution model

Describe intent once. Let policies do the hard work.

A stable request identity gives Nova one place to coordinate callers and apply production behavior. The API stays explicit while the infrastructure stays reusable.

Explore the architecture →
  1. 1
    Describe

    Method, URL, body, headers, and authentication scope form a typed request.

  2. 2
    Coordinate

    A deterministic fingerprint joins equivalent in-flight work and tracks each subscriber.

  3. 3
    Execute

    Resilience, cache, auth, transport, decoding, and telemetry run through one pipeline.

Batteries included, decisions exposed

A production stack, not another thin URLSession wrapper.

Adopt the pieces you need today without painting the next feature into a corner.

01

Shared in-flight work

Equivalent callers join one request. Each caller keeps independent cancellation semantics.

02

Resilience policies

Retry, rate limiting, circuit breaking, and HTTP-aware caching live in one execution pipeline.

03

Authentication refresh

Coordinate token refresh and prevent a burst of unauthorized requests from becoming a refresh stampede.

04

Offline delivery

Queue writes, replay them deliberately, and model recovery instead of hiding it behind a transport wrapper.

05

Realtime & transfers

Use WebSocket, Server-Sent Events, multipart uploads, downloads, and progress APIs from the same package.

06

Observable by design

Inspect lifecycle events, metrics, diagnostics, and deterministic test support without replacing the client.

07

Declarative endpoints

Generate request construction from an annotated Swift type, or generate whole endpoint types from an OpenAPI document.

08

Record and replay

Capture real traffic into a reviewable cassette and replay it in tests, previews, and offline demo builds.

09

Diagnostics you can see

Record what the client did, read retry waterfalls, and export a HAR that opens in any network inspector.

10

Authentication

OAuth 2.0 with PKCE, every grant, safe token storage, and one refresh shared by every caller.

11

Query layer

Server state by key for the screens that render it, with stale reads, shared fetches, and optimistic mutations.

From ad hoc to intentional

Keep business code about the request—not the machinery around it.

WITHOUT A COHERENT CLIENT
  • Task dictionaries in every feature
  • Retry rules copied between services
  • Refresh locks tied to UI state
  • Logs that cannot explain shared work
WITH NOVANETWORKCLIENT
  • Stable request identity
  • Composable, explicit policies
  • Coordinated auth and cancellation
  • Lifecycle events and metrics

Small surface, serious behavior

Your first typed response stays readable.

The simple case remains simple. Production capabilities are configured around it instead of leaking into every call site.

Read Getting Started
ProfileService.swift
let request = APIRequest(
    method: .get,
    url: apiURL.appending(path: "users/42")
)

let profile: Profile = try await client.load(
    request: request,
    authScope: "current-user"
)
✓ Typed, cancellable, observable, and shareable

Learn by building

From first request to production confidence.

All 13 tutorials →

Built for the code after the prototype

Ship the network layer once.

Start with one typed request. Add production policies when your app needs them.