My Portfolio and Work
Hello! In this section I wanted to outline my favorite projects I've worked on recently. Much of my recent work involves Odoo development and implementation, but I will try to show a range of experiences. That coudld be team building, dev ops, server management, custom software development, API integrations, etc. This will also be living documentation that I will update over time. If you have questions or want to talk then email me..
I started learning Odoo development in 2015 and have gone through dozen of project implementations. As I learn more and as Odoo has expanded its technology, I've seen a big gap in knowledge with developers.
Starting with myself and one other developer, we implemented and released a production ERP environment for a manufacturing company of 100 employees to replace their legacy, green screen software. The initial implementation took 3 months. Since then, the project has expanded to include roughly 40 customized modules for for MRP, Inventory, Accounting, Sales, Purchasing, HR, and more. We still support and maintain their system today.
A custom screen printing and embroidery business that manufactured thousands of custom products a year reached out about taking over a failing implementation by another Odoo developer. We stabilized their existing implementation and expand it to include a complete custom screen printing job shop module to manage their MRP process and still continue to support their system.
The Odoo agency I worked with was growing and the development team was feeling the pain from that. We was beginning to release more bugs as new developers joined the team and spending longer and longer on pull requests, code reviews, conflicting environment, debugging obscure problems, etc.
I iteratively designed a continuous integration process for us using a series of tools like Docker, Docker Compose, Github, Travis CI, Google Cloud, pre-commit, and custom CLI tooling to create a uniform experience for the dev team despite their personal development environment (we have windows, mac, and linux). Our process included a pipeline of automated checks and test runners to ensure code was in the best possible shape before another developer spend their time reviewing it. This was a constant feedback loop for each developer as they individually worked on their features.
When I started work at Blue Stingray, which is a software development agency, there was no Odoo team. The company was 5 people and I don't think any of us had even heard the word "Odoo".
A client approached us and asked about it, and we said we'll figure it out. I was the one assigned to figure it out. Over the course of the next 5 years at the company I helped build and lead an Odoo team, which was 6 developers and a project manager at its largest. This also helped grow the entire business to 20+ employees.
I ended up wearing a lot of hats, as many people will understand in small company's, but a major role was essentially being an engineering manager. I determined why type of people we wanted on the team, interviewed and hired, organized the team to deliver results and keep its promises, kept a high yearly retention rate at 86% and an average time spent at the company at around 3 years, and was able to coach most of the employees. One employee I coached into my role as I left the company and many others came from coding bootcamps green and ended up as strong software engineers.
After spending years implementing enterprise level business solutions, as a side project I wanted to create a product to offer to small businesses. Often, a small 1-3 person team would approach Blue Stingray, and we often had to turn them away because of their budget and this was painful to see at times.
Buster because a SaaS implementation using Flask which offered a few simple services for small businesses who 1. Couldn't afford or didn't need larger systems and 2. Didn't want to try to glue multiple systems together. The application offered contact management, sales/purchase order processing, inventory, a job shop module, and an API.
The project had about 50 active small business using it day to day. In 2020 during the Covid-19 pandemic the majority of those customers stopped using the platform and from a business perspective I struggled to keep the project alive. I eventually, and sadly shut the project down. Luckily, I learned an unbelievable amount by going through the process.
Every client that approached us about a software implementation asked us "where is this going to be hosted?". At first everything needed to be deferred off to another company or the client needed to provide their own onsite hosting.
Eventually I worked with my team to determine a plan for providing a hosting service. This led to partnering with Google Cloud and working with a consultant to develop a process for hosting client software implementation. I managed 10-20 servers hosting multiple services for our clients throughout my time at Blue Stingray.
We focused on a specific set of technologies for the sake of simplicity. This involved a Nginx web server, Google Cloud compute instances running Ubuntu, Docker and Docker Compose, custom uptime solutions for each layer (web server, database, application), custom CLI tooling for deployments, Google Cloud monitoring, and Sentry application monitoring.
Our team at Blue Stingray had a problem where the agile process we were using to develop conflicted with the sales process for our clients. Each client wanted a fairly complete estimate and requirements document for the entire project before moving forward. This led to dramatic changes over the course of the project as the client's operations evolved or other factors triggered scope changes.
I worked with the sales team to work out a new process for project estimation that did not include detailed requirement documents. We switched to proposing multiple phased estimations for large projects and focusing on end goals via user stories vs specific descriptions of features. Essentially providing more flexible estimates for long terms projects where we bake in an expectation change.
A large sports helmet manufacturer ran a Magento Ecommerce platform with store fronts in 50+ languages and an Odoo ERP instance. The two needed to be integrated together to sync order and customer information between the two systems.
I designed a python service using Flask and a Celery and RabbitMQ job queue which was deployed using gunicorn, Nginx, and an Ubuntu cloud instance on Google Cloud. The application was tied into our standard hosting process to include Sentry integration, cloud server monitoring, and up time monitoring. The service was processing 30-50 orders an hour with a single instance with the possibility to scale it up horizontally if needed as the ecommerce grew.
Most of the Odoo implementations I've done have required, or the client had demanded, some form of customizations. This meant developing many custom modules and learning the dynamics of architecting larger software systems.
I wanted to include an example of one specific module customizations. A manufacturing company required a dynamic BOM visualization tool. As their BOMs increased in size and became increasingly complex it was difficult for their employees to move through multiple menus. Their engineers needed a single, visual tool. Developing this involved using the dhtmlx graph to build a custom frontend module and view within the core MRP module BOM view.
I started writing blog articles back in 2016 on Medium (and have since switched everything over to the blog on my portfolio site) and as part of that I wanted to share my experience with building a SaaS product with primarily Flask and Stripe.
At the time, I didn't find fantastic resources for a simple implementation of this. For a critical system like payment I was cautious of doing it properly. After implementation it was a perfect candidate to share with other developing and get a bit of feedback. It became a starting template for other future projects as well.
<- Click the Github link to the left to see the code.
^ Click the Github link above to see the code.
In 2021, after I left my full time job at Blue Stingray to pursue some consulting, freelancing, and contracting work I started playing around with game developer frameworks and engines such as pygame, monogame, and Unity.
As usual with my career, as I learn I like to write and document those things. I've been having fun with game development as a hobby and wanted to share the ideas I come across as I get better.
In this case, I implemented an isometric map with two very simple isometric block assets I created in Aseprite. I created a Tiled map and imported that map into pygame so that you can float the camera around the map.