{"id":34374129,"url":"https://github.com/sde1000/quicktill","last_synced_at":"2026-03-13T07:34:17.322Z","repository":{"id":10926868,"uuid":"13229769","full_name":"sde1000/quicktill","owner":"sde1000","description":"Figure out where all the money and stock went to","archived":false,"fork":false,"pushed_at":"2026-03-07T19:45:34.000Z","size":7096,"stargazers_count":47,"open_issues_count":70,"forks_count":9,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-03-08T01:16:25.570Z","etag":null,"topics":["cash-register","epos","escpos","point-of-sale","pos","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sde1000.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2013-09-30T22:59:50.000Z","updated_at":"2026-03-07T19:45:37.000Z","dependencies_parsed_at":"2024-04-19T15:49:03.503Z","dependency_job_id":"2aec8d10-4efe-41a5-9343-6f64d1fc1a44","html_url":"https://github.com/sde1000/quicktill","commit_stats":null,"previous_names":[],"tags_count":319,"template":false,"template_full_name":null,"purl":"pkg:github/sde1000/quicktill","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sde1000%2Fquicktill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sde1000%2Fquicktill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sde1000%2Fquicktill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sde1000%2Fquicktill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sde1000","download_url":"https://codeload.github.com/sde1000/quicktill/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sde1000%2Fquicktill/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30460934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T06:34:02.089Z","status":"ssl_error","status_checked_at":"2026-03-13T06:33:49.182Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cash-register","epos","escpos","point-of-sale","pos","python"],"created_at":"2025-12-18T11:22:34.263Z","updated_at":"2026-03-13T07:34:17.315Z","avatar_url":"https://github.com/sde1000.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"quicktill — cash register software\n==================================\n\nCopying\n-------\n\nquicktill is Copyright (C) 2004–2026 Stephen Early \u003csteve@assorted.org.uk\u003e\n\nIt is distributed under the terms of the GNU General Public License\nas published by the Free Software Foundation, either version 3\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see [this\nlink](http://www.gnu.org/licenses/).\n\nFeatures\n--------\n\n * Any number of departments, products, price lookups, users, etc.\n\n * Products sold can be entered through keys on a keyboard, on-screen\n   buttons, or barcode scans\n\n * Works on multiple terminals at once; transactions follow users\n   between terminals\n\n * Web interface for reporting and management\n\n * Flexible discount policies, and reporting on discounts given\n\n * [Xero](https://www.xero.com/) integration\n\n * [Square Terminal](https://developer.squareup.com/docs/terminal-api/overview) integration\n\nIt should be possible to run this software on any system that supports\nPython 3.12.  Usually it runs on Debian-derived Linux systems.\n\nMisfeatures\n-----------\n\n * Lack of documentation — you're reading it now!\n\n * Only one developer at the moment\n\n * Arguably: Configuration is written in python (although there is an\n   ongoing effort to move configuration into the database)\n\nQuick start\n-----------\n\nThe till software includes an anonymised copy of the database from\n[EMFcamp 2024](https://www.emfcamp.org/) which can be used for\ntesting.  This guide assumes you have a fresh installation of Ubuntu\n24.04 Desktop.  (You will need a graphical user interface for the\non-screen keyboard, and the Desktop version has the \"universe\"\ncomponent enabled by default.)\n\n### Installing needed packages ###\n\nIn a terminal window, run the following to install packages the till\nsoftware needs:\n\n    sudo apt install git postgresql python3-sqlalchemy\n    sudo apt install python3-dateutil python3-psycopg2\n\n### Configuring postgres ###\n\nWe need to set up postgres to allow your user account to create new\ndatabases.  This procedure may vary from system to system, but on\nDebian-derived Linux systems will go something like this:\n\n    sudo -u postgres createuser -d your-username\n\nYou will need to substitute your own username for \"your-username\".\n\nIf you don't want to give your user account permission to create new\ndatabases, you could [use the instructions\nhere](https://wiki.debian.org/PostgreSql) to do something more\nrestricted.\n\n### Obtaining the till software and test data ###\n\nWe will create a clone of the till software from github:\n\n    git clone https://github.com/sde1000/quicktill.git\n\nThis puts the till software in a directory called \"quicktill\".  From\nnow on we'll assume that this is your current working directory:\n\n    cd quicktill\n\nTo create a database and install the test data in it:\n\n    createdb emfcamp\n    psql emfcamp \u003cexamples/data/emfcamp2024-anonymised.sql\n\nIf in the future you need to go back to the original version of the\ntest data, you can delete the database using \"dropdb emfcamp\" and\nrepeat the above two commands.\n\n### Running the till software ###\n\nCheck that the till software runs:\n\n    ./runtill --help\n\nThe software can run in a number of different modes, defined in the\nconfiguration file.  We're going to be using the configuration file\n`examples/emfcamp.py`.  The commands shown here will specify this on\nthe command line using the `-u` option.\n\nThe till software can also run both in its own window or in the\nterminal window you're using to start it.  For a separate window give\nthe `--gtk` option after the word `start` on the command line; to run\nin the terminal, leave it out.\n\nTo run the till software in \"Stock Terminal\" mode:\n\n    ./runtill -u file:examples/emfcamp.py start --gtk\n\nTo run the till software in \"Main bar\" mode:\n\n    ./runtill -u file:examples/emfcamp.py -c mainbar start --gtk --keyboard\n\nAt some sites the till software is used with a matrix keyboard, but\nthese are pricey and hard to get hold of.  The `--keyboard` option\nmakes the till software display an on-screen keyboard instead.\n\nOnce the till software is running, you can exit it by pressing the\n\"Manage Till\" button (or 'M' if there's no on-screen keyboard) and\npicking option 8.\n\n\nUsing the till software for your own site\n-----------------------------------------\n\nTo use this software for your own site, you will have to write a new\nconfiguration file.  It's easiest to do this by copying one of the\nexample configuration files (eg. `examples/emfcamp.py`) and changing\nit.  Once the software is configured, it's generally quite easy for\nstaff to use.  It's currently in use by [Individual Pubs\nLtd](https://www.individualpubs.co.uk/) in all their pubs.  It's\noccasionally used by [EMFcamp](https://www.emfcamp.org/) and [London\nHackspace](https://london.hackspace.org.uk/).\n\nAt the moment I'm not guaranteeing that changes from one release to\nthe next won't break existing configuration files, although I aim to\navoid this where possible.  The database schema can also change; SQL\ncommands to update existing databases are shown in commit messages.\nGenerally schema changes can be made before installing the updated\nrelease, and won't affect older versions of the software; config file\nchanges must be made after installing newer versions of the software\nand aren't backward-compatible.  (So, to upgrade smoothly: make\ndatabase schema changes, install the new version, then update the\nconfig file to enable any new features you need.)\n\nHardware\n--------\n\nYou can use a physical matrix keyboard, or an on-screen keyboard with\na touchscreen.  I generally use 16x8 matrix keyboards from Preh\n(MCI128), configured so that on each keypress they output a sequence\nof keystrokes giving the coordinates of the key that was pressed, for\nexample [A01] for the bottom-left and [H16] for the top-right.  If you\nhave a different type of keyboard, or it is set up differently, it's\nfairly easy to write a new keyboard driver: see\n`quicktill/kbdrivers.py`\n\nThe software needs some way of identifying users.  By default, there\nare three buttons at the top-left of the keyboard that can be used to\nlog users in.  If you have a keyboard with a magstripe reader, you can\nuse magstripe cards to enable users to log in.  At my sites we use\nACR122U NFC readers along with [some simple driver\nsoftware](https://github.com/sde1000/quicktill-nfc-bridge) (which\nshould be able to support any CCID compatible NFC reader).\n\nReceipt printers are supported (and required, if you want to use a\ncash drawer).  The software has generic support for all ESC/POS\nreceipt printers, and explicit support for the Epson TM-T20 (thermal),\nTM-U220 (dot-matrix), and Aures ODP 333.  Label printers are supported\nfor stock label printing.  I use the DYMO LabelWriter-450 (cheap,\nworks well, but unfortunately discontinued) but anything with\n[CUPS](https://www.cups.org/) support will work.\n\nBarcode scanners can be used to identify products as they are sold.\nYou need [some simple driver\nsoftware](https://github.com/sde1000/quicktill-serial-barcode-bridge)\nto drive USB serial barcode scanners.  Other types of scanner, for\nexample Bluetooth cordless, are not yet supported but should be simple\nto add if required.\n\nSetup\n-----\n\nYou must create a postgresql database and make it accessible to\nwhichever user is running the till software.  Name this database in\nthe configuration file.\n\nPut a URL pointing at the config file in /etc/quicktill/configurl\n(eg. file:///home/till/configweb/haymakers.py)\n\nCreate database tables:\n\n    runtill syncdb\n\nCopy the example database setup file and edit it:\n\n    cp examples/dbsetup.toml my-database-config.toml\n    (edit my-database-config.toml)\n    runtill dbsetup my-database-config.toml\n\n(There's an example edited database setup file at\n`examples/data/emfcamp2024-dbsetup.toml`)\n\nCreate an initial user; this will be a superuser that can do anything,\nyou can use the user management interface once the till is running to\nset up other users:\n\n    runtill adduser \"Built-in Alice\" Alice builtin:alice\n\nRun in \"stock control terminal\" mode and enter your initial stock\n(this mode doesn't require a special keyboard)\n\n    runtill start --gtk\n\nRun in \"cash register\" mode, create stocklines, bind them to keys, put\nyour stock on sale, and sell it:\n\n    runtill -c mainbar start --gtk --keyboard\n\nA simple wrapper for the web interface can be found [in this\nproject](https://github.com/sde1000/quicktill-tillweb).\n\nUseful subcommands\n------------------\n\nThe till software is invoked as `runtill [options] subcommand\n[subcommand options]`.  Usually the subcommand is \"start\", to run the\ntill interactively.  You can get a list of all the subcommands with\n`runtill --help`.\n\nAnother useful subcommand is \"dbshell\", which starts an interactive\npython interpreter with a database connection already set up, a\nsession started, and the td module and models.* already imported.  So\nfor example, to get a list of departments:\n\n    \u003e\u003e\u003e td.s.query(Department).all()\n\nA list of transactions in the current session:\n\n    \u003e\u003e\u003e Session.current(td.s).transactions\n\nA list of sessions and their totals (in a single round-trip to the\ndatabase):\n\n    \u003e\u003e\u003e from sqlalchemy.orm import undefer\n    \u003e\u003e\u003e [(x,x.total) for x in td.s.query(Session).options(undefer('total')).all()]\n\nCredits\n-------\n\nThis software incorporates code from the following projects, which may\nbe under a different licence:\n\n* [MultiSelect](https://plugins.jquery.com/multi-select/) ([DWTFYWT](http://www.wtfpl.net/txt/copying/) licence)\n* [json-viewer](https://github.com/LorDOniX/json-viewer) (MIT licence)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsde1000%2Fquicktill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsde1000%2Fquicktill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsde1000%2Fquicktill/lists"}