Try free tools
App source code · one-time purchase

QRForge: QR codes you can edit after they are printed

QRForge is a self-hosted web app for making dynamic QR codes. The code you print points at a short address on your own website, and that address sends people on to wherever you choose. Change the destination later and every printed copy follows, with no reprinting. It also counts the scans. There is no subscription and no per-scan fee: you buy the source code once and run it yourself.

£29or $39.99 · XAF 22,500 · one-timeBuy on Selar See it in action
Self-hosted: you own the dataNo subscription, no per-scan feeNo IP addresses storedFull source code (Next.js)

What QRForge does

Print a QR code on a menu, a shop window, a flyer, a business card or a poster and it normally has to stay the same forever, because the web address is built into the picture. If the page moves, the printed code breaks.

QRForge avoids that. Each code you create gets a short random address on your domain, such as https://links.yourbusiness.com/r/k7m2q9xa. The printed picture only contains that short address. When someone scans it, your server looks up the code, notes the scan and sends the visitor on to the current destination. You can change that destination from the dashboard whenever you like.

Who it is for

  • Small businesses, cafes, shops and event organisers who print QR codes and want to correct or update them later.
  • Agencies and freelancers who look after QR codes for a client and want to host them on their own domain.
  • Anyone who is comfortable running a small Node.js website and wants to avoid a monthly QR subscription.

Who it is not for

  • People who want a ready-made website to sign up to: this is software you install and host yourself.
  • Teams that need several users, roles or separate customer accounts: it has one business account.
  • Anyone who needs fancy styling (colours, logos), QR codes for Wi-Fi or contact cards, bulk import, or location-level analytics: those are not built in.

How dynamic QR codes work

A normal (static) QR code holds the final web address. A dynamic code holds a short address that you control, and that address forwards the visitor. That one extra hop is what makes the destination editable and the scans countable.

You create a code

Give it a label and a destination page. QRForge makes an 8-character short code and draws the QR image for your-domain/r/shortcode.

You print the image

Download the PNG and use it anywhere. The picture never needs to change.

Someone scans it

Their phone opens your short address. Your server finds the code, records the scan (time, device type and referrer) and redirects the visitor.

You change your mind

Edit the destination in the dashboard. The next person to scan the same printed code lands on the new page.

Static QR codeQRForge dynamic code
DestinationFixed in the printed pictureEditable any time, no reprint
Scan countsNoneCounted per code, with a daily chart
Switch it offNot possibleDeactivate it and scanners see a clear "no longer active" page
Where the redirect livesNowhereOn your own domain and server

Because every printed code contains your short address, your server has to stay online for the codes to keep working, and the domain you choose must be one you plan to keep.

Scan analytics: see which codes people actually use

Every scan is logged by your own server and shown on the dashboard and on each code's page. It is deliberately simple and privacy-friendly: enough to tell which printed code is working, without tracking individuals.

What you can see

  • Total scans for each code, and across all codes, plus the average per code
  • A bar chart of scans per day for the last 14 days
  • A breakdown by device type: Mobile, Tablet, Desktop, Bot or Unknown
  • A breakdown by referrer, which is whatever the scanning app sent. Many phone camera apps send none, so expect plenty of "Direct / no referrer"
  • The 20 most recent scans, with time, device and referrer
  • Your top five codes on the dashboard, with Active or Inactive status

What it does not record

  • No IP addresses are stored
  • No city, country or other location
  • No names, emails or cookies for the people who scan
  • No fingerprinting: device type comes only from the browser's User-Agent text
  • Crawlers and link-preview bots that follow the link are counted too, in their own "Bot" group, so totals can include some non-human visits
QRForge code page with a 14-day scan chart, device and referrer breakdowns and recent scans
A code's page: the 14-day chart, the device and referrer breakdowns and the recent-scans table. This one is a sample code that ships with the app.

Features

This is the complete list of what version 1.0.1 does. Nothing here is a roadmap item.

Editable destinations

Change a code's label and destination page at any time from the code's detail page.

Create and manage codes

Create codes one at a time (label and destination; https:// is added if you leave it off), list them with a small preview, open, deactivate, reactivate or delete them.

PNG download

Download each code as a 640-pixel PNG with a quiet-zone margin, ready for print or a design tool.

Deactivate a code

Switch a code off and scanners see a clean "No longer active" page (HTTP 410). A code that was deleted shows "Code not found" (HTTP 404). Neither shows an error screen.

Scan dashboard

Totals, average scans per code, your top five codes and a 14-day chart, all computed from your own data.

Per-code analytics

Daily chart, device breakdown, referrer breakdown and a recent-scans table on every code's page.

Login-protected admin

Email and password login (passwords stored hashed with bcrypt, session in a signed httpOnly cookie). The dashboard and code pages are protected; the redirect that scanners hit is public on purpose.

Hard-to-guess short codes

Random 8-character codes from an alphabet without look-alike characters (no 0, 1, o, l or i), about 40 bits of randomness.

Your database, your data

Prisma with SQLite by default. Everything is in a file or database you control, with a documented schema of three tables.

Full source code

Next.js, React, TypeScript and Tailwind. A production build is one command, and the code is small enough to read in an afternoon.

QRForge dashboard with totals and the top QR codes
The dashboard: how many codes you have, total scans, the average per code and your top five.

Walkthrough: create a code, change it, watch the scans

These are real screenshots from QRForge running with the sample data it ships with. The address shown in the QR is localhost because this copy ran on my own computer; on your site it will be your domain.

1Create a code

Open QR Codes, type a label and the page it should open, and press Create. You can leave off https://.

QRForge create form with a label and a destination filled in

2It appears with its QR image

The new code is added to your list with a small preview, a scan count and an Active badge. You can deactivate or delete a code from the list.

QRForge code list showing the newly created code at the top

3Open it and download the PNG

The code's page shows the larger QR image, the short address it contains, and a Download PNG button. Print that image.

QRForge code page with the QR image, short address and Download PNG button

4Change where it points

Edit the destination and save. The printed code does not change; the next scan goes to the new page. Here the menu link was updated from spring to summer.

QRForge edit destination form with a new URL typed in

5Scan it and read the results

After three test scans (two phones and a computer, from an Instagram link) the page shows the daily chart, the device and referrer breakdowns and each scan in the recent-scans table.

QRForge code page showing three scans, a daily chart and device and referrer breakdowns

6Switch it off when a campaign ends

Deactivate the code and anyone scanning the old printed copy sees this clear message instead of an error. You can reactivate it later.

Phone-sized page saying This QR code has been deactivated by its owner

These steps use only features that are in the product. If you want to try it before buying, you can run the free QR code generator in your browser: it makes ordinary static codes, which is the simpler tool when you never need to edit or count anything.

Install and set up

QRForge is a standard Next.js project. If you have deployed a Node.js site before, this will feel familiar. If you have not, ask a developer or hosting support to do the install once: after that, using it needs no technical skill.

What you need

  • Node.js 20.9 or newer (the project was built and tested on Node 24) and npm
  • A place to run a Node.js web app, with a domain or subdomain that you control
  • A terminal to run a handful of commands
  • A long random text string for the session secret

Running it on a real website

  • Set BASE_URL to your real public address before you create codes you will print. It is built into every QR image
  • Run npm run build and npm run start on a normal Node server, with the SQLite file kept on a disk that survives restarts
  • On serverless hosts such as Vercel there is no permanent disk, so switch the Prisma database to Postgres as the README describes (change the provider and DATABASE_URL)
  • Serve it over HTTPS so scans and logins are encrypted

Unzip and install

Unzip the download, open a terminal in the folder and install the packages.

npm install

Set your settings

Copy the example settings file, then set BASE_URL to your domain and SESSION_SECRET to a long random string.

cp .env.example .env

Create the database

Apply the schema. The README uses migrate dev; on a live server use migrate deploy, Prisma's production version.

npx prisma migrate dev

Create your account

There is no sign-up page. The seed script creates the account and some sample codes. Edit the email, password and business name in prisma/seed.ts first, then run it.

npx prisma db seed

Start it

Run it locally to try it, or build and start it on your server.

npm run dev (try it locally) npm run build && npm run start

Before you go live: the seed creates a demo account (demo@example.com) with a sample password. The sign-in form is not pre-filled, but anyone who reads this page could try the sample password, so change the seeded account in prisma/seed.ts before you run the seed, or skip the seed and create your own account.

What you receive after buying

You receive the complete source code as a single zip download from Selar, straight after payment.

In the download

  • The full QRForge source code (Next.js, React, TypeScript, Tailwind)
  • The Prisma database schema, the first migration and a seed script with sample data
  • A README with setup steps, the project structure and the known limits
  • An example settings file (.env.example) and the package list
  • No node_modules folder: you install the packages yourself with npm

Not included

  • Web hosting, a domain name or an installation service
  • A hosted copy to sign in to: you run your own
  • Updates or new features are not promised. You get the current version, 1.0.1
  • A single-buyer licence file (LICENSE.txt) is included: you may run and modify the code for your own business or hosted clients, but not resell or share the source

Limits and honest notes

Better you know now than discover it after printing. These come from the project's own README and code.

  • The domain in your printed codes is permanent. You can edit where a code goes, but not the domain that is encoded in the picture. Decide on the address first.
  • Your server must stay online. If it is down or the domain lapses, every printed code stops working.
  • One business account. There is no sign-up, no multiple users and no password-change screen: the account comes from the seed script.
  • Plain black-and-white codes. No colours, logos, SVG or PDF export. The QR image comes from one small file (src/lib/qr.ts) that a developer can extend.
  • Website addresses only. Codes open a web page. There are no Wi-Fi, contact-card, text or app-store code types.
  • No bulk tools. Codes are created one at a time. There is no CSV import or export.
  • No location analytics, by design. It does not store IP addresses, so it cannot show cities or countries. Adding that needs an IP lookup service and a privacy-policy update.
  • No short-domain manager. To use a short domain such as yourbrand.link, deploy QRForge on that domain.
  • SQLite by default. That is fine for one business on a normal server. A very high-volume or multi-customer setup should move to Postgres and a different ID strategy, as the README notes.
  • Bots are counted. Anything that follows the link, including link-preview crawlers, is logged as a scan (grouped as "Bot").

Questions

Do I need to be a programmer?

You need to be comfortable installing a Node.js project and running a few terminal commands once. After it is installed, creating and managing codes is point-and-click in the dashboard.

Can I use my own short domain?

Yes, by deploying QRForge on that domain or subdomain and setting BASE_URL to it. QRForge has no built-in domain manager.

What happens to old printed codes if I change BASE_URL later?

They keep pointing at the old domain, because the domain is part of the printed picture. Only the destination behind a code can be edited later, so choose your domain before you print.

Does it store my visitors' IP addresses?

No. Each scan records only the time, a coarse device category from the browser's User-Agent text, and the referrer if the scanning app sent one.

Is there a limit on scans or codes?

QRForge does not count or limit them and there are no per-scan fees. Capacity depends on the server and database you run it on.

Can I change the colour of the QR code or add my logo?

Not out of the box. The images are plain black and white. The QR image is generated in one small file with the open-source qrcode library, so a developer can add options.

Can several people sign in?

No. It has one business account, created by the seed script.

Is it better than a free static QR generator?

Only if you need to edit the destination after printing, switch codes off, or count scans. If a code will never change and you do not need numbers, a static code from the free generator is simpler.

Print once. Change it whenever you need to.

One payment, full source code, and the codes live on your own domain.

Buy QRForge · £29

All our tools are listed on the tools catalogue. Free browser tools are in the tools hub.