Implements filtering, ordering and cursor filtering for the hook useCombinedFindManyRecords, because it was not implemented, which was misleading because variables could be passed to it. The difficult part was to make sure that the cursor filtering was working, both before and after a cursor, because it was only hard coded for last cursor (equivalent to after). The duplicate limit parameter in the type RecordGqlOperationVariables was merged into one limit parameter, because it was making the developer guess how both could be handled. This single limit parameter can be used for either : general limit without cursor, first records from after cursor, last records until before cursor. Since those cases are exclusive it's better to have only one limit parameter and have an internal logic handling those cases. Tests were added on the relevant parts, especially useCombinedFindManyRecordsQueryVariables which requires its own unit test to handle this cursor + limit logic. Record show page pagination was tested to make sure removing the duplicate limit parameter had no impact.
The #1 Open-Source CRM
🌐 Website · 📚 Documentation · Roadmap ·
Discord ·
Figma
Installation
See:
🚀 Self-hosting
🖥️ Local Setup
Does the world need another CRM?
We built Twenty for three reasons:
CRMs are too expensive, and users are trapped. Companies use locked-in customer data to hike prices. It shouldn't be that way.
A fresh start is required to build a better experience. We can learn from past mistakes and craft a cohesive experience inspired by new UX patterns from tools like Notion, Airtable or Linear.
We believe in Open-source and community. Hundreds of developers are already building Twenty together. Once we have plugin capabilities, a whole ecosystem will grow around it.
What You Can Do With Twenty
We're currently developing Twenty's beta version.
Please feel free to flag any specific needs you have by creating an issue.
Below are a few features we have implemented to date:
- Add, filter, sort, edit, and track customers
- Create one or several opportunities for each company
- See rich notes tasks displayed in a timeline
- Create tasks on records
- Navigate quickly through the app using keyboard shortcuts and search
Add, filter, sort, edit, and track customers:
Create one or several opportunities for each company:
Track deals effortlessly with the email integration:
Tailor your data model to meet business needs:
See rich notes displayed in a timeline:
Create tasks on records
Navigate quickly through the app using keyboard shortcuts and search:
Connect your CRM to all your tools through our APIs and Webhooks.
Stack
- TypeScript
- Nx
- NestJS, with BullMQ, PostgreSQL, Redis
- React, with Recoil and Emotion
- Greptile for code reviews.
- Lingui and TranslationIO for translations.
Join the Community
- Star the repo
- Subscribe to releases (watch -> custom -> releases)
- Follow us on Twitter or LinkedIn
- Join our Discord
- Contributions are, of course, most welcome!




