How Nearly Dying Repeatedly Fixed My BurnoutIn the middle of 2018 in NYC I was going through some rough burnout. I’d been working my ass off at a corporation I’d panicked into after…
Climate Activism in Tech: Design, Code, Hack, and ShareAs the science-denial perpetrated omnishambles of 2020 continues, COVID-19 rages on whilst Europe gets hit by deadly storms and flash floods…
Fixing Gatsby oEmbed Instagram FailuresI use gatsby-remark-oembed by Benedicte Raae, because it makes embedding Tweets, Instagram posts, YouTube videos, etc in Phil.Tech and Phil…
OpenAPI Examples Need HelpOpenAPI has come a long way since its nascent days as Swagger. It’s got excellent tooling, is talked about at all the conferences, is used…
Refactoring an entire API EcosystemWhen I started working at WeWork back in 2016 I rather quickly discovered that the entire architecture was a total mess… Over the course of…
Remote Work As Climate ActionUpdate 2020-07-02: This article was written before the COVID-19 pandemic lockdowns were put in place, but this article has only become more…
Are Frameworks Keeping Up With Modern API Requirements?Over the years I’ve used about 20 different web application frameworks (tool-kits for making server-side applications), contributed to a few…
Update on OpenAPI and JSON SchemaUpdate 2020-02-02: JSON Schema Draft 2019-09 has been published for a while, and after much deliberation we got the folks at OpenAPI to…
Reinventing API Design with Stoplight StudioTwo months ago I teased that Stoplight was about to release something big, and yesterday we announced Stoplight Studio - an OpenAPI and…
New Life, New Job, New DomainThis blog has been a bit quiet for the last two years, with me blogging on APIs You Won’t Hate and phil.bike more than here. 2017 was mostly…
Picking the right API ParadigmA while back I wrote an article called Understanding RPC, REST and GraphQL which outlined the “what” in how these various approaches differ…
API Evolution for REST/HTTP APIsThere are a lot of pros and cons to various approaches to API versioning, but that has been covered in depth before: API Versioning Has No…
Solving OpenAPI and JSON Schema DivergenceUpdate 2020-02-02: This article has been replaced entirely, as the proposed workaround was written into a now abandoned project Speccy, and…
OpenAPI and JSON Schema Divergence: Part 1This article is going to explain the divergence between OpenAPI and JSON Schema, which I’ve been calling the subset/superset/sideset problem…
Design-first API Specification Workflow MaturesBack in October I wrote Chasing the Perfect API Specification Workflow, which was a huge article about the state of the API specification…
Still Going on REST is the new SOAPOne month after A Response to REST is the new SOAP and I’m still having a productive dialog with the author, helping him understand how REST…
A Response to REST is the new SOAPEnough people have asked me about the article REST is the new SOAP that I felt it justifies a write up. Before I get started, I want to be…
One Month Since OpenAPI v3.0Last month today OpenAPI v3.0 was released, and not only is there a lot of cool stuff, but it unblocks some akward situations with vendor…
A Happy Compromise Between Customization and CacheabilityWith endpoint-based APIs (REST, RESTish, SOAP, RPC, AJAX-ish junk, etc.) you get to choose if you want increased likelihood of network cache…
Chasing the Perfect API Specification WorkflowDocumentation is a nice thing to have, but it is often treated as optional or superfluous, especially in teams where the clients and servers…
Representing State in REST and GraphQLRepresenting state is a complex thing. At my last two jobs, it’s been very common for APIs to be treated like “databases over HTTP”. The…
You Might Not Need GraphQLAfter writing about how GraphQL and REST differ in various regards, and taking a closer look at caching in particular, I wanted to write…
GraphQL vs REST: CachingRecently I wrote GraphQL vs REST: Overview, giving a hype-free outline of the differences between REST and GraphQL. One section that would…
GraphQL vs REST: OverviewA few months back I wrote a comparison between RPC and REST for Smashing Magazine, and now I want to talk about the differences between REST…
Building APIs with Rails: Handling Errors NicelyIgnoring one session covering basic CRUD and deserialization using ActiveModel::Serializer, we get to a more interesting session: Handling…
Building APIs with Rails: Documentation TestingNow that we’ve started building a very basic API, we should make sure that the documentation is kept up to date with our progress. Even…
Building REST APIs with Rails: Basic SerializationThird video in a pile of LiveCoding.tv videos, shows how to use ActiveModel Serializer to shape the output of your resources. I totally…
Mocking APIs with API BlueprintThe second video in a pile of LiveCoding.tv videos shows how to use your API Blueprint documentation to mock APIs, and a few different ways…
API Documentation: Do it FirstTwo years ago I finished the first edition of Build APIs You Won’t Hate, and since then I’ve worked on bigger and better projects, using my…
Tips on Sidekiq QueuesSidekiq is great. It’s a really handy way to take slow stuff that your application is doing like uploading images or sending emails, and get…
Codes of Conduct: Maybe They're Not So Bad?I’ve written a few articles about Code of Conducts, which are a hotly debated version of the Anti-Harassment policy you almost certainly…
Geeks Giving for Aids: 2016For the third time, I will be doing a three-day ride from Boston to New York, along with hundreds of amazing people. Everyone was in various…
PHP-FIG: 3.0 or RebrandI’m tired of talking about the PHP-FIG. I don’t want to, and I won’t have anything to do with it. That said, as my timeline is full of old…
Talking About Diversity: ConspiracyThis is part two of a blog series, about why the PHP community is having a rough time talking about diversity related issues (like code of…
Talking About Diversity: MarginalizationThe other week I was out doing a charity bike ride; a Breast Cancer benefit from London to Cambridge. It was a lovely ride with a new group…
TechBikers 2016When I’m not making stupid jokes on Twitter, or in a bar, or making stupid jokes on Twitter from a bar, I’m usually riding bikes. I do this…
Dredd v1.1.0: A Bit DifferentA new version of Dredd - the API Documentation testing tool from Apiary Inc. - has been released, and it has changed a few things for the…
Why Care About PHP Middleware?Recently there has been a lot of buzz about HTTP middleware in PHP. Since PSR-7 was accepted, everyone and their friend Sherly has been…
PUT vs PATCH vs JSON-PATCHA question that is asked with increasing regularity in the APIs You Won’t Hate Slack Group is one which has been asked for years, but does…
Loudly Ignoring How CoCs WorkPaul Jones recently wrote an article called An Object Lesson in Conduct Enforcement. The title starts off factually inaccurate, and it goes…
PHP Town Hall: Code of ConductThe other week I wrote an article called Why is Everyone Outraged?, where I explained how the media often manufactures outrage, making it…
Why Is Everyone Outraged?There have been about twenty articles I want to write about equality in tech, and they all end up crossing over into one big mess. I’m going…
Made in Production II: Learning and ImprovingMade in Production has been something that my BFF Zack and I have been working on for a while. We had the idea to start selling super-niche…
HTTP/REST API File UploadsFile uploads are one thing that always feel rather complicated, and working out how to handle this in an API doesn’t make life easier. For…
Deploying with Git-Flow, Tags and CircleCIWant an integrated deployment process that sends tags off to the right environment (QA or Production) automatically as soon as they’re…
HTTP Documentation with API BlueprintWhen planning my talk and book on REST/HTTP API development, I ended up mentioning documentation towards the end, and flippantly said “Oh…
Everyones Favourite Twitter CharactersRegularly, I make a general piece of advice, and the types of responses are pretty similar regardless of the actual conversation. Lets take…
HTTP Status Codes Are Not EnoughI spotted an article called Just learn Rails (Part 3) HTTP status codes. It started off good, and I liked that it was teaching people to…
Auto-Incrementing IDs: Giving your Data AwaySomething we’re always taught as developers, usually by tutorials or via the defaults in various ORM tools, is every SQL table needs an auto…
No Booze for a MonthIn 5 weeks I’ll be riding my bike a really long way to raise money for charity. Sadly, as I ride bikes all the time, not so many people are…
The Ratio of Women Speakers in TechThere are a lot of my opinions and viewpoints that have changed over time. Some slowly and naturally, and some sharp and sudden like a wet…
Avoid Hardcoding HTTP Status CodesA lot of things in programming are argued to death, but one subject where people almost unanimously agree is that magic numbers can be a…
Geeks Giving for Aids: 2015Back in 2013 I did a three-day ride from Boston to New York, along with hundreds of amazing people. Everyone was in various levels of…
Geographic Fun with Google Maps APII’ve been working at Ride.com since October 2014, and I’ve got to do some awesome stuff with them. As far as my job has been concerned, the…
Twatty Fallacies when Fox and Friends talk FlagsUsually this blog is about programming. I try to stick to what I know, but one thing I have a lot of experience with is pointing out shit…
The Importance of Serializing API OutputI’ve given the API Pain Points talk a bazillion times over the last year. In just 2015 I gave it at: Lone Star PHP OpenWest ConFoo One…
Happily Stepping into the ShadowsAnyone who knows me better than my Twitter profile will know I have a love/hate relationship with my reputation, and the online persona that…
A Quick Note on PSR NumberingThe last PSR from the FIG to be sent out into the world, to be used by whoever felt like using it, was PSR-4: Autoloader. Now people are…
PHP 7 Feature FreezeToday was the feature freeze for PHP 7. That means no new votes can be started for a feature that is aimed at PHP 7.0, and would instead…
PHP Void: Much Ado About NothingRecently Return Types were accepted for PHP 7, which makes me very happy. This RFC was a real work of art. Levi Morrison sidestepped various…
Meet the LeagueA few months ago I wrote What is The League of Extraordinary Packages?, and it was clearly written in a defensive tone. I wanted to explain…
Dredd: Do Your HTTP API JusticeIf you have documentation for any sort of HTTP-based API, from a micro-service to a non-trivial RESTful API, if it has existed for more than…
Developer Fallacies of 2014Some people like to take a quick walk down memory lane in January, and post their highlights of the previous year. Last year (2014) was…
The State of MarkdownThe answer to “What is the State of Markdown?” is “Yes, it’s a f**king state.” Markdown has been around for a long time, since John Gruber…
Treehouse: PHP Standards and Best PracticesA while ago Treehouse got in touch with me, and asked me if I would be interested in working with them on a video course. They wanted more…
Alien Status: Extraordinary AgainA few months ago I wrote a bit of an emotional article about my visa status, and how I was in a bit of a pickle. A few people since have…
Composer: It's ALMOST Always About the Lock FileDavey Shafik wrote a great article for EngineYard called Composer: It’s All About the Lock File. The point of his article is to try and…
Describe Your PHP ComponentI’ve been talking recently about what The League of Extraordinary Packages is up to, and made a plea to avoid “Not Invented Here” syndrome…
PHP Wars: Attack of the ClonesIn the last article I said I wanted to write about when its a good idea to release a component. A lot of this comes down to: is there one…
What is The League of Extraordinary Packages?This is the story of group of friends, who decided to write some code, but somehow confused and angered everyone with a keyboard. tl:dr…
Stop Pretending Everything Is OKWe work in an industry where far too many people pretend that everything is O.K. We pretend that sexism isn’t rife. We pretend that startup…
I was an Extraordinary Alien... For a WeekThe last seven months have been a weird time. I started off the year with the knowledge that the startup I worked for was running out of…
The Neverending Muppet Debate of PHP 6 v PHP 7Update 12/12/2014: The answer is now of course PHP 7. There are a few major, important conversations happening in the PHP internals mailing…
Send PSR-0 to the Standards Farm in the SkyThis article attempts to convince you that deprecating the PSR-0 auto-loading standard in favor of the PSR-4 auto-loading standard is not…
The Pocket Guide to Sexism in TechToday I had somebody explain to me that they just didn’t believe there was a problem with sexism in tech. They flat out said it is not a…
Fractal v0.8.0, now with SerializersA new version of Fractal is out, which is a package aimed at making life easier to API developers handling output. At a basic level it acts…
RESTful Deletions, Restorations and RevisionsTwo weeks ago I posted RESTful URLs: Actions Need Not Apply which was all about how the only action/verb to appear in the HTTP Request…
RESTful URLs: Actions Need Not ApplyI was doing a little consulting for a company while I was out in South Africa and we played the game. You fire SOAP functionality at me, and…
Heroku and PHP Sitting in a Tree. K.I.S.S.I.N.GHeroku was - as far as I remember - the first (mainstream) PaaS on the market. It was Ruby-only but it was that symbol of modern web…
The Tale of Tom, Dick and HarryThis article describes three fictional characters as they all learn how various tools and methodologies work in the world of technology…
Made in ProductionLate last summer I was riding my bike around the mountains of New Jersey. I’m not sure if it was exhaustion, the heat or the fact that I had…
PHP-FIG: Autoloaders, Amendments and The "15th Standard"I’ve managed to get myself involved in a lot of projects in and around the PHP community because I like to offer my advice, experience and…
The "Framework" is Dead, Long live the FrameworkThere have been a few posts over the last few months saying that the age of the framework is dead, and that Composer is the true savior, and…
Autoloading Laravel application code with PSR-4When you use Laravel it’s very likely you autoload extra code than just the controllers/models that are autoloaded by default. Some use…
Composer now supports PSR-4I haven’t really posted about PSR-4 here other than as a footnote in this old article, but if you follow me on Twitter or hang out on Reddit…
The Tribal Framework MindsetTwitter seems to lead to the same thing happening over and over again. I say something I think is entirely uncontroversial People…
PHP API's: Fractal of GOOD DesignRecently I started a new blog series called “Build API’s That You Wont Hate”, starting off with Part 1 - Useful Database Seeding. It was…
Benchmarking Codswallop: NodeJS v PHPSometimes people link me to articles and ask for my opinions. This one was a real doozy. Oh goody, a framework versus language post. Let’s…
Build API's That You Wont Hate: Part 1 - Useful Database SeedingA little while back I produced an article called Building a Decent API which was mostly a tongue-in-cheek list of things that I’d come…
PSR-2 v CodeSniffer PSR-2: A Success StoryI’ve had static analysis tools running in Sublime Text for a long time, but for most of that time I have had CodeSniffer and it’s PSR-…
Solving the PHP Internals WorkflowOn Monday I posted a tale of woe, which like any good tale had a moral at the end. The moral was that while PHP internals has its troubles…
WTF is T_PAAMAYIM_NEKUDOTAYIMAnyone who has mentioned PHP Fractal of Bad Design to me knows I don’t give it much credit. It’s a list of complaints about loose-typing in…
Named Parameters in PHPUpdate 06/09/2013: I had initially offered to put together an RFC draft updating the original rather dire efforts at documenting PHP’s lack…
Potential Variadic Function Syntax for PHP 5.6An awesome RFC popped up the other day: Syntax for variadic functions, developed by Nikita Popov. I read through it and I loved it, but I…
CurlFile and the Facebook SDK in PHP 5.5One of the features implemented in PHP 5.5 was CurlFile, a nice addition to the Curl extension to allow you to specify specific arguments as…
FUD Cracker: PHP 5.5 never lost JSON supportI’m posting this because I have accidentally been perpetuating some FUD, that PHP 5.5 has had its JSON support removed. It hasn’t. Some…
PHP Static Analysis in Sublime TextCoding Standards have been around for the longest time and recently they’re starting to become more widespread in PHP. While learning Python…
Progress in the PHP-FIGThe PHP Framework Interoperability Group (PHP-FIG) has been around for 4 years, and it’s produced 4 PSR’s, which to some is a sign of…
Great Battle, Wrong FieldLife is hard, opinions are hard, and fighting for your opinions and beliefs is the hardest. This is why it upsets me that so many people…
Beware the Route to EvilAs programmers we should all be used to the fact that our personal preferences and habits are all subject to change. I used to be a big fan…
Building a Decent APIUpdate: This initial list of tips is aimed mostly at beginners, but I expanded upon it so much I turned it into a whole book. I’m a little…
Geeks Giving for AidsAfter doing my 100 mile bike ride to raise money for autism research I’ve decided to step things up a gear (ha) and go further in a bid to…
Biked to the Beach 2013Last month I posted about an upcoming bike century called Bike to the Beach. As lots of you were amazingly generous with sponsorship money I…
Send a Facebook Message with XMPP using Access Tokens in PythonToday I had a real tough time trying to work out how the hell I could send a Facebook message to a user with Python. I knew I needed the…
Composer and PSR-0: Friends, Not RelativesAs a huge proponent of Composer, a happy user of PSR-0 and a voting member on the PHP-FIG I get into plenty of conversations about all of…
Bike to the Beach 2013I have always liked to bike around. I bike to the pub, bike to my friends house, bike to dates (that never worked out so well) and bike up…
Build your own Vagrant Boxes with VeeWeeThe other day I posted an article about upgrading Chef and Vagrant, and the pains you can end up having by relying on third-party vagrant…
Testing and Contributing with Composer PackagesWhile Composer has been around for a while now, many packages are still in their infancy (< 1.0) or sometimes are just not as feature filled…
Vagrant and Chef: Upgrade PartyThe other day I thought to myself, I really should be using a RVM gemset for my “devops” repo, which contains all my Vagrant and Chef logic…
Is PSR-0 Shortsighted, or are you?One of the fun things about trying to support the PHP-FIG and all the good its doing, is seeing blog posts written complaining about it by…
PSR-2: The Tough DecisionPSR-2 has been out for a while now, and even though developers from member projects (such as Joomla, Drupal, phpBB, CakePHP, Symfony and…
Pick PHP Requirements for Packages ResponsiblyI recently tweeted something which seems to have confused a lot of people: Now, don’t go running off to PETA, I’m clearing kidding about the…
Help test PHP 5.5 beta1Yesterday PHP.net announced the release of PHP 5.5 Beta-1. This is a great news after the concerns that merging Zend Optimizer+ would really…
Catapult into PyroCMSIt’s been a little while in the making, but my first book is out: Catapult into PyroCMS. This is being released as an eBook only at this…
PHP 6: Pissing in the WindUpdate 12/12/2014: This ended up getting to #1 on Google for “PHP 6” so I thought it was important to give an update. The article hoped to…
Goals for 2013Back in 2010 I set myself a list of goals and put them online in the hope that it would be some extra motivation. I actually did pretty well…
The Most Important Conversation EverThe world today has a lot of hot topics that need to be discussed. Washington needs to get together to help sort out the debt-ceiling to…
Building an iTunes feed with OctopressOctopress is a great little CMS for hackers and it works on GitHub pages for free hosting, so a few PHP developers have been known to use it…
Why do some PHP Developers <3 Static APIs?There are two kinds of PHP developers. Those who absolutely love static methods because they are easy to work with and those who think they…
Arguing on the InternetI have referenced Shawn McCool’s blog a few times, ”Why CodeIgniter is Dead” and people are wondering why I argued so hard against it back…
5 Things CodeIgniter Cannot Do (without a rewrite)Now that PHP 5.2 is gone from my life entirely I am a happy man. As I don’t use PHP 5.2 anymore I no longer need a 5.2 framework, so I quit…
Why some people hate PHPThis is a repost of my answer to the Quora question: Do a large majority of people hate PHP solely because other people do so? There are a…
Distributed Architecture Faking with VagrantWorking at Kapture I’ve been charged with something I’ve never really had to do before: Managing a big-ass architecture of different servers…
Puppet or Chef?Back in the UK at PHPNE this May I saw an awesome talk from Ian Chilton, who explained very simply why using Vagrant for your development…
Bye Bye PHP 5.2PHP is undeniably the most used language when it comes to building web applications. Around 78% of the internet is powered by PHP and the…
Cloud Hosting for PHP: The Eternal Pipe DreamI posted an article at the start of the year called 2012: The year of PHP cloud hosting. Well, not really. Sure there are two months left in…
Package Watch: Image ManagementSorry if I sound like a broken record, but packages are f**king brilliant. I’ve mentioned before that packages are the future of PHP and…
No-DB Content Management SystemsIf you’re following many designers on Twitter then you’ll notice that they’ve just started noticing flat-file (or “No-DB”) content…
Moving OnMy entire career seems to have come from being a CodeIgniter developer, and a vocal one at that. Since then I have risen up through the…
Understanding CircumstanceI have been working for years in this industry and I have never needed to do what you do. Therefore your opinion is obviously wrong. Unless…
CICONF - Mission CompleteThis year the low-to-middle budget CodeIgniter Conference was held in San Francisco in a brilliant co-working space called Citizen Space. I…
Why PHP DateTime RocksWorking as a freelancer and contractor sometimes I come across some code that is so terrible I have to laugh, then immediately tweet a…
Blooie: Chat has ChangedThe last few months have been pretty mad for me. As well as the usual client work for HappyNinjas, I’ve been flying backwards and forwards…
PHP: Ecosystem UpdateDon’t worry guys, this isn’t another PHP apologist or PHP hater blog. We’ve all had enough of those recently. This is a quick heads up on…
CodeIgniter Conference 2012 SFSo only two months until the return of CICONF to America! Last year was CICONF2011 NY which was a great experience. There we announced the…
Laravel is AwesomeYou might not expect to hear that from a CodeIgniter and FuelPHP developer, but it’s true. Taylor has done a brilliant job writing code that…
Composer with CodeIgniterComposer is the best thing for PHP since sliced arrays and using it in your applications means you have easy access to a large selection of…
CMS: Interesting History, Powerful FutureAs a CMS developer on the PyroCMS team, a common problem I have to deal with on an almost daily basis is peoples strange fear of using a CMS…
Packages: The Way Forward for PHPWhat is a package? A package is a piece of reusable code that can be dropped into any application and be used without any tinkering to add…
My Thoughts on CICONF 2012 UKIt’s been a few days since CICONF and this is my first chance to get my thoughts together after a few busy days. In all I am extremely…
2012: The year of PHP cloud hostingCloud hosting is nothing new. Seeing as “cloud” is such a loosely used term some will consider their VPS solutions on Slicehost or Rackspace…
Starting Up in Start-upsI spent the last three months working as a hired gun for a start-up in an incubator program called ignite100, and now I am back in the south…
PHP Basher BashingAnyone who has used PHP for a while knows that it has its ugly parts. Recently I’ve seen a whole swathe of PHP-bashing articles and that…
Stitch Your Friends UpWhile I am on the ignite100 start-up incubator I have met some amazing people in some brilliant start-ups. One of these start-ups is Givey…
Do Things That Scare YouI was giving a short talks at DevXS in Lincoln this weekend based on my Nomadic Web Development article and I was asked “Where did you find…
Developer++I’ve been working up in Newcastle recently on the longest stay of my Nomadic Web Development mission, wandering the globe and country…
New CodeIgniter Documentation = Unicorn PartyThe CodeIgniter Community has been crying out for EllisLab and the development team to be more open and forward with information…
Managing CodeIgniter Packages with Git SubmodulesWith CodeIgniter moving to GitHub we are starting to see a lot of CodeIgniter developers wanting to learn more about Git, specifically how…
NinjAuth: The Social Integration Package PHP has been dying forIn the past I have never needed to implement oAuth into a PHP project. I have done it in Rails and boy it was easy thanks to OmniAuth…
CICON2011 and the future of CodeIgniterCICON BannerCICON2011 happened and it was awesome. We had 100 CodeIgniter nerds in the same place - which is the biggest collection of CI…
Nomadic Web DevelopmentAnyone following me on Twitter will have seen tweets coming in from all-over the place for the last few months. Am I on holiday? Nope…
Video: Pancake 3.1 overviewWe’ve been working hard on PancakeApp - a CodeIgniter-based Invoicing system - and it’s getting to be a real power-house of features. This…
Misconceptions about ORMsI was reading an article today ORM is an anti-pattern and it reminded me of some of the opinions I used to have about ORMs. I had used some…
Tumbleweed?As you may have seen in my last article I’m currently off traveling the world (well, North America for now at least) and I wanted to give…
TravlrApp - An app for backpackers and web nomadsThis summer I’ll be travelling around U.S.A with nothing much more than a Greyhound coach pass, a laptop, a map and of course a smart-phone…
The CodeIgniter Community goes on holiday to NYCThe CodeIgniter Community has decided to have a little holiday this summer, and head to New York for not just a meet up, but the biggest…
Why Write A New Framework?So we all know that the internet is full of frameworks. They’ve been the popular thing for the last 5 or 6 years and it seems to have become…
Time for a ChangeAfter years of being an active member in the CodeIgniter community I have decided it is time to change things up and move on. Where is that…
Video: Set up a REST API with CodeIgniterTonight I started working on the RESTful API for PancakeApp - an invoicing system built in CodeIgniter - when I remembered how many people…
FuelPHP - Oil Introduction & ScaffoldingDevelopment of FuelPHP has come a long way since Dan and myself started work on the system a few months ago and it’s command line utility…
Getting involved with CodeIgniterNow that CodeIgniter (Reactor) 2.0 is out people are starting to get involved, which is great. There are still a few stragglers getting…
PHP Format abstraction with a simple classHaving a quiet night in before a long day of kayaking I thought I’d write some fun code instead of banging out the usual shit like I’ve been…
Geocoding API's ComparedOver the last few weeks I have been doing plenty of work with geolocation and reverse geolocation directly in JavaScript, PHP and Ruby using…
Pancake v2.0 - Invoice Clients in stylePancake Payments is a super awesome invoicing application that lives on your server and can be made to keep with your brands look and best…
Introducing FuelPHPIt’s been in development for the last two months but the new PHP 5.3 framework FuelPHP is ready to see the light of day and we’re just about…
2010 for Phil Sturgeon: Year in ReviewAnother year has passed and this has been the best yet. Most years fly by without me having any real record of what I have achieved or where…
EllisLab react with CodeIgniter ReactorSo it’s been a month since my post ” CodeIgniter: What happens next?” and things have changed drastically in the world of CodeIgniter. That…
Using OmniAuth to make Twitter/oAuth API requestsUsing the brilliant user system gem Devise and a gem called OmniAuth you can make a Rails application that logs in or registers users via…
Drumbeat Festival: 3 days of awesomeFor the last few days I have been in Barcelona at a brilliant event run by Mozilla called Drumbeat Festival with the slogan “Learning…
BathCamp: A day of nerdery and beerI have been to several conferences, unconferences and local BathCamp meets, but this years proper BathCamp was a real chuckle. BathCamp is…
CodeIgniter: What happens next?Update 31/01/2011: Things have changed a great deal since this article was written and now CodeIgniter 2.0 is released with Reactor (a…
CodeIgniter 2.0 is stable (enough)For the last 7 months since CodeIgniter 2.0 was released on BitBucket the question “when will it be stable?” has been all bouncing around…
Mozilla Drumbeat Interview: Brad FelixAnybody interested in Open Education, Open Software, Open Hardware (basically anything open and web related) will probably know about the…
CodeCanyon's ExpressionEngine 2 section launchesCodeCanyon have just released their new ExpressionEngine 2 section with some of my plugins as seed content. I have put Widgets, Mapper, Text…
Power dump() on your PHP applicationsWhen trying to work out what the hell is going wrong in your PHP application the first thing most of us start doing is madly start var_dump…
Sturgeons Shittiest Company Award '10Let’s face it, none of us like dealing with big companies. Long waiting times, script reading Indian call centers, uncaring supervisors and…
What happened to Modular Separation?Modular Separation for CodeIgniter is no more. It has kicked the bucket, shuffled off the mortal coil, run down the curtain and joined the…
The internet finally gets some MojoAfter several months of totally secret development and two months of private beta MojoMotor - an amazing new CMS from EllisLab - is out, and…
ExpressionEngine 2.0 can finally have a RestMy first ExpressionEngine 2.0 Add-on has been released, with the amazingly imaginative name “Rest”. I originally had the idea for this…
CodeIgniter CON 2010 coming soonCodeIgniter Con 2010 is the first all-CodeIgniter conference and is being run in the UK. This means anyone who couldn’t make it to San…
Nerdy Adventures in America: EECI2010 USAfter months of waiting the time is finally here for EECI2010 US: The ExpressionEngine & CodeIgniter Conference of 2010, held in San…
CloudIgniter: Easy hosting for CodeIgniterEver wanted to install PyroCMS or set up a CodeIgniter playground but don’t know what the hell you are doing? The wonderful new hosting…
Upgrading to CodeIgniter 2.0As soon as I saw the tweet from EllisLab that CodeIgniter 2.0-dev was available on BitBucket I instantly converted PyroCMS to run on it. I…
Tiny REST framework in PHPI figured it is about time I start selling some of my work as the number of libraries and projects I have released open-source means I spent…
CodeIgniter Packages != ModulesSo many people are asking about the new Packages feature in CodeIgniter 2.0 that I need to put this to bed: Packages are not Modules. These…
Modular Separation for CodeIgniter 2Sadly CodeIgniter 2.0-dev has not brought us any sort of modular/HMVC system, but luckily Modular Separation works for this new “version…
CodeIgniter 2.0: Everything you need to knowIt has been 6 months since the last CodeIgniter minor update and 18 months since the last major update. Through all this time we were given…
Deploying websites with GitBack in 2008 I wrote an article describing how you can use Subversion as a very simple deployment method from your local box, through…
CodeIgniter Base Classes: Keeping it DRYMost applications in CodeIgniter will have various types of pages. The public frontend, a backend admin panel, perhaps some sort of…
Working with RESTful services in CodeIgniterThis blog has been pretty quiet for a few weeks now, mainly because I have been working on a beast of an article for NetTuts called…
CodeIgniter Template libraryWorking with multiple views in CodeIgniter has always been a pain. Out of the box CodeIgniter provides no real way of having a layout file…
Twiny-Framework: the framework small enough to tweetMany frameworks say they are lightweight, quick and easy on your server, but none are as lightweight as my new “framework” which is so…
Why CodeIgniter HTML helper functions rockA complaint I often hear about CodeIgniter is one about HTML helper functions like , and . The complaint boils down to these points: is…
CodeIgniter on PHP 5.3Last night I set up Zend Community Server with PHP 5.3 and gave PyroCMS (running CodeIgniter 1.7.2) a spin. Out of the box v0.9.7.3 and v0.…
Managing stable and unstable branches in GitStable and unstable branches are something that every open-source developer, project manager, or general software user should be aware of…
Give CodeIgniter's Parser library more kick with DwooAnyone who has used the CodeIgniter Parser library will agree it is damn basic. The library is literally just a way to use variables and…
Send iPhone notifications from CodeIgniterMost web-applications currently use automated e-mail’s to let an administrator know something is going on and some applications use Twitter…
Goodbye Matchbox, Hello Modular SeparationI’ve been using Matchbox in one of its many forms for several years - almost as long as I have been using CodeIgniter - and it got to the…
CodeIgniter "2.0": Rumours, facts and requestsUpdate 22/03/2010: Now that CodeIgniter 2.0 development code has been release this article is irrelevant. Please have a look at CodeIgniter…
Asset handling in CodeIgniter with the BASE tagThere are many suggested ways to handle your assets (CSS, images, JavaScript, etc) in CodeIgniter including my very own Asset library. Some…
Clearing CodeIgniter session dataA question came up in the CodeIgniter forums today asking how to clear session data. After writing a big reply to answer I felt others might…
UTF-8 support for CodeIgniterWriting an application is easy. Writing an application that supports all characters from multiple languages? Not so easy. The main problem…
Create an Admin panel with CodeIgniterAs I see it there are three methods to creating an admin system using the MVC framework CodeIgniter. In this article I will show examples of…
Poll: Will you use goto in PHP 5.3?It has just come to my attention that PHP 5.3 will include the ” goto” keyword that exists in so many other programming languages. PHP 5.…
How to: Multi-site CodeIgniter Set-upA few people have asked me recently about setting up CodeIgniter to run across multiple domains based on the same codebase. This can be…
REST implementation for CodeIgniterI have seen 1 or 2 RESTful implementations for CodeIgniter but the syntax and methodology for each of them left me feeling like it could be…
Debugging ActiveRecord queries in CodeIgniterWhen you have an ActiveRecord call that just will not work, it can be a pain. Many developers seem to find an issue and instantly ask for…
CodeIgniter & Canonical linksDue to CodeIgniter’s URI flexibility people are able to access the same url in many ways which causes issues with both Google ranking…
Access CodeIgniter helpers from Smarty templatesThis article assumes you already have Smarty parsing your CodeIgniter views. If you have not done this, you can find out how to integrate…
Tips for a Subversion addict learning GitThis post is a mixture of things learnt from IRC, educated guesses and the results of many hours of trial and error. Local & Remote…
How to: Install Transmission CLI to Ubuntu ServerI made this guide as I had a little trouble finding all the correct information required to get this set up. Some of it was scattered around…
Watch CodeIgniter error's reported as they happenIf you have access to your web server via the command line, you can use a unix command called . You can use this to watch changes in any…
How to: Support multiple production environments in CodeIgniterTo get this working is very easy. Constants can be seen all the way through CodeIgniter and can be set almost anywhere. To keep things neat…
How to: Clean username URL's in CodeIgniterWhen most people start work on this, they think about using routes. You could do it this way, but then every time you enter a url such as…
DateTime objects - Start month, end month, first Monday, etcI recently came across PHP’s DateTime object and I’m loving it. Working out the first Monday of the month is also quite easy, but has one…
cURL 1 out on CodeIgniterI noticed a support request for a cURL related question and decided it was time CI had its own cURL library. After a few hours of blind…
Finally, my MSN Money UK sections go live!Now normally when I do big jobs I like to use CodeIgniter but at work that is not an option. Instead I had to get these sections working…
Deploying sites with SVNI have a working copy on my dev site and the live site. live will be trunk, dev will be the branch I am working on or trunk depending on…
First PostThere are several reasons for starting this blog. Firstly as a way to keep track of all my tips, tutorials, code snippets and various web…