CLI tool
zws-im/zws avatar
zws-im/zws

ZWS: A URL Shortener That Encodes IDs as Invisible Zero-Width Unicode Characters

Project brief: Shorten URLs using invisible spaces. Individuals Organizations [Support this project with your organization][open-collective].

1,848 stars148 forksTypeScriptApache-2.0

At a glance

What is it?
An open-source URL shortener that represents shortened link identifiers using sequences of invisible zero-width Unicode spaces, producing URLs that appear blank in most text interfaces while remaining fully functional as redirects.
Who is it for?
ZWS is the right choice for developers who want a URL shortener with an unusual encoding mechanic and are comfortable with the social implications: links copied from ZWS will look blank when pasted into a text field, which can confuse users who cannot see the characters or verify what they are clicking. The Apache-2.0 license permits commercial use and self-hosting.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 2, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What ZWS Does and the Problem It Is Solving

Most URL shorteners encode a link identifier as a short alphanumeric string appended to the shortener domain, producing something like bit.ly/abc123. The short code is visible when the URL is displayed.

ZWS takes a different approach. It encodes the identifier using zero-width Unicode characters: code points that occupy no visible width in most rendering contexts. When a ZWS-shortened URL is displayed, the identifier portion appears empty. When shared in text, the URL appears to consist only of the domain. The characters are present but invisible.

The primary use case appears to be novelty and technical interest rather than a practical productivity problem. The README presents it as a demonstration of what can be done with invisible Unicode characters in URLs. It is also used in contexts where the visible appearance of a URL matters, such as pasting a link into a message where any visible short code would look out of place.

The project is maintained by Jonah Snider and has received integration into ShareX, a popular screenshot and file-sharing tool, by a third-party contributor. A hosted instance runs at zws.im.

How Zero-Width Unicode Encoding Works

Unicode includes several zero-width characters. Zero-width space (U+200B), zero-width non-joiner (U+200C), zero-width joiner (U+200D), and word joiner (U+2060) are common examples. These characters have code points and can be included in strings, URLs, and text, but most font rendering engines assign them zero visual width.

ZWS uses sequences of these characters to encode a numerical ID. Each character in the sequence represents a value in a small alphabet of zero-width code points. The resulting string of zero-width characters, appended to the domain, is a valid URL path component that the server can decode to look up the target URL.

The zero-width characters survive copy-paste in most text editors, messaging applications, and web browsers, so the link remains functional even after being copied and shared. In interfaces that strip or normalize Unicode characters, including some email clients and content management systems, the characters may be removed, breaking the link. This is a real limitation that the project does not conceal.

The encoded IDs produce URLs that look like the domain name alone, which is the distinctive visual property of the project.

Using the Public API and the CLI

A hosted instance is available at zws.im. An OpenAPI schema and interactive API documentation are available at zws.im/api-docs.

The project also has a separate CLI tool at github.com/zws-im/cli for shortening URLs from the command line against any ZWS instance. The README links to the CLI README for usage details.

ZWS instances expose Shields.io-compatible badge endpoints for embedding live stats in documentation:

text
https://img.shields.io/endpoint?url=https://api.zws.im/stats/shields/urls
https://img.shields.io/endpoint?url=https://api.zws.im/stats/shields/visits

The /stats/shields/urls route returns the count of shortened URLs. The /stats/shields/visits route returns the count of link visits. Both follow the Shields endpoint schema and can be embedded as live badges in README files.

A Procfile in the root suggests the project has historically been deployed to Heroku-compatible platforms. The railway.json file indicates Railway is also a supported deployment target.

Repository Structure and Self-Hosting

The repository is a pnpm monorepo managed with Turborepo. The top-level package.json defines workspaces under apps/ and packages/. The pnpm-workspace.yaml specifies the workspace layout.

The development tooling uses Biome for linting and formatting, replacing ESLint and Prettier in the current setup. The package.json dev script runs all workspace packages in parallel.

Database migrations are managed with Drizzle Kit, specified as drizzle.config.ts. The drizzle/ directory contains migration files. Migration commands:

bash
pnpm run migrate

Creating a new migration:

bash
pnpm run migrate:create

The mise.toml file suggests the project uses mise (formerly rtx) for managing the Node version and other tool versions in the development environment. The package.json devEngines field specifies Node 26.x.

For self-hosting, the apps directory contains the server application. The README directs users to the OpenAPI documentation and the repository for self-hosting details but does not include a quickstart self-hosting guide in the README itself.

Limitations and Cases Where ZWS Is the Wrong Tool

The core encoding mechanic is also the main limitation. Zero-width characters are invisible, which means users cannot inspect or read a ZWS link to verify its destination before clicking. This is a significant concern for security-conscious users and in contexts where link transparency is required.

Some platforms strip zero-width characters from user-generated content as part of sanitization or Unicode normalization. When a ZWS link is posted to such a platform, the invisible characters are removed and the link breaks. The README acknowledges this by noting that ZWS links may not survive all copy-paste contexts.

ZWS does not offer analytics dashboards, custom domains, link expiration, or access control as documented features. Teams that need a production URL shortening service with those capabilities should use a conventional URL shortener.

The project has no releases more recent than 2021 in the releases tab, though the repository itself continues to receive pushes. The most recent GitHub releases are tagged for @zws.im/schemas from November 2021. The README does not document a versioning or release process for the main application.

How ZWS Differs from Bitly

Bitly is a widely used commercial URL shortener that encodes identifiers as short alphanumeric strings. A Bitly link looks like bit.ly/AbC123d. The short code is visible, readable, and can be typed by hand. Bitly provides analytics, custom domains, link expiration, and enterprise plans.

ZWS encodes identifiers using invisible zero-width Unicode characters. A ZWS link looks like a bare domain name. The code cannot be read or typed by hand. ZWS provides no analytics dashboard, no custom domain support as a documented feature, and no enterprise plan. The project is open source under Apache-2.0.

The choice between them is not primarily about features. ZWS has a specific visual property that Bitly does not: links appear to consist only of the domain. For applications where that visual property is useful or interesting, ZWS is the only option. For standard short link use cases, Bitly or other conventional shorteners are more practical.

Maintenance, Contributors, and License

The repository is maintained primarily by Jonah Snider. The README thanks Jaex for integrating ZWS into ShareX, making ZWS-shortened URLs available directly from the ShareX screenshot tool.

The project is funded through Open Collective, with individual and organizational financial contributors listed in the README.

The license is Apache-2.0, which permits commercial use, modification, and distribution. The last push to the main branch was on 2026-09-27.

The pnpm-lock.yaml and package.json list Biome 2.3.10, Turbo 2.11.4, and pnpm 12.6.0 as the current toolchain versions. The drizzle-kit dependency uses a release candidate version (1.0.0-rc.5-ab785fc), indicating the migration tooling is pre-stable.

Editorial conclusion

ZWS is the right choice for developers who want a URL shortener with an unusual encoding mechanic and are comfortable with the social implications: links copied from ZWS will look blank when pasted into a text field, which can confuse users who cannot see the characters or verify what they are clicking. The Apache-2.0 license permits commercial use and self-hosting. Teams that need standard short links with visible short codes, analytics dashboards, or enterprise support should use a conventional URL shortener. The last push was on 2026-09-27. Before self-hosting, check the apps directory for the server component and its deployment configuration.

Frequently asked questions

Is it safe to shorten a URL using a zero-width character shortener?

From a security perspective, zero-width encoded links present an additional concern compared to conventional short links: the encoded portion is invisible, so users cannot read or inspect the identifier before clicking. The redirect destination is only visible after following the link or using the API to look it up.

Does ZWS store analytics or track who clicks shortened links?

The hosted instance at zws.im exposes a /stats/shields/visits endpoint that counts total link visits, but the README does not document per-link analytics, geographic data, or click-through tracking as available features.

Can ZWS be self-hosted and what does it require?

Yes. The repository is a pnpm monorepo containing the server application. Database migrations use Drizzle Kit against a configured database. The repository links to OpenAPI documentation at zws.im/api-docs for the full API surface. Node 26.x is the specified runtime.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/zws-im-zws.svg)](https://hysenlabs.com/projects/zws-im-zws)