Dear forum members,
We're exploring the capabilities of ODK and wondering to what extent it's customizable for projects with unique requirements. Beyond just form configuration, is it possible to develop new functionalities directly within ODK Collect or on the ODK Central server to meet very specific needs?
What are the limits and the best ways to approach these extensions? We'd love to hear your experiences and opinions on this.
Thank you in advance for your valuable input!
Hmm.. I'm not very familiar with the ODK Collect's code-base as of now, but I do keep playing around with ODK Central's code-base whenever I get some free time. And, I will have to say - the ODK Central's code-base is really well organized, which makes it very easy to understand and tweak, even when it comes to related stuff like Pyxform and other environment components.
Now, I would not recommend doing the above for anything at production-level - but only for learning purposes. When it comes to production though, I always stick to the default ODK Central setup - no experiments there..! (learned it the hard way) ![]()
Instead, when I do need to extend ODK Central's functionality in production, here's what I usually do:
- Since ODK Central's front-end depends entirely on its REST API, I run both
ODK Centralandn8non the same server. - Then I use
n8nto build whatever custom logic / ODK Central's extension / plugin I need. Sometimes I even register new routes forn8n's workflows under the same domain as ODK Central, so the user never even notices if they're using ODK Central or n8n. It all blends together smoothly / seamlessly. - Example 1: As ODK Central doesn't support entities within repeats yet, I used the ODK Central's REST API along with n8n to build that functionality for my projects. My n8n workflow keeps on checking the incremental submissions every 10 minutes, processes the in-repeat entities / properties at the workflow's level and add it to the respective entity list.
- Example 2: For one of my projects, there is need for the data to be analyzed by an AI to determine some result based on the submission data. n8n automation helps here as well. It fetches the data from ODK Central -> Analyses it via AI -> Updates the submissions in the ODK Central with the AI analyzed data - all this automatically!
And when it comes to extending ODK Collect, I just use the external apps feature.
Many times I have been tempted to implement something in Central and related tools, only to realise it's actually possible (either through searching the forum, docs, or going about it a different way).
Make sure you are 100% certain it's not possible via specific XLSForm logic or some other means!
ODK is pretty receptive to updating things based on user requirements. I would say it's probably best to post the ideas you have for modifications in the ideas section, then others in the community can comment or vote on it. If there is enough traction, then it may get included at some point ![]()
If you are really in need of some modifications that others in the community see no value adding, then your best bet is to maintain a custom fork of Central / Collect. But as @MinimalPotato says, I wouldn't take this decision lightly!
For a while I was having to maintain a fork of Collect, to allow pre-selection of an entity in the form, by clicking a button from an external app. It's not fun having to keep your fork in sync with latest changes and continually reconcile your changes against them.