Open source

What we give back

When we solve a problem that isn't specific to our business, we publish it. Eleven packages across six registries — including json-compress, one wire format with six interoperable implementations on npm, NuGet, PyPI, Packagist, pkg.go.dev and crates.io — and eight platforms, plugins and tools on GitHub, all under MIT or Apache 2.0 and free to use commercially.

Open source npm · nuget · pypi · packagist · go · crates · github
Packages 7 Platforms 4 Strapi plugins 4 Licences MIT · Apache 2.0
Published on npm, NuGet, PyPI, Packagist, pkg.go.dev & crates.io

Install and go

Eleven packages across six registries — json-compress alone ships on npm, NuGet, PyPI, Packagist, pkg.go.dev and crates.io, six implementations of one wire format that all write the same bytes. Alongside them, pgrecon on PyPI under Apache 2.0 and three more on npm under MIT, one of those also carried on the official Strapi Marketplace, plus an agentless Strapi backup tool in development. All extracted from problems we hit doing the work.

pgreconoracle → postgresql
Migration assessment · v0.1.2

pgrecon

Migration reconnaissance for PostgreSQL. Oracle-to-PostgreSQL projects overrun because nobody measures the PL/SQL before committing to a date — pgrecon is the measurement. It parses your DDL and program units with a real grammar, applies 62 rules, reports every incompatibility with evidence and a remedy, and turns the result into an effort estimate in person-days that shows its own arithmetic.

It never connects to your database. It generates a read-only SQL*Plus script your DBA reads and runs; analysis happens locally on the output files. That single design decision is why security teams approve it in minutes.

$ pip install pgrecon
Offline Analysis Grammar-based PL/SQL Parsing 62 Rules Severity & Remedies Effort Estimation JSON Export Oracle 9.2 → 21c Python 3.11+ Apache 2.0

A sample Oracle dump ships with the package, so you can go from install to a first report in about two minutes without an Oracle instance.

json-compresslossless · still json
JSON compression · six languages · v1.0

json-compress

Lossless JSON compression that is still JSON. It writes every key name once instead of once per record, turns arrays of like-shaped objects into columns and rows, hoists out the columns whose value never changes, and de-duplicates the values that keep coming back. Record-shaped documents come out 45–75% smaller, and decompress hands back exactly what went in — key order included.

It began as an internal helper for moving large result sets between a database layer and a set of front ends, where the payloads were dominated by repeated field names. It kept being copied from project to project, so we wrote it properly, specified the wire format so it could be ported, and then ported it — six times, into JavaScript, .NET, Python, PHP, Go and Rust.

$ npm install @tech-style/json-compress
$ pip install json-compress
$ composer require tech-style/json-compress
6 Interoperable Implementations Key Catalogue Columnar Tables Constant & Dictionary Columns Value De-duplication Byte-perfect Round Trip Zero Dependencies npm · NuGet · PyPI · Packagist · pkg.go.dev · crates.io TypeScript Types CLI Included Documented Wire Format MIT

The six implementations do not merely interoperate — they write the same bytes. Each is checked on every build against a shared corpus of 144 documents, in both directions: it must restore every envelope the reference encoder wrote, and write those same envelopes itself. Compress in a Python job, restore in a Go worker, in any combination. Java is planned against the same specification.

Keystoresecure-keystore-js
Node.js security · v1.1.0

secure-keystore-js

A secure key-value store with two-layer encryption. A single user key unlocks a per-store master key, and that master key unlocks each value individually — so secrets sit encrypted on disk and are only decrypted, in memory, at the moment you ask for one.

It was built because credentials kept ending up in plaintext config files across our own services. It now backs credential storage in strapi-content-sync-pro.

$ npm install secure-keystore-js
Two-layer Encryption AES-256-GCM Per-key Encryption Multiple Stores Import / Export CLI Tool MIT
Content Syncstrapi-content-sync-pro
Strapi v5 plugin · v1.2.1

strapi-content-sync-pro On Strapi Marketplace

Copy, migrate and live-sync content, media and data between Strapi environments. It handles the awkward parts of moving a CMS between staging and production: relations that must land in order, media that shouldn't be re-uploaded, and fields that should never cross the boundary at all.

It is published on the official Strapi Marketplace, listed under Content, Data, Database & Migrations and Import & Export — so it installs and updates alongside the rest of a Strapi project's plugins.

Paired & Single-side Modes Bi-directional Sync Media Sync (HTTP & rsync) Field-level Policies On-demand · Scheduled · Live Large Dataset Pagination Dependency Analytics Bulk Transfer Pause / Resume / Cancel Persisted History Retention Controls Alerts & Logging API Tokens & HMAC-SHA256 MIT
$ npm install strapi-content-sync-pro

Requires Strapi v5.0.0 or later and Node.js 20+.

WebDAVupload provider
Strapi v5 provider · v1.0.2

strapi-provider-upload-webdav

A WebDAV upload provider for Strapi v5. Point the media library at any WebDAV-capable storage — a NAS, a shared host, a self-managed box — instead of an object-store bucket you'd rather not pay for or depend on.

$ npm install strapi-provider-upload-webdav
Strapi v5 WebDAV Self-hosted Storage MIT
Remote Backupstrapi-remote-backup-pro
Strapi backup & restore · v0.1.0

strapi-remote-backup-pro In development

Back up and restore any Strapi v4 or v5 instance remotely — without installing a plugin in it. Every other Strapi backup tool is a plugin, which means adding a dependency to a live CMS and redeploying it. This one authenticates against the same admin API the Strapi admin panel itself uses, so there is nothing to install, nothing to redeploy, and nothing running inside your production process.

It ships as a desktop app for Windows, macOS and Linux and as a CLI for developers, CI and cron — both driving one engine, so anything the app can do a terminal can do too. Restore is selective: pick content types, pick records, choose how many relation hops to follow, and review a diff before anything is written to a live instance.

No Plugin Installed Strapi v4 & v5 Desktop App & CLI Content · Media · Schemas Relation-depth Restore Reviewable Restore Diff Local · S3 · Azure · Drive Dropbox · OneDrive · SFTP · FTP Scheduling & Retention AES-256-GCM Archives Documented Format MIT
$ npx strapi-remote-backup-pro backup

Requires Node.js 20.11+ for the CLI; the desktop app bundles its own runtime. Currently in development — the repository is public and the archive format is specified in full.

Why we publish

Because the alternative is rewriting it

Every one of these packages started as internal code. A keystore because credentials were sitting in config files. A sync plugin because staging and production kept drifting. A media server because pre-generating six variants per image was costing more disk than the business justified. A migration assessor because every Oracle project we joined had already committed to a date before anyone read the PL/SQL. A remote backup tool because clients kept needing their Strapi instance backed up on hosting we had no deploy access to.

Publishing them costs us documentation time and gains us three things: the discipline of writing an interface someone else can use, the scrutiny of people who don't already know how it works, and the certainty that we can still use our own tools if our priorities change.

We use permissive licences — MIT, or Apache 2.0 where patent grants matter — because a restrictive licence on a small utility helps nobody.

Using our packages?

  • Free for commercial use under MIT / Apache 2.0
  • Issues and pull requests welcome on GitHub
  • Commercial support and custom work available
  • Happy to talk through an integration before you commit

Building on our work?

We'd genuinely like to hear about it — and we offer commercial support, integration and custom development around every package here.