diff --git a/README.md b/README.md index ed925d6..b6c093c 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,17 @@ -

- - SplitPro Logo - +# An open source alternative to Splitwise -

SplitPro

-

An open source alternative to Splitwise

+## TODO -

- To our App ยป -
-
-

-

+- [ ] Add expenses with an individual or groups +- [ ] Overall balances across the groups +- [ ] Multiple currency support +- [ ] Upload expense bills +- [ ] PWA support +- [ ] Split expense unequally (share, percentage, exact amounts, adjustments) +- [ ] Push notification +- [ ] Download your data +- [ ] Import from splitwise -## About - -SplitPro aims to provide an open-source way to share expenses with your friends. - -It's meant to be a complete replacement for Splitwise. - -It currently has most of the important features. - -- Add expenses with an individual or groups -- Overall balances across the groups -- Multiple currency support -- Upload expense bills -- PWA support -- Split expense unequally (share, percentage, exact amounts, adjustments) -- Push notification -- Download your data -- Import from splitwise - -**More features coming every day** - ---- - -## Why - -Splitwise is one of the best apps to add expenses and bills. - -I understand that every app needs to make money, After all, lots of effort has been put into Splitwise. My main problem is how they implemented this. - -Monetising on pro features or ads is fine, but asking money for adding expenses (core feature) is frustrating. - -I was searching for other open-source alternatives (Let's be honest, any closed-source product might do the same and I don't have any reason to believe otherwise). - -I managed to find a good app [spliit.app](https://spliit.app/) by [Sebastien Castiel](https://scastiel.dev/) but it's not a complete replacement and didn't suit my workflow sadly. Check it out to see if it fits you. - -_That's when I decided to work on this_ ## Tech stack @@ -67,20 +31,6 @@ _That's when I decided to work on this_ - PostgreSQL - pnpm (recommended) -## Docker - -We provide a Docker container for Splitpro, which is published on both DockerHub and GitHub Container Registry. - -DockerHub: [https://hub.docker.com/r/ossapps/splitpro](https://hub.docker.com/r/ossapps/splitpro) - -GitHub Container Registry: [https://ghcr.io/oss-apps/splitpro](https://ghcr.io/oss-apps/splitpro) - -You can pull the Docker image from either of these registries and run it with your preferred container hosting provider. - -Please note that you will need to provide environment variables for connecting to the database, redis, aws and so forth. - -For detailed instructions on how to configure and run the Docker container, please refer to the Docker [Docker README](./docker/README.md) in the docker directory. - ## Developer Setup ### Install Dependencies @@ -96,25 +46,15 @@ pnpm i ### Setting up the environment - Copy the env.example file into .env -- Setup google oauth required for auth https://next-auth.js.org/providers/google or Email provider by setting SMTP details -- Login to minio console using `splitpro` user and password `password` and [create access keys](http://localhost:9001/access-keys/new-account) and the R2 related env variables +- Must: Google Provider +- Must: DATABASE_URL +```bash +pnpm db:dev # init schema +``` +- Option: R2 related ### Run the app ```bash pnpm d ``` - -## Sponsors - -We are grateful for the support of our sponsors. - -### Our Sponsors - - - hekuta - - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=oss-apps/split-pro&type=Date)](https://star-history.com/#oss-apps/split-pro&Date) diff --git a/public/manifest.json b/public/manifest.json index 59acc2d..d3b85c7 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,7 +1,7 @@ { - "name": "SplitPro", - "short_name": "SplitPro", - "description": "Split Expenses with your friends for free. SplitPro is an open-source alternative for splitwise", + "name": "SplitwiseLocal", + "short_name": "SplitwiseLocal", + "description": "Split Expenses with your friends for free. SplitwiseLocal is an open-source alternative for splitwise", "icons": [ { "src": "/icons/ios/72.png", diff --git a/public/manifest/manifest.webmanifest b/public/manifest/manifest.webmanifest index 9471556..78ed0f3 100644 --- a/public/manifest/manifest.webmanifest +++ b/public/manifest/manifest.webmanifest @@ -4,8 +4,8 @@ "display": "standalone", "scope": "/", "start_url": "/balances", - "name": "SplitPro", - "short_name": "SplitPro", + "name": "SplitwiseLocal", + "short_name": "SplitwiseLocal", "description": "Split Expenses with your friends for free", "icons": [ { diff --git a/public/sitemap.xml b/public/sitemap.xml index 323b515..50a0b22 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -8,32 +8,32 @@ - https://splitpro.app/ + https://splitwiselocal.app/ 2024-04-03T05:23:09+00:00 1.00 - https://splitpro.app/blog/need-for-splitwise-alternative + https://splitwiselocal.app/blog/need-for-splitwise-alternative 2024-04-03T05:23:09+00:00 1 - https://splitpro.app/terms + https://splitwiselocal.app/terms 2024-04-03T05:23:09+00:00 0.80 - https://splitpro.app/privacy + https://splitwiselocal.app/privacy 2024-04-03T05:23:09+00:00 0.80 - https://splitpro.app/auth/signin + https://splitwiselocal.app/auth/signin 2024-04-03T05:23:09+00:00 0.80 - https://splitpro.app/balances + https://splitwiselocal.app/balances 2024-04-03T05:23:09+00:00 0.64 diff --git a/src/components/AddExpense/AddExpensePage.tsx b/src/components/AddExpense/AddExpensePage.tsx index c4e568e..88108f5 100644 --- a/src/components/AddExpense/AddExpensePage.tsx +++ b/src/components/AddExpense/AddExpensePage.tsx @@ -432,23 +432,6 @@ export const AddOrEditExpensePage: React.FC<{ )} -
- - - -
)} diff --git a/src/components/InstallApp.tsx b/src/components/InstallApp.tsx index 376bd40..daeacd6 100644 --- a/src/components/InstallApp.tsx +++ b/src/components/InstallApp.tsx @@ -44,7 +44,7 @@ const InstallApp: React.FC = () => { shouldCloseOnAction >
-

You can download SplitPro as a PWA to your home screen

+

You can download SplitwiseLocal as a PWA to your home screen

If you are using iOS, checkout this{' '} diff --git a/src/components/Layout/MainLayout.tsx b/src/components/Layout/MainLayout.tsx index 2b378c2..3a01050 100644 --- a/src/components/Layout/MainLayout.tsx +++ b/src/components/Layout/MainLayout.tsx @@ -35,7 +35,7 @@ const MainLayout: React.FC = ({ children, actions, hideAppBar, >

- - - - - - - - - - - - - - - -
- - Download App -
- -
- } - leftAction="Close" - title="Download App" - className="h-[70vh]" - shouldCloseOnAction - > -
-

You can download SplitPro as a PWA to your home screen

- -

- If you are using iOS, checkout this{' '} - - video - -

- -

- If you are using Android, checkout this{' '} - - Video - -

-
- - ) : ( -
- ) - } >
diff --git a/src/pages/balances/[friendId]/expenses/[expenseId].tsx b/src/pages/balances/[friendId]/expenses/[expenseId].tsx index 2739938..861a3e5 100644 --- a/src/pages/balances/[friendId]/expenses/[expenseId].tsx +++ b/src/pages/balances/[friendId]/expenses/[expenseId].tsx @@ -67,7 +67,7 @@ ExpensesPage.auth = true; export async function getServerSideProps() { return { props: { - storagePublicUrl: env.R2_PUBLIC_URL, + storagePublicUrl: env.R2_PUBLIC_URL ?? null, }, }; } diff --git a/src/pages/expenses/[expenseId].tsx b/src/pages/expenses/[expenseId].tsx index 0d2a8e5..2883c66 100644 --- a/src/pages/expenses/[expenseId].tsx +++ b/src/pages/expenses/[expenseId].tsx @@ -68,7 +68,7 @@ ExpensesPage.auth = true; export async function getServerSideProps() { return { props: { - storagePublicUrl: env.R2_PUBLIC_URL, + storagePublicUrl: env.R2_PUBLIC_URL ?? null, }, }; } diff --git a/src/pages/groups/[groupId]/expenses/[expenseId].tsx b/src/pages/groups/[groupId]/expenses/[expenseId].tsx index a5f4a91..88cc80f 100644 --- a/src/pages/groups/[groupId]/expenses/[expenseId].tsx +++ b/src/pages/groups/[groupId]/expenses/[expenseId].tsx @@ -69,7 +69,7 @@ ExpensesPage.auth = true; export async function getServerSideProps() { return { props: { - storagePublicUrl: env.R2_PUBLIC_URL, + storagePublicUrl: env.R2_PUBLIC_URL ?? null, }, }; } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 2279c16..f65e0cc 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -3,15 +3,6 @@ import Link from 'next/link'; import { Button } from '~/components/ui/button'; import { ArrowRight, - Banknote, - Bell, - FileUp, - GitFork, - Github, - Globe, - Import, - Split, - Users, } from 'lucide-react'; import Image from 'next/image'; import { BackgroundGradient } from '~/components/ui/background-gradient'; @@ -21,8 +12,8 @@ export default function Home() { return ( <> - SplitPro: Split Expenses with your friends for free - + SplitwiseLocal: Split Expenses with your friends for free + {process.env.NODE_ENV === 'production' && ( <> @@ -41,12 +32,7 @@ export default function Home() {
@@ -73,153 +59,12 @@ export default function Home() { Add Expense {' '} - - -
-
-

Features

- -
-
-
- -

Groups and Friends

-
-

- Can create multiple groups or add balance directly. Everything will be - consolidated -

-
- -
-
- -

Multiple currencies

-
-

- Need to add expense with different currency for same user? No problem! -

-
-
- -
-
-
- -

Unequal Split

-
-

- Advanced split options. By shares, percentage or exact amounts. -

-
- -
-
- -

PWA support

-
-

- Love mobile apps? We got you covered. Install it as a PWA and you won't - even notice! -

-
-
- -
-
-
- -

Upload Receipts

-
-

- Upload receipts along with the expense -

-
- -
-
- -

Open source

-
-

- Which makes it hard to become evil. Easy to self host -

-
-
-
-
-
- -

Import from splitwise

-
-

- Don't have to manually migrate balances. You can import users and groups - from splitwise -

-
-
-
- -

Push notification

-
-

- Never miss important notifications. Get notified when someone adds an expense or - settles up -

-
-
-
- -
- - Splitpro - Free drop in replacement  to Splitwise: Fully Open source | Product Hunt - -
- Built by{' '} - - KM Koushik - - {/*

- A product of ossapps.dev -

*/} -
-
- - Twitter - - - Github - -
-
diff --git a/src/pages/privacy.tsx b/src/pages/privacy.tsx index b61d265..80db847 100644 --- a/src/pages/privacy.tsx +++ b/src/pages/privacy.tsx @@ -10,7 +10,7 @@ const Privacy: NextPage<{ feedbackEmail: string }> = ({ feedbackEmail }) => { diff --git a/src/pages/terms.tsx b/src/pages/terms.tsx index 336ac9f..7e91987 100644 --- a/src/pages/terms.tsx +++ b/src/pages/terms.tsx @@ -11,7 +11,7 @@ const Terms: NextPage<{ feedbackEmail: string }> = ({ feedbackEmail }) => { diff --git a/src/server/mailer.ts b/src/server/mailer.ts index c0be5d7..cdceb53 100644 --- a/src/server/mailer.ts +++ b/src/server/mailer.ts @@ -44,9 +44,9 @@ export async function sendSignUpEmail(email: string, token: string, url: string) return true; } - const subject = 'Sign in to SplitPro'; - const text = `Hey,\n\nYou can sign in to SplitPro by clicking the below URL:\n${url}\n\nYou can also use this OTP: ${token}\n\nThanks,\nSplitPro Team`; - const html = `

Hey,

You can sign in to SplitPro by clicking the below URL:

Sign in to ${host}

You can also use this OTP: ${token}



Thanks,


SplitPro Team

`; + const subject = 'Sign in to SplitwiseLocal'; + const text = `Hey,\n\nYou can sign in to SplitwiseLocal by clicking the below URL:\n${url}\n\nYou can also use this OTP: ${token}\n\nThanks,\nSplitPro Team`; + const html = `

Hey,

You can sign in to SplitwiseLocal by clicking the below URL:

Sign in to ${host}

You can also use this OTP: ${token}



Thanks,


SplitwiseLocal Team

`; return await sendMail(email, subject, text, html); } @@ -63,9 +63,9 @@ export async function sendInviteEmail(email: string, name: string) { return; } - const subject = 'Invitation to SplitPro'; - const text = `Hey,\n\nYou have been invited to SplitPro by ${name}. It's a completely open source free alternative to splitwise. You can sign in to SplitPro by clicking the below URL:\n${env.NEXTAUTH_URL}\n\nThanks,\nSplitPro Team`; - const html = `

Hey,

You have been invited to SplitPro by ${name}. It's a completely open source free alternative to splitwise. You can sign in to SplitPro by clicking the below URL:

Sign in to ${host}


Thanks,
SplitPro Team

`; + const subject = 'Invitation to SplitwiseLocal'; + const text = `Hey,\n\nYou have been invited to SplitwiseLocal by ${name}. It's a completely open source free alternative to splitwise. You can sign in to SplitwiseLocal by clicking the below URL:\n${env.NEXTAUTH_URL}\n\nThanks,\nSplitPro Team`; + const html = `

Hey,

You have been invited to SplitwiseLocal by ${name}. It's a completely open source free alternative to splitwise. You can sign in to SplitwiseLocal by clicking the below URL:

Sign in to ${host}


Thanks,
SplitwiseLocal Team

`; await sendMail(email, subject, text, html); } @@ -75,7 +75,7 @@ export async function sendFeedbackEmail(feedback: string, user: User) { if (!env.FEEDBACK_EMAIL) return; - const subject = `Feedback received on SplitPro from ${user.name}`; + const subject = `Feedback received on SplitwiseLocal from ${user.name}`; const text = `Feedback created by ${user.name} :\n\nFeedback: ${feedback}\n\nemail: ${user.email}`; await sendMail(env.FEEDBACK_EMAIL, subject, text, text, user.email ?? undefined); diff --git a/theme.config.jsx b/theme.config.jsx index 3d0079e..6f06f6e 100644 --- a/theme.config.jsx +++ b/theme.config.jsx @@ -8,7 +8,7 @@ import { Separator } from '~/components/ui/separator'; const config = { footer: (
- + App @@ -16,7 +16,7 @@ const config = { Github - + Product Hunt