I use short links often enough that depending on another service had started to feel unnecessary. This site already stores and serves my ShareX uploads, so adding a small URL shortener felt like a natural extension: one more useful tool that could live alongside the rest of the Portfolio instead of somewhere else.
The basic version is deliberately straightforward. A short link has a unique slug, a destination, an optional title, and a visit count. The admin side lets me create memorable links, update where they lead, and remove them when they are no longer useful. That ability to change the destination is the part I care about most. I can print or share one stable address without treating the first destination as permanent.
The public redirect is small, but it has a few important boundaries. Destinations are validated before they are saved and checked again before a redirect is served. Redirect responses are explicitly non-cacheable so changing a destination takes effect instead of being hidden behind a stale browser or intermediary response. They also carry a no-referrer policy, which keeps the destination from receiving the short-link page as referral information. Successful visits are counted without making an ordinary redirect look like an administrative edit.
I also connected the shortener to ShareX. It now has a separate URL-shortening configuration in addition to the existing file and text upload configuration. Sending a URL through that path creates a random short link and returns the compact address immediately. The generated entry still appears in the same admin area, so it can be given a title, reviewed, or pointed somewhere else later. That turned the feature from something I could use occasionally into something that fits an existing daily workflow.
QR codes were the next obvious step. The generator can encode one of the hosted short links or any other text. Choosing a hosted link keeps the useful indirection: the printed QR code continues to point at the same short address even if I change its final destination. The arbitrary-text option works for ordinary URLs, contact details, Wi-Fi notes, or multiline text without saving that content as another record.
The generator produces PNGs in memory and shows a live preview as the form changes. Text input is debounced briefly so typing does not turn into a stream of unnecessary requests, and the page reports the remaining UTF-8 capacity before the server performs the same validation. Opening the generator from an existing short link renders its QR code immediately, while switching sources or appearance options refreshes the preview without requiring a separate button click.
I ended up giving the appearance controls more attention than I expected. There are a few high-contrast presets, square, rounded, and dot module shapes, editable foreground and background colours, and an option for a transparent PNG. Image padding is configurable all the way down to zero, while the page keeps its own preview spacing separate from the downloaded file. The larger finder patterns remain square across the decorative styles because a QR code that looks interesting but scans poorly is not much of a tool.
This was one of those projects where several modest pieces became much more useful together. The shortener gives me stable links I control, ShareX makes them quick to create, visit counts provide a small amount of practical feedback, and the QR generator gives the same links a physical form. None of it needs to be a separate product. It is simply another part of the site that now does a job I previously handed to someone else.