Background
Signpost Collective is a non-profit organisation that focuses on improving the lives of street sellers by connecting them to the wider community and dignifying what they do. The organisation conducts regular visits to informal street sellers across the country to lend a listening ear, provide support, and raise awareness of their joys and struggles.
Since its founding in 2019, Signpost Collective has built a strong community of trained volunteers and engaged with over 120 informal street sellers across 15+ MRT stations in Singapore.
Project Description
In 2026, CVWO onboarded Signpost Collective to the Cornerstone system to enhance the efficiency of their administrative process. Some of the main workflows that the system supports include:
- Managing volunteer attendance
- Managing expenditures incurred during volunteering sessions
- Tracking interaction notes with street sellers
Furthermore, in line with the vision to continuously develop Cornerstone to become a flexible system that can be used to implement, with minimal hardcoding, the various common workflows of different organisations, we developed the custom entity and custom module functionalities. Fundamentally, most systems require data models, user interface (pages), and actions (logic). Instead of repeatedly building them from scratch, the data model, including the access-control system, can be built using custom entities. Then, the custom module, which consists of custom pages and custom actions, can be used to build user interfaces and persistence logic that demand a fair level of complexity.
Project Objectives
This year, our team accomplished two objectives:
- Enhance Cornerstone with Custom Entity and Custom Module to generalise the building of data models, pages, and actions
- Onboard Signpost Collective into Cornerstone
Key Contributions
1. Custom Entity
Building upon the custom form module, we developed the custom entity module, which is fundamentally an Entity-Attribute-Value (EAV) with various customisation options, notably:
- Permissions: Role-Based Access Control (entity-level), Attribute-Based Access Control (record-level), and Field-Level Permission (field value-level)
- Support for various field types including associations between entities
- Customisable layout for various screen sizes
- Customisable filters and table columns
Attribute-Based Access Control (ABAC)
ABAC support for custom entities is implemented through database row-filtering queries, which compare the records a user tries to access or modify against attributes of that user. These database queries can be defined at runtime by the administrator.
In some cases, the most intuitive user interface might demand a level of complexity that the custom entity abstraction does not support, such as pre-filling fields based on some past data. For such cases, we have also made it possible to extend the generic custom entity field components with bespoke components that are developed as code.
Bespoke component: a table picker to pick volunteers to mark their attendance, together with a "selected" section
2. Custom Module
The custom module system consists of two parts: custom page and custom actions. Both support role-based access control.
Custom Page
The custom page allows us to set up the two main components of a page: what kind of information to show to the user (data) and how the information is shown (layout). Therefore, most pages are defined by the admin-configured parameterised database queries and the layout metadata. The page layout can be configured using the drag-and-drop editor that supports various commonly used UI components such as tables, search bar, forms, and buttons.
Custom Action
The custom action allows us to configure persistence logic that is beyond CRUD, such as conditionally sending emails based on the values of the payload. In addition to being set up as standalone endpoints, custom actions can also run as hooks on creation, modification, or deletion of custom entity records, enhancing integration with the custom entity system.
A custom action showing the list of sequential operations to run based on the payload, as well as side effects to run
Side Effect: Custom Email
Some actions emit side-effects such as sending of emails. To further enhance customisability, we also developed a custom email interface for the system administrator to define email templates and recipient-selection logic. The email can then be wired as a custom action side effect, and it will receive any data relevant to the actions to populate the placeholders in the templates, allowing for customisable, dynamic emails.
Overall, the custom module and custom email complement the custom entity system to make it possible to setup a system for future organisations with minimal amount of code.
3. Signpost Collective Onboarding
We onboarded Signpost Collective and set up the system to support their workflows using the developed custom entity and custom module system.
Dashboard page for volunteers in Signpost Collective, showing walkabouts in the volunteer's region over the past week. The "Pending Volunteers" section is conditionally rendered when the current user has the permission to manage volunteers, so that they can see at a glance new volunteer registrations that have not been followed up.
Project Team
- Florian Viorel Tanely (Project Lead, Year 2)
- Lee Ho Yang, Larry (Developer, Year 1)
- Justin Stevenson Theodorus (Developer, Year 1)
- Seah Xin Yan (Developer, Year 1)
- Foong Yue Ru, Chloe (Developer, Year 1)
- Ngiam Ju Wen (Developer, Year 1)
Afterthoughts
I’m very grateful for the opportunity to serve as team lead. I learnt a lot not only in terms of technical skills but also soft-skills in project and team management that are increasingly valuable in the AI-era. I’d like to also thank my amazing team members, without whom this project would not have been successful.
– Florian
It has been a truly rewarding experience working alongside such an exceptional team. Watching everyone develop, gain confidence, and grow throughout the summer has been incredibly fulfilling, and I have also learnt so much from each of them. I am grateful for the opportunity to serve with CVWO once again.
– Larry
CVWO taught me that the hardest part of software engineering isn’t writing the code, it’s figuring out what the people using it actually need.
– Justin
CVWO has been a meaningful and rewarding experience that allowed me to grow both technically and personally. I am grateful for the opportunity to work with a supportive team and contribute to projects that create a positive impact in the community.
– Chloe
CVWO has been a challenging but rewarding experience, combining technical rigour with the chance to work on projects that truly benefit the community.
– Xin Yan
My time with CVWO has been both challenging and rewarding, allowing me to grow not just technically but personally as well. I am grateful for this amazing opportunity to learn while making meaningful contributions to society.
– Ju Wen
Acknowledgements
We would like to express our heartfelt gratitude to the following individuals and organisations for their invaluable support and influence throughout our project:
- GIC for their generous support
- Prof. Ben Leong (NUS) and Patrick Wang (NUS) for their guidance and mentorship