* Translated using Weblate (German) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/de/ * Translated using Weblate (French) Currently translated at 99.6% (302 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/fr/ * Translated using Weblate (Spanish) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/es/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 97.3% (295 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/zh_Hans/ * Added translation using Weblate (Korean) * Translated using Weblate (Korean) Currently translated at 82.8% (251 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/ko/ * Translated using Weblate (Catalan) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/ca/ * Translated using Weblate (Russian) Currently translated at 87.1% (264 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/ru/ * Added translation using Weblate (Basque) * Translated using Weblate (Basque) Currently translated at 48.5% (147 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/eu/ * Translated using Weblate (Basque) Currently translated at 56.7% (172 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/eu/ * Translated using Weblate (Italian) Currently translated at 90.7% (275 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/it/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 94.7% (287 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/pt_BR/ * Translated using Weblate (Basque) Currently translated at 82.1% (249 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/eu/ * Translated using Weblate (Basque) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/eu/ * Added translation using Weblate (Indonesian) * Translated using Weblate (Indonesian) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/id/ * Translated using Weblate (Japanese) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/ja/ * Added translation using Weblate (Portuguese) * Translated using Weblate (Portuguese) Currently translated at 27.3% (83 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/pt/ * Added translation using Weblate (Hebrew) * Translated using Weblate (Hebrew) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/he/ * Translated using Weblate (Basque) Currently translated at 100.0% (303 of 303 strings) Translation: Spliit/Spliit Translate-URL: https://hosted.weblate.org/projects/spliit/spliit/eu/ --------- Co-authored-by: Panoloo <chr.gee@t-online.de> Co-authored-by: Meryl Street <e.kergrene+osm@gmail.com> Co-authored-by: Aire Sur <andreser@gmail.com> Co-authored-by: Leo Li <leo_li2001@outlook.com> Co-authored-by: MinjiK <km.minjikim@gmail.com> Co-authored-by: Jose <seriamente.fs@gmail.com> Co-authored-by: Roman Miller <rmn.miller@googlemail.com> Co-authored-by: Alexander Gabilondo <alexgabi@openmailbox.org> Co-authored-by: Arthur Bonavita <arthur.bonavita@gmail.com> Co-authored-by: Stefan Tanuwijaya <st.navybloo1@gmail.com> Co-authored-by: susui <susui@hatsuyoake.com> Co-authored-by: Pedro Gaspar <19785870+p-gaspar@users.noreply.github.com> Co-authored-by: 12 123 <rohin.kaelin@moonfee.com>
Spliit is a free and open source alternative to Splitwise. You can either use the official instance at Spliit.app, or deploy your own instance:
Features
- Create a group and share it with friends
- Create expenses with description
- Display group balances
- Create reimbursement expenses
- Progressive Web App
- Select all/no participant for expenses
- Split expenses unevenly (#6)
- Mark a group as favorite (#29)
- Tell the application who you are when opening a group (#7)
- Assign a category to expenses (#35)
- Search for expenses in a group (#51)
- Upload and attach images to expenses (#63)
- Create expense by scanning a receipt (#23)
Possible incoming features
Stack
- Next.js for the web application
- TailwindCSS for the styling
- shadcn/UI for the UI components
- Prisma to access the database
- Vercel for hosting (application and database)
Contribute
The project is open to contributions. Feel free to open an issue or even a pull-request! Join the discussion in the Spliit Discord server.
If you want to contribute financially and help us keep the application free and without ads, you can also:
Translation
The project's translations are managed using our Weblate project. You can easily add missing translations to the project or even add a new language! Here is the current state of translation:
Run locally
- Clone the repository (or fork it if you intend to contribute)
- Start a PostgreSQL server. You can run
./scripts/start-local-db.shif you don’t have a server already. - Copy the file
.env.exampleas.env - Run
npm installto install dependencies. This will also apply database migrations and update Prisma Client. - Run
npm run devto start the development server
Run in a container
- Run
npm run build-imageto build the docker image from the Dockerfile - Copy the file
container.env.exampleascontainer.env - Run
npm run start-containerto start the postgres and the spliit2 containers - You can access the app by browsing to http://localhost:3000
Health check
The application has a health check endpoint that can be used to check if the application is running and if the database is accessible.
GET /api/health/readinessorGET /api/health- Check if the application is ready to serve requests, including database connectivity.GET /api/health/liveness- Check if the application is running, but not necessarily ready to serve requests.
Opt-in features
Expense documents
Spliit offers users to upload images (to an AWS S3 bucket) and attach them to expenses. To enable this feature:
- Follow the instructions in the S3 bucket and IAM user sections of next-s3-upload to create and set up an S3 bucket where images will be stored.
- Update your environments variables with appropriate values:
NEXT_PUBLIC_ENABLE_EXPENSE_DOCUMENTS=true
S3_UPLOAD_KEY=AAAAAAAAAAAAAAAAAAAA
S3_UPLOAD_SECRET=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
S3_UPLOAD_BUCKET=name-of-s3-bucket
S3_UPLOAD_REGION=us-east-1
You can also use other S3 providers by providing a custom endpoint:
S3_UPLOAD_ENDPOINT=http://localhost:9000
Create expense from receipt
You can offer users to create expense by uploading a receipt. This feature relies on OpenAI GPT-4 with Vision and a public S3 storage endpoint.
To enable the feature:
- You must enable expense documents feature as well (see section above). That might change in the future, but for now we need to store images to make receipt scanning work.
- Subscribe to OpenAI API and get access to GPT 4 with Vision (you might need to buy credits in advance).
- Update your environment variables with appropriate values:
NEXT_PUBLIC_ENABLE_RECEIPT_EXTRACT=true
OPENAI_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Deduce category from title
You can offer users to automatically deduce the expense category from the title. Since this feature relies on a OpenAI subscription, follow the signup instructions above and configure the following environment variables:
NEXT_PUBLIC_ENABLE_CATEGORY_EXTRACT=true
OPENAI_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
License
MIT, see LICENSE.
