Wills Grigg
Senior Back-End Developer
Senior back-end developer specialising in PHP and Symfony, with experience building APIs, third-party integrations and authentication systems. Currently the sole back-end developer at ProdPad, working across MCP, GraphQL, OAuth, event-driven architecture and AWS.
Case Studies
MCP Server
PHP/Symfony/OAuth 2
Built while working at ProdPad - 2026
The Problem
ProdPad wanted to take advantage of a new way of interacting with software through the Model Context Protocol (MCP). The aim was to give customers more flexibility in how they worked with their product data, particularly the ability to use AI clients to analyse their ProdPad data in whatever way suited their needs.
We also wanted to go beyond simply making data available for analysis and allow customers to make changes to their ProdPad accounts through the same interface.
The Solution
I worked on the development of an MCP server that provides AI clients with authenticated access to ProdPad.
The server supports reading ideas, feedback, initiatives, products, personas, workflow statuses and account configuration, as well as creating and updating ideas, feedback and initiatives.
It also supports relationships between these objects, allowing AI clients to link:
- Ideas to feedback
- Ideas to initiatives
- Feedback to initiatives
The server uses OAuth 2 to authenticate customers and provide authorised access to their ProdPad accounts.
What I worked on
I was involved throughout the project, from the initial technical discovery through to implementation and supporting customers using the integration.
Specification and technical discovery
I worked on defining the functionality that the MCP server needed to expose and investigated how MCP could work with ProdPad's existing APIs and authentication model.
As MCP was a relatively new protocol, this involved understanding the protocol itself as well as how different AI clients implemented and interacted with it.
Architecture and implementation
I worked on the architecture and implementation of the MCP server, including the tools used to read and modify ProdPad data and the OAuth 2 authentication flow used to securely access customer accounts.
The implementation needed to expose useful ProdPad functionality while fitting into the existing application and authentication architecture.
Testing and interoperability
A significant part of the work involved testing the server against different AI clients.
Different clients could behave differently when interacting with the same MCP implementation, so I spent time reproducing issues, investigating protocol interactions and adapting the implementation where necessary.
Troubleshooting and customer support
I also supported customers using the MCP server in practice, including joining calls with customers to troubleshoot issues.
This provided a useful feedback loop between the implementation and real-world usage, helping identify problems that weren't always apparent during development and testing.
Linear Integration
PHP/Symfony/GraphQL/OAuth
Built while working at ProdPad - 2026
The Problem
ProdPad needed to integrate with Linear so that users could connect their Linear workspace and synchronise initiative, idea and user story data between the two platforms.
The Solution
I developed the backend integration using Linear's GraphQL API, handling authentication and communication between the two systems.
The integration included:
- OAuth-based connection to Linear accounts.
- Keeping OAuth access tokens alive using refresh tokens.
- Querying and mutating Linear data through its GraphQL API.
- Mapping data between Linear and ProdPad's domain models.
- Using Linear webhooks to keep data in ProdPad synchronised with updates made in Linear.
What I worked on
I was responsible for the backend implementation of the integration, including authentication, GraphQL queries and mutations, data mapping and integration with the existing ProdPad application.
Event Sourcing
EventStore/KurrentDB/Node.js
Worked on while working at ProdPad - 2019 - 2026
The Problem
ProdPad uses an event-sourced architecture to record changes to product data as a sequence of events rather than relying solely on the current state of records.
The system had been in place before I joined ProdPad, so my role has been focused on maintaining, extending and upgrading an established event-sourced system as the product and underlying technology have evolved.
Over several years, this has involved working across EventStore/KurrentDB, projections, persistent subscriptions and the services responsible for processing and storing events.
The Solution
I work across the different parts of the event-driven architecture that support the ProdPad application.
The main Symfony application consumes data through the REST API exposed by EventStore/KurrentDB, while a Node.js service consumes events through persistent subscriptions, processes them and writes events back into the event store.
I have also worked on the operational side of the event store, including maintaining projections, configuring event scavenging and working with persistent subscriptions.
As the underlying technology evolved, I contributed to upgrading EventStore from v5 through to v23, adapting the surrounding application and services as the platform changed.
What I worked on
EventStore / KurrentDB
I have maintained and extended the existing EventStore implementation, including:
- Maintaining and updating projections.
- Setting up and managing event scavenging.
- Working with persistent subscriptions for consuming events.
- Making changes required to support new application functionality.
- Contributing to the upgrade from EventStore v5 through to v23.
This has given me experience working with an event store as a production system rather than simply implementing event sourcing as a new architectural pattern.
Symfony integration
The main ProdPad application is built with Symfony and communicates with EventStore/KurrentDB through its REST API.
I have written and maintained the Symfony code responsible for consuming and working with data exposed by the event store, making changes to the application as the underlying event model and product requirements have evolved.
Node.js event processing
I have also maintained the Node.js service responsible for consuming and processing events through persistent subscriptions.
The service uses WebSockets to communicate with the application client and handles events before sending them on for storage in EventStore or further processing.
As part of the EventStore upgrades, I migrated the service from the legacy eventstore/db-client package to the newer KurrentDB client.
Although Node.js isn't my primary language, working on this service has required me to become productive in an unfamiliar codebase and make changes safely within an important part of the production architecture.
What I've learned
Working with an established event-sourced system has given me a practical understanding of the challenges involved in running and evolving event-driven architecture in production.
Rather than designing an event-sourced system from scratch, my experience has been in understanding an existing architecture, making changes without disrupting dependent services, upgrading the underlying technology and dealing with the operational concerns that come with a long-lived event store.
Microsoft Teams Integration
PHP/Symfony/OAuth
Built while working at ProdPad - 2025
The Problem
ProdPad needed a way for customers to interact with their product management data directly from Microsoft Teams. The integration was designed to improve collaboration by bringing conversations, product feedback and ideas into Teams, while also encouraging users to engage with ProdPad without leaving Teams.
The Solution
I collaborated with product managers to design and develop the backend integration, allowing users to:
- Synchronise conversations between ProdPad and Microsoft Teams.
- Create Ideas and Feedback directly from Microsoft Teams using modals and forms.
- Push Ideas and Feedback from ProdPad into Microsoft Teams.
- Receive events from Microsoft Teams and respond to changes in conversations.
The integration used OAuth 2 to authorise access to customers' Microsoft Teams accounts, including securely managing access and refresh tokens.
I used the Microsoft API to create and update conversations and implemented subscriptions/webhooks to receive events from Microsoft Teams. The Teams modal and form APIs were used to provide interactive workflows for creating and updating ProdPad data from within Teams.
What I worked on
I was responsible for the backend development of the integration, including authentication, API communication, event handling and the integration between the Teams workflows and the existing ProdPad application.
Other Integrations
I've also worked on integrations with Salesforce, Jira and Slack, developing backend integrations with third-party APIs, authentication and synchronisation workflows.
Past Projects
A selection of earlier agency and personal projects from before my current role at ProdPad.
Pithy Reviews
PHP/Craft/Twig/JS/Sass
Personal project - 2017
Costa Reset Password
PHP/Twig/JS/CSS
Built while working at Graphite Digital
Heineken/Shazam
PHP/Slim/Twig/JS/Sass
Built while working at Graphite Digital
Uniqlo The Joy of Winning
PHP/Laravel/JS/CSS
Built while working at Graphite Digital
Higgidy Promotional Campaign
PHP/Laravel/JS/Sass
Built while working at Graphite Digital
RPM Design
PHP/Grav/Twig/JS/CSS
Freelance project - 2018
Technical Skills
Back-end
PHP, Symfony, Laravel, Python, Node.js
Architecture & APIs
REST APIs, MCP, OAuth 2, 2FA, Event sourcing, EventStore/KurrentDB, GraphQL
Databases & Infrastructure
MySQL, AWS, Docker, Parquet, DuckDB
Front-end
JavaScript, VueJS, HTML5, Sass, Twig, Blade
CMS
WordPress, Craft, Drupal, Umbraco, Grav
Tools
Git