Just a short note to say Tuskfish 2 is in the works. It's going to be a partial re-write of the back end, but there will be minimal changes on the front end or from a user experience point of view. The database schema will also remain unchanged to allow seamless upgrade. Tuskfish 2 will be designed as a strict MVC architecture to improved separation of concerns, rather than the loose MVC it currently has. Components will be assembled through composition and inheritance will be fully dispensed with.

I'm very happy about Github's decision to grant unlimited free private repositories. It's not that I objected to Github charging people for the services they provide, but to qualify for free access you had to make all of your repositories open source and public. The problem with that was that the world is actually better off with some repositories remaining private. Do you really want access to the scratch pad repository I'm using to learn a new language? I think not.

A maintenance release. Further internal refactoring to improve the structure and extensibility, and updates to third party libraries. An XSS vulnerability present in Bootstrap 4.0 has been patched through an update to Bootstrap V4.1.3.


  • Add canonical URL link.
  • Clean up base URL / links on index page (remove unnecessary 'index.php').
  • Use title for image alt tag if no caption is set.
  • Refactor of methods towards smaller logical components and improved compliance with the single responsibility principle.
  • Removal of magic method accessors and mutators in favour of manual getters and setters.
  • Improved error messages to increase clarity.
  • Extended bad login count and retry delay to include 2-factor authentication.
  • Fixes to pagination control.
  • Implement admin side content object controller to clean up the admin script.
  • Fix https://tuskfish.biz conversions in content module.
  • Manually set cache limiter in some pages to avoid 'document expired' errors when using the browser back button.
  • Bugfix for taglinks being deleted when a tag is edited.
  • Update to FontAwesome 5.5.
  • Update Bootstrap to V4.1.3 and remove unnecessary files.
  • Remove popper.js library (now bundled in Bootstrap).
  • Update TinyMCE to V4.8.5.

Sick of low quality clickbait articles about "the best" and " most popular" programming languages? Everyone seems to play this game, even otherwise reputable sites. I suppose they do it because "what language should I learn" is a question that every aspiring programmer has to ask. There's a lot of traffic in it.

Nearly all of these articles are bad, because they are based on irrelevant metrics such as trends in keyword searches, recent Github activity, average salaries or similar. For example, if a lot of people search for "Javascript" clickbait articles often extrapolate this into "popular" and/or "the best", and slap it into a "top 10" list of languages you should learn!

Another round of refactoring has been conducted to improve the structure of Tuskfish and to make it easier to read and to test. No new functionality has been added.


  • The larger methods have been broken down into smaller logical components, to make the code more readable and easier to test.
  • Implemented an admin controller class to clean up the admin controller script and allow reuse for common operations.
  • Extended bad login count and retry delay to the two-factor Yubikey version of the login script.
  • Converted rights to a trait to allow for reuse across system.
  • Error messages have been improved to give a more precise indication of what went wrong.

I have one more refactor of Tuskfish planned. The goal is to break down some of the more monolithic methods into smaller logical components that are easier to test. This will not involve adding any new functionality as the core system now does what I want it to do. From here on changes will largely focus on refining the structure, simplifying and clarifying the code to make the project more robust and easier to work with.

A minor refactoring and bugfix release with improvements to strengthen password hashing.


  • Switched to more appropriate password hashing algorithm (bcrypt) and the native hash_password() function.
  • Added 'expiresOn' and 'lastUpdated' to the content object table as hooks for future functionality.
  • Added 'module' as an additional column in the taglinks table to allow taglinks to be filtered by module.
  • Locked user-side gallery to image type objects, rather than returning all images from all object types.
  • Adopted usage of null coalescing operator (PHP 7) to shorten relevant ternary expressions.
  • Renamed TfAngryTree to Tftree.
  • Removed TfSecurityUtility (consolidated into TfUtils).
  • Removed TfCriteriaItemFactory (items are now handled as part of TfCriteriaFactory).
  • Added missing TfBlockHandler.
  • Fixed bug related to search operator in TfSearchContent.
  • Fixed offset bug recently introduced to pagination control.

I was playing around with different password hashing algorithms and came across this password hash cost calculator. It's a simple script you can use to measure how long it takes to calculate a given hash on a particular machine. Since web hosting accounts often come with limited resources compared to your local dev box, it's useful for tuning the cost of your hashing algorithm (how many times you iterate the calculation) to keep it at a sane level.

Tuskfish has been substantially refactored to improve its internal structure, and to make it easier to extend. Please note that due to changes in the database schema version 1.1 is not compatible with previous versions.


  • Static methods have been largely eliminated in favour of dependency injection.
  • Some reassignment of methods between classes, to improve compliance with the single responsibility principle.
  • Many methods and variables renamed to better indicate function and make code more self-describing.
  • Variables, properties and database columns have been converted to camel case for consistency.
  • Class and method documentation improved.
  • Restored manual type checking in methods to reinforce the strict types directive.
  • Modularised the structure to facilitate development of discrete expansions.
  • Reverted to Bootstrap-fileinput V4.4.7 due to issues with FontAwesome.

Tuskfish has had a substantial internal restructure. Static methods have been removed in favour of dependency injection, and modularity has been added (beginning of course with the content management module). The documentation needs extensive revision, when it's all ready the result will be released as Tuskfish V1.1.