Changelog

This site doubles as a hands-on demonstration project, so here's a running log of what's changed — partly for transparency, partly because it's genuinely useful to see a small site evolve over time.

Week 39 · September 2026

A search across "All time" that now answers

  • Searching visitor sessions across "All time" could end in a server error instead of results. The underlying search was made faster, and the results come back.

Demo accounts get a look inside Settings.

  • A demo account with access to Settings can now open the panel and look around. What it sees there are made-up placeholder values rather than the real configuration, and every save action is safely blocked, the same deal the demo accounts have had from the start: look at everything, nothing can be changed.

Week 38 · September 2026

Two lines on the business card that ignored the language switch

  • Switching between Danish and English changed every text on the business card except two: the job title and the tagline. Both were hardcoded, in two separate places, and never followed the page's language. They are now translated like everything else.

A date search engines can actually accept

  • The CV page's structured data, the machine-readable summary search engines read and visitors never see, gave its creation date in a format that wasn't recognized as valid. It now uses a properly formatted date.

A search box that leaves your filters alone

  • Clearing the visitor-traffic search box, or pressing Enter while typing in it, used to quietly reset the time range and the "everyone / only mine" filter to their defaults. Both now stay exactly as set. The same fix lifted a hidden limit as well: after a search was cleared, the list had been capped at 20 rows with no way to page through the rest, and it now shows the full list again.

Danish characters, and a QR code that choked on them

  • The business card's QR code, fixed once before for an unrelated reason, had one more problem: on the Danish card it could fail with a "Too long" error. The culprit was how special characters like ø were encoded, and with that fixed, the code now generates correctly every time.

A tidier Skills section in the CV, and a footer that links home

  • In the long CV's Skills section the category headings are clearer, and the skill list finally has proper bullet points. The CV's footer, which used to show plain, unclickable text, now links straight back to the portfolio website.

The contact button moves up on phones

  • On phones, the "Get in touch" button added a couple of weeks earlier sat below the bio text, out of sight until you scrolled. It now comes right after my name, visible straight away.

Week 37 · September 2026

"Expand all" now means all

  • The Skills section's "Expand all" button opened the skill descriptions, but not each category's own "More…" list of extra skills. It now expands and collapses both together.

Week 36 · August 2026

The Lab explains itself

  • The Lab page used to introduce itself in a single line. Its intro now explains what the Lab section is and why it exists.

A shorter way to get in touch

  • The homepage introduction now has a "Get in touch" button that goes straight to the contact section, so visitors no longer have to scroll to find it.

Week 35 · August 2026

Table layouts that follow you, and a shared starting point

  • The admin tables already let you sort, resize, reorder and hide columns. Now the arrangement itself can be saved: the sort column, each column's width, their order and which ones are hidden. A saved layout follows me to any device I sign in from, instead of living only in whichever browser it was set up in.
  • Anyone allowed to change a given tool also gets a "save as the starting point for everyone" option. It sets the layout newcomers see on a table they have never arranged themselves, and it never overwrites an arrangement somebody has already saved.
  • A layout still being dragged into shape, not yet saved, is left alone, so reloading the page mid-edit no longer throws the work away. Demo logins can look at everything as usual, but can't save either kind of layout.

The admin tools learn Danish

  • The public site has been bilingual from day one, but the admin tools only ever spoke English, whatever language I was browsing in. Every admin tool can now be shown in Danish as well, and a small switch in each tool's top bar changes that tool's language on the spot, independently of the language the public site happens to be showing.

A few bugs found along the way

  • The small myip page, which shows your browser's own current IP address, had been quietly broken for a while, failing on every single visit; fixed. So were two admin tools' page footers and one tool's second row of page navigation, which had stayed in English after everything around them switched to Danish.

Week 34 · August 2026

A live search for the visitor-traffic list

  • The recent-visits search box now filters the whole list as you type, across every page of results at once rather than just the page on screen, and the page-number controls follow along, reflecting how many results actually match instead of the unfiltered total.

Hunting down a freeze in the admin tools

  • Typing fast or pasting into the new search box could, on rare occasions, freeze the entire tool solid, with no way out short of closing the tab. The hunt went through a couple of dead ends, including a suspected slowdown from large result sets that turned out to be innocent, before reaching the real culprit: shared code behind every admin tool's tables that, in one narrow situation, could get stuck endlessly reshuffling a table's columns in the background. Fixed, and stress-tested afterwards without anything else surfacing.
  • Two safety margins went in on top, in case a similar freeze ever has a different cause: a hard time limit on the database lookups the search triggers, and a cap on how many expanded result panels render at once.

Dates that sort by time, not by text

  • Clicking a "Time" column heading, or anything like it, in any admin table now sorts by the moment something actually happened rather than by the text on screen. Once dates were shown in a locale-friendly day-month-year format, sorting them as text could scramble the order by day of month, or by month alone. The fix covers every table that shows a point in time, including a couple that build their own tables in the browser rather than on the server.

A real CV editor, and PDFs at the click of a button

  • Work experience and education used to be edited by hand as raw text strings. They now have a proper structured editor, where entries are added, edited and reordered with real date pickers.
  • The four downloadable CV PDFs, English and Danish, long and short, are now generated from that same data with one click. Before, they were separate Word documents maintained by hand, always at risk of drifting out of sync with the site.
  • The short CV still lists every role, but older ones are now trimmed automatically to a single line: roughly the last decade keeps full detail, and everything earlier appears as a short summary instead of disappearing.

Skills on the CV, from the same source as the homepage

  • The CV, both on the page and in all four PDFs, now has a Skills section drawn from exactly the same list the homepage shows, so it only ever needs editing in one place. The short CV keeps it brief with a bulleted list of skill names, while the long CV groups every skill by category, each with a short description of what it covers.

Admin tools that keep their own dark mode

  • The admin tools could also flip from dark to light mode partway through work if an ordinary page of the site happened to be open in another browser tab. The two now keep their settings apart, so an admin tool stays in the mode it was opened in until someone changes it on purpose.

The same live search, in the traffic-monitoring tool

  • Earlier the same week the analytics list got a real live search; now the visit list in the visitor-traffic monitoring tool has one too. It searches every page of results at once instead of just hiding rows on the page in front of you, the page-number controls follow the search, and a small clear button empties it in one click.

A humans.txt to go with the robots.txt

  • The site has always had a robots.txt for the machines. Now there is a /humans.txt as well, a small, long-standing web convention for naming the people behind a site. It is edited straight from the site settings tool, next to the other small site-wide text files, so keeping it current never means editing a file by hand.

The case of the white-on-white Save button

  • In light mode, every Save button in the site settings tool appeared as a blank white pill. The label and icon were there all along, just white on white. They now show up properly in both light and dark mode.

Week 33 · August 2026

Summary cards that share the row on phones

  • The small at-a-glance cards in a few admin tools, showing page views, visitor counts and similar numbers, used to stack one per row on every phone. On wider phone screens they now sit two side by side.

Seeing exactly why a visit got the label it did

  • The visitor-traffic monitoring tool can now take a chosen visit and walk it step by step through every classification rule, in the order the rules are actually checked, showing which matched and which didn't, and why, and which one finally decided the outcome.
  • Next to it sits a "test the rules" tool, where I can build a made-up visit by hand, with browser, address, page, how long ago it happened and so on, and see how it would be classified, without it being a real visit or touching real data. Both tools only look: running either of them, as many times as you like, never relabels or deletes a real visit.

Page navigation that behaves the same everywhere

  • The visitor-traffic monitoring tool's tables had a plain prev/next pair that stood out from everything else. They now use the same numbered row of pages as the rest of the site, with first, previous, next and last. Every admin tool with a long, paged list now also shows those controls both above and below it, so changing page never requires scrolling back first.

A visual refresh for the admin tables

  • Every data table in the admin tools now has a clean, boxed-grid look, with outlined headings and cells, nested tables included. Hovering over a row highlights it in a distinct color, since the old gray was too close to the zebra striping to notice, and the little arrow for expanding a row became a proper round button, with a soft glow on hover and a solid highlight while the row is open.
  • Two layout bugs, one the mirror image of the other, were fixed in the same pass. Removing a column could leave an odd strip of empty space on the right instead of letting the remaining columns spread out, and once that was fixed, a narrow icon-only column could stretch far wider than it needed to, leaving an oddly empty box.

A visit logged in Denmark, shown as Switzerland

  • The clue was a visit clearly logged from Denmark that the admin tables showed as Switzerland. The cause: a single browsing visit that switched networks partway through, with a VPN toggled on or off mid-visit for example, could end up pairing a real address from one moment with a city or country from a completely different one. Every visit now shows a location that actually belongs together.

A follow-up for the monitoring-service cleanup rule

  • A one-off "recheck everything" action in the visitor-traffic monitoring tool could bury the housekeeping rule that clears out old monitoring-service records behind a much larger backlog of unrelated records, delaying it by hours. Rules with a real deadline, like this one, are now always checked ahead of ones that are merely due for a routine, non-urgent recheck.

Location and address, now from the same moment

  • A related mismatch, seen from another angle: a visit can occasionally use more than one network address over its lifetime, like a phone switching between wifi and mobile data. In that case the admin analytics tools could show a location that didn't match the address displayed beside it, because the two were being worked out separately. They are now worked out together, so a location and its address always come from the same moment.

A security tidy-up behind the scenes

  • One admin tool, the one that logs attempted attacks on the site, showed attackers' raw IP addresses to demo and preview logins, unlike every other tool that handles that kind of data. It now masks them like the rest.
  • A couple of tools that track visitor activity now consistently show a bit more about where a visit comes from network-wise, and can mark rows that turn out to be my own visits with a small "this was me" badge, as other tools already did.
  • Then the cleanup rule again. It was meant to clear old monitoring-service records after a few minutes, but only ever did so when the rules were re-run by hand; now it runs in the background, as intended. Even then nothing was cleared, and the real cause was subtler: a rule waiting for a record to reach the right age could be permanently overruled by another rule that fired sooner, so it never got a second chance once the record was old enough. Records the rule engine defers on are now revisited once they are ready, instead of keeping whatever verdict landed first.

The dark mode that wouldn't stay dark

  • Every so often, with no obvious cause or pattern, the color scheme in the admin tools would switch from dark to light in the middle of a session. Tracked down and fixed.

Three rounds of polish for the rule tester's input fields

  • The input fields in the new "test the rules" tool took three attempts to get right. First they barely had a visible outline or background; once that was fixed they sat far too close together; and finally they came out slightly too wide for their own row on wider screens. All three are sorted, and the fields now look clean and consistent at any window size.

A full mobile pass, and the two real bugs it caught

  • Going through the whole site on a phone-sized screen turned up two genuine bugs in the admin tools' expandable tables. Tapping a visit row to open its details showed nothing at all on a phone: a mobile style rule meant to hide a table's own column headings was, by accident, also hiding the entire expanded panel whenever that panel contained a smaller table of its own.
  • The second was subtler: a sliver of invisible content stuck out past the edge of the screen and made the whole page scroll slightly sideways on some admin tools. Both were fixed and re-checked page by page on a phone-sized screen, across every public page and every admin tool.

Corners and colors brought back in line

  • A handful of rounded corners and a couple of button colors had quietly drifted from the site's own color system and were brought back in line, among them the image in the "prove you're human" check, which had carried the wrong corner rounding for a while.

Week 32 · August 2026

The business card's QR code returns, and the monitoring tool gets sharper

  • A recent change had broken the QR code on the digital business card: a script wasn't loading correctly under the page's clean web address, so the code was never drawn. Fixed.
  • The visitor-traffic monitoring tool can now base a rule on how a visit has already been classified, which makes it possible to refine an existing label with one extra signal on top of everything else it checks. Its minimum-age setting also accepts whatever unit makes sense, from minutes, hours and days to weeks, months or years, instead of making me convert everything to days in my head.
  • A rule meant to clear out old records from an external uptime-checking service after a couple of days turned out never to have taken effect at all, and those records had been piling up unnoticed. It works now.
  • An admin-table bug turned out to have a deeper version: after certain interactions a column's heading and its data could drift out of sync, leaving information under the wrong heading. Fixed, and every data table across the admin tools was checked for the same problem.

A guided tour of the backend, new toys in the Lab, and a better-read assistant

  • A new page gives a plain-language tour of every admin tool behind the scenes, what each one does and why, with a one-click "try it yourself" demo login. It is linked from the Lab section.
  • The Lab's hand-built components gained a before/after slider, a confetti burst, swipe-to-dismiss, copy-to-clipboard and a live relative-time display. The "magnetic hover" button is now hidden on phones, since without a mouse cursor there is nothing for it to be drawn to.
  • The homepage testimonial can now be shown or hidden from Site Settings. The AI assistant on the homepage, meanwhile, knows a good deal more about me: my full work history, education, past projects in more detail, hobbies and recent site updates. Rather than relying only on a fixed, limited summary, it can now look up deeper site content, this changelog included, when a question calls for it.

My email address, no longer in plain sight anywhere

  • The contact links already kept my email address away from harvesting bots, but in a couple of spots the address still sat in the surrounding text, written out in full. Now any sensitive piece of text, for the moment just my email address, can be entered as a short placeholder, a kind of nickname, wherever it's needed.
  • The real value is stored and edited in exactly one place behind the scenes and swapped in automatically wherever the placeholder appears, so the trick that already protected the links now covers the text around them as well.

The admin tools grow more capable, more consistent and more secure

  • Data tables in every admin tool now support sorting, resizing, reordering and hiding columns, with the preferences remembered; until now only some of them did. A handful of small display glitches went away with it: a couple of misaligned columns, some uneven spacing, and a horizontal scrollbar that had no business being there.
  • Underneath, several hundred duplicated lines across the admin tools were consolidated into shared code, which makes future changes safer and less error-prone. The login page gained an extra layer of protection against cross-site request forgery, and a thorough security and reliability review of the whole site found a handful of small issues, nothing serious, all fixed.

Two small things for the search engines

  • The sitemap's last-modified dates for the homepage and CV page had fallen slightly behind and were brought up to date. The downloadable CV files are now also kept out of search results: the same content already exists as proper, readable text on the CV page, and search engines shouldn't have to guess which version to show.

The CV becomes fully editable, this time for real

  • Last week's change made the whole CV page editable through the content-editing tool, or so it seemed. The feature itself worked, but the tool's internal list of editable text hadn't been refreshed since the new CV fields were added, so most of the job history, education, languages and driving licence entries were quietly missing from it. Refreshing that list closed the gap: every part of the CV, all 22 job entries and their bullet points included, can now be edited without a code change.

A new portrait, and page headings that finally say something

  • The portrait in the About section was replaced with a new photo. A less visible change went into the page headings: every page's main heading had been an unlabeled logo image, which looked exactly right but left the heading effectively empty to search engines, screen readers and anything else that couldn't see it. It now carries real, readable text.
  • Plus more small polish across the admin tools: consistent colors in light and dark mode, tidier code, and a few more small display and reliability fixes.

Week 31 · July 2026

Traffic Analyzer: working out who — or what — is really visiting

  • A raw count of page views says little about who is behind them. Traffic Analyzer, a new admin tool, works it out for every page view: a real person, a search engine checking the site for Google, an AI assistant, or an automated script. It also spots and flags visits that look like hacking attempts or hostile scanning tools, so they stand out instead of blending into normal traffic.
  • It is built to keep learning. As new kinds of visitors show up, it recognizes the pattern and starts sorting them correctly; it can go back and re-sort older visits whenever its rules improve; and a rule can now wait until a visit is a certain number of days old before it acts, for anything that shouldn't happen right away.
  • The admin tables around it got better too. Every one can be sorted by clicking a column heading and resized by dragging a column edge, with a one-click button to restore the original order and widths, and every other row now carries a faint tint that makes long lists noticeably easier to read. Visit times in the Analytics tool now appear in the viewer's own local time and date format rather than the server's.
  • Two smaller fixes belong to the same batch. Two of the admin tools had been treated as ordinary pages by the "are you human?" check instead of being recognized as admin tools, a gap now closed. Separately, every public page gained canonical tags, telling search engines which version of a page is the real one and clearing up some duplicate-listing confusion in Google's index.

Site colors, editable live, with a safety net

  • The site's main colors, for both the dark and the light look, can now be changed from a new "Site colors" section in Site Settings, and the change shows up on the live site immediately, no redeploy needed. A guard is built in: the tool refuses to save a color change that would make text too hard to read against its background, and a single click puts every color back the way it started.

A phone menu with real structure, and control over what shows where

  • On phones the menu used to sit flush against the edge. It now shows a real hierarchy, with top menus, their items and the descriptions beneath them indented to match, and a long title or description that wraps onto a second line stays aligned instead of drifting back to the edge.
  • A menu, or a single item in one, can now be set to show on desktop only, on phones only, or on both; before, everything showed everywhere. Two bugs were fixed alongside it: an item set to show only a description on phones still showed its desktop title, and switching a "different on phone" option off and on again in the menu tool could wipe out text already typed in.
  • Email addresses are no longer written out in plain text in the page source; the visitor's browser assembles them instead, which makes them harder for spam bots to harvest. That change came with a bug of its own: tapping "Email" in the phone menu didn't open a mail app. That is fixed too. The front-page banner picture was also updated.

A proper "closed for maintenance" page, and icons to spare

  • The site can now be closed for maintenance properly. A dedicated page is shown to every visitor except staff, a switch in Site Settings turns it on and off, and it has its own admin tool for writing and updating the message visitors see while it's up.
  • The menu tool's icon picker went from a small handful to well over a hundred icons, a proper business-card icon among them, and hovering over any of them shows a plain-language name. One bug was fixed on the way: a menu item's phone-only description could look saved when it quietly wasn't.

The header menus get a tool of their own

  • Until now the header menus could only be edited as they already were. A new admin tool manages them properly: whole menus and the items inside them can be added, removed and reordered, an item can carry different, shorter text on phones than on desktop, with a live phone-sized preview inside the tool, and a description is optional, since a short title on its own is often enough.
  • The menus themselves got tidier. The CV link moved into the header menu like everything else instead of standing apart, the phone version always puts a title and its description on separate lines, an empty menu no longer shows visitors a broken-looking dropdown, and the language switch in the top corner was restyled to match the other header menus.
  • Two smaller things for the people working in the tools: every admin tool now has a clear "View site" link back to the actual pages, and a handful of checkboxes in the menu tool, which had worked all along, just invisibly, can now be seen.

A small AI assistant moves into the homepage

  • A chat widget now sits in the bottom corner of the homepage. Ask it about my background, skills or experience and it answers directly, so nobody has to dig through the page. It tries hard not to be in the way: it minimizes itself while you scroll, only offers help after you have paused for a few seconds, and once closed it leaves you alone for the rest of the visit. It replies in whatever language you write to it in, starting from the site's current language.
  • The visitor-traffic tool behind the scenes got smarter the same week. It can now combine several signals at once instead of just one, to recognize things like fake search-engine bots or coordinated scanning attempts, and its detection rules have become much easier to review and adjust.
  • The entire CV page, every job, education entry, language and driving licence, can now be edited through the same content-editing tool the rest of the site already used, rather than through a code change. Even the scrollbars changed: across the whole site they now wear the site's own colors instead of the browser's plain gray, in light and dark mode alike.

Making the site findable, and the CV readable to search engines

  • Searching for my name had a problem: the site got lost behind unrelated people who happen to share it. Page titles now mention where I'm based, Favrskov, Denmark, to help tell us apart. The CV page, meanwhile, used to show only a PDF, which search engines mostly can't read; it now carries a full text version of my career history right on the page.
  • The rest was groundwork. Structured data now describes who the site belongs to, in a standard format search engines and AI assistants understand; every bilingual page tells search engines about both its Danish and English versions instead of leaving them to guess; the sitemap was refreshed with accurate information; and the homepage banner photo, which had been needlessly large, now loads noticeably faster, especially on phones.

A light/dark switch in every admin tool, and a round of homepage fixes

  • Two admin tools, Analytics and the Security Log, had always been dark. Now every admin tool has the light/dark switch.
  • The homepage got a round of fixes. "Selected Experience" now puts the year, employer and job title beside each description instead of above it, which makes it much quicker to scan. The "Get in touch" button had been there and working, but nearly invisible until hovered; fixed. The "Show more" and "Show less" buttons under each skills group are easier to hit with a finger, and a link on the banner photo that had no name for screen-reader users now has one.
  • Pinch-to-zoom works on phones again, now that a setting that had been quietly blocking it is gone. A handful of old CV files, superseded by newer versions, were cleared out as well.

Traffic Analyzer learns to tidy up after itself

  • The rule that deletes visitor records after two years, as the privacy policy promises, now has a sibling: a second rule that does the same for Traffic Analyzer's own activity history, so that history no longer grows forever. To make that possible, rules can now target either "Visits" or "Activity log entries", where before they only ever looked at visitor records.
  • Two small visibility bugs in the rule editor were fixed: an "Enabled" checkbox that worked but couldn't actually be seen, and a "Delete rule" button that appeared even while adding a brand-new rule, when there was nothing to delete yet.
  • Finally, just for fun, a measurement: the site is now about 27,500 lines of hand-written code across 90 files. No framework, no build step, no page builder, just plain PHP, JavaScript and CSS, built and maintained one feature at a time.

Week 30 · July 2026

Sharper icons, and a truer picture of who's online

  • Every page now has a proper, crisp icon in the browser tab and on a phone's home screen, replacing a plain, blurry placeholder.
  • The admin tool that shows who is on the site right now also shows real browser, device, location and activity details for logged-in staff, not only for ordinary visitors. Its practice version lets sample visitors arrive at a more natural pace, mixed in with real ones, so it feels closer to the real thing.

Demo accounts, and an open invitation to look around

  • A new kind of account arrived: the demo account, which can click through every admin tool without being able to change or break anything real. With that in place, the admin side could be opened up to everyone. Any visitor can now try the admin tools with a single click, no account or signup needed, and staff can drag and drop to decide which admin tools come first in their own menu.
  • The site's top menu was reorganized into two clear groups instead of one long row of links, and a glitch that could close the menu before a link could be clicked was fixed. The whole site went through a security review, which turned up one real problem, since fixed. A one-click backup was set up as well, saving a full copy of the site and all its data in one go.

A public showcase, and drag-and-drop that works without a mouse

  • Some of the polished, interactive building blocks used around the site now have a public page of their own. Dragging items to reorder them became much smoother, and fully usable with just a keyboard, and the same feel was carried over to the admin tool for managing the listed skills.
  • Behind the scenes, the tools that track visitors and staff logins now show clearly when a staff member is browsing one of the admin tools, and which one. A small sound glitch went away too: a new notification sound can no longer overlap and clash with one that is already playing.

The admin tools start to look like one system

  • Every admin tool was redesigned around one shared layout, with the same sidebar and top bar, so they look and feel like parts of one connected system rather than separate pages. They also stopped living in a small fixed box: each tool now uses the full screen, laid out sensibly for what it shows. Testing the redesign on phones and tablets turned up a handful of display issues, all of them fixed.
  • The login-security log became more talkative, recording browser, device and rough location for each login attempt and showing them right in the table rather than behind a click. Both full-length CV documents, English and Danish, were also refreshed with updated content.

One login for everything, and control over who sees what

  • The admin side had grown one tool at a time and collected several separate logins along the way. They were replaced by a single login that works across every admin tool, with fine-grained control over exactly who can see or change what. A new admin tool handles the other half of the job: creating staff accounts and deciding what each one may access.
  • The one remaining tool that didn't ask for a login at all now does, which closed a gap, and the new login system was reviewed for security issues; the one problem the review found was fixed.
  • The CV now comes in a short and a long version in both languages, so visitors can pick whichever suits them, and the homepage and CV page say plainly that I'm based in Favrskov, Denmark.

Week 29 · July 2026

The Skills section gets an editor of its own

  • Until now, changing the Skills section on the homepage meant changing code. It now has a password-protected admin tool instead. Skills and their categories can be dragged into any order and switched on or off for the homepage one by one, categories can be collapsed and edited with a double-click, and the tool refuses invalid entries so the underlying data stays clean.
  • On the homepage itself, each category now shows just a handful of skills and a "Show more" link, which keeps the page from feeling overwhelming. It was also one of the larger single-day additions to the project so far.

Version history, and checks that run on every change

  • By now the project had passed a size milestone worth noting. At the same time, all of the site's code came under version control, tracked and backed up with its full history so no work can ever be permanently lost, and automatic checks now run every time something changes, catching mistakes before they can reach the live site.

A business card for your phone, and a light theme

  • A digital business card arrived, styled like the rest of the site, that visitors can save straight into their phone's contacts. It is linked from the homepage's contact section, and the way it gets shared was cleaned up.
  • The other big arrival of the week: the whole site can now switch between a dark and a light look. Getting it right everywhere took some follow-up. A display issue was fixed so the light theme reads cleanly on every public page, and the mobile menu was rebuilt to follow the light/dark choice as well, losing a broken menu icon along the way.

Giving credit, and getting by on one cookie

  • The site stands on a design template, outside tools and other people's photographs, and they now have a page of their own crediting them. Meanwhile the site slimmed down from two cookies to one, the more privacy-friendly arrangement. The privacy policy was updated to match, and the copyright notice now reads the same on every page.

Clean URLs, a word to employers, and a friendlier error page

  • Every web address on the site lost its technical file extension, and the homepage gained a section written for potential employers, about what I can offer. Getting lost, or hitting something that has gone wrong, now lands visitors on a custom, friendly error page, illustrated with animal photos, which go a long way towards softening a 404.
  • Under the surface, the site now publishes the standard files that search engines and security researchers expect to find on a well-run site, and links to it carry preview information, so they look right when shared on social media or in chat apps.

Visitor statistics, with privacy designed in from the start

  • The site got a private dashboard of its own: country, device, browser and more for every visit. Data like that comes with obligations, so a GDPR-compliant privacy policy went up alongside it, including automatic deletion of visitor data once it is two years old. The cookie that keeps visitor sessions working was hardened at the same time.

Week 28 · July 2026

Security, from the very first week

  • In its very first week the site got a "prove you're human" check, there to stop automated bots from overloading it or patiently guessing at admin passwords. A weakness that could have let someone fake their location to slip past that check was found and closed, and the site picked up the set of extra security settings recommended for any modern website.

The site goes live

  • This is where it starts: a personal portfolio site, in Danish and English from day one. It reads each visitor's browser settings and answers in the right language without being asked, and the CV is there from the beginning too, readable online or downloadable as a PDF in both languages.