56,966 blogs · [ { "id": "01a08c56-173f-7327-906f-26e634d75ab0", "title": "AI-Powered Photo Booth", "url": "https://timmyomahony.com/work/ai-powered-photo-booth/", "published_at": "2026-07-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63561bcf8", "title": "Heineken Loyalty Platform", "url": "https://timmyomahony.com/work/heineken-barstar-loyalty-platform/", "published_at": "2026-07-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e635789a01", "title": "Power Meter Game", "url": "https://timmyomahony.com/work/power-meter-game/", "published_at": "2026-07-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6359e5cc5", "title": "AI-Powered Golfing Photo Wall", "url": "https://timmyomahony.com/work/ai-golfing-portrait-photo-booth/", "published_at": "2026-06-15T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6364e0626", "title": "Real-time People Counter", "url": "https://timmyomahony.com/work/real-time-people-counter/", "published_at": "2026-04-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6366a6a8c", "title": "Selfie Cam", "url": "https://timmyomahony.com/work/selfie-cam/", "published_at": "2026-04-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e636cd7ec7", "title": "Event Landing Page", "url": "https://timmyomahony.com/work/event-landing-page/", "published_at": "2026-03-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6372adf10", "title": "Photo Wall for Corporate Event", "url": "https://timmyomahony.com/work/photo-wall-for-corporate-event/", "published_at": "2026-03-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e637439987", "title": "AI-Powered Coffee Barista", "url": "https://timmyomahony.com/work/ai-powered-coffee-barista/", "published_at": "2025-09-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e637ca038e", "title": "Head-to-Head Arcade Button Quiz", "url": "https://timmyomahony.com/work/head-to-head-arcade-button-quiz/", "published_at": "2025-07-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e638256d72", "title": "Mini-Marathon Fan Cam", "url": "https://timmyomahony.com/work/fan-cam-mini-marathon/", "published_at": "2025-06-15T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e638d6bb5b", "title": "Useful utility views for every Django project", "url": "https://timmyomahony.com/blog/useful-utility-views-for-every-django-project/", "published_at": "2025-05-02T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6395f21ae", "title": "Adding an intermediate date range to Django Import/Export", "url": "https://timmyomahony.com/blog/adding-intermediate-date-range-to-django-import-export/", "published_at": "2025-05-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e639c29c0f", "title": "Private Git Submodules with Vercel", "url": "https://timmyomahony.com/blog/private-git-submodule-with-vercel/", "published_at": "2025-04-15T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63a0ccac8", "title": "Live Audience Pub Quiz", "url": "https://timmyomahony.com/work/live-audience-pub-quiz/", "published_at": "2025-04-14T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63a0e6382", "title": "Educational Classroom Games", "url": "https://timmyomahony.com/work/educational-classroom-games/", "published_at": "2025-04-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63ad4cbe0", "title": "2-Player Button Quiz", "url": "https://timmyomahony.com/work/2-player-button-quiz-lidl/", "published_at": "2025-03-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63b1db0a3", "title": "Real-time Team Quiz Game", "url": "https://timmyomahony.com/work/real-time-team-quiz-game/", "published_at": "2025-02-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63b4b21e4", "title": "Fetch", "url": "https://timmyomahony.com/work/fetch/", "published_at": "2025-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63c104adb", "title": "Offline Audio Player Interface", "url": "https://timmyomahony.com/work/offline-audio-player-interface/", "published_at": "2025-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63cf978dc", "title": "TACM", "url": "https://timmyomahony.com/work/tacm/", "published_at": "2025-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63cfd1b41", "title": "JDS Labs Core", "url": "https://timmyomahony.com/work/jds-labs-core/", "published_at": "2024-12-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63daf5252", "title": "Automated Coffee Coupon System", "url": "https://timmyomahony.com/work/automated-coffee-coupon-system/", "published_at": "2024-11-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63e8d25d3", "title": "Timed Multi-Choice Quiz", "url": "https://timmyomahony.com/work/timed-multi-choice-quiz/", "published_at": "2024-11-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63e9f3a00", "title": "Interactive Group Gameshow", "url": "https://timmyomahony.com/work/interactive-group-game-show/", "published_at": "2024-06-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63f450b41", "title": "Spin the Wheel Giveaway Game", "url": "https://timmyomahony.com/work/spin-the-wheel-giveaway-game/", "published_at": "2024-05-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63f89cd1a", "title": "Favourite Product Live Poll", "url": "https://timmyomahony.com/work/favourite-product-live-poll/", "published_at": "2024-03-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e63fb4252e", "title": "Paginating Blog Posts In Next.js (App Directory)", "url": "https://timmyomahony.com/blog/paginating-blog-posts-in-nextjs-app-directory/", "published_at": "2023-09-28T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6405637d0", "title": "Demystifying Digital Ocean's App Platform for Django", "url": "https://timmyomahony.com/blog/demystifying-digital-oceans-app-platform-for-django/", "published_at": "2023-09-13T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e640a7fe6c", "title": "Understanding Django's Host Header Error Emails", "url": "https://timmyomahony.com/blog/understanding-django-host-header-error-emails/", "published_at": "2023-09-13T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6410bc279", "title": "Backing Up WhatsApp Media From iCloud", "url": "https://timmyomahony.com/blog/backing-up-whatsapp-media-from-icloud/", "published_at": "2023-09-12T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64167a524", "title": "Kiosk Mode on iPads with PWAs and Guided Access Mode", "url": "https://timmyomahony.com/blog/kiosk-mode-on-ipads-with-pwa/", "published_at": "2023-09-12T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6425cb7ed", "title": "Live Festival Artwork Creator", "url": "https://timmyomahony.com/work/live-festival-artwork-creator/", "published_at": "2023-05-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e642c2f543", "title": "iPad Recruitment Quiz", "url": "https://timmyomahony.com/work/ipad-recruitment-quiz/", "published_at": "2023-03-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6436832d9", "title": "Cycling Challenge", "url": "https://timmyomahony.com/work/cycling-challenge/", "published_at": "2022-10-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e644678b2f", "title": "Charity Donations Live Poll", "url": "https://timmyomahony.com/work/charity-donations-live-poll/", "published_at": "2022-09-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6452efc03", "title": "Live Stream Bingo Game", "url": "https://timmyomahony.com/work/live-stream-bingo-game/", "published_at": "2022-03-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e645e57c76", "title": "Laya Healthcare Microsite", "url": "https://timmyomahony.com/work/laya-healthcare/", "published_at": "2022-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e646dc59f1", "title": "Educational Spin-the-Wheel Game", "url": "https://timmyomahony.com/work/educational-spin-the-wheel-game/", "published_at": "2021-04-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6477095ee", "title": "Substack's UI and 1Password just cost me $2,023", "url": "https://timmyomahony.com/blog/substacks-ui-and-1password-just-cost-me-2023-dollars/", "published_at": "2021-03-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e647d5b86c", "title": "Vetzone", "url": "https://timmyomahony.com/work/vetzone/", "published_at": "2021-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6486fcd53", "title": "What Saturday on Hacker News Looks Like", "url": "https://timmyomahony.com/blog/what-saturday-on-hacker-news-looks-like/", "published_at": "2020-10-25T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e648acc47c", "title": "Home Made Standing Desk Raspberry Pi Controller", "url": "https://timmyomahony.com/blog/home-made-standing-desk-raspberry-pi-controller/", "published_at": "2020-10-11T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6498e3390", "title": "Django Pagedown Image Uploads", "url": "https://timmyomahony.com/blog/django-pagedown-image-uploads/", "published_at": "2020-08-06T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64a7f1781", "title": "Craft CMS Plugins", "url": "https://timmyomahony.com/work/craft-cms-plugins/", "published_at": "2020-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64b563150", "title": "Django and CircleCI 2.0", "url": "https://timmyomahony.com/blog/django-and-circleci-2/", "published_at": "2019-05-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64b6e1773", "title": "Ember Ajax and Ember Simple Auth", "url": "https://timmyomahony.com/blog/ember-ajax-and-ember-simple-auth/", "published_at": "2018-04-20T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64c2185b1", "title": "Sending Ember actions down to components", "url": "https://timmyomahony.com/blog/sending-ember-actions-down-to-components/", "published_at": "2018-04-06T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64ccdaa4e", "title": "Connected Insight", "url": "https://timmyomahony.com/work/connected-insight/", "published_at": "2017-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64d6f34d1", "title": "FindHello", "url": "https://timmyomahony.com/work/findhello/", "published_at": "2017-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64e2c1272", "title": "JDS Labs", "url": "https://timmyomahony.com/work/jds-labs/", "published_at": "2017-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e64f2a4ded", "title": "'Route variable' pattern with Ember", "url": "https://timmyomahony.com/blog/route-variable-pattern-ember-routes/", "published_at": "2016-07-13T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65002f91b", "title": "A simple pagination component with Ember", "url": "https://timmyomahony.com/blog/simple-pagination-component-ember/", "published_at": "2016-06-20T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6506f5d47", "title": "Making a draggable Ember component", "url": "https://timmyomahony.com/blog/making-draggable-ember-component/", "published_at": "2016-06-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e651309d54", "title": "Making USB Push Buttons", "url": "https://timmyomahony.com/blog/making-usb-push-buttons/", "published_at": "2016-05-11T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e651d29b5d", "title": "Twitter controlled power switches with a Raspberry Pis", "url": "https://timmyomahony.com/blog/twitter-controlled-power-switches-raspberry-pis/", "published_at": "2016-05-11T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e651e05af3", "title": "Adding labels to Ember Leaflet markers", "url": "https://timmyomahony.com/blog/adding-labels-ember-leaflet-markers/", "published_at": "2016-03-25T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6529a4ee4", "title": "Django access mixin for active users only", "url": "https://timmyomahony.com/blog/django-access-permission-mixin-active-users-only/", "published_at": "2016-01-12T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e652c1ba64", "title": "Feral", "url": "https://timmyomahony.com/work/feral/", "published_at": "2016-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65308e8d2", "title": "Pubs With A Fire", "url": "https://timmyomahony.com/work/pubs-with-a-fire/", "published_at": "2015-01-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e653c64643", "title": "Updating your cert_fingerprint for offlineimap with Fastmail.fm", "url": "https://timmyomahony.com/blog/updating-your-cert-fingerprint-for-fastmail-and-offlineimap/", "published_at": "2014-12-30T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e654b26a71", "title": "The Missing Manager for Django Models with GFK Relationships", "url": "https://timmyomahony.com/blog/the-missing-gfk-model-manager-for-django-models/", "published_at": "2014-10-14T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e655a42702", "title": "Importing Big Databases with MAMP & phpMyAdmin on OSX", "url": "https://timmyomahony.com/blog/mamp-phpmyadmin-and-big-database-imports-errors-or-timeouts/", "published_at": "2014-06-25T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6563ca350", "title": "Uploading and validating an image from an URL with Django", "url": "https://timmyomahony.com/blog/upload-and-validate-image-from-url-in-django/", "published_at": "2014-06-20T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e657317034", "title": "Understanding, setting up, accessing and serving media files and static files in Django", "url": "https://timmyomahony.com/blog/static-vs-media-and-root-vs-path-in-django/", "published_at": "2014-06-11T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6576abbc7", "title": "An Updated General Django Project Structure or Folder Layout", "url": "https://timmyomahony.com/blog/updated-django-project-structure-or-folder-layout/", "published_at": "2014-03-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65775aeca", "title": "Autodeploy Jekyll using bitbucket post-commit service hooks and Flask", "url": "https://timmyomahony.com/blog/autodeploy-jekyll-using-bitbucket-post-commit-service-hooks-and-flask/", "published_at": "2013-10-21T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e658306938", "title": "SuspiciousOperation Invalid HTTP_HOST header with Django", "url": "https://timmyomahony.com/blog/suspiciousoperation-invalid-http-host-header-django/", "published_at": "2013-04-24T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e6591d205e", "title": "A Custom Cropping Engine With sorl-thumbnail", "url": "https://timmyomahony.com/blog/custom-cropping-engine-with-sorl-thumbnail/", "published_at": "2012-12-13T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65950d26d", "title": "Using Django's request after updating POST or GET attributes", "url": "https://timmyomahony.com/blog/djangos-request-updating-with-request-get/", "published_at": "2012-12-12T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65980c02d", "title": "Automatically generating admin URLs for your objects", "url": "https://timmyomahony.com/blog/reversing-admin-urls-and-creating-admin-links-you-models/", "published_at": "2012-12-12T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e659d46a36", "title": "Reversing a unique Generic Foreign Key with Django", "url": "https://timmyomahony.com/blog/reversing-unique-generic-foreign-key-django/", "published_at": "2012-12-01T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65ac0057a", "title": "Filtering on annotations in Django", "url": "https://timmyomahony.com/blog/filtering-on-annotations-in-django/", "published_at": "2012-11-16T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65bad1118", "title": "Middleware to ensure Facebook Auth on all views with Fandjango", "url": "https://timmyomahony.com/blog/middleware-ensure-facebook-auth-all-views-fandjango/", "published_at": "2012-11-10T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65bb81da2", "title": "A General Django Project Structure or Folder Layout", "url": "https://timmyomahony.com/blog/general-django-project-structure-or-folder-layout/", "published_at": "2012-11-09T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65c61fba9", "title": "Create automatic redirects upon changing an URL dependent field in your Django Models", "url": "https://timmyomahony.com/blog/create-automatic-redirects-upon-changing-an-url-dependent-field-in-your-django-models/", "published_at": "2012-10-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65d10c66a", "title": "Don't keep sensitive information in your Django settings", "url": "https://timmyomahony.com/blog/dont-keep-sensitive-settings-settingspy/", "published_at": "2012-10-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65d286ecc", "title": "Misconceptions with \"select_related\" in Django", "url": "https://timmyomahony.com/blog/misconceptions-select-related-in-django/", "published_at": "2012-10-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65d65b5e9", "title": "Using sorl thumbnail and easy thumbnails in the same template", "url": "https://timmyomahony.com/blog/using-sorl-thumbnail-and-easy-thumbnails-in-the-same-template/", "published_at": "2012-10-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65e012213", "title": "Using a virtualenv with CodeRunner.app", "url": "https://timmyomahony.com/blog/using-virtualenv-coderunnerapp/", "published_at": "2012-10-22T00:00:00+00:00" }, { "id": "01a08c56-173f-7327-906f-26e65e8e125a", "title": "Django CMS Urls not reversing properly", "url": "https://timmyomahony.com/blog/django-cms-urls-not-reversing-correctly/", "published_at": "2012-05-16T00:00:00+00:00" } ] posts Claim your blog
Back to timmyomahony.com
Blog · corpus.blog/blogs/timmyomahony.com/posts

timmyomahony.com

timmyomahony.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012