Private Dartastic Pub for Dart & Flutter teams

Git Tags Aren't a Package Manager.

Every Dart team starts the same way: the shared package moves to its own repo, the pubspec grows a git: ref and it works. Then the second app appears, the second team, the first partner... and the easy solution breaks down. To be fair to path: dependencies inside one repo, with melos, they're great. The trouble starts when code crosses a repo, a team, or a company boundary. That's when tags fall apart:

  • Share your packages, not your repo. There's no way to hand a customer a git dependency without handing them repo access. With Dartastic Pub you can allow access per-package, watch the access logs, and revoke access the moment the contract ends.
  • No pub, no memory. Which internal packages exist? What changed in 2.3.0? Which version supports the new SDK? With git dependencies the answer lives in Slack. A pub registry renders READMEs, changelogs, and version history. New teammates browse instead of searching or asking.
  • Your tooling goes blind. dart pub outdated and constraint-based upgrades reason over hosted version lists. Git refs are opaque to them. And packages published to pub.dev aren't allowed git dependencies at all, so internal shared code on git tags caps what you can ever ship publicly.
  • Tags move. Archives don't. A tag can be force-pushed, a branch rewritten, a repo renamed, a commit garbage-collected. Your lockfile pins a commit hash, but nothing guarantees that commit stays fetchable. A published version on a registry is an immutable archive. The build that passed yesterday fetches the same bytes next year.
  • Git dependencies are fat. Git fetches the entire history. Every branch, every experiment, every secret someone committed and "deleted" three years ago. A pub package ships the published files of one version. Nothing else.
  • One ref is not version solving. A git dependency pins exactly one commit. The solver can't try other versions. The day one package needs shared_models at v2 while another still needs v1, resolution simply fails, and you're coordinating a lockstep upgrade across every consumer. A registry gives pub a version list, so ^1.2.0 constraints resolve the way they do on pub.dev. (Dart 3.9's tag_pattern can now feed tags to the solver, credit where due. Every problem below still stands.)
  • Your lockfile is your bill of materials. An opinion we'll defend: pubspec.lock ships with the app. It is the BOM, the exact parts list of the build you released. With hosted dependencies, every entry carries a name, an exact version, and a sha256 of the archive. Auditors can verify it. You can rebuild from it. A git dependency's entry is a repo URL and a commit hash. There is no content hash of the package, and the pointer dangles the day history moves. Reviews suffer too. A hosted lock diff reads like "1.2.3 to 1.2.4", while a git lock diff swaps one forty-character hash for another. Nobody can tell a patch from a rewrite. And a checked-in lock can lull a team: one dev upgrades and forgets to commit, another pulls and skips pub get, and now two devs read the same pubspec while running different code. If the package is a library, consumers never see your lock at all. You tested a dependency set your users will never run.
  • Pub clones the repository. All of it. Resolving a git dependency fetches the repo, history included, to deliver one package. A hosted dependency downloads one small archive of one version, cached. Your CI feels the difference on every fresh run.
  • dart pub publish is a quality gate. A tag is not. Publishing validates the version bump, the changelog, the analysis; releasing is a deliberate act. Anyone can tag anything, including broken code and a pubspec whose version disagrees with the tag name.
Git tag · one pinned commit
dependencies:
  shared_models:
    git:
      url: git@github.com:acme/shared_models.git
      ref: v1.2.0   # repo creds required,
                    # no ranges, tag can move
Dartastic Pub · solves like pub.dev
dependencies:
  shared_models:
    hosted: https://pub.dartastic.io
    version: ^1.2.0   # per-package token,
                      # immutable archives

Even Dart's own documentation points teams at a package repository for collaborative work. Dartastic Pub is that repository, minus the running of it. Start free. Outgrow it for the price of a coffee.

A private pub.dev for your code

Stand up a private Dart/Flutter package registry your team, partners, and customers can publish to and consume from. Same client, same workflow. Your packages instead of the world's.

pub.dartastic.io speaks the same protocol as pub.dev. dart pub publish and dart pub get work unchanged once a token's registered. No new tooling. No new mental model.

What you get
  • Private registry, scoped to your team
  • Share with your team, partners, customers - anyone.
  • Unrestricted version retraction (private publishing is not "forever")
  • Access logs
  • Quick API key revocations.
  • Daily backups, dual-region

Things git hosting can't do at all

Retract without breaking builds

Shipped a bad version? Retract it: the solver stops picking it, while builds already pinned to it keep working. Deleting a git tag does the opposite: it breaks every consumer pinned to it, immediately. When your registry is private, publishing isn't "forever."

Crash reports that name your source

Flutter apps published here ship their .symbols in the archive. The Dartastic Symbolizer auto-fetches them and turns obfuscated production stack traces into real file and line. One publish per release. A git tag carries no artifacts at all.

Run like infrastructure

Per-package publish and read tokens, access logs, revocations in seconds, daily dual-region backups. Your dependency supply chain, treated like the production system it is.

Quick start

One-time per machine: register the token. Then publish or consume like normal pub.dev. Just point at pub.dartastic.io.

# Mint a key on dartastic.io/dashboard?tab=tokens with the `pub` scope
# (the plaintext key is shown ONCE at mint time). Then pipe it in:
echo '<your-token>' | dart pub token add https://pub.dartastic.io

Don't use the interactive dart pub token add: its silent Enter secret token: prompt truncates Dartastic's long signed tokens, so it appears to hang. Pipe the token in, as above.

Publishing
# pubspec.yaml
name: my_private_package
version: 1.0.0
publish_to: https://pub.dartastic.io
dart pub publish
Consuming
# pubspec.yaml
dependencies:
  my_private_package:
    hosted: https://pub.dartastic.io
    version: ^1.0.0

Subscribe to get access

Dartastic Pub gets you the private pub server. Symbolizer adds the Dartastic Symbolizer and the OTel Dev runtime.

Free Pub

Free Private Pub

No credit card required

$0

free forever

  • Free Private Pub Package RepositoryLearn more
    • Share packages privately with your team, customers, consultants - anyone.
    • Standard pubspec.yaml integration, familiar pub.dev feel
    • Give read or write access to any or all packages
    • Quick revocations
    • Daily backups, dual-region
  • 100 MB total storage
    • Outgrow it? Dartastic Pub is 10 GB for only $4/mo
  • Our telemetry ensures a stable expansion. We hope to make Dartastic Free Pub available to everyone but you may be added to a waitlist.

Dartastic Pub

Private Pub with New Tricks

Secure checkout via Stripe

$4

per seat, per month

$40/yr · 2 mo free

  • Private Pub Package RepositoryLearn more
    • Share packages internally or privately with external partners and customers.
    • Manage teams, members and app and read and write package access.
    • Standard pubspec.yaml integration
    • Familiar pub.dev feel
    • Retract anytime. When private, publishing isn't forever
    • Quick API key revocations
    • Daily backups, dual-region
    • 10 GB pooled downloads / user / mo
  • Try Dartastic Symbolizer
    • 10 symbolize calls included to try it out
    • $5 per 1,000 additional calls. Upgrade to Dartastic Symbolizer for the full entitlement

See all tiers and annual pricing on dartastic.io/pricing.