{"id":15173248,"url":"https://github.com/pnxl/handel-pos","last_synced_at":"2025-10-01T10:31:32.940Z","repository":{"id":238618569,"uuid":"796996293","full_name":"pnxl/handel-pos","owner":"pnxl","description":"Web-based point-of-sale system for people running small, temporary businesses - such as garage sales and pop-up shops","archived":true,"fork":false,"pushed_at":"2024-05-20T09:37:32.000Z","size":713,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-09-28T11:01:12.591Z","etag":null,"topics":["business","cashier","entrepreneurship","garage-sale","nuxt","point-of-sale","pop-up","pos-system","supabase","supabase-js","tailwindcss","typescript","vue"],"latest_commit_sha":null,"homepage":"https://handel.pnxl.dev","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pnxl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"ko_fi":"poonxal","custom":"https://saweria.co/pnxl"}},"created_at":"2024-05-07T02:16:12.000Z","updated_at":"2024-09-15T04:39:24.000Z","dependencies_parsed_at":"2024-05-18T07:23:39.041Z","dependency_job_id":"0ba0dd3e-62ad-40f5-a477-da23f3f92ff2","html_url":"https://github.com/pnxl/handel-pos","commit_stats":null,"previous_names":["pnxl/freshly-pos","pnxl/handel-pos"],"tags_count":0,"template":false,"template_full_name":"pnxl/nuxt-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnxl%2Fhandel-pos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnxl%2Fhandel-pos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnxl%2Fhandel-pos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnxl%2Fhandel-pos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pnxl","download_url":"https://codeload.github.com/pnxl/handel-pos/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234858883,"owners_count":18897829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["business","cashier","entrepreneurship","garage-sale","nuxt","point-of-sale","pop-up","pos-system","supabase","supabase-js","tailwindcss","typescript","vue"],"created_at":"2024-09-27T11:00:19.874Z","updated_at":"2025-10-01T10:31:32.553Z","avatar_url":"https://github.com/pnxl.png","language":"Vue","funding_links":["https://ko-fi.com/poonxal","https://saweria.co/pnxl"],"categories":[],"sub_categories":[],"readme":"# Handel\n\nThis is Handel - a web-based, simple, configurable point-of-sale app. It's aimed towards people running small, temporary businesses - such as garage sales and pop-up shops.\n\n### It makes running your shop effortless, with features such as...\n\n- **Calculating item prices on the fly**, and gives you a live preview of the current order's price 💸\n- **Item modifier management**, so you can add modifiers to an item, such as it's sauces, flavour, and size 🤖\n- **Dead simple order logging**, to keep track of every item you've ever sold; making it easy to see who sold what, how much you earned, and when it was sold 📜\n\n### Furthermore, Handel is based around core fundamentals that matter...\n\n- Firstly, it's **So. Damn. Simple.** it's designed with ease-of-use in mind, so prioritises a clear and straightforward design. This minimises the learning curve and helps you focus on selling items 🤑\n- For all the nerds, it's **built on rock solid foundations**, taking advantage of the latest technologies in order to stay performant and fast ⚡️\n- Lastly, it's **infinitely customisable**. Because of its open source nature, anyone is free to fork it and adjust it to their own needs 😄\n\n### What applications can it be used for?\n\nHandel can be applied to a lot of scenarios, such as..\n\n- Garage sales (can be used to keep track of prices and inventory\\*)\n- Pop-up shops (maybe something temporary, like selling lemonade at the side of the street)\n- School projects (something like 'Entrepreneurship Day' where you sell goods)\n\n* feature coming soon!\n\n### What's the catch?\n\nHandel doesn't take payments - instead having you handle the payments manually. This is perfect for small temporary shops, where obtaining a payment terminal or a real register isn't viable.\n\n## How do I use it?\n\nTo get started with Handel, fork the project and run your own instance on Cloudflare Pages (or any other static hosting service). Make sure to fill your enviroment variables accordingly (refer to `.env.example`)\n\n### Database setup\n\nYou'll also need a Supabase instance, with the following tables:\n\n1. `menu`, to store all your items\n2. `cashiers`, for logging who sold what\n3. `purchases`, to log items you've sold\n4. `kitchen`, for a kitchen display to receive orders (make sure Supabase Realtime is enabled!)\n5. `quotes`, for the text under the 'Cashier' title\n\nYou'll also need two storage buckets, for the following:\n\n1. `menu`, to store images of items you're selling.\n2. `cashiers`, to store images of the cashiers\n\nYou can name them any of these anything you'd like. Enter the names in your environment variables (refer to `.env.example`)\n\nFor columns in the table, you'll need the following:\n\n- For the `menu` table:\n\n  - id (int8, leave default)\n  - name (text, disallow nullable)\n  - price (float4, disallow nullable)\n  - image (text, default value: `noimage.png`)\n  - description (text)\n  - options (jsonb, array, default value: `[]`)\n\n- For the `cashiers` table:\n\n  - id (int8, leave default)\n  - fullName (text, disallow)\n  - image (text, default value: `noimage.png`)\n\n- For the `purchases` table:\n\n  - id (int8, leave default)\n  - timestamp (timestamptz, leave default)\n  - revenue (float4, disallow nullable)\n  - cashier (text, default value: `Cashier`)\n  - item (text, disallow nullable)\n  - options (text, array, default value: `[]`)\n  - notes (text, array, default value: ``)\n\n- For the `kitchen` table: (enable Supabase Realtime!)\n\n  - id (int8, leave default)\n  - timestamp (timestamptz, leave default)\n  - assignment (text, default value: `No Name`, disallow nullable)\n  - item (text, disallow nullable)\n  - options (text, array, default value: `[]`)\n  - notes (text, default value: ``)\n\n- For the `quotes` table:\n  - id (int8, leave default)\n  - text (text, disallow nullable)\n\n### Adding new items\n\nCreate a new column in your items table and fill in each row accordingly.\n\n#### Adding images to items\n\nUpload an image of your item to your items storage bucket, taking note of the name. Go back to the table editor, and fill in the image row with the file name of the image you just uploaded.\n\n#### Adding options to items\n\nEach item has the ability to have modifiers and modifier categories (such as size, add-ons, etc.) in a JSON array. The syntax goes as follows:\n\n```json\n[\n  {\n    \"category\": \"Add-ons\",\n    \"items\": [\n      {\n        \"name\": \"Add-on #1\",\n        \"price\": 0\n      },\n      {\n        \"name\": \"Add-on #2\",\n        \"price\": 3\n      },\n      {\n        \"name\": \"Add-on #3\",\n        \"price\": 6\n      }\n    ]\n  },\n  {\n    \"category\": \"Modifier\",\n    \"items\": [\n      {\n        \"name\": \"Modifier #1\",\n        \"price\": 0\n      },\n      {\n        \"name\": \"Modifier #2\",\n        \"price\": 0\n      },\n      {\n        \"name\": \"Modifier #3\",\n        \"price\": 0\n      }\n    ]\n  }\n]\n```\n\n### Adding new users\n\nCreate a new column in your users table and fill in each row accordingly.\n\n#### Adding images to items\n\nUpload an image of your item to your users storage bucket, taking note of the name. Go back to the table editor, and fill in the image row with the file name of the image you just uploaded.\n\n### Adding new quotes\n\nQuotes are randomised from your quotes database. Simply add a new row, and fill in your desired quote(s) into the text column.\n\n## Does that sound good to you?\n\nIf it does - you can learn more about it at [handel.pnxl.dev](https://handel.pnxl.dev/).\n\nFor demos, check out [handel-demo.pages.dev](https://handel-demo.pages.dev).\n\nFor an in-person demo and to get it for your business, feel free to contact me here or through email at [jason@pnxl.dev](mailto:jason@pnxl.dev); I'd love to show you what my product can do for your business 😉\n\n## Acknowledgements and Credits\n\nMuch love to Nuxt for a rock solid framework and Supabase for an easy-to-use database. ❤\n\nCode licensed under GNU GPLv2.\n\nAssets and libraries used with permission.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpnxl%2Fhandel-pos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpnxl%2Fhandel-pos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpnxl%2Fhandel-pos/lists"}