[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fyGIfZf6YWIYU389liOSIYRzfOgptET60WtXGHXoCz-k":3},{"slug":4,"display_name":5,"profile_url":6,"plugin_count":7,"total_installs":8,"avg_security_score":9,"avg_patch_time_days":10,"trust_score":11,"computed_at":12,"plugins":13},"spyr05","snwebapps","https:\u002F\u002Fprofiles.wordpress.org\u002Fspyr05\u002F",1,0,100,30,94,"2026-08-30T06:41:37.371Z",[14],{"slug":15,"name":16,"version":17,"author":5,"author_profile":6,"description":18,"short_description":19,"active_installs":8,"downloaded":20,"rating":8,"num_ratings":8,"last_updated":21,"tested_up_to":22,"requires_at_least":23,"requires_php":24,"tags":25,"homepage":31,"download_link":32,"security_score":9,"vuln_count":8,"unpatched_count":8,"last_vuln_date":33,"fetched_at":34},"tillkit","TillKit","1.0.3","\u003Cp>\u003Cstrong>TillKit\u003C\u002Fstrong> turns your WooCommerce store into a mobile point of sale. Open the app from any phone or tablet browser, log in with a PIN, and start selling.\u003C\u002Fp>\n\u003Ch4>Free Features\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Cstrong>Mobile POS\u003C\u002Fstrong> — Full-screen product grid with category filter chips, search by name \u002F SKU, and cart drawer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Till management\u003C\u002Fstrong> — Open and close a till with float tracking and variance report on close\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Order history\u003C\u002Fstrong> — Browse today’s orders with full item breakdown\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Cash payments\u003C\u002Fstrong> — Take cash sales and track change\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PWA \u002F Add to Home Screen\u003C\u002Fstrong> — Install on Android (Chrome) or iOS (Safari) for a native app feel\u003C\u002Fli>\n\u003Cli>\u003Cstrong>2 staff members\u003C\u002Fstrong> with PIN login — Cashier and Manager roles\u003C\u002Fli>\n\u003Cli>\u003Cstrong>1 active cart\u003C\u002Fstrong> — Single cart per session\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Offline mode\u003C\u002Fstrong> — Products cached; pending orders sync on reconnect\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Upgrade to Pro\u003C\u002Fh4>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fsnwebapps.com\u002Ftillkit\u002F\" rel=\"nofollow ugc\">TillKit Pro\u003C\u002Fa> adds:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Unlimited staff\u003C\u002Fstrong> and all roles (Supervisor, Scanner Only)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Up to 10 simultaneous carts\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Card and custom payment methods\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Full & partial refunds\u003C\u002Fstrong> from Order History\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Receipt emails\u003C\u002Fstrong> sent to customers\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Barcode Scanner\u003C\u002Fstrong> tab (Quagga2) with scan log\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Size Exchange\u003C\u002Fstrong> with automatic stock adjustment on both sides\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Reports\u003C\u002Fstrong> — Shifts & Till Summaries, Product Sales, Exchange Log\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Email Designer\u003C\u002Fstrong> for branded receipts\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Priority support\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>PWA Shell Architecture\u003C\u002Fh3>\n\u003Cp>TillKit serves its point-of-sale interface as a \u003Cstrong>Progressive Web App (PWA)\u003C\u002Fstrong>. When a user visits the configured suite URL, the plugin intercepts the request via the \u003Ccode>template_redirect\u003C\u002Fcode> action hook, outputs a complete standalone HTML document, and calls \u003Ccode>exit()\u003C\u002Fcode>. WordPress never proceeds to \u003Ccode>wp_head()\u003C\u002Fcode> or \u003Ccode>wp_footer()\u003C\u002Fcode>, so the assets registered via \u003Ccode>wp_enqueue_script()\u003C\u002Fcode>\u002F\u003Ccode>wp_enqueue_style()\u003C\u002Fcode> for this request have nothing to print into automatically — they’re printed directly instead, as described below.\u003C\u002Fp>\n\u003Cp>The scripts and styles for the PWA shell are registered and enqueued through the standard \u003Ccode>wp_register_script()\u003C\u002Fcode>\u002F\u003Ccode>wp_enqueue_script()\u003C\u002Fcode> and \u003Ccode>wp_register_style()\u003C\u002Fcode>\u002F\u003Ccode>wp_enqueue_style()\u003C\u002Fcode> APIs (see \u003Ccode>tillkit_pwa_register_script()\u003C\u002Fcode> and \u003Ccode>tillkit_pwa_register_style()\u003C\u002Fcode> in \u003Ccode>tillkit-main.php\u003C\u002Fcode>). Because \u003Ccode>wp_head()\u003C\u002Fcode>\u002F\u003Ccode>wp_footer()\u003C\u002Fcode> never run for this request, the enqueued assets are printed directly via \u003Ccode>wp_print_scripts()\u003C\u002Fcode>\u002F\u003Ccode>wp_print_styles()\u003C\u002Fcode> with an explicit handle array, rather than relying on those hooks. This only prints the exact handles this plugin registered — not a foreign theme’s full head output — and runs safely after \u003Ccode>init\u003C\u002Fcode>, since registration happens on \u003Ccode>template_redirect\u003C\u002Fcode>. Dynamic values (the inline config block and theme-colour CSS override) are attached via \u003Ccode>wp_add_inline_script()\u003C\u002Fcode>\u002F\u003Ccode>wp_add_inline_style()\u003C\u002Fcode>. All values are sanitized: URLs through \u003Ccode>esc_url()\u003C\u002Fcode>, version strings through \u003Ccode>esc_attr()\u003C\u002Fcode>, and inline JS values through \u003Ccode>esc_js()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>This is the same pattern used by any WordPress plugin that serves a full-page application (e.g. login pages, OAuth callbacks, app shells) via \u003Ccode>template_redirect\u003C\u002Fcode>. The relevant PHPCS rules are suppressed with \u003Ccode>\u002F\u002F phpcs:disable WordPress.WP.EnqueuedResources\u003C\u002Fcode> at the function level with this explanation inline.\u003C\u002Fp>\n\u003Ch3>WordPress Core File Usage\u003C\u002Fh3>\n\u003Cp>TillKit loads two sets of WordPress core admin helper files using \u003Ccode>require_once\u003C\u002Fcode>. These are standard WordPress patterns and are used as follows:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>wp-admin\u002Fincludes\u002Fupgrade.php\u003C\u002Fcode> — loaded in \u003Ccode>TillKit_Database\u003C\u002Fcode> methods that call \u003Ccode>dbDelta()\u003C\u002Fcode> to create or update database tables. This is the \u003Ca href=\"https:\u002F\u002Fdeveloper.wordpress.org\u002Freference\u002Ffunctions\u002Fdbdelta\u002F\" rel=\"nofollow ugc\">documented WordPress method\u003C\u002Fa> for plugin schema management. The file is loaded immediately before \u003Ccode>dbDelta()\u003C\u002Fcode> is called.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>wp-admin\u002Fincludes\u002Ffile.php\u003C\u002Fcode>, \u003Ccode>image.php\u003C\u002Fcode>, \u003Ccode>media.php\u003C\u002Fcode> — loaded in the \u003Ccode>upload_media\u003C\u002Fcode> REST API endpoint when processing logo uploads. These files expose \u003Ccode>wp_handle_upload()\u003C\u002Fcode>, \u003Ccode>wp_generate_attachment_metadata()\u003C\u002Fcode>, and \u003Ccode>media_handle_upload()\u003C\u002Fcode>, which are called immediately after loading. The files are only loaded if the functions are not already available.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>In all cases, \u003Ccode>require_once\u003C\u002Fcode> is used (not \u003Ccode>require\u003C\u002Fcode>), the files are WordPress core files (not third-party), and a function from each file is called immediately after loading — as recommended in the WordPress plugin guidelines.\u003C\u002Fp>\n\u003Ch3>Third Party Libraries\u003C\u002Fh3>\n\u003Cp>TillKit includes two pre-built third-party libraries as minified bundles. Both are unmodified upstream releases. Source code, license, and build instructions are provided below.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>QuaggaJS v0.12.1\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Files: \u003Ccode>app\u002Fjs\u002Fquagga.js\u003C\u002Fcode>, \u003Ccode>suite\u002Fjs\u002Fquagga.js\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Purpose: Camera-based barcode scanning (live video stream barcode decoding)\u003C\u002Fli>\n\u003Cli>License: MIT\u003C\u002Fli>\n\u003Cli>Original source: https:\u002F\u002Fgithub.com\u002Fserratus\u002FquaggaJS (archived)\u003C\u002Fli>\n\u003Cli>Actively maintained fork: https:\u002F\u002Fgithub.com\u002Fericblade\u002Fquagga2\u003C\u002Fli>\n\u003Cli>NPM package: https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@ericblade\u002Fquagga2\u003C\u002Fli>\n\u003Cli>License text: https:\u002F\u002Fgithub.com\u002Fserratus\u002FquaggaJS\u002Fblob\u002Fmaster\u002FLICENSE\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The included \u003Ccode>quagga.js\u003C\u002Fcode> is the unmodified \u003Ccode>dist\u002Fquagga.js\u003C\u002Fcode> output from the\u003Cbr \u002F>\nupstream \u003Ccode>serratus\u002FquaggaJS\u003C\u002Fcode> build at tag v0.12.1. To reproduce it from source:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>git clone https:\u002F\u002Fgithub.com\u002Fserratus\u002FquaggaJS.git\ncd quaggaJS\ngit checkout v0.12.1\nnpm install\nnpm run build\n# Output at: dist\u002Fquagga.js\ncp dist\u002Fquagga.js \u002Fpath\u002Fto\u002Fplugin\u002Fapp\u002Fjs\u002Fquagga.js\ncp dist\u002Fquagga.js \u002Fpath\u002Fto\u002Fplugin\u002Fsuite\u002Fjs\u002Fquagga.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Chart.js v4.5.1\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>File: \u003Ccode>admin\u002Fjs\u002Fchart.umd.js\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Purpose: Admin analytics charts\u003C\u002Fli>\n\u003Cli>License: MIT\u003C\u002Fli>\n\u003Cli>Source: https:\u002F\u002Fgithub.com\u002Fchartjs\u002FChart.js\u003C\u002Fli>\n\u003Cli>License file: https:\u002F\u002Fgithub.com\u002Fchartjs\u002FChart.js\u002Fblob\u002Fmaster\u002FLICENSE.md\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The minified file is the unmodified output of the Chart.js build. To reproduce it:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>npm install chart.js@4.5.1\n# Copy node_modules\u002Fchart.js\u002Fdist\u002Fchart.umd.js to admin\u002Fjs\u002Fchart.umd.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Or download directly: https:\u002F\u002Fgithub.com\u002Fchartjs\u002FChart.js\u002Freleases\u002Ftag\u002Fv4.5.1\u003C\u002Fp>\n\u003Ch3>Source Code and Build Tools\u003C\u002Fh3>\n\u003Ch4>Plugin Source Files (no build step required)\u003C\u002Fh4>\n\u003Cp>All TillKit JavaScript files are plain, unminified, human-readable source files included directly in the plugin package. No compiler, bundler, or transpiler is used for plugin code.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fapp.js\u003C\u002Fcode> — App bootstrap, authentication, navigation\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fpos.js\u003C\u002Fcode> — POS product grid, category chips, search\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fcart.js\u003C\u002Fcode> — Cart drawer, multi-cart management\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fscanner.js\u003C\u002Fcode> — Barcode scanner tab (Quagga2 wrapper)\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fhistory.js\u003C\u002Fcode> — Order history, refunds\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fexchange.js\u003C\u002Fcode> — Size exchange workflow\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fstore.js\u003C\u002Fcode> — Store\u002Fproduct management tab\u003C\u002Fli>\n\u003Cli>\u003Ccode>suite\u002Fjs\u002Fsw.js\u003C\u002Fcode> — Service Worker (offline cache, sync queue)\u003C\u002Fli>\n\u003Cli>\u003Ccode>admin\u002Fjs\u002Ftillkit-admin.js\u003C\u002Fcode> — WordPress admin panel\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>To modify these files: edit them directly. No compilation step is needed. If you change \u003Ccode>sw.js\u003C\u002Fcode> or any file that may be cached, increment the \u003Ccode>CACHE_VERSION\u003C\u002Fcode> constant at the top of \u003Ccode>sw.js\u003C\u002Fcode> to bust the service worker cache.\u003C\u002Fp>\n\u003Ch4>Third-Party Libraries\u003C\u002Fh4>\n\u003Cp>Two third-party libraries are included as pre-built minified bundles. They are compiled by their own upstream build systems — not by this plugin. Instructions for reproducing each bundle from source are provided below.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>QuaggaJS v0.12.1\u003C\u002Fstrong> — \u003Ccode>suite\u002Fjs\u002Fquagga.js\u003C\u002Fcode>, \u003Ccode>app\u002Fjs\u002Fquagga.js\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purpose: Barcode scanning via camera feed\u003C\u002Fli>\n\u003Cli>License: MIT\u003C\u002Fli>\n\u003Cli>Upstream source: https:\u002F\u002Fgithub.com\u002Fserratus\u002FquaggaJS\u003C\u002Fli>\n\u003Cli>NPM package: \u003Ccode>quagga\u003C\u002Fcode> (note: the actively maintained fork is \u003Ccode>@ericblade\u002Fquagga2\u003C\u002Fcode> at https:\u002F\u002Fgithub.com\u002Fericblade\u002Fquagga2)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>To regenerate \u003Ccode>quagga.js\u003C\u002Fcode> from source:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>git clone https:\u002F\u002Fgithub.com\u002Fserratus\u002FquaggaJS.git\ncd quaggaJS\nnpm install\nnpm run build\n# Output: dist\u002Fquagga.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Copy \u003Ccode>dist\u002Fquagga.js\u003C\u002Fcode> to both \u003Ccode>suite\u002Fjs\u002Fquagga.js\u003C\u002Fcode> and \u003Ccode>app\u002Fjs\u002Fquagga.js\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Chart.js v4.5.1\u003C\u002Fstrong> — \u003Ccode>admin\u002Fjs\u002Fchart.umd.js\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Purpose: Analytics charts on the admin Reports page\u003C\u002Fli>\n\u003Cli>License: MIT\u003C\u002Fli>\n\u003Cli>Upstream source: https:\u002F\u002Fgithub.com\u002Fchartjs\u002FChart.js\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>To regenerate \u003Ccode>chart.umd.js\u003C\u002Fcode> from source:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>npm install chart.js@4.5.1\n# Output: node_modules\u002Fchart.js\u002Fdist\u002Fchart.umd.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Copy \u003Ccode>node_modules\u002Fchart.js\u002Fdist\u002Fchart.umd.js\u003C\u002Fcode> to \u003Ccode>admin\u002Fjs\u002Fchart.umd.js\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Alternatively, download the file directly from the Chart.js CDN or GitHub release:\u003Cbr \u002F>\nhttps:\u002F\u002Fgithub.com\u002Fchartjs\u002FChart.js\u002Freleases\u002Ftag\u002Fv4.5.1\u003C\u002Fp>\n\u003Ch4>Summary\u003C\u002Fh4>\n\u003Cp>No custom build pipeline exists for this plugin. Future developers only need a text editor to modify plugin source files. The two minified files above are unmodified upstream releases and can be updated by following the steps above.\u003C\u002Fp>\n","A free mobile POS terminal for WooCommerce. Sell from your phone with a PIN-protected app — no hardware required.",106,"2026-06-25T04:25:00.000Z","7.0.2","5.8","7.4",[26,27,28,29,30],"barcode","mobile","point-of-sale","pos","woocommerce","https:\u002F\u002Fsnwebapps.com\u002Ftillkit\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Ftillkit.1.0.3.zip",null,"2026-07-22T17:31:50.256Z"]