04

Open-source encrypted text service

Open source

textWormhole.

Store encrypted text, keep the identifier and key, retrieve it when needed.

A compact Node.js and Express service that validates text, encrypts it with AES-256-GCM before persistence, and retrieves it through a human-readable identifier plus a 256-bit key.

github.com/H2GGdev/textWormholeREPOSITORY
textWormhole GitHub repository showing the project files, README, and JavaScript language breakdown
Open repository
Role

Backend architecture, API, frontend

Scope

Open-source web service

Built with

Node.js · Express · AES-256-GCM

Status

Open source

Make the complex
feel obvious.

Create the smallest understandable store-and-retrieve flow for text while keeping persisted message content encrypted and protecting the API from basic abuse.

The service has to make two unusual credentials, a generated phrase and a long hexadecimal key, understandable to a user while validating input and never writing plaintext messages to storage.

AES256-GCM encryption
05word identifier
10requests per minute

A system,
not a skin.

The current project favors a lightweight interface and a small, inspectable Node.js codebase. The portfolio treatment turns its identifier, key, IV, ciphertext, and authentication tag into a visual system.

01

Store flow

The API sanitizes and validates text, enforces a body limit, creates a random key and IV, encrypts with AES-256-GCM, and persists only ciphertext plus the authentication data.

02

Memorable retrieval

A cryptographically selected five-word identifier is paired with a 64-character key so the stored message can be located and decrypted later.

03

Small abuse controls

Requests are rate limited per IP, identifiers and keys are pattern-validated, and authenticated decryption rejects incorrect keys or altered data.

Plain text in.
Ciphertext stored.

01

POST /store

Validate text, enforce the size limit, and apply the per-IP request window.

02

KEY + IV

Generate a random 256-bit key and a 12-byte initialization vector.

03

AES-256-GCM

Encrypt on the server and produce ciphertext plus an authentication tag.

04

JSON STORAGE

Persist the identifier, timestamp, IV, tag, and ciphertext, never the plaintext.

05

GET /retrieve

Validate the identifier and key, authenticate the payload, then return decrypted text.

Every choice
has a job.

Crypto

Authenticated encryption

AES-256-GCM protects confidentiality and detects a wrong key or modified ciphertext during retrieval.

Identifiers

Words over opaque IDs

Five randomly selected words make the lookup identifier easier to transfer while the separate key retains cryptographic strength.

Scope

Compact by design

Express, JSON storage, and a framework-free frontend keep the prototype direct and easy to inspect.

Built for clarity.
Ready for the next step.

  1. A complete store-and-retrieve path with authenticated encryption before persistence.
  2. A human-readable identifier system backed by cryptographically secure random selection.
  3. An open codebase that makes the API and security decisions easy to study and extend.

Next case study 01 / 04

Ajdinović Gradnja.