{
 "products": [
  {
   "key": "agents",
   "name": "Hoq Agents",
   "status": "live",
   "url": "https://agent.hoq.app",
   "line": "Coding agents in a server terminal that keep running after you close the tab.",
   "facts": [
    {
     "label": "Runtimes",
     "value": "Claude Code, or an opencode-based terminal agent that runs on Hoq Intelligence models. You pick one per agent."
    },
    {
     "label": "Persistence",
     "value": "Each agent is a tmux session on the server, so it keeps running through browser disconnects and closed tabs."
    },
    {
     "label": "Agents per person",
     "value": "Up to 20."
    },
    {
     "label": "Terminal transport",
     "value": "A WebSocket opened by the browser directly to the agent host, authorized by a single-use HS256 JWT valid for 120 seconds."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID with OAuth PKCE (S256). Every API call needs a token with the agents:manage scope."
    },
    {
     "label": "Agent browser",
     "value": "Optional per agent. The agent drives it over the Chrome DevTools Protocol and you watch or take over through an in-page VNC view."
    },
    {
     "label": "Ownership",
     "value": "Ownership is enforced server-side on every call; you can list, open and change only your own agents."
    }
   ],
   "figures": [
    {
     "value": "20",
     "label": "agents per person"
    },
    {
     "value": "120 s",
     "label": "lifetime of the single-use token that opens a terminal"
    },
    {
     "value": "2",
     "label": "agent runtimes to choose from"
    }
   ],
   "features": [
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Create an agent",
       "what": "Name it, pick Claude Code or the Hoq Intelligence runtime, and optionally give it a browser.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rename, stop and delete",
       "what": "Manage each agent from the list, scoped to your own account.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Always on",
       "what": "The tmux session keeps the agent working while no browser is attached.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Terminal",
     "rows": [
      {
       "name": "Browser terminal",
       "what": "A full xterm terminal attached to the agent's live session.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Session view",
       "what": "tmux windows and panes rendered as native tabs over tmux control mode, laid out for a phone.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Key bar",
       "what": "An on-screen bar with Esc, Tab, arrows and sticky Ctrl and Alt for touch keyboards, which you can reorder and customise.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Paused output notice",
       "what": "If your connection falls behind, the view says the pane is paused and repaints it when it catches up.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Files",
     "rows": [
      {
       "name": "Upload",
       "what": "Drop a file into the agent's uploads folder or its current folder.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Download",
       "what": "Fetch any file from the agent's workspace by path.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Browser",
     "rows": [
      {
       "name": "Agent-driven browser",
       "what": "The agent controls its own Chromium through the Chrome DevTools Protocol.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Watch and take over",
       "what": "See the same browser live in the Browser tab and use it yourself.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 11,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Devin",
      "url": "https://devin.ai/pricing"
     },
     {
      "name": "Claude Team",
      "url": "https://claude.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Entry price",
      "hoq": "not published",
      "them": [
       "Pro $20/month; Teams $80/month plus $40 per dev seat",
       "$25 per seat per month billed monthly, $20 billed annually"
      ],
      "sources": [
       "https://devin.ai/pricing",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Where the agent runs",
      "hoq": "A tmux session on a Hoq server",
      "them": [
       "Devin Cloud; VPC deployment on Enterprise",
       "not published"
      ],
      "sources": [
       "https://devin.ai/pricing",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Agent you can run",
      "hoq": "Claude Code or an opencode-based agent",
      "them": [
       "Devin",
       "Claude Code included"
      ],
      "sources": [
       "https://devin.ai/pricing",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Keeps working with the tab closed",
      "hoq": "Yes, the session lives on the server",
      "them": [
       "not published",
       "Hand off and schedule tasks is listed for Pro, Max and Ultra, not Team"
      ],
      "sources": [
       "https://devin.ai/pricing",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Agents or seats",
      "hoq": "Up to 20 agents per person",
      "them": [
       "Teams: up to 200 users",
       "Team: 2 to 150 seats"
      ],
      "sources": [
       "https://devin.ai/pricing",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "SSO",
      "hoq": "not published",
      "them": [
       "SAML/OIDC SSO on Enterprise",
       "Included on Team"
      ],
      "sources": [
       "https://devin.ai/pricing",
       "https://claude.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "assets",
   "name": "Hoq Assets",
   "status": "beta",
   "url": "https://assets.hoq.app",
   "line": "Everything you own, where it is, who has it, and what it needs.",
   "facts": [
    {
     "label": "Where your data lives",
     "value": "One .assets file per company in the owner's Hoq Storage."
    },
    {
     "label": "Codes",
     "value": "Things are numbered A-0001 onward unless you give your own code."
    },
    {
     "label": "Starter types",
     "value": "Fridges, freezers, espresso machines, grinders, roasters, vehicles, tools, test kits and computers, each with its own fields."
    },
    {
     "label": "Public tag page",
     "value": "A phone's own camera opens the tag page; no app or sign-in needed. Problem reports are capped at five an hour per tag."
    },
    {
     "label": "Statuses",
     "value": "In service, out of service, in repair, lost or retired."
    },
    {
     "label": "Maintenance dates",
     "value": "Due dates are counted in the company's time zone and the next date runs from the day work was done."
    },
    {
     "label": "Check-out",
     "value": "One person holds a thing at a time, with a due-back date and a list of what is late."
    },
    {
     "label": "Sensors",
     "value": "Link a thing to its Hoq Sensor feed."
    }
   ],
   "figures": [
    {
     "value": "9",
     "label": "starter types with their own fields"
    },
    {
     "value": "5",
     "label": "statuses a thing can have"
    },
    {
     "value": "5",
     "label": "public problem reports per tag per hour"
    }
   ],
   "features": [
    {
     "area": "Things",
     "rows": [
      {
       "name": "Things and their codes",
       "what": "Keeps everything a business owns, numbered A-0001 onward unless you give it a code of your own.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Types with their own fields",
       "what": "Gives each kind of thing the fields it needs, with starter types for fridges, freezers, espresso machines, grinders, roasters, vehicles, tools, test kits and computers.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Places inside places",
       "what": "Keeps where things live as sites, areas, spots and vehicles, and lists everything inside a place and the places within it.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Status and who has it",
       "what": "Marks a thing in service, out of service, in repair, lost or retired, and who looks after it.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Parts",
       "what": "Lets a thing be part of another, like burrs inside a grinder.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Sensor link",
       "what": "Links a thing to its Hoq Sensor feed.",
       "status": "beta",
       "verified": "2026-10-11"
      }
     ]
    },
    {
     "area": "Story",
     "rows": [
      {
       "name": "A story per thing",
       "what": "Writes every move, status change, hand-off, tag, service and check-out onto the thing's own timeline.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Log something",
       "what": "Lets staff add a note, service, repair, inspection or reading, dated now or earlier.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Sent once from a phone",
       "what": "Records a log sent twice by a flaky phone only once.",
       "status": "beta",
       "verified": "2026-10-11"
      }
     ]
    },
    {
     "area": "Tags",
     "rows": [
      {
       "name": "Sheets of tags",
       "what": "Makes a printable sheet of QR tags not yet on anything.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Put a tag on by scanning",
       "what": "Scanning a blank tag offers to put it on something new or something you already have.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Public tag page",
       "what": "Anyone who scans a tag sees what it is and where it belongs, without signing in.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Report a problem from the tag",
       "what": "Lets anyone send a note from the tag onto the thing's story, five an hour at most.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Scan in the app",
       "what": "Reads a tag with the camera where the browser can, or by typing the code under the square.",
       "status": "beta",
       "verified": "2026-10-11"
      }
     ]
    },
    {
     "area": "Maintenance",
     "rows": [
      {
       "name": "Plans with steps",
       "what": "Keeps what each thing needs and how often, with steps to tick off.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Due by your own date",
       "what": "Lists what is late and what is coming up, counted in the company's time zone.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Done, with the steps missed",
       "what": "Marking work done writes it to the story, says which steps were skipped and sets the next date from the day it was done.",
       "status": "beta",
       "verified": "2026-10-11"
      }
     ]
    },
    {
     "area": "Check-out",
     "rows": [
      {
       "name": "Check out and in",
       "what": "Records who took a thing and when it is due back, one person at a time.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Who has what",
       "what": "Lists everything that is out and what is late coming back.",
       "status": "beta",
       "verified": "2026-10-11"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 19,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "UpKeep Essential",
      "url": "https://upkeep.com/pricing/"
     },
     {
      "name": "Asset Panda",
      "url": "https://www.assetpanda.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "$24 per user per month",
       "Quote only"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://www.assetpanda.com/pricing/"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "No public price yet",
      "them": [
       "No; free view-only and requester seats",
       "No"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://www.assetpanda.com/pricing/"
      ]
     },
     {
      "label": "Public problem reports",
      "hoq": "Anyone who scans a tag, no sign-in",
      "them": [
       "Free requester seats",
       "Not published"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://www.assetpanda.com/pricing/"
      ]
     },
     {
      "label": "Offline on phone",
      "hoq": "No",
      "them": [
       "Professional plan and up",
       "Yes"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://prohelp.assetpanda.com/mobile-app/mobile-offline-mode"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API with a scoped key",
      "them": [
       "Enterprise only",
       "Yes, admins only"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://help.assetpanda.com/API_Configuration.html"
      ]
     },
     {
      "label": "Export",
      "hoq": "No export from the app yet; the file is in your drive",
      "them": [
       "PDF and CSV listed, tier unclear",
       "CSV or Excel"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://www.assetpanda.com/solutions/fixed-asset-tracking/"
      ]
     },
     {
      "label": "Work orders",
      "hoq": "Maintenance plans with steps; no work orders",
      "them": [
       "Unlimited work orders",
       "Not published"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://www.assetpanda.com/pricing/"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage",
      "them": [
       "Vendor cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://upkeep.com/pricing/",
       "https://www.assetpanda.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "atrium",
   "name": "Hoq Mail",
   "status": "live",
   "url": "https://mail.hoq.app",
   "line": "Mail, calendar and contacts in the browser, for every mailbox you have.",
   "facts": [
    {
     "label": "Sign-in",
     "value": "Hoq ID single sign-on. Hoq ID holds the mailbox credential; the browser gets a 15-minute token."
    },
    {
     "label": "Mailboxes per person",
     "value": "Several. Each linked mailbox is opened by its own link id, so two tabs can show two mailboxes."
    },
    {
     "label": "Which servers",
     "value": "Hoq Email mailboxes in one click, or any JMAP server with a password."
    },
    {
     "label": "Protocol",
     "value": "JMAP from the browser to the mail server, with live updates pushed to the open page."
    },
    {
     "label": "End-to-end encryption",
     "value": "PGP (OpenPGP.js) and S/MIME in the browser. Keys kept in the browser, wrapped with a passphrase stretched by 600,000 PBKDF2 rounds."
    },
    {
     "label": "Filters",
     "value": "Rules are saved as Sieve scripts on your mail server, so they run even when the app is closed."
    },
    {
     "label": "Calendar",
     "value": "Month, week, day and agenda views, repeating events, sharing a calendar with other people, and .ics import and export."
    },
    {
     "label": "Deleted mail",
     "value": "Recover deleted mail from Settings; it returns to the Inbox. Kept 30 days on paid plans."
    },
    {
     "label": "Page security",
     "value": "Every inline script carries a per-request nonce; the page allows no unsafe inline code."
    }
   ],
   "figures": [
    {
     "value": "15 min",
     "label": "life of the token the browser holds instead of a password"
    },
    {
     "value": "7",
     "label": "actions you can put on a swipe, from archive to snooze"
    },
    {
     "value": "4",
     "label": "calendar views: month, week, day, agenda"
    },
    {
     "value": "4",
     "label": "appearance presets: Default, Roomy, Compact, Focus"
    }
   ],
   "features": [
    {
     "area": "Inbox",
     "rows": [
      {
       "name": "Conversation view",
       "what": "Shows a thread as stacked cards with the newest open and older messages folded to one line.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Two layouts",
       "what": "Choose a single-line list or a side-by-side reading pane.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Undo",
       "what": "Puts a message back after archive, delete or spam from the notice at the bottom.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Snooze",
       "what": "Hides a message until a time you pick, then brings it back to the Inbox.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Labels and folders",
       "what": "Create, rename, nest and colour folders and labels.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bulk actions",
       "what": "Select many messages and archive, delete, mark read, star, label or move them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Swipe actions",
       "what": "Set what a swipe left or right does on a phone.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Keyboard",
       "what": "Moves through the list and acts on the selected message from the keyboard.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Search",
       "what": "Searches the mailbox on the server and shows previews before opening a message.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Writing",
     "rows": [
      {
       "name": "Compose window",
       "what": "Writes in a docked window you can minimise or open full screen, with drafts saved to the server.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Inline reply",
       "what": "Replies inside the thread with bold, italic, lists and links.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Address suggestions",
       "what": "Suggests recipients from your contacts as you type.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "PGP and S/MIME",
       "what": "Encrypts, signs, decrypts and verifies in the browser with keys you import.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Settings",
     "rows": [
      {
       "name": "Filters",
       "what": "Builds rules that file, label or forward mail, stored as Sieve on the server.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vacation reply",
       "what": "Sends an automatic reply while you are away.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Forwarding",
       "what": "Forwards your mail to another address.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Send as",
       "what": "Sends from an outside address after you prove you own it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Mail apps",
       "what": "Makes a separate password for each mail app on a phone or computer.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recover deleted mail",
       "what": "Lists purged mail still kept and puts any of it back in the Inbox.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Appearance",
       "what": "Sets density, reading pane, list style and four presets.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Calendar and contacts",
     "rows": [
      {
       "name": "Calendar views",
       "what": "Month, week, day and agenda, with quick create and full event editing.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Repeating events",
       "what": "Creates and edits events that repeat.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Calendar sharing",
       "what": "Shares a calendar with other people and stops sharing it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": ".ics import and export",
       "what": "Brings events in from an .ics file and saves them out to one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Contacts",
       "what": "Keeps people in several address books, with search and editing.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 25,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Gmail (Google Workspace Business Starter)",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Fastmail Standard",
      "url": "https://www.fastmail.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "Not published",
      "them": [
       "$7.00",
       "$5 paid yearly, $6 monthly"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "PGP in the web app",
      "hoq": "Yes, keys stay in your browser",
      "them": [
       "not published",
       "No, by design"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.fastmail.com/blog/why-we-dont-offer-pgp/"
      ]
     },
     {
      "label": "S/MIME in the web app",
      "hoq": "Yes, keys stay in your browser",
      "them": [
       "Hosted S/MIME on Enterprise Plus and Education editions",
       "No, use a third-party app"
      ],
      "sources": [
       "https://knowledge.workspace.google.com/admin/gmail/advanced/hosted-s-mime-faq",
       "https://www.fastmail.com/blog/why-we-dont-offer-pgp/"
      ]
     },
     {
      "label": "Open mailboxes on other providers' servers",
      "hoq": "Any JMAP server, by password",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "Protocol behind the web app",
      "hoq": "JMAP",
      "them": [
       "not published",
       "JMAP"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "Native phone apps",
      "hoq": "None; installable web app",
      "them": [
       "Yes",
       "Yes"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.fastmail.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "blend",
   "name": "Hoq Blend",
   "status": "live",
   "url": "https://blend.hoq.app",
   "line": "Recipes, sizes and label words for every product, with every version kept.",
   "facts": [
    {
     "label": "Where your products live",
     "value": "One file per company in the owner's Hoq Storage drive."
    },
    {
     "label": "Recipe history",
     "value": "Every version of a recipe is kept with what changed. Label words keep every earlier wording too."
    },
    {
     "label": "Roast target on a coffee recipe",
     "value": "Roast level, target Agtron, development and drop temperature."
    },
    {
     "label": "Shares and money",
     "value": "Shares are stored as whole basis points and prices as whole cents, so totals never drift by rounding."
    },
    {
     "label": "Inventory link",
     "value": "A read-only key issued through Hoq ID. Name matches are only proposed; you confirm each link."
    },
    {
     "label": "Mixing station pairing",
     "value": "A six-digit code shown on the screen, valid for 15 minutes. A paired screen can read recipes and change nothing."
    },
    {
     "label": "AI in the Studio tab",
     "value": "Names, tasting story, label art and songs are made through Hoq Intelligence and billed to the signed-in person. Art and songs are saved in the company drive."
    }
   ],
   "figures": [
    {
     "value": "15 min",
     "label": "life of a screen pairing code"
    },
    {
     "value": "4",
     "label": "of your own pictures can be mixed into one piece of label art"
    },
    {
     "value": "30 s",
     "label": "song clip per blend, or a full song"
    }
   ],
   "features": [
    {
     "area": "Products",
     "rows": [
      {
       "name": "Products",
       "what": "Keeps each product a business sells, coffee, tea, spice or anything else, with a short code of its own.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Recipes with versions",
       "what": "Writes down what goes into a product and in what share, and keeps every earlier version with what changed.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Shares that add up",
       "what": "Refuses a recipe whose shares are well off 100%, and evens out a recipe that is a hair off.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "The roast it aims at",
       "what": "Records the roast level, target Agtron, development and drop temperature a coffee recipe aims at; tea and spice have none.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "On sale, draft, archived",
       "what": "Puts a product on sale only once it has a recipe and, for coffee, a roast to aim at.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Sizes",
       "what": "Keeps the bags and tins products sell in, with net weight, price and UPC, and a default size per product.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Words on the label",
       "what": "Keeps a product's description, tasting notes, story, origin line, brew guide, claims and art, with every earlier wording.",
       "status": "shipped",
       "verified": "2026-10-10"
      }
     ]
    },
    {
     "area": "Import",
     "rows": [
      {
       "name": "Import from Shop Manager",
       "what": "Brings house blends, drafts and package types across from Shop Manager, showing what would change first, and leaves catalog roast variants behind unless asked.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Safe to repeat",
       "what": "Running the import again changes nothing, and a blend changed in Shop Manager comes across as a new version.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Sealed shop key",
       "what": "Keeps the Shop Manager API key sealed and only ever calls public shop addresses.",
       "status": "shipped",
       "verified": "2026-10-10"
      }
     ]
    },
    {
     "area": "Inventory",
     "rows": [
      {
       "name": "Connect Hoq Inventory",
       "what": "Connects a company to its Hoq Inventory with a read-only key from Hoq ID, so nobody copies a key by hand.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Ingredients linked to items",
       "what": "Links each ingredient to its inventory item once, after you check the matches Blend finds by name.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Stock on the recipe",
       "what": "Shows each ingredient's inventory item and how much is on hand on the recipe, opening the item in Inventory.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Choose from inventory",
       "what": "Makes the recipe editor pick ingredients from the inventory, so a recipe cannot name something you do not stock.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Links survive imports",
       "what": "Keeps an ingredient's link when a newer recipe for it comes across from Shop Manager.",
       "status": "shipped",
       "verified": "2026-10-10"
      }
     ]
    },
    {
     "area": "Mixing station",
     "rows": [
      {
       "name": "Pair a screen",
       "what": "Pairs a wall screen or tablet to one company with a six-digit code that runs out after 15 minutes, named and unpaired from Settings.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Pair in one tap from a station",
       "what": "A pairing page shown as a tab of a Hoq Station gives the station a Pair link that opens Settings with the code filled in, after sign-in if needed and after picking a company when you run several.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "What goes in",
       "what": "Shows each recipe's ingredients and their weights for a bag size times a count, the recipe batch or any weight typed in, with the version it comes from.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Tick off as you add",
       "what": "Ticks each ingredient off as it goes in, keeps the batch fixed while mixing and remembers progress through a reload.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Look only",
       "what": "A screen can read recipes of its own company and nothing else; it changes nothing.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "A tab on a Hoq Station",
       "what": "The pairing page and the mixing station can be shown inside a Hoq Station, which stays on the tab while a mix is part done (until ten minutes pass without a tick) and refreshes the recipes when the tab comes back into view.",
       "status": "beta",
       "verified": "2026-10-13"
      }
     ]
    },
    {
     "area": "Account",
     "rows": [
      {
       "name": "Your own file",
       "what": "Keeps each company's products in one file in the owner's Hoq Storage drive.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Sign in with Hoq ID",
       "what": "Uses a Hoq account and its organization for access.",
       "status": "shipped",
       "verified": "2026-10-10"
      }
     ]
    },
    {
     "area": "Studio",
     "rows": [
      {
       "name": "Studio shelf from Inventory",
       "what": "Fills the Studio's shelf with the company's inventory coffees and teas, their tasting facts and stock.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Bench and profile",
       "what": "Mixes a blend by share or weight, with a tasting profile and notes that follow the roast you aim at.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Drafts and history",
       "what": "Saves a blend as you work, keeps snapshots and renames as versions, and warns when another tab changed it.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Names and story",
       "what": "Writes names and a tasting story through Hoq Intelligence, from a prompt you can see and change.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Label art",
       "what": "Makes a picture through Hoq Intelligence, mixing in up to four of your pictures if you like, or takes your own, and keeps it in the company drive.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Publish from the Studio",
       "what": "Publishes a blend as a new product or a new version, naming its inventory items, with notes, story and art.",
       "status": "shipped",
       "verified": "2026-10-10"
      },
      {
       "name": "Songs",
       "what": "Writes a 30-second clip or a full song for a blend through Hoq Intelligence and keeps it, with its lyrics, in the company drive.",
       "status": "shipped",
       "verified": "2026-10-10"
      }
     ]
    }
   ],
   "shipped": 24,
   "beta": 6,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Cropster Roast (blend profiles)",
      "url": "https://www.cropster.com/products/roast/features/"
     },
     {
      "name": "A spreadsheet (Google Sheets)",
      "url": "https://support.google.com/docs/answer/190843"
     }
    ],
    "rows": [
     {
      "label": "Pre-roast and post-roast blends",
      "hoq": "Recipes by share; pre-roast and post-roast are not modelled as separate kinds",
      "them": [
       "Both, each profile and green component handled separately",
       "Whatever you build by hand"
      ],
      "sources": [
       "https://www.cropster.com/products/roast/features/",
       "https://support.google.com/docs/answer/190843"
      ]
     },
     {
      "label": "Shares must add to 100%",
      "hoq": "Refused when well off, evened out when a hair off",
      "them": [
       "Post-roast blend components must total exactly 100%",
       "Only if you write the formula"
      ],
      "sources": [
       "https://help.cropster.com/en/knowledge/how-to-create-a-post-roast-blend",
       "https://support.google.com/docs/answer/190843"
      ]
     },
     {
      "label": "History of a recipe",
      "hoq": "Every version kept with what changed",
      "them": [
       "not published",
       "Version history of the whole file; restore or copy an earlier one"
      ],
      "sources": [
       "https://help.cropster.com/how-to-edit-a-post-roast-blend?kb_language=en_US",
       "https://support.google.com/docs/answer/190843"
      ]
     },
     {
      "label": "Green inventory deducted by a roast",
      "hoq": "Not in Blend. Stock lives in Hoq Inventory; Blend only reads it",
      "them": [
       "Creating a roast deducts the green weight from green inventory",
       "No"
      ],
      "sources": [
       "https://help.cropster.com/3290010",
       "https://support.google.com/docs/answer/190843"
      ]
     },
     {
      "label": "Label words, sizes and UPCs on the product",
      "hoq": "Yes, with every earlier wording kept",
      "them": [
       "not published",
       "Whatever you build by hand"
      ],
      "sources": [
       "https://www.cropster.com/products/roast/features/",
       "https://support.google.com/docs/answer/190843"
      ]
     },
     {
      "label": "Mixing screen at the bench",
      "hoq": "Paired tablet lists weights for a batch and ticks them off",
      "them": [
       "not published",
       "No"
      ],
      "sources": [
       "https://www.cropster.com/products/roast/features/",
       "https://support.google.com/docs/answer/190843"
      ]
     }
    ]
   }
  },
  {
   "key": "board",
   "name": "Hoq Board",
   "status": "live",
   "url": "https://board.hoq.app",
   "line": "Draw, lay out pages and prepare print files on one canvas.",
   "facts": [
    {
     "label": "Export formats",
     "value": "PNG, JPG, WebP and vector PDF for a page or the whole board; native Illustrator file per page."
    },
    {
     "label": "Import formats",
     "value": "PDF (one artboard per page), Illustrator and PDF pages as editable shapes and text, SVG as editable paths, images from file or clipboard."
    },
    {
     "label": "Where a board is kept",
     "value": "On Hoq, with a versioned .board copy saved into your own Hoq Storage drive."
    },
    {
     "label": "Print output",
     "value": "Bleed and crop marks, contour cut lines, and a print container with each spot color as a named channel."
    },
    {
     "label": "Page sizes",
     "value": "Artboards at preset sizes such as Letter, A4 or Instagram; rulers in pixels, inches, millimeters and other units."
    },
    {
     "label": "Fonts",
     "value": "50 font families hosted by Hoq."
    },
    {
     "label": "AI images",
     "value": "Image generation inside the board is paid from your own AI credit."
    },
    {
     "label": "Agent access",
     "value": "MCP server at POST /mcp/board for a Hoq ID key with scope board:use (edit) or board:read (read only)."
    },
    {
     "label": "Agent permissions",
     "value": "Per agent and per area (boards, content, comments): off, look, ask first, or change. Asks wait for your approval."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID. Board has no separate password."
    }
   ],
   "figures": [
    {
     "value": "50",
     "label": "font families hosted by Hoq"
    },
    {
     "value": "5",
     "label": "export formats: PNG, JPG, WebP, vector PDF, Illustrator"
    },
    {
     "value": "22",
     "label": "MCP tools an AI agent can use on your boards"
    },
    {
     "value": "4",
     "label": "agent levels per area: off, look, ask first, change"
    }
   ],
   "features": [
    {
     "area": "Boards",
     "rows": [
      {
       "name": "Your boards",
       "what": "Shows all your boards on a home grid with a real picture of each one.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Board details",
       "what": "Opens a side panel on any board with its details, recent activity and a link to its own page.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Saved in your drive",
       "what": "Keeps a versioned copy of each board in your Hoq Storage drive.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Version history",
       "what": "Saves named versions of a board and restores any of them, saving the current state first.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Undo and redo",
       "what": "Steps back and forward through your recent edits.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Board templates",
       "what": "Starts a new board from a saved board template.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Drawing",
     "rows": [
      {
       "name": "Shapes and lines",
       "what": "Draws rectangles, ellipses, lines and arrows, and a shape can hold its own text.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Pen and pencil",
       "what": "Draws precise curves with the pen or freehand strokes with the pencil.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Edit points",
       "what": "Moves the individual points and curves of any path.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Text",
       "what": "Adds text that runs freely or wraps inside a box.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Connectors",
       "what": "Links two objects with a straight, elbow or curved line that follows them when they move.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Images",
       "what": "Places images from a file or straight from the clipboard.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Image crop",
       "what": "Crops an image to a circle or rounded rectangle.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Generate images",
       "what": "Creates images from a description inside the board, paid from your own AI credit.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Generate vector art",
       "what": "Turns a description into editable vector artwork.",
       "status": "beta",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Layout",
     "rows": [
      {
       "name": "Artboards",
       "what": "Lays out pages at preset sizes such as Letter, A4 or Instagram and manages them from an Artboards panel.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Arrange artboards",
       "what": "Arranges every page in a grid, row or column with a live preview before you apply it.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Page guides",
       "what": "Shows margins, columns, rows and fold lines on a page.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Master pages",
       "what": "Shares common content across pages from a master page.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Grid and smart guides",
       "what": "Snaps objects to a grid and to other objects' edges and centers while you move them.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Rulers and units",
       "what": "Shows rulers and lets you work in pixels, inches, millimeters and other units without changing the drawing.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Align and distribute",
       "what": "Lines objects up and spaces them evenly.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Auto layout",
       "what": "Stacks a frame's contents in a row or column with set gaps and padding.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Components",
       "what": "Turns a frame into a reusable component whose copies can each be changed on their own.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Layers",
       "what": "Organizes objects in a layer tree with folders, hiding and locking.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Isolation mode",
       "what": "Lets you work inside a group or frame while everything else steps back.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Movable panels",
       "what": "Moves the side panels between the left and right and reorders them.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Vector and color",
     "rows": [
      {
       "name": "Combine shapes",
       "what": "Unites, subtracts, intersects or excludes overlapping shapes.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Multiple fills and strokes",
       "what": "Stacks several fills and strokes on one shape.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Gradients and patterns",
       "what": "Fills shapes with gradients or repeating pattern tiles.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Envelope distort",
       "what": "Bends shapes and text with a warp or a mesh.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Clipping masks",
       "what": "Uses one shape to clip the objects beneath it.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Text on a path",
       "what": "Runs text along a curve.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Create outlines",
       "what": "Turns text into editable vector shapes.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Graphic styles",
       "what": "Saves a look and applies it to other objects.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Repeat copies",
       "what": "Makes evenly spaced or rotated copies in one step.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Swatches",
       "what": "Keeps named colors that update everywhere they are used.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Brand kit",
       "what": "Puts your brand colors in every color picker.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Eyedropper",
       "what": "Picks a color from anything on the board.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Fonts",
       "what": "Offers 50 font families hosted by Hoq.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Linked text frames",
       "what": "Flows one story across several text boxes and edits it in a story editor.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Plans and print",
     "rows": [
      {
       "name": "Import PDF plans",
       "what": "Imports a PDF as one artboard per page, with a progress bar and a stop button.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Reference underlays",
       "what": "Locks an image underneath your drawing to trace over.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Scale and measure",
       "what": "Sets a page's real-world scale from a preset or two points, then measures real lengths.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Find rooms",
       "what": "Finds the rooms on an imported floor plan.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Bleed and crop marks",
       "what": "Adds bleed and crop marks to printed pages.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Contour cut lines",
       "what": "Adds a cut line around artwork for printers and cutters.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Merge from CSV",
       "what": "Makes one page per row of a spreadsheet from a template page.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Spec sheet",
       "what": "Produces a spec sheet for a board as a page or a PDF.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Import and export",
     "rows": [
      {
       "name": "Export images and PDF",
       "what": "Exports a page or the whole board as PNG, JPG, WebP or a vector PDF.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Illustrator export",
       "what": "Exports a page as a native Illustrator file.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Illustrator import",
       "what": "Opens an Illustrator or PDF page as editable shapes and text instead of a flat picture.",
       "status": "shipped",
       "verified": "2026-10-09"
      },
      {
       "name": "Tab stops",
       "what": "Keeps a priced list's columns in place: imported text carries Illustrator-style tab stops, and the properties panel edits them (left, right, center, decimal).",
       "status": "shipped",
       "verified": "2026-10-09"
      },
      {
       "name": "SVG import",
       "what": "Brings SVG files in as editable paths.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Print container",
       "what": "Exports one file carrying the artwork plus every spot color as its own named channel, for printers and film tools.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Working together",
     "rows": [
      {
       "name": "Live sync",
       "what": "Shows changes from your other tabs and from agents as they happen.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Cursors and selections",
       "what": "Shows the pointer and selection from your other open tabs of the same board.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Comments",
       "what": "Adds comment threads to any object that you can reply to and resolve.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Board chat",
       "what": "Keeps a chat thread about the whole board.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Activity feed",
       "what": "Shows agent runs and background jobs for a board in one feed.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "AI and agents",
     "rows": [
      {
       "name": "Canvas assistant",
       "what": "Makes changes on the board when you ask in plain language.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Magic Write",
       "what": "Writes or rewrites selected text with AI, and one undo puts it back.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Agent access",
       "what": "Gives an AI agent its own token so it can read and edit a board and answer when mentioned in comments.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Board description for agents",
       "what": "Lets an agent read a board as structured data with an optional preview image.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Agent guide",
       "what": "Publishes a guide explaining how agents work with boards.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Boards by name",
       "what": "Lets an agent find a board by its name and address any board by name or uid instead of a number.",
       "status": "shipped",
       "verified": "2026-10-07"
      },
      {
       "name": "Grimaste agents",
       "what": "Lets a Grimaste agent use Board through MCP tools with its own labelled token, read-only or editing, revocable in the Agents sheet.",
       "status": "shipped",
       "verified": "2026-10-09"
      },
      {
       "name": "Agent levels per area",
       "what": "Lets the owner set each Grimaste agent to off, look, ask first or change for boards, content and comments from the Agents sheet.",
       "status": "shipped",
       "verified": "2026-10-09"
      },
      {
       "name": "Asks the owner approves",
       "what": "Records a change an agent proposes in an \"ask first\" area, shows it in the Agents sheet with Approve and Turn down, runs it as the agent once approved, and tells the agent the answer.",
       "status": "shipped",
       "verified": "2026-10-09"
      }
     ]
    },
    {
     "area": "Signing in",
     "rows": [
      {
       "name": "Hoq ID sign-in",
       "what": "Signs you in with your Hoq ID, with no separate Board password.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Sign out",
       "what": "Signs you out of Board and Hoq ID together.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "App switcher",
       "what": "Jumps to your other Hoq apps from the menu.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    }
   ],
   "shipped": 71,
   "beta": 1,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Miro",
      "url": "https://miro.com/pricing/"
     },
     {
      "name": "FigJam",
      "url": "https://www.figma.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month, cheapest paid tier",
      "hoq": "Not published on board.hoq.app",
      "them": [
       "$8 per member, billed yearly (Starter)",
       "$3 per Collab seat (Professional)"
      ],
      "sources": [
       "https://miro.com/pricing/",
       "https://www.figma.com/pricing/"
      ]
     },
     {
      "label": "Export formats",
      "hoq": "PNG, JPG, WebP, vector PDF, Illustrator",
      "them": [
       "High-resolution JPG or PDF on Starter; low-res only on Free",
       "PNG, JPG, PDF, CSV (sticky notes only)"
      ],
      "sources": [
       "https://miro.com/pricing/",
       "https://www.figma.com/pricing/"
      ]
     },
     {
      "label": "Print preparation (bleed, crop marks, cut lines, spot color channels)",
      "hoq": "Built in",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://miro.com/pricing/",
       "https://www.figma.com/pricing/"
      ]
     },
     {
      "label": "Where data is stored",
      "hoq": "On Hoq, plus a versioned copy in your own Hoq Storage drive",
      "them": [
       "EU on Free, Starter and Business; EU, US, Australia or Japan on Enterprise",
       "not published"
      ],
      "sources": [
       "https://miro.com/pricing/",
       "https://www.figma.com/pricing/"
      ]
     },
     {
      "label": "API and AI agents",
      "hoq": "MCP server with 22 tools; per-area agent permissions with approvals",
      "them": [
       "REST APIs and Web SDKs; MCP calls capped at 100 to 10,000 a day by plan",
       "REST APIs, rate limits vary by seat and plan"
      ],
      "sources": [
       "https://miro.com/pricing/",
       "https://www.figma.com/pricing/"
      ]
     },
     {
      "label": "Largest file you can upload to a board",
      "hoq": "not published",
      "them": [
       "30 MB",
       "not published"
      ],
      "sources": [
       "https://help.miro.com/hc/articles/360017731613",
       "https://www.figma.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "books",
   "name": "Hoq Books",
   "status": "beta",
   "url": "https://books.hoq.app",
   "line": "Double-entry books for one company: invoices, bills, bank feeds and reports.",
   "facts": [
    {
     "label": "Where your books live",
     "value": "One .books file per company in the owner's Hoq Storage."
    },
    {
     "label": "Saving",
     "value": "Changes ship to your drive every 15 seconds, with a full save daily."
    },
    {
     "label": "Versions kept",
     "value": "The newest 20 versions of each books file stay in your drive."
    },
    {
     "label": "Bank import",
     "value": "OFX and CSV statements, with bank rules and reconciliation."
    },
    {
     "label": "Reports",
     "value": "Profit and loss, balance sheet, trial balance, cash flow, general ledger, AR and AP aging."
    },
    {
     "label": "Tax forms",
     "value": "1099 figures for the year, with a threshold you set."
    },
    {
     "label": "Tamper evidence",
     "value": "Posted journal entries are linked in a hash chain that an integrity check walks."
    },
    {
     "label": "Entries from other apps",
     "value": "Hoq Crew payroll and Hoq Service invoices post as balanced entries; a retry never posts twice; each app can be held for review."
    },
    {
     "label": "Attachments",
     "value": "Receipts and documents are kept beside the books in your drive, or inside the books file, per company."
    },
    {
     "label": "AI agents",
     "value": "Connect Claude Code, Cursor or any MCP client with a key; set each area to off, look, ask first or change."
    }
   ],
   "figures": [
    {
     "value": "15 s",
     "label": "between saves of your changes to your drive"
    },
    {
     "value": "20",
     "label": "versions of each books file kept in your drive"
    },
    {
     "value": "7",
     "label": "standard reports, from profit and loss to aging"
    }
   ],
   "features": [
    {
     "area": "Money in",
     "rows": [
      {
       "name": "Invoices",
       "what": "Create, send and track invoices.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Payments received",
       "what": "Record payments against invoices, or money in without one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Credit memos",
       "what": "Issue credit memos to customers.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Money out",
     "rows": [
      {
       "name": "Bills",
       "what": "Enter and pay bills from vendors.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Purchase orders",
       "what": "Raise purchase orders.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vendor credits",
       "what": "Record credits from vendors.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Check printing",
       "what": "Preview and print checks.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Banking",
     "rows": [
      {
       "name": "Statement import",
       "what": "Load OFX or CSV statements; lines already loaded are skipped.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bank rules",
       "what": "Sort incoming lines to accounts by rule.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reconcile",
       "what": "Reconcile each account to its statement.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Deposits and e-payments",
       "what": "Group receipts into deposits and record electronic payments.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Accounting",
     "rows": [
      {
       "name": "Chart of accounts and journal",
       "what": "Keep your own chart of accounts and post journal entries.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recurring entries",
       "what": "Repeat entries on a schedule.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Fixed assets",
       "what": "Keep an asset register.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Year-end close",
       "what": "Close the year.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hash-chained journal",
       "what": "Posted entries are linked by hash so changes can be detected.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Reports",
     "rows": [
      {
       "name": "Financial statements",
       "what": "Profit and loss, balance sheet, trial balance and cash flow.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Aging",
       "what": "Receivable and payable aging.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "General ledger",
       "what": "The full ledger, downloadable as CSV.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "1099 figures",
       "what": "Vendor totals for 1099 reporting.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Connected",
     "rows": [
      {
       "name": "Entries from Hoq apps",
       "what": "Crew and Service post balanced entries; a retry returns the first entry; hold any app for review.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Agent keys",
       "what": "One key for Claude Code, Cursor or any MCP client, across the companies you choose.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Per-area agent rules",
       "what": "Set each agent to off, look, ask first or change, area by area.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 23,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "QuickBooks Online Simple Start",
      "url": "https://quickbooks.intuit.com/pricing/"
     },
     {
      "name": "Xero Early",
      "url": "https://www.xero.com/us/pricing-plans/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "$38 per month list (1 user)",
       "$27 per month"
      ],
      "sources": [
       "https://quickbooks.intuit.com/pricing/",
       "https://www.xero.com/us/pricing-plans/"
      ]
     },
     {
      "label": "Users",
      "hoq": "Owners and admins of the company, through Hoq ID",
      "them": [
       "1 user plus 2 accountants",
       "No per-user fees"
      ],
      "sources": [
       "https://quickbooks.intuit.com/pricing/",
       "https://www.xero.com/us/pricing-plans/"
      ]
     },
     {
      "label": "Invoice limit on cheapest tier",
      "hoq": "None set",
      "them": [
       "None stated",
       "20 invoices and 5 bills a month"
      ],
      "sources": [
       "https://quickbooks.intuit.com/pricing/",
       "https://www.xero.com/us/pricing-plans/"
      ]
     },
     {
      "label": "Export",
      "hoq": "The books file and 20 versions are in your drive; general ledger as CSV",
      "them": [
       "Reports and lists as zipped Excel; no single full export",
       "CSV of invoices, bills, contacts, chart of accounts and more"
      ],
      "sources": [
       "https://quickbooks.intuit.com/learn-support/en-us/help-article/list-management/export-reports-lists-data-quickbooks-online/L1xleDrLp_US_en_US",
       "https://central.xero.com/0/article/Export-invoices-and-bills"
      ]
     },
     {
      "label": "API",
      "hoq": "MCP and JSON door for agents and Hoq apps",
      "them": [
       "Intuit Accounting API",
       "Xero Accounting API"
      ],
      "sources": [
       "https://developer.intuit.com/",
       "https://developer.xero.com/documentation/api/accounting/overview"
      ]
     },
     {
      "label": "Payroll",
      "hoq": "Posts from Hoq Crew; no payroll run",
      "them": [
       "Payroll add-on",
       "Payroll powered by Gusto, $36 a month plus $6 per person"
      ],
      "sources": [
       "https://quickbooks.intuit.com/pricing/",
       "https://www.xero.com/us/pricing-plans/"
      ]
     },
     {
      "label": "Bank feeds",
      "hoq": "OFX and CSV statement import; no live bank connection",
      "them": [
       "Connected bank feeds",
       "Connected bank feeds"
      ],
      "sources": [
       "https://quickbooks.intuit.com/pricing/",
       "https://www.xero.com/us/pricing-plans/"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage",
      "them": [
       "Vendor cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://quickbooks.intuit.com/pricing/",
       "https://www.xero.com/us/pricing-plans/"
      ]
     }
    ]
   }
  },
  {
   "key": "capture",
   "name": "Hoq Capture",
   "status": "live",
   "url": "https://capture.hoq.app",
   "line": "Scan receipts and pages to PDF in your browser. Nothing to install.",
   "facts": [
    {
     "label": "Where it runs",
     "value": "In the browser tab, on your device. Edge detection, straightening, filters and OCR all run locally."
    },
    {
     "label": "Install",
     "value": "None. It is a web page you can add to your Home Screen."
    },
    {
     "label": "Export formats",
     "value": "PDF (optionally searchable), a single JPG, or a zip of JPGs for several pages."
    },
    {
     "label": "Searchable PDF",
     "value": "On-device OCR writes an invisible text layer. The text layer holds Latin (WinAnsi) characters only."
    },
    {
     "label": "OCR download",
     "value": "About 16 MB of model weights, fetched the first time you ask for searchable text."
    },
    {
     "label": "Export sizes",
     "value": "Original, medium (2200 px long edge) or small (1400 px long edge)."
    },
    {
     "label": "Page filters",
     "value": "Original, color, gray and black and white. Filters can be changed later without retaking."
    },
    {
     "label": "Where pages wait",
     "value": "In your browser's IndexedDB on the device, so a backgrounded tab does not lose them."
    },
    {
     "label": "Saving to the cloud",
     "value": "Only when signed in with Hoq ID: the PDF goes to your Hoq Storage drive. Otherwise it downloads."
    },
    {
     "label": "Other input",
     "value": "Choose, drop or paste an existing image instead of using the camera."
    }
   ],
   "figures": [
    {
     "value": "30 KB",
     "label": "gzipped engine for edge finding, loaded with the page"
    },
    {
     "value": "6",
     "label": "frames grabbed per shot; the sharpest one is kept"
    },
    {
     "value": "3",
     "label": "export sizes: original, medium and small"
    },
    {
     "value": "0",
     "label": "bytes uploaded when you are not signed in"
    }
   ],
   "features": [
    {
     "area": "Camera",
     "rows": [
      {
       "name": "Live edge finding",
       "what": "Draws the page outline over the camera view about 12 times a second.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Auto-capture",
       "what": "Takes the shot once the outline has held steady for 8 frames.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Sharpest of a burst",
       "what": "Grabs 6 frames at the shutter and keeps the sharpest.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Torch",
       "what": "Turns on the phone light where the camera supports it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Learned corner model",
       "what": "When the classic detector misses, a small neural model loads and finds the corners.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Manual mode",
       "what": "Drag the corners yourself when no outline locks.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Pages",
     "rows": [
      {
       "name": "Reorder",
       "what": "Long-press a page in the strip and drag it to a new place.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Retake, rotate, delete",
       "what": "Fix one page without starting the stack again.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Filters",
       "what": "Original, color, gray or black and white, per page or for all pages.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Select several",
       "what": "Tick pages to rotate or delete them together.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Export",
     "rows": [
      {
       "name": "PDF",
       "what": "A multi-page PDF titled with the name you give it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Searchable text",
       "what": "On-device OCR adds an invisible text layer to the PDF.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "JPG and zip",
       "what": "One page exports as a JPG; several export as a zip of JPGs.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Save to Hoq Storage",
       "what": "Signed-in PDFs land in your drive instead of downloading.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 14,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Adobe Scan",
      "url": "https://www.adobe.com/acrobat/mobile/scanner-app.html"
     },
     {
      "name": "Genius Scan",
      "url": "https://thegrizzlylabs.com/genius-scan/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published",
      "them": [
       "Free app",
       "Free; Ultra $39.99 per year"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     },
     {
      "label": "Needs an app install",
      "hoq": "No, runs in a browser tab",
      "them": [
       "Yes, iOS 15+ or Android 8+",
       "Yes, mobile app"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     },
     {
      "label": "Searchable PDF",
      "hoq": "Yes, free, on-device",
      "them": [
       "Yes",
       "Yes, Ultra only, on-device"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     },
     {
      "label": "OCR languages",
      "hoq": "Latin characters only in the text layer",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     },
     {
      "label": "Export formats",
      "hoq": "PDF, JPG, zip of JPGs",
      "them": [
       "PDF, JPEG, Word",
       "PDF, PDF/A, encrypted PDF"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     },
     {
      "label": "Cloud destinations",
      "hoq": "Hoq Storage, or download",
      "them": [
       "Adobe account, Dropbox, Google Drive, local",
       "Dropbox, Box, Google Drive, OneDrive, WebDAV, FTP and more (Ultra)"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     },
     {
      "label": "Works on a laptop",
      "hoq": "Yes, same page with a webcam or an image",
      "them": [
       "Scans viewable in Acrobat web; no browser scanner described",
       "Web access with Ultra"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/mobile/scanner-app.html",
       "https://thegrizzlylabs.com/genius-scan/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "card",
   "name": "Hoq Card",
   "status": "live",
   "url": "https://card.hoq.app",
   "line": "A printed business card you write for the person you hand it to.",
   "facts": [
    {
     "label": "Card address",
     "value": "hoq.link/C/ plus an eight-character code made from 32 letters and digits that cannot be mistaken for each other."
    },
    {
     "label": "Card size",
     "value": "CR80, the standard credit-card size, with a 20 mm vector QR code."
    },
    {
     "label": "Contact file",
     "value": "vCard 3.0 at /c/<code>/contact.vcf, which a phone saves to its contacts."
    },
    {
     "label": "Opened tracking",
     "value": "Counts an open from a script on the page, so link previews and your own views are left out."
    },
    {
     "label": "Guessing protection",
     "value": "An address that asks for 10 codes that do not exist within 10 minutes, or 40 in a day, must wait before opening any card."
    },
    {
     "label": "Printing",
     "value": "Through your own Hoq Print, with a key that can only send print jobs. You choose the printer and can disconnect it."
    },
    {
     "label": "Your artwork",
     "value": "Upload PNG, JPEG or WebP, landscape or portrait; drag and size the QR spot, then check a sample PDF before printing."
    },
    {
     "label": "Where data lives",
     "value": "As objects in Hoq's own object storage. Card has no separate database."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID. There are no separate Card passwords."
    }
   ],
   "figures": [
    {
     "value": "8",
     "label": "characters in every card's code"
    },
    {
     "value": "50",
     "label": "new cards printed in one job"
    },
    {
     "value": "20 mm",
     "label": "vector QR code on each card"
    }
   ],
   "features": [
    {
     "area": "Cards",
     "rows": [
      {
       "name": "Card codes",
       "what": "Each printed card carries its own eight-character code and QR, `hoq.link/C/<code>`.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Claim by scanning",
       "what": "Scanning a blank card while signed in makes it yours and picks the profile it shows.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Profiles",
       "what": "Your name, title, company, phones, emails, links, address and a note, kept as a few profiles (work, shop, personal).",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Written for one person",
       "what": "Before handing a card over you write who it is for, a note and an offer; that card's page shows them.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Note that expires",
       "what": "A card's note can stop showing on a date, after which the card shows just your details.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "See it as they will",
       "what": "Shows the page exactly as the person you hand it to will see it.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Opened by them",
       "what": "Tells you when the person opened the card and on what kind of device; your own views and link previews do not count.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Guessing protection",
       "what": "An address that asks for ten card codes that don't exist within ten minutes, or forty in a day, is told to wait before it can open any card. Codes are eight characters from 32 that can't be mistaken for each other.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Save contact",
       "what": "The card page gives a contact file (vCard 3.0) a phone can save.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Retire a card",
       "what": "A retired card says it is no longer used.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Printing",
       "what": "Cards print on a business-card printer through Hoq Print, one card per page with the QR drawn as vector shapes.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Connect to Hoq Print",
       "what": "Connects Card to your own Hoq Print with a key that can only send print jobs, which you can disconnect; you choose the printer your cards go to.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Print new cards",
       "what": "Makes up to 50 new cards already yours with a chosen profile and sends them to your printer in one job.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Print one card",
       "what": "Sends a single card again from its page.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Your own artwork",
       "what": "Upload a picture for the card (landscape or portrait), drag and resize where its QR code goes, check a sample PDF, then print new cards or one card with it; each card gets its own QR on a white square in that spot.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    }
   ],
   "shipped": 10,
   "beta": 5,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Blinq",
      "url": "https://blinq.me/pricing"
     },
     {
      "name": "HiHello",
      "url": "https://www.hihello.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price for one person",
      "hoq": "Not published",
      "them": [
       "Premium: $9.99/mo monthly, $7.33/mo annually",
       "Professional: $8/mo monthly, $6/mo annually"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Team price",
      "hoq": "Not published",
      "them": [
       "Business: $6.99/user/mo monthly, $4.99 annually, 5 card minimum",
       "Business: $6/user/mo monthly, $5 annually, 5 to 100 users"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "Not published",
      "them": [
       "Free forever, 1 to 2 cards",
       "Personal: free, 2 cards"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Printed cards",
      "hoq": "Printed on your own card printer through Hoq Print; every card has its own code",
      "them": [
       "NFC cards sold separately; plan inclusion not stated",
       "NFC card programming from Professional"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Different message per recipient",
      "hoq": "Yes: note, offer and expiry written on each printed card",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Opened tracking",
      "hoq": "Per card, people only, with device type",
      "them": [
       "Card analytics listed",
       "Views, saves and leads from Professional"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Lead capture and CRM",
      "hoq": "Planned (details sent back into Hoq CRM)",
      "them": [
       "20+ native CRM integrations, Zapier and API",
       "Salesforce, HubSpot, Microsoft Dynamics on Business"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     },
     {
      "label": "Phone and wallet sharing",
      "hoq": "QR on the printed card and a vCard download",
      "them": [
       "not published",
       "QR, email, SMS, WhatsApp, Apple and Google Wallet"
      ],
      "sources": [
       "https://blinq.me/pricing",
       "https://www.hihello.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "chat",
   "name": "Hoq Chat",
   "status": "live",
   "url": "https://chat.hoq.app",
   "line": "Team chat where AI agents are members, with owners and hard limits.",
   "facts": [
    {
     "label": "Where a workspace lives",
     "value": "One file in the owner's Hoq Storage drive, with changes journaled and shipped as they happen."
    },
    {
     "label": "Export",
     "value": "The whole workspace as one JSON document: members, channels, threads, every message and reaction. On every plan."
    },
    {
     "label": "Import",
     "value": "Slack export files up to 100 MB."
    },
    {
     "label": "File uploads",
     "value": "Up to 25 MB per file, stored in Hoq Storage. PDFs, video and audio open in place."
    },
    {
     "label": "Huddles",
     "value": "Audio and screen share with screen audio, per channel or DM."
    },
    {
     "label": "Agent limits",
     "value": "10 wakes per conversation, depth 6, fan-out 2, 4 turns between two agents, 6 agent posts a minute. Each adjustable within fixed ranges."
    },
    {
     "label": "Guests and the agent's tools",
     "value": "When someone other than the owner wakes an agent, it runs with no tools and no memory."
    },
    {
     "label": "Apps and bots",
     "value": "Incoming webhooks (Slack JSON, ntfy, plain JSON), slash commands, bot tokens, and signed event delivery."
    },
    {
     "label": "Notifications",
     "value": "Web Push to browsers and an installable web app, plus an email digest."
    },
    {
     "label": "Search",
     "value": "Full-text search inside the workspace file, with in: and from: filters, accents ignored."
    }
   ],
   "figures": [
    {
     "value": "128",
     "label": "actions shared by the app, the JSON API and the MCP server"
    },
    {
     "value": "25 MB",
     "label": "largest file you can attach"
    },
    {
     "value": "10",
     "label": "agent wakes per conversation before it pauses for the owner"
    },
    {
     "value": "9",
     "label": "people in a group DM by default, up to 20"
    }
   ],
   "features": [
    {
     "area": "Conversations",
     "rows": [
      {
       "name": "Channels",
       "what": "Public or private channels you can convert between, archive and rename.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Direct and group messages",
       "what": "Opens a DM or group DM with the people you pick.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Threads",
       "what": "Replies in a thread you can rename, resolve and follow.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Forward",
       "what": "Forwards a message to a channel or DM, refused when the new place is wider than the old one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Edit with history",
       "what": "Edits keep the earlier versions; deletes follow channel roles.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reactions and custom emoji",
       "what": "Reacts with any emoji, including your workspace's own.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Mark unread",
       "what": "Marks a message and everything after it unread again.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Typing",
       "what": "Shows who is typing, and shows an agent as thinking.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Saved, pins, reminders, scheduled send",
       "what": "Keeps messages for later, pins them, reminds you, and sends at a set time.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Agents as members",
       "what": "An agent joins a workspace with an owner, and its owner decides which channels it is in.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Wake rules and budgets",
       "what": "The server decides when an agent runs and pauses a chain of agents at its limits.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Approval cards",
       "what": "An agent asks; only its owner can answer.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tasks for agents",
       "what": "Hands work to an agent with /task and tracks its state.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Who can read this",
       "what": "Shows which agents can read a channel, worked out by the server.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "What did I miss",
       "what": "Summarises what happened while you were away; the summary is not stored.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Huddles, canvases, workflows",
     "rows": [
      {
       "name": "Huddles",
       "what": "Audio and screen share in any channel or DM.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Canvas",
       "what": "One versioned markdown page per channel; a stale save is refused.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Workflows",
       "what": "Runs steps when a message, reaction, new member or schedule triggers them.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Apps",
     "rows": [
      {
       "name": "Incoming webhooks",
       "what": "Posts from any tool that can send an HTTP request, in Slack, ntfy or plain JSON.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Slash commands and cards",
       "what": "Apps answer commands and post cards with buttons and selects.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "MCP server",
       "what": "Gives an AI tool the same actions a person has, under its own key.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Admin",
     "rows": [
      {
       "name": "Shared channels",
       "what": "Shares a channel with another company's workspace by one-time code.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Retention",
       "what": "Deletes messages after a set time, per workspace, per channel, or for your own messages.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Roles and guests",
       "what": "Owners, admins, members and guests, invited by email.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Audit log",
       "what": "Records admin actions in the workspace.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Close a workspace",
       "what": "Takes a closing backup, stops sharing, and archives the workspace; the file stays in the drive.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Slack import",
       "what": "Brings in history from a Slack export.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 27,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Slack Pro",
      "url": "https://slack.com/pricing"
     },
     {
      "name": "Microsoft Teams Essentials",
      "url": "https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-business-options"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "Not published",
      "them": [
       "$7.25 paid yearly, $8.75 monthly",
       "$4.00 paid yearly"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-business-options"
      ]
     },
     {
      "label": "Message history on the free tier",
      "hoq": "Kept until your retention rule removes it",
      "them": [
       "90 days",
       "not published"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-business-options"
      ]
     },
     {
      "label": "Export of all messages, private included",
      "hoq": "Every plan",
      "them": [
       "Higher tiers only",
       "not published"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-business-options"
      ]
     },
     {
      "label": "Largest file",
      "hoq": "25 MB",
      "them": [
       "1 GB",
       "not published"
      ],
      "sources": [
       "https://slack.com/help/articles/201330736-Add-files-to-Slack",
       "https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-business-options"
      ]
     },
     {
      "label": "File storage",
      "hoq": "Your Hoq Storage drive",
      "them": [
       "not published",
       "10 GB per user"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-teams/essentials"
      ]
     },
     {
      "label": "Calls",
      "hoq": "Audio and screen share huddles, no video",
      "them": [
       "Group huddles",
       "Video meetings, up to 300 people, 30 hours"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-teams/essentials"
      ]
     },
     {
      "label": "Channels shared with other companies",
      "hoq": "Yes, each side keeps its own copy",
      "them": [
       "Up to 250 organizations",
       "not published"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-business-options"
      ]
     },
     {
      "label": "Native desktop and phone apps",
      "hoq": "None yet; installable web app",
      "them": [
       "Yes",
       "Yes"
      ],
      "sources": [
       "https://slack.com/downloads",
       "https://www.microsoft.com/en-us/microsoft-teams/download-app"
      ]
     }
    ]
   }
  },
  {
   "key": "collab",
   "name": "Hoq Collab",
   "status": "beta",
   "url": "https://collab.hoq.app",
   "line": "Connect with people you work with, then chat and share lists.",
   "facts": [
    {
     "label": "Connections",
     "value": "Two-sided: one account requests, the other accepts or declines. Following is one-sided."
    },
    {
     "label": "Conversations",
     "value": "Direct and group conversations with unread counts. Messages are up to 4,000 characters."
    },
    {
     "label": "Live delivery",
     "value": "New messages are pushed over a websocket to the people in the conversation after they are saved."
    },
    {
     "label": "Sharing roles",
     "value": "Viewer, commenter, editor and owner. A share goes to one person, a group, or a link with a random 128-bit token, and can carry an expiry date and be revoked."
    },
    {
     "label": "Presence",
     "value": "Online, idle, away or offline, plus where you currently are."
    },
    {
     "label": "Blocking",
     "value": "A direct message between a blocked pair is refused."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID single sign-on. Hoq ID tokens are encrypted at rest."
    }
   ],
   "figures": [
    {
     "value": "4,000",
     "label": "characters in one message"
    },
    {
     "value": "4",
     "label": "sharing roles: viewer, commenter, editor, owner"
    },
    {
     "value": "4",
     "label": "presence states: online, idle, away, offline"
    }
   ],
   "features": [
    {
     "area": "People",
     "rows": [
      {
       "name": "Connection requests",
       "what": "Ask another Hoq account to connect; they accept or decline, and either side can remove it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Follow",
       "what": "Follow someone without needing them to accept.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Your own groups",
       "what": "Create named groups and add or remove members.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Block and mute",
       "what": "Block a person to stop direct messages, or mute them to quiet them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Presence",
       "what": "See which of your connections are online or idle.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Chat",
     "rows": [
      {
       "name": "Direct messages",
       "what": "Start or reopen a one-to-one conversation and send the first message in one step.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Group conversations",
       "what": "Start a titled conversation with several members.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Unread counts",
       "what": "Each conversation tracks what you have read, with a total unread count.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Live updates",
       "what": "New messages arrive over a websocket, with polling as a backstop.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Sharing",
     "rows": [
      {
       "name": "Shared lists",
       "what": "Make a checklist, add, edit, tick and delete items, and share it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Role-gated access",
       "what": "Owners and editors change a list; any other grant can only read it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Share links",
       "what": "Share to a person, a group or a link, with an optional expiry, and revoke it later.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 12,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Slack Free",
      "url": "https://slack.com/pricing"
     },
     {
      "name": "Slack Pro with Slack Connect",
      "url": "https://slack.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "No price shown on collab.hoq.app",
      "them": [
       "$0",
       "$7.25 billed annually, $8.75 billed monthly"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://slack.com/pricing"
      ]
     },
     {
      "label": "Message history",
      "hoq": "No retention limit in the product",
      "them": [
       "90 days",
       "not published"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://slack.com/pricing"
      ]
     },
     {
      "label": "People outside your organization",
      "hoq": "Any Hoq account, after it accepts your connection request",
      "them": [
       "1:1 DMs only",
       "DMs, group chats and channels with up to 250 organizations, each on a paid plan"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://slack.com/help/articles/115004151203-Slack-Connect-guide--work-with-external-organizations"
      ]
     },
     {
      "label": "Audio and video calls",
      "hoq": "None",
      "them": [
       "Huddles, 1:1 only",
       "Huddles with screen sharing for groups"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://slack.com/pricing"
      ]
     },
     {
      "label": "Shared lists",
      "hoq": "Checklists shared as viewer, commenter, editor or owner",
      "them": [
       "not published",
       "Slack Lists included"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://slack.com/pricing"
      ]
     },
     {
      "label": "Channels",
      "hoq": "None; direct and group conversations only",
      "them": [
       "not published",
       "Included"
      ],
      "sources": [
       "https://slack.com/pricing",
       "https://slack.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "commerce",
   "name": "Hoq Commerce",
   "status": "live",
   "url": "https://commerce.hoq.app",
   "line": "Every sales channel in one ledger, counted once, in your time zone.",
   "facts": [
    {
     "label": "Channels",
     "value": "Square, Hoq Shop, Amazon (seller-fulfilled and FBA), WooCommerce, Shopify, and eBay through Hoq Sell."
    },
    {
     "label": "Where the data lives",
     "value": "One .commerce document per company in the owner's Hoq Storage, in a Commerce folder."
    },
    {
     "label": "Counting rule",
     "value": "One sale per channel order. Retries and updates never count twice."
    },
    {
     "label": "Refunds",
     "value": "Recorded on their own day with amount and reason, so past days never change."
    },
    {
     "label": "Money",
     "value": "Kept in whole cents by the business's own date and time zone."
    },
    {
     "label": "Tracking back",
     "value": "Parcels go back to Hoq Shop, Amazon, WooCommerce, Shopify and eBay with carrier and tracking, once each."
    },
    {
     "label": "Payment kinds",
     "value": "Each payment recorded as card, cash, gift card or other, so split payments count as their parts."
    },
    {
     "label": "Export",
     "value": "Sales, lines and refunds as three spreadsheet downloads."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "sales channels read into one ledger"
    },
    {
     "value": "2 minutes",
     "label": "between Amazon order checks"
    },
    {
     "value": "5 minutes",
     "label": "between WooCommerce and Shopify backup reads, on top of webhooks"
    },
    {
     "value": "1 year",
     "label": "of Square history brought in on connect"
    }
   ],
   "features": [
    {
     "area": "Channels",
     "rows": [
      {
       "name": "Square",
       "what": "Takes a business's Square orders, payments and refunds as they happen, from Square's own signed notices.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Hoq Shop",
       "what": "Takes a Hoq Shop store's orders, payments and refunds from the store's signed notices, every storefront and till included.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Amazon",
       "what": "Asks Amazon every two minutes for the orders that changed since the channel was connected (nothing older), each stored like a notice so it can be replayed; seller-fulfilled orders carry the buyer's address, read through a restricted data token.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Amazon FBA sales",
       "what": "Records orders Amazon ships itself as sales, when the channel is set to, and never sends them to be packed.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "WooCommerce",
       "what": "Adds its own order webhooks to a WooCommerce store on connect, and also reads the store's changed orders every five minutes in case one is lost; paid orders go to ship with their address, orders waiting for money are kept open, unpaid ones wait, collected ones are never shipped, and the key is checked before anything is saved.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "WooCommerce refunds",
       "what": "Reads each refund an order lists, once, and records it on its own day with its amount and reason.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "WooCommerce webhooks kept on",
       "what": "Turns the store's webhooks back on when Woo has switched them off after failed deliveries, and says when one was deleted.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Shopify",
       "what": "Connects a Shopify store through a custom app made in its own admin (token and secret checked before anything is saved), adds its own order and refund webhooks, and also reads updated orders every five minutes; paid orders go to ship with the lines still to fulfil, unpaid ones stay open, orders with no address and gift cards are never shipped, cancels reach the warehouse.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Shopify refunds",
       "what": "Records each refund once, whether it came by webhook or by reading the order, with its amount and note.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Shopify webhooks kept",
       "what": "Puts back any of its webhooks Shopify deleted after two days of failed deliveries.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "eBay through Hoq Sell",
       "what": "Takes eBay orders from the account the owner connected in Hoq Sell, through a sealed Hoq ID app-link key (Commerce never holds eBay's keys), asking every five minutes from the moment it was connected; paid orders go to ship, unpaid ones stay open, an order whose buyer asked to cancel is not packed, cancels reach the warehouse, refunds are recorded once.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "One sale per order",
       "what": "Keeps one sale per channel order however many times the channel sends it, so a retry or an update never counts twice.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Arrival log",
       "what": "Keeps every notice exactly as it arrived, shows what became of it, and can replay one or a date range after a fix.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Test ping",
       "what": "Lets a channel's connection be tested with a signed ping that is checked and never stored as a sale.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Past sales",
       "what": "Brings a channel's history in (a year of Square orders) without sending any of it to the kitchen.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Sales",
     "rows": [
      {
       "name": "One ledger",
       "what": "Keeps every channel's sales in one place, by the business's own date and time zone, in whole cents.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Find a sale",
       "what": "Searches sales by customer, reference, item, amount, how it was paid and shop, and shows one with its lines, choices, payments, tickets and refunds.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Open tabs",
       "what": "Shows a counter order still waiting to be paid as open, never as money taken.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Refunds on their own day",
       "what": "Records a refund on the day it was given, so a day already counted never changes, and keeps a refund that arrives before its sale until the sale lands.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "How it was paid",
       "what": "Records each payment of a sale by kind (card, cash, gift card, other), so a sale split between a gift card and a card counts as its parts.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Gift cards are not sales twice",
       "what": "Keeps a gift card bought apart from sales and counts it as a sale when it is spent, shown on Takings as gift cards sold.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Shipping",
     "rows": [
      {
       "name": "Orders to ship",
       "what": "Sends each paid store order with something to post to Hoq Logistics: the lines that ship and where they go, never an order not paid yet.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Shipping doorbell",
       "what": "Rings the connected Hoq Logistics the moment there is an order to ship or a cancel, so it fetches at once.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Parcels reported back",
       "what": "Records each parcel Hoq Logistics sends, once however often it is reported, and marks the order shipped.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Tracking to the store",
       "what": "Sends each parcel's carrier and tracking to the Hoq Shop store it came from, so the store emails the shopper; one the store did not take is tried again every minute.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Tracking to Amazon",
       "what": "Confirms each parcel of an Amazon order to Amazon with its carrier, service, tracking and the items it held; Amazon refusing the same package twice counts as done.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Pending and cancelled on Amazon",
       "what": "Keeps an Amazon order Amazon has not cleared out of the warehouse, and sends a cancel on Amazon to the warehouse as a cancel.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Tracking to WooCommerce",
       "what": "Sends each parcel back to the store as a Shipment Tracking entry when the store has that extension, else as a note the customer sees, never twice, and marks the order completed once nothing is left to ship.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Fulfilments to Shopify",
       "what": "Sends each parcel back as a Shopify fulfilment of exactly its lines and quantities, with its tracking, never twice; Shopify emails the customer when the channel is set to, and a missing app permission is shown on the parcel.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Tracking to eBay",
       "what": "Sends each parcel to eBay through Hoq Sell as a shipping fulfilment of its lines with carrier and tracking, once; when Sell does not answer, the parcel waits for the next tick.",
       "status": "beta",
       "verified": "2026-10-27"
      }
     ]
    },
    {
     "area": "Items",
     "rows": [
      {
       "name": "Item mapping",
       "what": "Says once that a channel's item is the business's own item, and fixes every past sale of it too.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Items to map",
       "what": "Lists the items a channel sent that are not mapped yet, biggest money first.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Reports",
     "rows": [
      {
       "name": "Today",
       "what": "Shows the day so far: takings, the drawer, open tabs and refunds, per shop.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Takings for a period",
       "what": "Shows gross, refunds, net, tax, tips and sales for any range, by day, channel and shop.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "What sold",
       "what": "Shows sales by item and by category over a range, and one item in depth by day, shop, hour, size and choices.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Choices",
       "what": "Counts milks, syrups, extra shots and other choices per item made.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "In the drawer",
       "what": "Shows how the money came in over a range: card, cash, gift card and the rest.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Through the day",
       "what": "Shows a day hour by hour, and compares days in short chunks of time on the business's clock.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Export",
       "what": "Downloads sales, lines and refunds as spreadsheets.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Locations",
     "rows": [
      {
       "name": "The business's own shops",
       "what": "Keeps the business's own locations and says which channel location each one is, moving past sales with it.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Dated facts",
       "what": "Records dated facts for a location, such as foot traffic or weather, beside its sales.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Kitchen",
     "rows": [
      {
       "name": "Kitchen feed",
       "what": "Keeps the current work of every order for Hoq KDS to read, and rings its doorbell when something changes.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Ticket numbers",
       "what": "Numbers tickets per station per day from 1, never giving out a number still open from the day before.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Pickup time",
       "what": "Carries the time an order placed ahead is wanted, and numbers it on the day it is made.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Reading tools",
       "what": "Lets an agent read sales, reports and locations, and record location facts, over MCP.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    }
   ],
   "shipped": 26,
   "beta": 19,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Square for Retail (Square Free, Plus, Premium)",
      "url": "https://squareup.com/us/en/point-of-sale/retail/pricing"
     },
     {
      "name": "Lightspeed Retail",
      "url": "https://www.lightspeedhq.com/pos/retail/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price per month",
      "hoq": "not published",
      "them": [
       "$0 Free, $49 Plus, $149 Premium per location",
       "$89 Basic, $149 Core, $289 Plus"
      ],
      "sources": [
       "https://squareup.com/us/en/point-of-sale/retail/pricing",
       "https://www.lightspeedhq.com/pos/retail/pricing/"
      ]
     },
     {
      "label": "Extra locations",
      "hoq": "not published",
      "them": [
       "Monthly fee applies to each location on Plus and Premium",
       "Priced as a line item; amount not published"
      ],
      "sources": [
       "https://squareup.com/us/en/point-of-sale/retail/pricing",
       "https://www.lightspeedhq.com/pos/retail/pricing/"
      ]
     },
     {
      "label": "Takes card payments itself",
      "hoq": "No. Each channel's own processor takes the money",
      "them": [
       "Yes, 2.6% + 15¢ in person on Free",
       "Yes, 1.5% card-present as listed"
      ],
      "sources": [
       "https://squareup.com/us/en/payments/our-fees",
       "https://www.lightspeedhq.com/pos/retail/pricing/"
      ]
     },
     {
      "label": "Outside channels read in",
      "hoq": "Square, Hoq Shop, Amazon, WooCommerce, Shopify, eBay",
      "them": [
       "Shopify sync through Thrive",
       "Built-in ecommerce on Core and Plus"
      ],
      "sources": [
       "https://squareup.com/us/en/point-of-sale/retail/pricing",
       "https://www.lightspeedhq.com/pos/retail/pricing/"
      ]
     },
     {
      "label": "Point of sale",
      "hoq": "None in Commerce; tills live in Hoq Shop",
      "them": [
       "Included",
       "1 register included"
      ],
      "sources": [
       "https://squareup.com/us/en/point-of-sale/retail/pricing",
       "https://www.lightspeedhq.com/pos/retail/pricing/"
      ]
     },
     {
      "label": "Sales export",
      "hoq": "Sales, lines and refunds as CSV",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/point-of-sale/retail/pricing",
       "https://www.lightspeedhq.com/pos/retail/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "connect",
   "name": "Hoq Connect",
   "status": "live",
   "url": "https://connect.hoq.app",
   "line": "A private network between your machines, built on WireGuard and the Tailscale client.",
   "facts": [
    {
     "label": "Protocol",
     "value": "WireGuard, through the open-source Tailscale client."
    },
    {
     "label": "Linux install",
     "value": "One command: curl -fsSL … | sudo sh. Needs systemd; x86-64 and ARM64."
    },
    {
     "label": "Other devices",
     "value": "Any Tailscale client that accepts a custom login server can join. Devices that join without a key wait for approval."
    },
    {
     "label": "Access rules",
     "value": "Groups and tags, hosts, rules, rule tests and an editable policy source."
    },
    {
     "label": "Routing",
     "value": "Subnet routers and exit nodes, each approved in the dashboard."
    },
    {
     "label": "Names",
     "value": "MagicDNS names for every machine, managed in the DNS tab."
    },
    {
     "label": "Control plane",
     "value": "Runs on three servers in Australia, the United States and Spain, with the database replicated between them."
    },
    {
     "label": "Billing",
     "value": "Metered per machine, averaged across the month, with a free allowance per network."
    },
    {
     "label": "Plans",
     "value": "Included in the Team and Business organization plans."
    }
   ],
   "figures": [
    {
     "value": "3",
     "label": "control-plane servers on three continents"
    },
    {
     "value": "2",
     "label": "CPU architectures for the Linux agent: x86-64 and ARM64"
    },
    {
     "value": "15 min",
     "label": "a keyless device waits for approval before it is dropped"
    }
   ],
   "features": [
    {
     "area": "Machines",
     "rows": [
      {
       "name": "Machine list",
       "what": "Every machine with its address, online state, last seen, expiry, routes and tags.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Topology map",
       "what": "See machines and how they connect.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Expire a machine",
       "what": "Force a machine to sign in again.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Approve new devices",
       "what": "Devices that join without a key park for about 15 minutes until approved.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Joining",
     "rows": [
      {
       "name": "Join links",
       "what": "A /join link bakes the key and login server into the installer.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pre-auth keys",
       "what": "Create keys to add devices, in the Add a device tab.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Self-updating agent",
       "what": "The Linux agent checks for new versions and updates itself.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Access",
     "rows": [
      {
       "name": "Groups and tags",
       "what": "Name sets of people and machines to write rules against.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rules and tests",
       "what": "Write allow rules and test them before they apply.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Policy source",
       "what": "Edit the whole policy as text.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Users",
       "what": "See and manage the people on the network.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Network",
     "rows": [
      {
       "name": "Subnet routes",
       "what": "Let a machine route to a LAN behind it, once approved.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Exit nodes",
       "what": "Send a device's internet traffic through a chosen machine, once approved.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "MagicDNS",
       "what": "Machine names and DNS settings for the network.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Records",
     "rows": [
      {
       "name": "Activity and audit",
       "what": "What changed, who changed it, and when.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Usage",
       "what": "Machines per month and what they cost.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 16,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Tailscale",
      "url": "https://tailscale.com/pricing"
     },
     {
      "name": "ZeroTier",
      "url": "https://www.zerotier.com/pricing/"
     },
     {
      "name": "Cloudflare Zero Trust",
      "url": "https://www.cloudflare.com/plans/sase-zero-trust.md"
     }
    ],
    "rows": [
     {
      "label": "Protocol",
      "hoq": "WireGuard via the Tailscale client",
      "them": [
       "WireGuard",
       "Its own protocol",
       "WireGuard or MASQUE"
      ],
      "sources": [
       "https://tailscale.com/opensource",
       "https://docs.zerotier.com/protocol",
       "https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/warp/"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "Free machine allowance per network; amount not published",
      "them": [
       "Up to 6 users, unlimited devices",
       "10 devices, 1 network",
       "50 users"
      ],
      "sources": [
       "https://tailscale.com/pricing",
       "https://www.zerotier.com/pricing/",
       "https://www.cloudflare.com/plans/sase-zero-trust.md"
      ]
     },
     {
      "label": "Paid price",
      "hoq": "Per machine per month; price not published",
      "them": [
       "$8 per user per month (Standard)",
       "$18 per month for 10 devices, then $2.00 per device",
       "$7 per user per month"
      ],
      "sources": [
       "https://tailscale.com/pricing",
       "https://www.zerotier.com/pricing/",
       "https://www.cloudflare.com/plans/sase-zero-trust.md"
      ]
     },
     {
      "label": "Access rules",
      "hoq": "Groups, tags, hosts, rules, rule tests, policy source",
      "them": [
       "ACLs or grants in a policy file, all plans",
       "Flow rules; not on Free",
       "Gateway network policies"
      ],
      "sources": [
       "https://tailscale.com/kb/1018/acls",
       "https://docs.zerotier.com/rules/",
       "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/concepts/"
      ]
     },
     {
      "label": "Exit nodes",
      "hoq": "Yes, approved in the dashboard",
      "them": [
       "Yes, all plans",
       "Yes, set up by hand",
       "Limited"
      ],
      "sources": [
       "https://tailscale.com/kb/1103/exit-nodes",
       "https://docs.zerotier.com/exitnode/",
       "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/concepts/"
      ]
     },
     {
      "label": "Relays when direct fails",
      "hoq": "Not published",
      "them": [
       "DERP relays in 28 locations, 18 countries",
       "4 root servers, locations not published",
       "All traffic passes through Cloudflare, 348 cities"
      ],
      "sources": [
       "https://tailscale.com/kb/1232/derp-servers",
       "https://docs.zerotier.com/protocol",
       "https://www.cloudflare.com/network/"
      ]
     },
     {
      "label": "Sign-in for admins",
      "hoq": "Hoq ID: emailed code or passkey",
      "them": [
       "Apple, Google, GitHub, Microsoft, Okta, OneLogin, OIDC",
       "OIDC on Essential and up",
       "Email PIN, Entra ID, OIDC, SAML, social"
      ],
      "sources": [
       "https://tailscale.com/kb/1013/sso-providers",
       "https://www.zerotier.com/pricing/",
       "https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/"
      ]
     },
     {
      "label": "Client apps",
      "hoq": "Hoq agent for Linux; other platforms through Tailscale's clients",
      "them": [
       "Windows, macOS, Linux, iOS, Android",
       "Windows, macOS, Linux, iOS, Android",
       "Windows, macOS, Linux, iOS, Android"
      ],
      "sources": [
       "https://tailscale.com/download",
       "https://www.zerotier.com/download/",
       "https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/warp/download-warp/"
      ]
     }
    ]
   }
  },
  {
   "key": "crew",
   "name": "Hoq Crew",
   "status": "beta",
   "url": "https://crew.hoq.app",
   "line": "Schedules, time cards, tips and payroll files for hourly crews.",
   "facts": [
    {
     "label": "Where your data lives",
     "value": "One file per company in the owner's Hoq Storage."
    },
    {
     "label": "Labor law by place",
     "value": "Each location follows federal rules or Washington, Seattle, Oregon or California law; Colorado, Idaho, New York and Texas are covered for final pay, leaver papers, injuries and retirement programs."
    },
    {
     "label": "Rule sets are opt-in",
     "value": "Nothing is checked against a rule set a location has not turned on."
    },
    {
     "label": "Payroll files",
     "value": "Gusto upload, RUN Powered by ADP time sheet import, ADP Workforce Now paydata, hours-only CSV or full CSV."
    },
    {
     "label": "Clocking in",
     "value": "From each person's phone, or a shared kiosk tablet by name and a 4 to 8 digit PIN, with optional photo at each punch."
    },
    {
     "label": "Tips",
     "value": "Pools by location, period, week or day, with steps by role; card and cash tips from Hoq Commerce split among whoever was on the clock each hour."
    },
    {
     "label": "Sensitive numbers",
     "value": "SSNs and bank numbers are encrypted with a key kept outside the company file and shown as the last four only."
    },
    {
     "label": "Calendar",
     "value": "Each person gets a private feed of shifts, time off and company holidays for Apple, Google or Outlook Calendar."
    },
    {
     "label": "Languages",
     "value": "English and Spanish for the phone, kiosk, new-hire packet and job pages."
    },
    {
     "label": "Leaving",
     "value": "One zip with the company file, spreadsheets of people, time cards, shifts and payroll, the uploaded documents, and a SQLite database."
    },
    {
     "label": "Roles",
     "value": "Owner runs everything; managers run schedule and time cards without seeing pay; employees see only their own."
    }
   ],
   "figures": [
    {
     "value": "5",
     "label": "places a location can follow for break and pay rules: federal, Washington, Seattle, Oregon, California"
    },
    {
     "value": "9",
     "label": "jurisdictions with final-pay and leaver rules, counting federal and Seattle"
    },
    {
     "value": "3",
     "label": "payroll import formats: Gusto, RUN Powered by ADP, ADP Workforce Now"
    },
    {
     "value": "2",
     "label": "languages for staff: English and Spanish"
    }
   ],
   "features": [
    {
     "area": "Your company",
     "rows": [
      {
       "name": "A company is a file",
       "what": "Keeps each company's people, schedule, time cards, tips and notices in one file in the owner's Hoq Storage.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Company time zone",
       "what": "Shows and takes every shift and punch in the company's own time zone, through daylight-saving changes.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Owner, manager, employee",
       "what": "Lets the owner run everything, managers run the schedule and time cards without seeing pay, and employees see only their own clock, shifts and notices.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Sign in with your email",
       "what": "Lets anyone added with an email open the company by signing in to Hoq ID with that address.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Agent tools",
       "what": "Gives every action to agents as tools, with read-only keys that cannot change anything.",
       "status": "beta",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "People",
     "rows": [
      {
       "name": "Crew list",
       "what": "Lists everyone on the crew with how they sign in, their kiosk PIN and, for the owner, their pay.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Add a person",
       "what": "Adds someone by name, with email, phone, department, usual location, hire date and birth date.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Kiosk PIN",
       "what": "Sets a 4 to 8 digit PIN that is stored scrambled and never shown again, and refuses one digit repeated or a run like 1234.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Invite by email",
       "what": "Emails someone where to sign in and with which address, in the company's name with replies to the manager, plus their new-hire packet link when they have one.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Set your own PIN",
       "what": "Lets each person pick or change their own time clock PIN on their phone.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Taken off the crew",
       "what": "Ends someone's sign-in while keeping every record of their work.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Managers for some locations",
       "what": "Limits a manager to the locations the owner picks: they see and schedule only those people and shifts, and publishing publishes only theirs.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Pay for a trusted manager",
       "what": "Lets the owner allow a manager to see pay rates and run payroll, sick-leave corrections and the ESD and labor reports.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Schedule",
     "rows": [
      {
       "name": "Week board",
       "what": "Shows a week of shifts by person, with open shifts, drafts and each person's hours.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Add and change shifts",
       "what": "Adds a shift by clicking a day, with role, location and unpaid break, and rolls a closing shift past midnight.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Conflicts as you type",
       "what": "Refuses a double booking or a shift during approved time off, and warns about overtime, short rest and availability before you save.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Publish",
       "what": "Keeps new shifts as drafts until you publish the week to the crew.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Copy last week",
       "what": "Copies a week's shifts into another as drafts, keeping the same wall-clock times.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Schedule on a phone",
       "what": "Shows the week as a day-by-day list on a phone, with a button to add a shift to any day.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Week templates",
       "what": "Saves a week's shifts as a template and puts it on any week as drafts at the same wall-clock times, skipping and listing clashes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Coverage targets",
       "what": "Sets how many people each location needs, on which days and between which times, for any role or one role.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Covered or short",
       "what": "Shows each coverage window on the week as covered, covered only by open shifts, or short, counting the thinnest moment and naming the gap.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Who can cover",
       "what": "Lists who could take a shift, best first with the reasons, and who cannot and why.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Fill the week",
       "what": "Suggests someone for every open shift and a new shift for every coverage gap, never double booking or quietly pushing anyone into overtime, and adds the ones you keep as drafts.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Works at several locations",
       "what": "Lists the locations someone works at, so each of those locations' managers can schedule them.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Connect your Hoq apps",
       "what": "Connects Crew to your Hoq Commerce, Service, Chat or Books by picking the workspace by name — Crew gets its own key through Hoq ID, nothing to copy, and disconnecting takes it back.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sales forecast",
       "what": "Forecasts each hour's sales for a week from the same weekday and hour over the last four weeks of Hoq Commerce, and shows the people each hour needs.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Staff to sales",
       "what": "Fills the week to the sales forecast at each location's labor target and fewest-on, instead of fixed coverage targets.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Minor work hours",
       "what": "Warns when a shift would take someone under 18 past the daily, weekly, school-day or time-of-day limits of the rule sets on, and never suggests them for it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "School breaks",
       "what": "Marks school breaks as company dates so minors' school-week limits lift on those days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Notice warnings",
       "what": "Says when published shifts went up with less notice than a predictive-scheduling rule set asks for.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Time cards",
     "rows": [
      {
       "name": "Clock in and out",
       "what": "Lets an employee clock in and out and take a rest or meal break from their phone.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "A retried punch lands once",
       "what": "Records a punch only once even when a phone sends it twice.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Paid and unpaid breaks",
       "what": "Counts rest breaks and any break under 20 minutes as paid time.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "On the clock now",
       "what": "Shows who is clocked in and who is on break.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Pay period view",
       "what": "Shows every punch in a pay period, paid hours per person and late or early flags against the schedule.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Corrections with a reason",
       "what": "Requires a reason to change, add or remove a punch, and keeps every change with who made it and why.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Close a pay period",
       "what": "Locks a pay period's time cards and tip pools.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Kiosk by the door",
       "what": "Lets people clock in and out on a shared tablet by tapping their name and typing their PIN.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Kiosk break question",
       "what": "Asks the break question on the tablet right after someone clocks out there.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Kiosk photo check-in",
       "what": "Takes a photo at each kiosk clock-in and clock-out when the owner turns it on, kept with the time card so nobody clocks in for someone else.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Kiosk links",
       "what": "Makes a link for one tablet at one location, shown once, that the owner can turn off at any time.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "PIN lockout",
       "what": "Locks a person out of a kiosk after five wrong PINs, and the kiosk after twenty, for fifteen minutes.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Works without signal",
       "what": "Keeps punches made on a phone with no signal, with the time they were made, and sends them when signal returns.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Where a punch was made",
       "what": "Records where the phone was when someone clocked in or out and flags punches made away from the location, without ever refusing them.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Location areas",
       "what": "Sets how far from a location a punch still counts as there, using the device you are holding.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Answer a changed time card",
       "what": "Shows employees every change someone else made to their time card, with the reason, to accept or dispute.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Disputes for managers",
       "what": "Shows managers every disputed change with what the employee said.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "No times in the future",
       "what": "Refuses a corrected or added punch time that has not happened yet.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Clock in to a job",
       "what": "Lets people pick the Hoq Service visit they are booked on, or type what they are working on, when they clock in.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Switch job",
       "what": "Ends one time card and starts the next at the same moment when someone moves to another job, even with no signal.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Job on every card",
       "what": "Shows and lets managers correct the job, L&I risk class, trainee category, permit and supervising electrician on a time card.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Rule sets by location",
       "what": "Turns on the labor rules that apply at each location, starting with Washington; nothing is checked against rules a location has not turned on.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Where a location is",
       "what": "Each location names the place whose law it follows — federal only, Washington, Seattle, Oregon or California — and Crew uses it for final pay, personnel file requests, injury reporting, the safety program and state retirement; picking a place turns its rule sets on.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Switch a rule area off",
       "what": "Lets the owner send one area at a location (final pay, file requests, injuries, safety or retirement) back to federal rules while the rest of the place's law stays on.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Someone working elsewhere",
       "what": "Lets the owner hold one person to another place's law, for someone who works away from every location.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Job sites",
       "what": "Keeps where each job is; a time card at a job in another state is checked under that state's break rules and premiums, and someone who did most of their hours there in the last 30 days gets that state's final pay. Jobs from Hoq Service take their state from the address.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "More states",
       "what": "Knows the final pay, leaver papers, deductions, payouts, injury reports and retirement programs of Colorado, Idaho, New York and Texas, alongside Washington, Oregon and California; Colorado's breaks with pay for each rest missed, and New York's minor hours.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Break checks",
       "what": "Flags time cards that went too long without a meal or rest break, had too few rest breaks or a meal that was too short, by the person's age.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Breaks due",
       "what": "Shows people on the clock, and their managers, when their next rest break and meal are due, and when they are overdue.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Oregon and California rules",
       "what": "Checks Oregon meal and rest breaks by length of the work period and California meals, start-by times and rest counts, alongside Washington.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Break question at clock-out",
       "what": "Asks people when they clock out whether they got their breaks, chose to skip the meal, or missed one and why, and puts the answer on the time card.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Meal waivers",
       "what": "Lets a chosen-to-skip meal count only where the rule set allows it for a day that long.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Tips",
     "rows": [
      {
       "name": "Tip pools",
       "what": "Pools card and cash tips for a location over any run of days.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Split methods",
       "what": "Splits by hours worked, by hours weighted by role, or in equal shares.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Preview before splitting",
       "what": "Shows each person's card, cash and total share before anything is recorded.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Tip policies",
       "what": "Sets which locations pool together, how often (pay period, week or day) and where the money comes from.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Split in steps",
       "what": "Gives a share of the pool to some roles first, then the rest to others, by hours, role points or equally.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Pool per period",
       "what": "Makes each period's pool from the policy and fills it per location and day from the till and the cash counts.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Missing cash counts",
       "what": "Flags each close that has no cash count yet.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Typed tip amounts",
       "what": "Lets a manager type card or cash for a day, which stays when the pool refills.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Approve a pool",
       "what": "Records each share for payroll and locks the pool until it is reopened.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Tip pooling law",
       "what": "Says what each location's state allows, including New York refusing one pool across locations.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Who is left out",
       "what": "Leaves out owners, managers and non-sharing roles, and says why for each person.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Tips from the till",
       "what": "Fills a pool from Hoq Commerce (and the Square sales it brings in): card and cash tips hour by hour for the location's shop, each hour split among whoever was on the clock then, read again whenever the pool is opened.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Tip jar count at close",
       "what": "Asks the last person to clock out at the kiosk to count the cash tips, with no PIN right after clocking out; anyone can count or recount later with their PIN, managers on the web, and every count is kept.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Jar cash spread by sales",
       "what": "Spreads the counted cash over the day's hours by what each hour sold, so the rush shares in more of it.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Notices",
     "rows": [
      {
       "name": "Send a notice",
       "what": "Sends a policy or announcement to the whole crew to read and sign.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Typed signature",
       "what": "Has each person sign by typing their name.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Who has signed",
       "what": "Shows who has read and signed and who has not.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Signed text kept",
       "what": "Keeps the exact text each person signed, even after the notice is changed.",
       "status": "beta",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Notifications",
     "rows": [
      {
       "name": "Install on a phone",
       "what": "Adds Hoq Crew to a phone's home screen as an app.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Schedule posted",
       "what": "Tells each person on their phone when shifts for them are published.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Shift moved or cancelled",
       "what": "Tells the person when their published shift changes time, is given to someone else, comes to them or is cancelled.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Notice to sign",
       "what": "Tells everyone who still has to sign a notice when it is sent.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Time card changed",
       "what": "Tells the person when a manager changes their time card, with the reason.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Seen, not just sent",
       "what": "Has the phone report when a notification is shown and when it is tapped, and counts opening Crew as seeing it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Email when the phone stays quiet",
       "what": "Emails anything not seen on the phone within 15 minutes, and straight away for people with no phone set up, several at once folded into one message.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Who has seen the schedule",
       "what": "Shows managers, for each published week, who has seen it, who was emailed and who has no way to be reached.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Remind",
       "what": "Reminds everyone who has not seen a week yet, by phone and email.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Payroll",
     "rows": [
      {
       "name": "Premium pay",
       "what": "Adds the pay rule sets owe on top of hours — California's extra hour for a missed meal or rest, predictability pay and rest-between-shifts pay — to the payroll and the payroll files.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Payroll preview",
       "what": "Shows each person's regular hours, overtime, pay rate, pay before tax and tips for a pay period.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Overtime by workweek",
       "what": "Pays time and a half past 40 hours in a workweek, counting the whole week even when it runs into another pay period.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Daily overtime",
       "what": "Pays overtime past a daily limit when one is set, without counting the same hours twice.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Finalize a pay period",
       "what": "Freezes a pay period's hours, pay and tips, locks its time cards and records sick leave earned.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Undo a payroll",
       "what": "Reopens a finalized pay period with a reason and takes back the sick leave it recorded.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Payroll export",
       "what": "Downloads a finalized payroll as an hours-only CSV for a payroll service, or a full CSV with pay and sick leave.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Gusto import file",
       "what": "Downloads a finalized payroll as Gusto's payroll upload: hours, overtime, cash and paycheck tips by name, blank instead of zero, sick hours in the note.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "ADP import files",
       "what": "Downloads a finalized payroll as RUN Powered by ADP's time sheet import or ADP Workforce Now's paydata file, using the company's own ADP earnings codes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Expense reimbursements on payroll",
       "what": "Adds every approved, unpaid expense to the next payroll and its files: a reimbursement code line in RUN Powered by ADP, a note for Gusto and Workforce Now.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Pay problems flagged",
       "what": "Marks people still clocked in, with no pay rate, paid below the minimum wage you set, or over their sick leave.",
       "status": "beta",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Time off and sick leave",
     "rows": [
      {
       "name": "Paid time off policies",
       "what": "Earns each kind of time off by hours worked or a set amount a year, with a cap, carryover into a new year, a waiting period, and the notice a request needs.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Balances",
       "what": "Shows each person what they have earned and what is not yet asked for, and lets the owner correct a balance with a reason.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Request rules",
       "what": "Refuses a request with too little notice, before the waiting period ends, or for more than is available, unless the kind allows going below zero.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Washington special variance",
       "what": "Lets a 16- or 17-year-old with a signed variance work up to 28 hours in a school week and 6 on a school day.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Ask for time off",
       "what": "Lets employees ask for sick, vacation or unpaid time off, and withdraw a request that has not been decided.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Approve or deny",
       "what": "Lets managers approve time off or deny it with a reason the employee sees.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Sick leave earned",
       "what": "Earns one hour of sick leave per 40 hours worked, overtime included, without losing the minutes in between.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Sick leave balance",
       "what": "Shows each person their sick leave, takes approved sick time from it, and warns when it goes past what was earned.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Year-end carry-over",
       "what": "Carries at most 40 hours of sick leave into a new year.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Correct a balance",
       "what": "Lets the owner add or subtract sick leave with a reason, for example when moving from another system.",
       "status": "beta",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "New hires",
     "rows": [
      {
       "name": "New-hire packet",
       "what": "Gives a new hire a link to fill in their paperwork before day one, with no account and on any phone.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Signed forms",
       "what": "Collects their details and an emergency contact, each signed by typing their name.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Tax and bank details",
       "what": "Collects the W-4 answers and direct deposit details when the owner turns them on, checking the SSN and routing number as they type.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Encrypted SSN and bank numbers",
       "what": "Encrypts SSNs and bank numbers with a key kept outside the company file and shows only the last four, unless the owner asks, which is logged.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Handbook signatures",
       "what": "Asks every new hire to read and sign the notices everyone must sign.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Paperwork deadlines",
       "what": "Puts Form I-9 (three business days after the first day) and the state new-hire report on the manager's list with their due dates.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Packet progress",
       "what": "Shows managers which steps each new hire has finished and what they signed.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Fresh links",
       "what": "Makes a new packet link that turns the old one off; links last 30 days.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Documents and certificates",
     "rows": [
      {
       "name": "Upload a certificate",
       "what": "Lets people send a photo or PDF of a card or certificate, stored in the owner's Hoq Storage.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Check documents",
       "what": "Lets managers view each document and approve it or reject it with a reason.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Required documents",
       "what": "Makes a document required for everyone, and lists who still owes one.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Certificates gate roles",
       "what": "Refuses to schedule someone into a role that needs a certificate they do not have approved and in date on that day.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Workplace posters",
       "what": "Adds a notice listing the posters federal and Washington law require, with links to the free official copies.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Reports",
     "rows": [
      {
       "name": "Schedule changes",
       "what": "Keeps every change to a published shift with who, what, the days of notice and whether they asked for it, and the predictability and rest-between-shifts pay owed.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Breaks report",
       "what": "Lists every time card in a date range that broke a break rule, with the rule, and which locations were checked.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "L&I quarterly hours",
       "what": "Adds up hours actually worked by L&I risk class for the quarter, counting overtime once, leaving out paid leave and owners without coverage, with the due date.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Risk classes",
       "what": "Takes each hour's risk class from the time card, then the person, then the location, then the company, and flags hours with none or split across classes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Salaried L&I hours",
       "what": "Reports salaried people at the hours they worked or at 160 hours a month, one method for everyone.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "ESD and Paid Leave figures",
       "what": "Gives each person's paid hours for the quarter, paid time off included and rounded up, with wages and tips from payrolls paid in the quarter, for the owner only.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Electrical trainee hours",
       "what": "Totals a trainee's hours by L&I work category for an affidavit of up to 24 months, with the certified electrician who was on the same job each time.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Trainee checks",
       "what": "Flags trainee time with no electrician on the job, less supervision than the category needs, too many trainees per electrician, or after the certificate expired.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Labor against sales",
       "what": "Shows labor hours and cost by day, or by hour for one day, beside sales from Hoq Commerce less tax and tips, as a labor percentage.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Report downloads",
       "what": "Downloads the L&I, ESD and trainee reports as spreadsheets.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Connected apps",
     "rows": [
      {
       "name": "Read from Hoq Service",
       "what": "Reads each person's booked visits from the company's Hoq Service with the owner's read-only key, matched by email.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Read from Hoq Commerce",
       "what": "Reads sales from the company's Hoq Commerce with the owner's read-only key, with each location matched to a shop.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Keys kept sealed",
       "what": "Keeps the connection keys encrypted outside the company file and never shows them again.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Team chat",
       "what": "Makes a crew channel and one per location in the company's Hoq Chat, invites everyone with an email and puts them in their channels once they join.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "News in chat",
       "what": "Posts a line in the crew channel when a schedule is published or a notice goes out.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Leaving",
     "rows": [
      {
       "name": "Take everything with you",
       "what": "Downloads one zip with the company file, spreadsheets of people, time cards and every change to them, shifts, time off, signatures and payroll, every table raw, and the uploaded documents.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Opens without Hoq",
       "what": "Puts the whole company in the zip as a SQLite database any tool can open.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Private details only on request",
       "what": "Leaves SSNs and bank numbers out of the export unless the owner asks for them in plain text, which is logged.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "How long to keep it",
       "what": "Says in the export how long Washington wants the records kept.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Close the company",
       "what": "Revokes everyone's sign-in, stops kiosk, calendar and packet links, disconnects connected apps and archives the company, keeping the file in the owner's Hoq Storage.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Offboarding",
     "rows": [
      {
       "name": "Leaving checklist",
       "what": "Starts a checklist for someone leaving with their last day, why, whether you would hire them again, and the things to get back.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Final paycheck date",
       "what": "Puts the final paycheck on the list by the law where they work: Washington's regular payday, Oregon's next business day or five-day rule, California's immediately or 72 hours, counting notice, weekends and company holidays.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "What the last check carries",
       "what": "Works out wages through the last day, overtime, tips, premiums and expenses owed, plus time off paid out where California law or your policy says, and sick leave only for a Washington construction worker who leaves before 90 days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Late final pay",
       "what": "Records when the last check was paid and, if late, shows the days late and the penalty exposure under that state's law.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Papers to give them",
       "what": "Adds the papers that state wants handed over to the checklist with official links: Washington's unemployment benefits sheet, California's change-in-relationship notice and For Your Benefit.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Reason letter clock",
       "what": "Starts a 21-day clock when someone let go in Washington asks in writing why.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Before you go",
       "what": "Asks the person on their phone where to send their last pay stub and W-2, signed by typing their name.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Finish on the last day",
       "what": "Takes them off the crew on or after their last day, ending sign-in, kiosk PIN and links, and keeps every record.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Moving in",
     "rows": [
      {
       "name": "Bring in from WordPress",
       "what": "Brings people, locations, roles, templates and history from our earlier WordPress HR plugin into a new company, showing what will come across first.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Times kept as entered",
       "what": "Turns schedule times the old plugin stored in UTC into the company's wall-clock times as they were when entered.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Test accounts left behind",
       "what": "Leaves out test accounts and past draft shifts, and says how many.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Calendar",
     "rows": [
      {
       "name": "Calendar to schedule",
       "what": "Opens a day on the schedule from its shift count on the company calendar.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Month calendar",
       "what": "Shows each person their month of published shifts, time off and company dates, and managers the company's month with who is off and how many shifts each day.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "When I can't work",
       "what": "Lets people say when they cannot or can work, every week on a weekday or on one date, all day or between times, and lets managers set it for them.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Availability on the schedule",
       "what": "Flags a shift outside someone's stated availability without refusing it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Phone calendar feed",
       "what": "Gives each person a private link that keeps their shifts, time off and the company's holidays and closures in Apple, Google or Outlook Calendar.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "New feed link",
       "what": "Makes a new calendar link that turns the old one off.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Holidays",
       "what": "Puts company holidays on everyone's calendar without refusing anything.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Closed days",
       "what": "Refuses shifts on days a location, or the whole company, is closed, and templates skip those days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Time-off blackouts",
       "what": "Refuses time-off requests during busy periods and tells the person why.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Shift trading",
     "rows": [
      {
       "name": "Pick up open shifts",
       "what": "Lets people ask for an open shift, checked against their other shifts, time off and certificates.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Give a shift up",
       "what": "Lets people ask a manager to find cover; the shift stays theirs until someone takes it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Hand a shift to a coworker",
       "what": "Offers a shift to a named coworker, who says yes or no.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Swap shifts",
       "what": "Offers your shift for a coworker's; once they agree and it is approved, both move at once or neither does.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Approval your way",
       "what": "Has a manager approve every trade, or lets pick-ups, hand-offs and swaps go through once both people agree; giving a shift up always needs a manager.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Names on the schedule",
       "what": "Lets the owner choose how names read on the schedule only — goes-by and last name, legal name, goes-by name alone, or goes-by name and last initial (Alma C.) — while the directory keeps everyone's usual name.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Day view",
       "what": "Shows one day of the schedule as a timeline — everyone working as bars across the hours, open shifts, the time now — and adds a shift from any row.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Hours per day",
       "what": "Shows the hours scheduled each day, and the week's total, with shifts nobody has yet counted apart as open.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Planned breaks",
       "what": "Shows the meals and rests each shift will owe under the location's break rules and the person's age — when, and the window for a meal — on the schedule, as suggestions.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sales on the schedule",
       "what": "Draws forecast sales hour by hour on the Day view, with people on against people needed, and each day's forecast sales on the Week view, from Hoq Commerce.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Labor % before it happens",
       "what": "Shows what the schedule as it stands will cost as a share of forecast sales, per day and for the week, in red past the location's labor target; only to those who see pay.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "This time of year",
       "what": "Adjusts the sales forecast by how the same weeks went last year once a year of sales exists, and says when it is working from recent weeks only.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Like-day forecast",
       "what": "Forecasts each day from the same weekday within three weeks of it, this year and the two before, and says how many past days it rests on.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Half-hour sales",
       "what": "Shows forecast sales in half hours on the schedule's Day view.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Schedule by location",
       "what": "Shows one location's shifts and people at a time when a company has more than one location, and remembers the choice.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Trades to approve",
       "what": "Shows managers every trade waiting on them, to approve or turn down with a reason the person sees.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Trade notifications",
       "what": "Tells the coworker about an offer, managers about a request waiting on them, and both people the outcome.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Daily tasks",
     "rows": [
      {
       "name": "Task lists",
       "what": "Sets up opening, closing and other checklists per location, for chosen weekdays and roles, with a time they are due by.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Add to my Todo",
       "what": "Puts a task-list item on your Hoq Todo list; ticking it in Crew finishes the Todo task, unticking brings it back.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Readings and photos",
       "what": "Lets an item be a tick, a reading with an allowed range, a short note or a photo kept in the owner's drive.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Out-of-range alerts",
       "what": "Records a reading outside its range with what was done about it, and tells managers.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Tasks on the phone",
       "what": "Shows people today's lists where they are working, to tick off from their phone.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Task history",
       "what": "Shows each day a list was due at a location: done, late or missed, and readings out of range.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Manager's log",
       "what": "Keeps notes one shift leaves the next, tagged, per location or for every location, pinned on top until a date.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Training",
     "rows": [
      {
       "name": "Courses",
       "what": "Builds short courses from reading, video links and quizzes with a pass mark.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Who takes them",
       "what": "Gives a course to everyone, to chosen people with a due date, or makes a role need it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Courses gate roles",
       "what": "Refuses to schedule someone in a role whose course they have not finished.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Course player",
       "what": "Lets people take a course on their phone step by step, marks wrong quiz answers, and asks for a signature at the end.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Progress",
       "what": "Shows managers who finished, who is overdue and whose course changed since they finished.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "How-to library",
       "what": "Keeps recipes and how-tos per location or for everyone, searched by every word without accents.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Hiring",
     "rows": [
      {
       "name": "Job posts",
       "what": "Writes a job with pay, hours, a description and screening questions, as a draft, open or closed.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Public job pages",
       "what": "Shares a link to each job and to a page of all open jobs, with an application form that works on any phone and turns away simple bots.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Applications",
       "what": "Takes one application per email per job with answers and a resume, and marks — never drops — anyone who misses a must-have answer.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Applicant board",
       "what": "Moves applications from new to screening, interview and offer, with notes, stars and a timeline.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Interviews",
       "what": "Books an interview and emails the time and place to the applicant.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Hire",
       "what": "Makes the applicant a person on the crew with sign-in, and can send the new-hire packet and how to sign in.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Applicant emails",
       "what": "Tells applicants their application arrived, and can send a kind note when turning them down.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Offer letters",
       "what": "Writes an offer from your letter templates with the start date, pay, hours and reply-by date filled in, editable before sending.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sign to accept",
       "what": "Emails the candidate a link to read the frozen letter and accept it by typing their name, which hires them at the offered pay from the offered day and starts their new-hire paperwork.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Offer outcomes",
       "what": "Lets them turn an offer down with a reason, lets you withdraw it, and marks it expired after the reply-by date; managers are told either way.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Languages",
     "rows": [
      {
       "name": "Spanish",
       "what": "Shows a person's phone, the kiosk when they tap their name, the new-hire packet and the job pages in Spanish when they choose it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Notices in Spanish",
       "what": "Keeps a Spanish version of each notice, drafted with Hoq Intelligence and checked by a manager, and records which language someone signed.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Reviews and team",
     "rows": [
      {
       "name": "Review templates",
       "what": "Builds reviews from rating and written questions, each asked of the person, the manager or both.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Reviews and check-ins",
       "what": "Runs a review where the person fills their part and the manager theirs, then shares it for them to read and acknowledge with a comment; check-ins keep notes and goals.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Private notes",
       "what": "Keeps a manager's private notes on a review that the person never sees.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Raises with reviews",
       "what": "Records a new pay rate with a review that takes effect on its date once shared; managers without pay access never see it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Goals",
       "what": "Keeps goals that carry from one review to the next, marked done or dropped.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Reviews due",
       "what": "Lists who is due a review 90 days after starting and every year after.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Pulse questions",
       "what": "Asks everyone or one location a short anonymous question, and shows results only once five people have answered.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Shout-outs",
       "what": "Lets coworkers and managers thank each other, with the person told and a feed for everyone.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Overview",
     "rows": [
      {
       "name": "Owner overview",
       "what": "Shows today, what needs attention, the pay period's wages, overtime and premiums, labor % this week, people and turnover with reasons, days to hire, hours by week, the latest pulse and shout-outs.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Monday email",
       "what": "Emails the overview every Monday morning in the company's time zone to anyone who turns it on.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "My jobs",
       "what": "Shows someone who works for several Hoq Crew companies all their shifts, hours and pay estimates in one place, and flags shifts at two jobs that overlap or leave no time between.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Expenses and mileage",
     "rows": [
      {
       "name": "Receipts",
       "what": "Lets an employee ask to be paid back for something bought for work, with a photo or PDF of the receipt.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Mileage",
       "what": "Pays miles driven in their own car at the IRS business rate of the day driven (72.5¢ to June 30, 2026, 76¢ from July 1), or the company's own rate.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Approve or turn down",
       "what": "Lets a manager approve an expense or turn it down with a reason, tells the employee either way, and can undo a decision until payroll pays it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Managers see their own people",
       "what": "Shows a limited manager only the expenses of people at their locations.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Certified payroll",
     "rows": [
      {
       "name": "Public works projects",
       "what": "Keeps each prevailing-wage project with its job, county, L&I intent number, prime contractor, rate effective date and payroll week.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Rate tables",
       "what": "Holds each classification's base and fringe rate and its overtime code, with codes 1, 1B and 1C built in and any other entered from L&I's Benefit Code Key.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Weekly certified payroll",
       "what": "Works out each worker's straight and overtime hours per day on the project from every hour they worked that day and week, priced at the project's rates, with gross for the project and for all work.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sign and amend",
       "what": "Signs each week with the deductions and net pay from the paystub, numbers it, keeps amendments, and signs no-work weeks.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "WH-347 copy and CSV",
       "what": "Prints a signed week laid out on the WH-347 columns with the statement of compliance, and downloads it as CSV, showing only the last four of an SSN.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Injuries",
     "rows": [
      {
       "name": "Report an injury",
       "what": "Lets anyone report a work injury from their phone and tells managers at once; nothing about reporting counts against them.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Recordable or not",
       "what": "Works out whether an incident goes on the OSHA log from the facts, with each treatment checked against OSHA's first-aid list, and says why.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Days away and restricted",
       "what": "Counts days away and on restricted duty from a dated work-status timeline, from the day after, weekends included, 180 at most.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Who to tell by when",
       "what": "Shows the reporting clocks for the state: Washington DOSH within 8 hours of any hospital admission, deaths in 8 hours, the log in 7 days, Oregon's Form 801 and California's DWC-1.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "OSHA 300 log and 300A",
       "what": "Prints the year's log for a location and the summary to post from February 1 to April 30, with average employees and hours from time cards, and says whether the location has to keep a log at all.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Privacy cases and edits",
       "what": "Keeps a privacy case's name off the log and keeps every change to an incident with who made it.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Write-ups and personnel files",
     "rows": [
      {
       "name": "Notes and warnings",
       "what": "Lets a manager draft coaching notes and verbal, written or final warnings with what happened, what is expected and what happens next.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sign as received",
       "what": "Freezes the words when issued and asks the person to sign that they received it, not that they agree, or records that they declined with a witness.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Their statement",
       "what": "Lets the person add their own statement, kept with the record, as Washington allows.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "File requests",
       "what": "Tracks a request to see, copy or correct a personnel file with the state's deadline: Washington 21 days (also for people who left in the last three years), Oregon 45, California 30.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Print their file",
       "what": "Prints a copy of someone's file: details, signed forms, reviews, notes and warnings with statements, signed notices and pay periods, with sealed numbers left out.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Benefits",
     "rows": [
      {
       "name": "Plans",
       "what": "Keeps medical, dental, vision, life and retirement plans with each coverage level's cost to the person and the company per pay period, with health waiting periods capped at 90 days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sign up or waive",
       "what": "Lets people choose a plan or waive it on their phone, signed by typing their name, with family members and beneficiaries.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "When people can choose",
       "what": "Opens choices at hire, during open enrollment, and for 30 days after a life event (60 for Medicaid or CHIP), with coverage starting on the date the rules say.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Who is in",
       "what": "Shows per plan who signed up, who waived and who has not answered.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Deductions on payroll",
       "what": "Puts each person's benefit deductions and retirement savings on the payroll and notes them in the Gusto and ADP files.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "State retirement programs",
       "what": "Reminds a company with no retirement plan about Washington Saves (with last year's hours from time cards), OregonSaves and CalSavers.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Safety program",
     "rows": [
      {
       "name": "Written safety program",
       "what": "Keeps each location's written program with the sections its state requires: Washington's seven orientation items including hazardous chemicals, California's IIPP elements, and construction's crew meetings or Code of Safe Practices.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Safety orientation sign-off",
       "what": "Asks everyone at the location to read the program and sign their orientation, and asks again whenever the program changes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "What each location owes",
       "what": "Works out the meetings due: Washington monthly safety meetings, or a committee once 11 or more are on the clock at once; weekly toolbox talks and walk-arounds in construction; Oregon committees and quarterly inspections; California tailgate meetings every 10 working days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Meetings with sign-in",
       "what": "Records safety meetings, toolbox talks, committee meetings and inspections with what was covered and hazards raised; people sign in on their phone for two days after.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Recommendations answered",
       "what": "Keeps each recommendation with the date management will answer by and the answer.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Directory and org chart",
     "rows": [
      {
       "name": "Staff directory",
       "what": "Lists everyone with their title, where they work, who they report to and a line about them, with pictures.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "People choose what is shared",
       "what": "Shows a coworker's phone, email and birthday (month and day, never the year) only if they chose to share it; managers always see phone and email.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Org chart",
       "what": "Draws who reports to whom from each person's manager, refusing loops.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Birthdays and anniversaries",
       "what": "Shows shared birthdays and work anniversaries in the next two weeks.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Surveys",
     "rows": [
      {
       "name": "Engagement surveys",
       "what": "Sends a survey to everyone or one location, always anonymous, with results shown only once five people have answered.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "New-hire check-ins",
       "what": "Asks each new hire a few questions at 30, 60 and 90 days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Exit interviews",
       "what": "Asks each person who leaves why, and whether they would come back.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Results",
       "what": "Shows averages and spread, counts per choice and written answers, and for named surveys who said what.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Hoq Books",
     "rows": [
      {
       "name": "Payroll into Hoq Books",
       "what": "Posts each finalized payroll to the company's Hoq Books as one balanced entry — wages, card tips and expenses paid back, benefit deductions held, wages payable before tax — with the accounts the owner chose; undo voids it, and a retry never makes a second entry.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Reminders",
     "rows": [
      {
       "name": "Certificate reminders",
       "what": "Emails and pushes the person 30, 14, 7 and 0 days before a certificate or licence expires and when it has, and tells managers from a week out.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "New-hire paperwork reminders",
       "what": "Sends a new hire one email listing the paperwork due by tomorrow or late, with their packet link, and tells managers when any is late.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Agents from Grimaste",
       "what": "An agent you give Hoq Crew in Grimaste can work in one company through Crew's MCP door, using your key, labelled as itself.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Per-area permissions",
       "what": "The owner sets each agent, area by area, to off, look only, ask first or change; a new agent may do nothing until then.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Ask first",
       "what": "An agent's change in an ask-first area waits in Settings › Agents until the owner approves it or turns it down.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agent changes in the activity feed",
       "what": "Everything an agent changes is recorded under its name, including changes the owner approved.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 263,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Homebase",
      "url": "https://www.joinhomebase.com/pricing"
     },
     {
      "name": "7shifts",
      "url": "https://www.7shifts.com/compare/7shifts-vs-wheniwork/"
     },
     {
      "name": "When I Work",
      "url": "https://wheniwork.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "Essentials $30 per location per month",
       "Essentials $39.99 per location per month (annual billing implied)",
       "Essentials $2.50 per user per month"
      ],
      "sources": [
       "https://www.joinhomebase.com/pricing",
       "https://www.7shifts.com/compare/7shifts-vs-wheniwork/",
       "https://wheniwork.com/pricing"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "No public price yet",
      "them": [
       "1 location, up to 10 employees",
       "1 location, up to 15 employees",
       "No, 14-day trial"
      ],
      "sources": [
       "https://www.joinhomebase.com/pricing",
       "https://www.7shifts.com/compare/7shifts-vs-wheniwork/",
       "https://wheniwork.com/pricing"
      ]
     },
     {
      "label": "Gusto payroll file",
      "hoq": "Yes, with cash and paycheck tips",
      "them": [
       "Yes; tips and break penalties do not transfer",
       "Yes, listed partner",
       "Yes, listed sync"
      ],
      "sources": [
       "https://support.joinhomebase.com/hc/en-us/articles/360014420112-Integrate-with-Gusto",
       "https://www.7shifts.com/ai-info/",
       "https://wheniwork.com/solutions/payroll-integrations"
      ]
     },
     {
      "label": "ADP payroll file",
      "hoq": "RUN and Workforce Now",
      "them": [
       "RUN",
       "RUN and Workforce Now",
       "Yes, listed sync"
      ],
      "sources": [
       "https://support.joinhomebase.com/s/article/Homebase-and-ADP-RUN-Integration-Guide",
       "https://www.7shifts.com/ai-info/",
       "https://wheniwork.com/solutions/payroll-integrations"
      ]
     },
     {
      "label": "Built-in payroll",
      "hoq": "No",
      "them": [
       "Yes, add-on from $49 per month plus $6 per employee",
       "Yes, 7shifts Payroll",
       "No"
      ],
      "sources": [
       "https://www.joinhomebase.com/pricing",
       "https://www.7shifts.com/ai-info/",
       "https://wheniwork.com/pricing"
      ]
     },
     {
      "label": "Tip pooling",
      "hoq": "Included",
      "them": [
       "Tip Manager add-on, $25 per location per month",
       "Tip Management add-on, $49.99 per location per month",
       "Not published"
      ],
      "sources": [
       "https://www.joinhomebase.com/pricing",
       "https://www.7shifts.com/compare/7shifts-vs-wheniwork/",
       "https://wheniwork.com/pricing"
      ]
     },
     {
      "label": "Predictive scheduling",
      "hoq": "Rule sets for Seattle, Oregon and California",
      "them": [
       "Does not automate Fair Workweek, by its own comparison page",
       "Automated for Seattle, Oregon statewide, and several CA and IL cities",
       "Not published"
      ],
      "sources": [
       "https://www.joinhomebase.com/compare/homebase-vs-harri",
       "https://kb.7shifts.com/hc/en-us/articles/48814451240723-What-s-New-February-2026",
       "https://wheniwork.com/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API and MCP for agents",
      "them": [
       "Yes, tier not stated",
       "Limited by plan",
       "Premium only"
      ],
      "sources": [
       "https://www.joinhomebase.com/pricing",
       "https://developers.7shifts.com/docs/plan-requirements",
       "https://wheniwork.com/pricing"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage, exportable as a zip with SQLite",
      "them": [
       "Vendor cloud",
       "Vendor cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://www.joinhomebase.com/pricing",
       "https://www.7shifts.com/compare/7shifts-vs-wheniwork/",
       "https://wheniwork.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "crm",
   "name": "Hoq CRM",
   "status": "beta",
   "url": "https://crm.hoq.app",
   "line": "Contacts, companies and a deal pipeline, kept in a file in your drive.",
   "facts": [
    {
     "label": "Where your data lives",
     "value": "One .crm document per workspace in the owner's Hoq Storage, in a folder called CRM."
    },
    {
     "label": "Snapshots",
     "value": "A snapshot is its own .crm document in CRM/Snapshots. Restore it as the next version, or fork it into a new workspace."
    },
    {
     "label": "Default pipeline",
     "value": "Lead 10%, Qualified 25%, Proposal 50%, then Won or Lost. Stages and odds can be changed, and you can add pipelines."
    },
    {
     "label": "Custom field types",
     "value": "Text, number, date, select, checkbox and URL."
    },
    {
     "label": "CSV import",
     "value": "Loose header matching with no mapping step; a tags column may hold several tags; existing contacts are updated by email."
    },
    {
     "label": "Price groups",
     "value": "Put contacts and companies in a price group with an end date, and export only the people in one group."
    },
    {
     "label": "Organizations",
     "value": "A workspace can belong to a person or to a Hoq organization. Members read and write; admins restore, fork and change structure."
    },
    {
     "label": "Idle workspaces",
     "value": "A workspace untouched for 72 hours is put away in your drive and opens again on the next visit."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "custom field types"
    },
    {
     "value": "5",
     "label": "stages in the starting pipeline, each with its own odds"
    },
    {
     "value": "72 h",
     "label": "idle time before a workspace is put away in your drive"
    }
   ],
   "features": [
    {
     "area": "Contacts and companies",
     "rows": [
      {
       "name": "Contacts",
       "what": "Add, edit and remove people, with one contact per email address.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Companies",
       "what": "Keep the companies your contacts work for.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tags",
       "what": "Tag contacts and filter by tag.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Lists",
       "what": "Group contacts into lists and add or remove them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Custom fields",
       "what": "Add your own fields: text, number, date, select, checkbox or URL.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Price groups",
       "what": "Put contacts and companies in a price group with an end date, and export who is in one.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Activity",
     "rows": [
      {
       "name": "Timeline",
       "what": "Log calls, notes, texts and tasks on a contact, and see recent activity across the workspace.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tasks",
       "what": "List open tasks from every contact in one place.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Events",
       "what": "Record things that happened to a contact elsewhere, such as a form sent.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Deals",
     "rows": [
      {
       "name": "Pipelines and stages",
       "what": "Run one or more pipelines with your own stages and win odds.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Deal board",
       "what": "Drag deals between stages; each move is recorded on the deal.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Weighted forecast",
       "what": "Totals the board by stage, weighted by each stage's odds.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Moving in and keeping it",
     "rows": [
      {
       "name": "CSV import",
       "what": "Bring contacts from any CSV with loose header matching, updating existing people by email.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Snapshots",
       "what": "Take a copy of the whole workspace at any time without opening it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Restore and fork",
       "what": "Roll the workspace back to a snapshot, or start a new workspace from one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Switch workspace files",
       "what": "Point your CRM at any other .crm document in your drive.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "With other Hoq apps",
     "rows": [
      {
       "name": "From Hoq Forms",
       "what": "A form entry finds or adds the contact by email and logs it on their timeline once.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Deals on Todo",
       "what": "Add a deal to your Hoq Todo list; winning or losing the deal closes the task.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 18,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "HubSpot Sales Hub Starter",
      "url": "https://www.hubspot.com/pricing/sales/starter"
     },
     {
      "name": "Pipedrive Lite",
      "url": "https://www.pipedrive.com/en/pricing"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "$20 per seat per month billed monthly; $7 per seat per month billed annually (new-customer rate)",
       "US$14 per seat per month billed annually (official page could not be read; figure from search snapshot)"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/how-does-pricing-work-in-pipedrive"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "No public price yet",
      "them": [
       "Yes, up to 2 users",
       "not published"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/how-does-pricing-work-in-pipedrive"
      ]
     },
     {
      "label": "Pipelines",
      "hoq": "As many as you make",
      "them": [
       "Up to 15 per account",
       "Unlimited on Lite"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/what-features-do-the-pipedrive-plans-have"
      ]
     },
     {
      "label": "Deal or record limit on cheapest tier",
      "hoq": "None set",
      "them": [
       "Not shown on pricing page",
       "2,500 deals and leads per seat, up to 300,000"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/usage-limits-in-pipedrive"
      ]
     },
     {
      "label": "Export",
      "hoq": "The workspace is a .crm document in your drive; no CSV export of all contacts yet",
      "them": [
       "CSV, XLSX or XLS on all plans",
       "Excel or CSV by data type"
      ],
      "sources": [
       "https://knowledge.hubspot.com/import-and-export/export-records",
       "https://support.pipedrive.com/en/article/exporting-data-from-pipedrive"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API with a scoped key",
      "them": [
       "Not stated on pricing page",
       "Included on Lite"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/what-features-do-the-pipedrive-plans-have"
      ]
     },
     {
      "label": "Offline on phone",
      "hoq": "No",
      "them": [
       "not published",
       "Yes, iOS and Android apps sync on reconnect"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/do-the-mobile-apps-work-offline"
      ]
     },
     {
      "label": "Email sequences and automation",
      "hoq": "Not built",
      "them": [
       "Sequences and up to 50 workflows",
       "Not on Lite"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/usage-limits-in-pipedrive"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage",
      "them": [
       "Vendor cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://www.hubspot.com/pricing/sales/starter",
       "https://support.pipedrive.com/en/article/how-does-pricing-work-in-pipedrive"
      ]
     }
    ]
   }
  },
  {
   "key": "db",
   "name": "Hoq DB",
   "status": "live",
   "url": "https://db.hoq.app",
   "line": "SQLite databases over HTTP, libSQL and Redis, with 30 days of history.",
   "facts": [
    {
     "label": "Protocols",
     "value": "JSON over HTTPS, libSQL (Hrana over HTTP), Redis RESP2 over TLS on port 6380, and MCP (streamable HTTP)."
    },
    {
     "label": "When a write is acknowledged",
     "value": "By default, once a second server has fsynced it. Per database you can choose to be answered only after the change is stored in the R2 log, or at once."
    },
    {
     "label": "Where data lives",
     "value": "An append-only log of whole-page segments and periodic full copies in Cloudflare R2. A quiet database is also copied to your Hoq Storage drive as Databases/<name>.db."
    },
    {
     "label": "Ordering guarantee",
     "value": "Log segment n is written create-only (If-None-Match). The first writer owns it, so a replaced server refuses writes instead of forking the history."
    },
    {
     "label": "Failover",
     "value": "Two servers, one active by a lease held in the bucket. A planned handover takes about 0.2 s and refuses no requests; if the active server dies, the standby takes over after 20 s without a lease renewal."
    },
    {
     "label": "History",
     "value": "Fork a database as it was at any log position or moment within the retention window (30 days by default)."
    },
    {
     "label": "Access control",
     "value": "Keys are read-only or read-write, reach chosen databases, and can be limited to named tables. SQLite's authorizer refuses everything else, including ATTACH and load_extension."
    },
    {
     "label": "Per-request limits",
     "value": "5 s per statement, 100 statements per batch, 999 parameters, 10,000 rows or 8 MiB per response, 4 MiB per value."
    },
    {
     "label": "Extensions built in",
     "value": "FTS5 full-text search, R*Tree, and sqlite-vec vector search (vec0 tables, cosine and L2 distance)."
    },
    {
     "label": "Change feed",
     "value": "Committed inserts, updates and deletes on chosen tables, followed by long-poll, Server-Sent Events or MCP. Rolled-back work never appears."
    }
   ],
   "figures": [
    {
     "value": "~6 ms",
     "label": "to acknowledge a write once two servers hold it"
    },
    {
     "value": "30 days",
     "label": "of history you can fork a database from"
    },
    {
     "value": "0.2 s",
     "label": "to hand the service to the second server during a deploy, with no refused requests"
    },
    {
     "value": "7",
     "label": "MCP tools for agents, with reads kept read-only even on a writing key"
    }
   ],
   "features": [
    {
     "area": "Querying",
     "rows": [
      {
       "name": "Query and batch",
       "what": "Run one statement or an all-or-nothing batch, with positional or named parameters.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "libSQL clients",
       "what": "Point @libsql/client or Drizzle at https://db.hoq.app/db/<key>/ and they work unchanged.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Redis protocol",
       "what": "Strings, counters, expiry, hashes, lists, sets, sorted sets, MULTI/EXEC and pub/sub, stored in tables of the same SQLite file.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Full-text search",
       "what": "FTS5 tables with snippets and bm25 ranking.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vector search",
       "what": "sqlite-vec is compiled in: store embeddings in vec0 tables and search by distance in SQL.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Durability and history",
     "rows": [
      {
       "name": "Second copy",
       "what": "A write is answered once a second server has it on disk, and the bucket upload follows.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Upload gap",
       "what": "Choose how often a database uploads to the bucket, from 1 s to 300 s, trading storage write cost against latency.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Fork in time",
       "what": "Make a new database from any earlier log position or moment.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Drive copy",
       "what": "A quiet database's newest full copy is saved into your Hoq Storage drive as Databases/<name>.db.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Failover",
       "what": "Two servers share one address; the standby forwards requests and takes over when the active one stops renewing its lease.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Access",
     "rows": [
      {
       "name": "Database keys",
       "what": "Keys that reach chosen databases, read-only or read-write, optionally limited to named tables.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "MCP for agents",
       "what": "List databases, read schema, query, execute, batch, follow changes and create databases from an MCP client.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Change feed",
       "what": "Follow committed changes to chosen tables by long-poll or Server-Sent Events, resuming from the last id.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Console",
     "rows": [
      {
       "name": "Table browser and query editor",
       "what": "Browse tables, run queries and read the schema in the browser, signed in with Hoq ID.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Keys and snippets",
       "what": "Make keys with table limits and copy ready-made connection snippets.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Download",
       "what": "Download the whole database as a SQLite file.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 16,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Cloudflare D1",
      "url": "https://developers.cloudflare.com/d1/"
     },
     {
      "name": "Turso",
      "url": "https://turso.tech/pricing"
     }
    ],
    "rows": [
     {
      "label": "Engine",
      "hoq": "SQLite",
      "them": [
       "SQLite",
       "libSQL (a SQLite fork)"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/",
       "https://docs.turso.tech/features/ai-and-embeddings"
      ]
     },
     {
      "label": "Point-in-time history",
      "hoq": "30 days, fork to a new database",
      "them": [
       "30 days (Workers Paid), 7 days (Free)",
       "1 day (Free) to 90 days (Pro)"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/platform/limits/",
       "https://turso.tech/pricing"
      ]
     },
     {
      "label": "Maximum database size",
      "hoq": "1 GiB (default page limit)",
      "them": [
       "10 GB (Workers Paid), 500 MB (Free)",
       "not published"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/platform/limits/",
       "https://turso.tech/pricing"
      ]
     },
     {
      "label": "Maximum query duration",
      "hoq": "5 s per statement",
      "them": [
       "30 s",
       "not published"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/platform/limits/",
       "https://turso.tech/pricing"
      ]
     },
     {
      "label": "Bound parameters per query",
      "hoq": "999",
      "them": [
       "100",
       "not published"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/platform/limits/",
       "https://turso.tech/pricing"
      ]
     },
     {
      "label": "Vector search in SQL",
      "hoq": "sqlite-vec (vec0) compiled in",
      "them": [
       "not published (separate Vectorize product)",
       "Native vector types and search"
      ],
      "sources": [
       "https://developers.cloudflare.com/vectorize/",
       "https://docs.turso.tech/features/ai-and-embeddings"
      ]
     },
     {
      "label": "Export",
      "hoq": "Whole SQLite file over the API, up to 512 MB",
      "them": [
       "SQL file via wrangler d1 export; databases with virtual tables (including FTS5) cannot be exported",
       "not published"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/best-practices/import-export-data/",
       "https://turso.tech/pricing"
      ]
     },
     {
      "label": "Free tier",
      "hoq": "not published",
      "them": [
       "10 databases, 5 GB, 5 million rows read and 100,000 written per day",
       "$0: 100 databases, 5 GB, 500 million rows read, 10 million written a month"
      ],
      "sources": [
       "https://developers.cloudflare.com/d1/platform/pricing/",
       "https://turso.tech/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "devices",
   "name": "Hoq Devices",
   "status": "live",
   "url": "https://devices.hoq.app",
   "line": "Pair a Linux box once, then give it a job and lease its hardware.",
   "facts": [
    {
     "label": "Pairing",
     "value": "Six-digit code, valid 15 minutes, 5 tries. The credential is collected once."
    },
    {
     "label": "Signed software",
     "value": "Every role payload must carry an ed25519 signature from a key compiled into the agent. The download server is not trusted."
    },
    {
     "label": "Closed role list",
     "value": "intake, screen, print, vision, sensor, roast, station. The server names a role, never a URL or a command."
    },
    {
     "label": "Closed command list",
     "value": "Printer add, remove, default, pause, resume and probe; screen mode; screenshot; reboot. There is no remote shell."
    },
    {
     "label": "Sandbox",
     "value": "Each role runs as its own systemd unit with read-only system paths, a private /tmp, a memory cap, and only the paths it declared writable."
    },
    {
     "label": "Updates",
     "value": "Security updates install on their own; nothing else does. The box reports when a reboot is needed and never reboots by itself."
    },
    {
     "label": "Rollback",
     "value": "Each role keeps the running version and two earlier ones on the box."
    },
    {
     "label": "Hardware leases",
     "value": "Display, input, printer, scanner, serial, audio and Bluetooth can each be leased by a different app."
    },
    {
     "label": "Agent",
     "value": "One Rust binary for Linux with systemd."
    }
   ],
   "figures": [
    {
     "value": "7",
     "label": "roles a box can be given"
    },
    {
     "value": "3",
     "label": "versions of each role kept on the box for fallback"
    },
    {
     "value": "15 min",
     "label": "before an unused pairing code expires"
    },
    {
     "value": "200 MB",
     "label": "cap on the box's system log"
    }
   ],
   "features": [
    {
     "area": "Enrolment",
     "rows": [
      {
       "name": "Pair by code",
       "what": "The box shows six digits; you claim it in the console.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "One-time credential",
       "what": "The box collects its credential once; a second pickup fails.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hardware manifest",
       "what": "The box declares its capabilities and ports, and declares again when hardware changes.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Roles",
     "rows": [
      {
       "name": "Assign a role",
       "what": "Give a box one of seven jobs from the console.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Signed payloads",
       "what": "Unsigned or wrongly signed payloads are refused before unpacking.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Declared permissions",
       "what": "A role gets write paths, groups, network control or the display only if it asks for them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reconciled every poll",
       "what": "Units and permissions are rewritten each poll, so a change reaches boxes without a new release.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reported version",
       "what": "The version shown is read from the running process, not from what the installer intended.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Hardware",
     "rows": [
      {
       "name": "Capability leases",
       "what": "Apps lease a display, input, printer, scanner, serial port, audio or Bluetooth separately.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Session or permanent",
       "what": "A session lease ends when the app stops renewing; a permanent one ends when released.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "One kiosk",
       "what": "The agent owns the box's single kiosk screen and shows whichever role holds the display.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Upkeep",
     "rows": [
      {
       "name": "Security updates",
       "what": "Security updates only, applied automatically.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Health report",
       "what": "Disk free, temperature, pending and security updates, reboot needed.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Commands",
       "what": "Queue printer, screen mode, screenshot or reboot commands; each is delivered once and acknowledged.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Separate screen user",
       "what": "The screen and console run as their own user with no sudo.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 15,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "balenaCloud",
      "url": "https://www.balena.io/pricing"
     },
     {
      "name": "Mender",
      "url": "https://mender.io/pricing/plans"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published yet",
      "them": [
       "Free for 10 devices; Prototype $159/month for 30 devices",
       "Basic $34/month up to 50 devices"
      ],
      "sources": [
       "https://www.balena.io/pricing",
       "https://mender.io/pricing/plans"
      ]
     },
     {
      "label": "Operating system on the device",
      "hoq": "Any Linux with systemd",
      "them": [
       "balenaOS required",
       "Any embedded Linux; Yocto and Debian paths documented"
      ],
      "sources": [
       "https://docs.balena.io/learn/welcome/primer/",
       "https://docs.mender.io/overview/introduction"
      ]
     },
     {
      "label": "Signed updates",
      "hoq": "Every payload ed25519-signed, key built into the agent",
      "them": [
       "OS signed on secure-boot devices; app containers not signed",
       "Signed artifacts on all tiers"
      ],
      "sources": [
       "https://docs.balena.io/reference/os/secure-boot-and-full-disk-encryption/overview",
       "https://docs.mender.io/overview/artifact"
      ]
     },
     {
      "label": "Rollback",
      "hoq": "Running version plus two earlier ones kept on the box",
      "them": [
       "Automatic host OS rollback on failed health checks",
       "A/B partitions with automatic rollback"
      ],
      "sources": [
       "https://docs.balena.io/reference/os/updates/rollbacks",
       "https://mender.io/pricing/plans"
      ]
     },
     {
      "label": "Remote shell",
      "hoq": "None by design; fixed command list",
      "them": [
       "Web terminal and SSH",
       "Paid Troubleshoot add-on"
      ],
      "sources": [
       "https://docs.balena.io/learn/welcome/primer/",
       "https://mender.io/pricing/plans"
      ]
     },
     {
      "label": "App packaging",
      "hoq": "Signed role payloads run as sandboxed systemd units",
      "them": [
       "Docker-compatible containers",
       "Optional containers through Update Modules"
      ],
      "sources": [
       "https://docs.balena.io/learn/welcome/primer/",
       "https://mender.io/pricing/plans"
      ]
     },
     {
      "label": "Self-hosted server",
      "hoq": "No, hosted only",
      "them": [
       "openBalena, open source",
       "Open-source server; on-premise on Enterprise"
      ],
      "sources": [
       "https://www.balena.io/pricing",
       "https://docs.mender.io/overview/introduction"
      ]
     },
     {
      "label": "Per-app hardware leases",
      "hoq": "Display, scanner, printer, serial and more leased separately",
      "them": [
       "Not published",
       "Not published"
      ],
      "sources": [
       "https://docs.balena.io/learn/welcome/primer/",
       "https://docs.mender.io/overview/introduction"
      ]
     }
    ]
   }
  },
  {
   "key": "docs",
   "name": "Hoq Documents",
   "status": "live",
   "url": "https://docs.hoq.app",
   "line": "Word documents in your browser, saved as versions in your own drive.",
   "facts": [
    {
     "label": "Formats it opens",
     "value": "doc, docx, docm, dot, dotx, dotm, odt, ott, rtf, txt, html, htm, mht, xml, epub, fb2"
    },
    {
     "label": "Where files live",
     "value": "In your own Hoq Storage drive as normal files, so Hoq Storage, Documents, Sheets and Slides all see the same file."
    },
    {
     "label": "Saving",
     "value": "Ctrl+S saves straight to your drive. Each save is a new version of the same file."
    },
    {
     "label": "History kept",
     "value": "The 10 most recent versions of a file are kept. Replaced versions older than 90 days are removed, unless a retention date holds them."
    },
    {
     "label": "Editor",
     "value": "Built on the open-source ONLYOFFICE Docs editor (AGPLv3), credited in the editor's About box."
    },
    {
     "label": "PDFs",
     "value": "PDFs show up in the list and open in Hoq PDF, which owns them."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID. Your token is held by the page, never in a cookie shared across Hoq apps."
    },
    {
     "label": "Offline",
     "value": "No. The editor needs a connection to open and save."
    }
   ],
   "figures": [
    {
     "value": "16",
     "label": "file types it opens and edits"
    },
    {
     "value": "4",
     "label": "built-in starting points, blank included"
    },
    {
     "value": "10",
     "label": "past versions kept per file"
    },
    {
     "value": "90 days",
     "label": "before a replaced version is removed"
    }
   ],
   "features": [
    {
     "area": "Start and find",
     "rows": [
      {
       "name": "Starting points",
       "what": "4 built-in starting points: Blank document, Letter, Meeting notes and Report.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recent and search",
       "what": "The start screen lists your recent files and filters them as you type.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rename and trash",
       "what": "Rename a file or move it to the trash from the list; trash is recoverable in Hoq Storage.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organization drives",
       "what": "Switch between your own drive and the drives of organizations you belong to.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Editing",
     "rows": [
      {
       "name": "New files are DOCX",
       "what": "New documents are saved as .docx, the Microsoft Office format.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Edit on a phone",
       "what": "The editor opens in edit mode on mobile browsers, not view-only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Download and print",
       "what": "Download or print any file you can open, from the editor's File menu.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "AI tab",
       "what": "Chat, summarize, translate and grammar actions in the editor, billed to your Hoq account with no key to paste.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Saving and history",
     "rows": [
      {
       "name": "Save on Ctrl+S",
       "what": "Every Ctrl+S writes the file back to your drive at once, not only when you close it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Every save is a version",
       "what": "Each save becomes a new version of the same file, so your drive holds one file with its history.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Version History",
       "what": "Open an earlier version from the editor's Version History panel.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 10,
   "beta": 1,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Google Docs (Workspace Business Starter)",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Microsoft Word (Microsoft 365 Business Basic)",
      "url": "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month, cheapest business plan",
      "hoq": "No price published on docs.hoq.app",
      "them": [
       "$7.00 (Business Starter, as listed; a 50% off offer runs to Feb 15, 2027)",
       "$7.00, paid yearly (Business Basic)"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Storage included",
      "hoq": "Uses your Hoq Storage drive",
      "them": [
       "30 GB pooled per user",
       "1 TB per user"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Desktop app",
      "hoq": "No, browser only",
      "them": [
       "No desktop app listed on the plan",
       "No, web and mobile apps only on Business Basic"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Works offline",
      "hoq": "No",
      "them": [
       "Yes, in Chrome or Edge with offline access turned on",
       "not published"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6388102",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Word files (.docx)",
      "hoq": "Stored and saved as .docx, no conversion",
      "them": [
       "Edited in Office Compatibility Mode or converted to Docs",
       "Native format"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6055139",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "OpenDocument (.odt) and EPUB",
      "hoq": "Opens and edits both",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6055139",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Document size limit",
      "hoq": "Not published",
      "them": [
       "1.02 million characters",
       "not published"
      ],
      "sources": [
       "https://support.google.com/drive/answer/37603",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     }
    ]
   }
  },
  {
   "key": "email",
   "name": "Hoq Email",
   "status": "live",
   "url": "https://mail.hoq.app",
   "line": "Mailboxes on your domain, with calendars, contacts and a drive on every account.",
   "facts": [
    {
     "label": "Mail protocols",
     "value": "JMAP, IMAP, POP3 and SMTP. Sieve filters managed over JMAP or ManageSieve."
    },
    {
     "label": "Calendar, contacts, files",
     "value": "CalDAV, CardDAV and WebDAV, plus JMAP for all three. A drive mounts on a computer as a WebDAV share."
    },
    {
     "label": "Sender authentication",
     "value": "DKIM signing; SPF, DMARC and ARC checks; DANE and MTA-STS on delivery."
    },
    {
     "label": "Signing in",
     "value": "Passkeys, one-time codes, and a separate app password for each mail app. The web app holds a 15-minute token, never your password."
    },
    {
     "label": "Device setup",
     "value": "One signed profile sets up Mail, Calendar and Contacts on iPhone and Mac. Thunderbird and Outlook set themselves up from the email address."
    },
    {
     "label": "TLS certificates",
     "value": "Issued automatically for domains hosted on the service."
    },
    {
     "label": "Your own bucket",
     "value": "Mail and files can live in your S3 bucket in a documented archive format with an encrypted index. A reader fits in about 100 lines of code."
    },
    {
     "label": "Deleted mail",
     "value": "Kept 30 days on paid organization plans and 90 on Business, then purged. A person restores it to the Inbox from Settings."
    },
    {
     "label": "Webhooks",
     "value": "Your own service is notified when new mail arrives in an account."
    },
    {
     "label": "Send as an outside address",
     "value": "Allowed after you prove you own it by signing in to its mail server once."
    }
   ],
   "figures": [
    {
     "value": "4",
     "label": "mail protocols served: JMAP, IMAP, POP3, SMTP"
    },
    {
     "value": "15 min",
     "label": "life of the token the web app holds instead of your password"
    },
    {
     "value": "30 days",
     "label": "deleted mail kept on paid plans, restorable from Settings"
    },
    {
     "value": "3",
     "label": "places a spam rule can apply: you, your domain, everyone"
    }
   ],
   "features": [
    {
     "area": "Mail",
     "rows": [
      {
       "name": "Every mail protocol",
       "what": "Serves mail over JMAP, IMAP, POP3 and SMTP, with Sieve filters managed over JMAP or ManageSieve.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Sender authentication",
       "what": "Signs and checks mail with DKIM, SPF, DMARC and ARC, and protects delivery with DANE and MTA-STS.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Send as another address",
       "what": "Lets you send from an outside address after proving you own it by signing in to its mail server once.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Fast inbox and search",
       "what": "Opens big mailboxes and All Mail, and runs searches, from a search index instead of reading every message.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Quick snippets",
       "what": "Shows search result previews from each message's stored preview before fetching any full message.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Webhooks",
       "what": "Notifies your own service when new mail arrives in an account.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Attachment text extraction",
       "what": "Sends new mail to an extraction service and keeps the text it returns for each part.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Spam",
     "rows": [
      {
       "name": "Spam filter",
       "what": "Scores incoming mail with rules, blocklists, a trained classifier, sender reputation and phishing checks.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Sentry",
       "what": "Learns from mail you drop into its folders and rejects, blocks, marks or allows close copies, for you, your domain or everyone.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Block a sender",
       "what": "Refuses all mail from one address or a whole domain, for you or for everyone.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Categories",
       "what": "Files incoming mail into Social, Promotions, Updates and Forums from sender rules it learns from you.",
       "status": "beta",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Calendar, contacts and files",
     "rows": [
      {
       "name": "Calendar and contacts",
       "what": "Syncs calendars and contacts over CalDAV, CardDAV and JMAP, with meeting invitations.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Free/busy sharing",
       "what": "Lets you choose whether people in your organization can see when you are busy.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Drive",
       "what": "Stores files over WebDAV and JMAP, so a drive mounts on a computer and opens in the web app.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "File versions",
       "what": "Keeps earlier versions of a file and lets you open any of them.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Share links",
       "what": "Makes a public link to one file, checked every time it is opened, and revocable at any time.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Shared with me",
       "what": "Lists everything other people have shared with you.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "File activity",
       "what": "Shows who opened or changed one of your files, including anonymous visits through a share link.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "File name search",
       "what": "Finds files in your drive by name.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Address autocomplete",
       "what": "Suggests addresses from people you have mailed, and lets you hide or forget any of them.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Your own bucket",
     "rows": [
      {
       "name": "Bring your own bucket",
       "what": "Keeps an account's mail and files in the customer's own S3 bucket, in an archive format they can read without us.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Changes reach the bucket",
       "what": "Writes flag changes, moves and deletions back to the bucket, so it stays the true copy.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Mirror through a queue",
       "what": "Copies every arriving message to the bucket through a queue that survives a failed write.",
       "status": "beta",
       "verified": "2026-10-02"
      },
      {
       "name": "Restore from the bucket",
       "what": "Rebuilds an account from its bucket with the original message ids.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Retention",
       "what": "Clears archive history older than a chosen number of days, keeping the live copy.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Take your training",
       "what": "Saves an account's spam and category training to its bucket, so it leaves with the customer.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Signing in and setup",
     "rows": [
      {
       "name": "Passkeys",
       "what": "Signs in with a passkey instead of a password.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Two-factor and app passwords",
       "what": "Protects accounts with one-time codes and separate passwords for mail apps.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Short-lived web tokens",
       "what": "Gives the web app a 15-minute token instead of the password, ended at once when access is revoked.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "One-tap Apple setup",
       "what": "Sets up Mail, Calendar and Contacts on an iPhone or Mac from one signed profile download.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Automatic setup",
       "what": "Configures Thunderbird, Outlook and other apps from just the email address.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Certificates for custom domains",
       "what": "Gets TLS certificates automatically, only for domains hosted on the service.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Running the service",
     "rows": [
      {
       "name": "Any node serves any account",
       "what": "Routes a person to the server that holds their account, whichever server they reach first.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Account administration",
       "what": "Creates, renames, suspends and resets accounts, and empties mailboxes, through an admin API.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Mail health overview",
       "what": "Shows each account's size and each server's memory, storage and response times, scoped to the operator's tenants.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Live watch",
       "what": "Follows one account's activity live for troubleshooting, and records who watched.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Security feed",
       "what": "Keeps a running list of sign-in failures and security events for the operator.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "No phone-home",
       "what": "Runs every feature, enterprise ones included, without any license call to the original vendor.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    }
   ],
   "shipped": 36,
   "beta": 2,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Google Workspace Business Starter",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Microsoft 365 Business Basic",
      "url": "https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-plans-and-pricing"
     },
     {
      "name": "Fastmail Standard",
      "url": "https://www.fastmail.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "Not published",
      "them": [
       "$7.00",
       "$7.00, paid yearly",
       "$5 paid yearly, $6 monthly"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-plans-and-pricing",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "Mail storage per user",
      "hoq": "Not published",
      "them": [
       "30 GB pooled per person",
       "100 GB mailbox, 50 GB archive",
       "50 GB mail, calendar and contacts, 10 GB files"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "JMAP",
      "hoq": "Yes, for mail, calendars, contacts and files",
      "them": [
       "not published",
       "not published",
       "Yes"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "IMAP for other mail apps",
      "hoq": "Yes, plus POP3",
      "them": [
       "Yes, always on",
       "not published",
       "Yes, plus POP"
      ],
      "sources": [
       "https://support.google.com/mail/answer/7126229",
       "https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits",
       "https://www.fastmail.help/hc/en-us/articles/1500000278342-Server-names-and-ports"
      ]
     },
     {
      "label": "Calendar and contacts sync",
      "hoq": "CalDAV, CardDAV, JMAP",
      "them": [
       "not published",
       "not published",
       "CalDAV, CardDAV"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits",
       "https://www.fastmail.help/hc/en-us/articles/1500000278342-Server-names-and-ports"
      ]
     },
     {
      "label": "Deleted mail recoverable",
      "hoq": "30 days on paid plans, none on Free",
      "them": [
       "30 days in Trash",
       "14 days after Deleted Items is emptied",
       "not published"
      ],
      "sources": [
       "https://support.google.com/mail/answer/7401",
       "https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "Largest message",
      "hoq": "Not published",
      "them": [
       "50 MB received (Enterprise Standard)",
       "150 MB",
       "not published"
      ],
      "sources": [
       "https://knowledge.workspace.google.com/admin/gmail/gmail-receiving-limits-in-google-workspace",
       "https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits",
       "https://www.fastmail.com/pricing/"
      ]
     },
     {
      "label": "Mail kept in your own S3 bucket",
      "hoq": "Yes, in a documented format",
      "them": [
       "not published",
       "not published",
       "not published"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-plans-and-pricing",
       "https://www.fastmail.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "files",
   "name": "Hoq Storage",
   "status": "live",
   "url": "https://storage.hoq.app",
   "line": "One drive for every Hoq app, on our storage or your own bucket.",
   "facts": [
    {
     "label": "Trash",
     "value": "Deleted files stay in the trash for 30 days, then are removed for good. You can restore or empty it any time."
    },
    {
     "label": "Version history",
     "value": "Replacing a file keeps the old copy. Up to 10 earlier versions per file, older versions cleared after 90 days."
    },
    {
     "label": "Large uploads",
     "value": "Files over 8 MB upload in 4 MB chunks. A dropped connection resumes from where the server left off."
    },
    {
     "label": "Share links",
     "value": "Public /s/ links with an optional password and expiry, revocable any time. Moving the file to trash stops the link."
    },
    {
     "label": "Upload request links",
     "value": "A /d/ link lets someone without an account drop files into a folder you choose. They cannot see what is already there."
    },
    {
     "label": "Your own bucket",
     "value": "Amazon S3, Cloudflare R2, Wasabi, Backblaze B2, MinIO or any S3-compatible service. Bucket keys are sealed with AES-256-GCM."
    },
    {
     "label": "Leaving a managed bucket",
     "value": "Each managed bucket holds _manifest/latest.json mapping every path to its object and version chain, refreshed daily."
    },
    {
     "label": "Retention",
     "value": "Keep-until dates and legal holds per file, or a keep-for-N-days policy per space, up to 3,650 days. Dates can only be extended."
    },
    {
     "label": "Zip files",
     "value": "Open a zip and browse its contents without downloading it. Compress a selection or extract a zip on the server."
    },
    {
     "label": "App access",
     "value": "Apps ask for one of four scopes: whole drive read, whole drive write, their own folder, or only files you pick."
    },
    {
     "label": "Change events",
     "value": "Webhooks for created, updated, moved, renamed, trashed, restored and deleted files, signed with a Hoq-Signature header."
    }
   ],
   "figures": [
    {
     "value": "30 days",
     "label": "in the trash before a file is removed"
    },
    {
     "value": "10",
     "label": "earlier versions kept per file"
    },
    {
     "value": "4 MB",
     "label": "upload chunks, resumable after a dropped connection"
    },
    {
     "value": "6",
     "label": "S3-compatible bucket services you can connect, plus any other"
    },
    {
     "value": "3,650 days",
     "label": "longest keep-for policy on a space"
    }
   ],
   "features": [
    {
     "area": "Browse",
     "rows": [
      {
       "name": "List and grid views",
       "what": "Folders with breadcrumbs, and a grid view with server-made WebP thumbnails.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Quick look",
       "what": "Space previews images, video, audio, PDF and text, and the arrow keys walk the folder.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Go to anything",
       "what": "⌘K opens a palette that finds any file or command by name.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Stars and recents",
       "what": "Star files and folders and see them on every device you sign in on.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tags and notes",
       "what": "Colour tags with sidebar filters, and a note on each file that saves as you type.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Documents shown as one file",
       "what": "A board or other Hoq document stored as a folder shows as one row with its title and preview.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Light and dark",
       "what": "Light, dark, or follow your system setting.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Upload and organise",
     "rows": [
      {
       "name": "Resumable uploads",
       "what": "Drop files or whole folders, or paste; large files go up in chunks and resume after a drop.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Name conflicts",
       "what": "Choose Replace, Keep both or Skip when an upload matches an existing name.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Batch rename",
       "what": "Rename many files at once with a before and after table.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Move by drag",
       "what": "Drag files onto a folder in the sidebar or the breadcrumb.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Zip in place",
       "what": "Compress a selection, browse a zip without downloading it, or extract it on the server.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Safety",
     "rows": [
      {
       "name": "Trash and undo",
       "what": "Deletes go to a 30-day trash, and ⌘Z undoes the last move, rename or delete.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Version history",
       "what": "List, download or restore the copies a replace displaced.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Retention and holds",
       "what": "Set a keep-until date or a hold on a file; Hoq will not delete it before then.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Sharing",
     "rows": [
      {
       "name": "Share links",
       "what": "Public links with optional password and expiry; video and large files stream by byte range.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Upload requests",
       "what": "A link that lets anyone drop files into one of your folders.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "File picker for apps",
       "what": "Other apps open a picker; the files you choose are the only ones they can reach.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organisation drives",
       "what": "An organisation has its own drive, and leaving the organisation ends access on the next request.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Your own storage",
     "rows": [
      {
       "name": "Connect a bucket as it is",
       "what": "Browse your own S3-compatible bucket in its own layout.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Managed bucket",
       "what": "Your bucket in our layout, so trash, versions, sharing and retention work on storage you own.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Portability manifest",
       "what": "A daily JSON map of every path, object and version, so the bucket reads back without Hoq.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "For developers",
     "rows": [
      {
       "name": "Files API",
       "what": "REST endpoints to list, upload, move, trash, restore, star and share, with a scoped Bearer token.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Webhooks",
       "what": "Signed events when files change, sent only for files the app was given.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 24,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Google Drive (Workspace Business Starter)",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Dropbox Standard",
      "url": "https://www.dropbox.com/plans"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "No public price yet",
      "them": [
       "$7.00 (monthly billing)",
       "$15"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Storage included",
      "hoq": "Not published",
      "them": [
       "30 GB pooled per user",
       "Starts at 3 TB for the team"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Largest single file",
      "hoq": "Not published",
      "them": [
       "Up to 5 TB",
       "Transfers up to 100 GB"
      ],
      "sources": [
       "https://support.google.com/drive/answer/37603",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Trash",
      "hoq": "30 days",
      "them": [
       "30 days",
       "not published"
      ],
      "sources": [
       "https://support.google.com/drive/answer/2375102",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Version history",
      "hoq": "10 earlier versions, kept up to 90 days",
      "them": [
       "100 newer versions or 30 days, unless marked Keep forever",
       "180-day history"
      ],
      "sources": [
       "https://support.google.com/drive/answer/2409045",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Password and expiry on share links",
      "hoq": "Yes",
      "them": [
       "not published",
       "Yes"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Upload request links",
      "hoq": "Yes",
      "them": [
       "not published",
       "Yes (incoming transfer requests)"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.dropbox.com/plans"
      ]
     },
     {
      "label": "Keep files in your own S3 bucket",
      "hoq": "Yes, as-is or managed",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.dropbox.com/plans"
      ]
     }
    ]
   }
  },
  {
   "key": "forms",
   "name": "Hoq Forms",
   "status": "beta",
   "url": "https://forms.hoq.app",
   "line": "Forms for your site and customers, with every entry kept and routed.",
   "facts": [
    {
     "label": "Where your data lives",
     "value": "One file per company in the owner's Hoq Storage, copied nightly when it changed and test-opened weekly."
    },
    {
     "label": "Question kinds",
     "value": "26, including grids, files, signatures, consent, a recommend score and repeating groups."
    },
    {
     "label": "Templates",
     "value": "65 templates in 12 groups, plus your own."
    },
    {
     "label": "Payments",
     "value": "Card payments into Stripe accounts you add by key, several per company, each form picking one; refunds from the entry."
    },
    {
     "label": "Export",
     "value": "Entries as CSV or Excel."
    },
    {
     "label": "Routing",
     "value": "Email, signed webhooks, and Hoq CRM, Service, Chat, Support, Mailer and Todo; conditional by answer; retried for a day."
    },
    {
     "label": "Embedding",
     "value": "One line of code on another site, only on sites you allow; also on Hoq Shop store pages."
    },
    {
     "label": "Languages",
     "value": "English and Spanish, by the visitor's browser, with a switch."
    },
    {
     "label": "Fonts",
     "value": "Served from Hoq; visitors never load anything from Google."
    },
    {
     "label": "Moving in",
     "value": "Imports forms and entries from Fluent Forms and Gravity Forms on WordPress."
    }
   ],
   "figures": [
    {
     "value": "26",
     "label": "kinds of question"
    },
    {
     "value": "65",
     "label": "templates in 12 groups"
    },
    {
     "value": "6",
     "label": "themes: Paper, Studio, Kraft, Bloom, Ink and Night"
    },
    {
     "value": "1 day",
     "label": "of retries for a failed send"
    }
   ],
   "features": [
    {
     "area": "Building forms",
     "rows": [
      {
       "name": "Builder that looks like the form",
       "what": "Lays out questions on a canvas drawn in the form's own theme, with questions moved up and down, set side by side, copy and paste, undo and redo.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "26 kinds of question",
       "what": "Asks for text, contact details, numbers, dates, choices, ratings, a recommend score, grids, files, signatures, consent and repeating groups.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Show only when",
       "what": "Shows a question or a whole page only when earlier answers call for it.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Several pages",
       "what": "Splits a long form into pages with a progress bar or named steps, and an optional page to check every answer before sending.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "One question at a time",
       "what": "Shows a form as one full question per screen that works by keyboard alone.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Versions",
       "what": "Keeps every published version, so a change never alters what earlier people answered.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "65 templates",
       "what": "Starts a form from 65 templates in 12 groups, from catering requests and site visits to waivers and donations, each with its own wording and theme.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Template gallery",
       "what": "Shows every template drawn small in its theme, with groups, search and a full preview before choosing.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Your own templates",
       "what": "Saves any form as a template the company can start from.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Write a form from a sentence",
       "what": "Turns a description into a draft form through Hoq Intelligence, checked like any other form and never published by itself.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "How forms look",
     "rows": [
      {
       "name": "Six themes",
       "what": "Dresses a form as Paper, Studio, Kraft, Bloom, Ink or Night, each with its own colors and fonts.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Your own touches",
       "what": "Lets each form change its accent color, corners, light or dark, and font.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Preview on computer and phone",
       "what": "Shows the draft exactly as people will see it, at computer or phone width.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Phones first",
       "what": "Stacks every question for a phone, with a full-width Send button.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Fonts served by Hoq",
       "what": "Serves every font from Hoq itself, so visitors never load anything from Google.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "Filling in",
     "rows": [
      {
       "name": "Checks as you go",
       "what": "Explains a mistake when someone leaves a question, clears it as they fix it, and stops Send at the first problem.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Did you mean",
       "what": "Suggests the right email domain when one is mistyped, like gmial.com.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Tidy phone numbers",
       "what": "Formats US phone numbers as they are typed.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Counters and thumbnails",
       "what": "Counts characters or words against a limit and shows pictures before they are sent.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Pages without reloading",
       "what": "Moves between pages in place, keeping every answer, and still works without scripts.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Save and finish later",
       "what": "Emails a link back to a half-finished form, kept for a week.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Fill in from a link",
       "what": "Fills a question from the address, like ?email=someone@example.com.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Spanish",
       "what": "Shows a form and every page after it in Spanish to people whose browser prefers it, with a switch, and lets an owner translate their own words, with a suggested first draft.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "On your own website",
       "what": "Puts a form on another site with one line of code, only on sites the owner allows.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "On your Hoq Shop",
       "what": "Shows a form on a Hoq Shop store page in the store's own style.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "A thank-you that fits",
       "what": "Thanks people with the owner's words, a different message by answer, or a page of their own.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "Payments",
     "rows": [
      {
       "name": "Priced questions",
       "what": "Adds items with prices and quantities, priced choices and a running total worked out by the server.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Your own Stripe accounts",
       "what": "Takes card payments into Stripe accounts the business adds by key, several per company, each form choosing one.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Paid before sent",
       "what": "Keeps an unpaid answer waiting and sends it nowhere until the money arrives.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Refunds",
       "what": "Gives money back in part or in full from the entry.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Payments on embedded forms",
       "what": "Takes payment on a form shown inside another website, opening checkout in the whole window.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "Entries",
     "rows": [
      {
       "name": "Inbox for answers",
       "what": "Lists entries newest first with who, what and when, new ones marked, starred, done and paid at a glance.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Read and sort fast",
       "what": "Opens an entry beside the list and moves through them with j and k, d for done and s to star.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Search and views",
       "what": "Finds entries by any answer or number, and shows new, starred, unpaid, spam and trash.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Notes, tags and edits",
       "what": "Lets the team add notes and tags and correct answers, keeping what each said before.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Export",
       "what": "Downloads entries as CSV or Excel.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Activity",
       "what": "Shows what happened, by day: new entries, publishing, payments, failed sending.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Monday summary",
       "what": "Emails last week's entries form by form.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Results",
       "what": "Sums up every question in charts, from choices and the recommend score to grids and the words people used, for any date range.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Share results",
       "what": "Makes a read-only results link that shows charts and counts but never written answers or contact details.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "Sending entries on",
     "rows": [
      {
       "name": "Email",
       "what": "Sends each entry to team addresses or addresses confirmed by a code.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Webhooks",
       "what": "Posts each entry, signed, to an outside address.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Other Hoq apps",
       "what": "Sends entries to Hoq Service as leads, Hoq Chat, Hoq Support, Hoq Mailer, Hoq CRM and Hoq Todo.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Only some entries",
       "what": "Sends to a place only when the answers match.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Tries again",
       "what": "Retries a failed send for a day, shows each try, and lets the owner send again.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "Keeping out spam",
     "rows": [
      {
       "name": "Hidden trap and timer",
       "what": "Quietly drops answers from bots that fill a hidden box or send in under three seconds.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Limits per sender",
       "what": "Caps how many answers one address, form and company can send in an hour.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Spam score",
       "what": "Moves suspicious answers to Spam, where they send nothing until rescued.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Same message, many senders",
       "what": "Sends the same message from three or more senders in a day to Spam.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Learns from Spam",
       "what": "Counts a sender and message marked as spam against what they send next, and forgets them when marked not spam.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Cloud and Tor check",
       "what": "Counts answers from cloud servers and Tor exits toward the spam score, from lists refreshed weekly.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Are-you-a-person check",
       "what": "Adds Cloudflare Turnstile to new forms once its keys are set up.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Form Locker",
       "what": "Opens and closes a form on a schedule, caps entries, limits answers per person, asks for a password, a sign-in or a minimum age, and confirms emails.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    },
    {
     "area": "Running it",
     "rows": [
      {
       "name": "A file per company",
       "what": "Keeps each company's forms and entries in one file in the owner's Hoq drive.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Nightly backups",
       "what": "Copies each company's file nightly when it changed, two weeks kept, and checks a copy opens every week.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Outside watch",
       "what": "Checks Forms from another server every five minutes and emails when something goes wrong or recovers.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Team roles",
       "what": "Lets owners, managers and staff do what their role allows.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Agents",
       "what": "Lets AI agents read or change forms and entries within what the owner allows, through the same actions and MCP.",
       "status": "beta",
       "verified": "2026-10-19"
      },
      {
       "name": "Bring forms over",
       "what": "Imports forms and entries from Fluent Forms, Gravity Forms and our earlier WordPress forms plugin.",
       "status": "beta",
       "verified": "2026-10-19"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 59,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Typeform Basic",
      "url": "https://www.typeform.com/pricing/"
     },
     {
      "name": "Jotform Bronze",
      "url": "https://www.jotform.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "$39 per month monthly, $28 per month billed yearly",
       "$39 per month, or $408 a year"
      ],
      "sources": [
       "https://www.typeform.com/pricing/",
       "https://www.jotform.com/pricing/"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "No public price yet",
      "them": [
       "10 responses a month",
       "5 forms, 100 submissions a month"
      ],
      "sources": [
       "https://help.typeform.com/hc/en-us/articles/360032972852-Free-plan",
       "https://www.jotform.com/pricing/"
      ]
     },
     {
      "label": "Responses on cheapest paid tier",
      "hoq": "No cap set",
      "them": [
       "100 a month included",
       "1,000 a month"
      ],
      "sources": [
       "https://www.typeform.com/pricing/",
       "https://www.jotform.com/pricing/"
      ]
     },
     {
      "label": "Payments",
      "hoq": "Your own Stripe accounts, several per company",
      "them": [
       "Stripe, Basic and up",
       "Card, PayPal and more on every tier; 100 payment submissions a month on Bronze"
      ],
      "sources": [
       "https://help.typeform.com/hc/en-us/articles/360060585211-Basic-plan",
       "https://www.jotform.com/pricing/"
      ]
     },
     {
      "label": "Export",
      "hoq": "CSV or Excel",
      "them": [
       "XLSX or CSV",
       "CSV, Excel or PDF"
      ],
      "sources": [
       "https://www.typeform.com/pricing/",
       "https://www.jotform.com/help/73-how-to-download-form-submissions-as-excel-csv-pdf/"
      ]
     },
     {
      "label": "Webhooks and API",
      "hoq": "Signed webhooks, JSON API and MCP",
      "them": [
       "Webhooks on Basic; APIs available",
       "API available, tier not stated"
      ],
      "sources": [
       "https://www.typeform.com/pricing/",
       "https://www.jotform.com/pricing/"
      ]
     },
     {
      "label": "Integrations",
      "hoq": "Hoq CRM, Service, Chat, Support, Mailer and Todo",
      "them": [
       "Integrations library and AI form creation",
       "Large template and integration library"
      ],
      "sources": [
       "https://www.typeform.com/pricing/",
       "https://www.jotform.com/pricing/"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage",
      "them": [
       "Vendor cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://www.typeform.com/pricing/",
       "https://www.jotform.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "fun",
   "name": "Hoq Fun",
   "status": "live",
   "url": "https://fun.hoq.app",
   "line": "Game rooms where people and AI agents play at the same table.",
   "facts": [
    {
     "label": "Record of play",
     "value": "Append-only and hash-chained with SHA-256. Each entry hashes the previous one plus the sentence players read. A rewind supersedes earlier moves and deletes nothing."
    },
    {
     "label": "Hidden information",
     "value": "Committed as SHA-256 of a random salt plus the normalized secret before play, and checked against every answer at the reveal."
    },
    {
     "label": "Rules",
     "value": "Told, not enforced. Every well-formed move commits, an illegal one included, and is flagged with the clause it broke. Any player can challenge it."
    },
    {
     "label": "Randomness",
     "value": "Dice are rolled on the server. A roll sent by the client is overwritten."
    },
    {
     "label": "Agent interface",
     "value": "MCP over JSON-RPC 2.0 at /mcp with ten tools: fun_games, fun_tables, fun_join, fun_look, fun_start, fun_wait, fun_act, fun_say, fun_challenge, fun_leave."
    },
    {
     "label": "Agent invites",
     "value": "One token per room. It covers every game played in that room and cannot see or open any other room."
    },
    {
     "label": "Person invites",
     "value": "A link that seats whoever opens it, for one room, expiring after 30 days. The person needs a Hoq account."
    },
    {
     "label": "Agent pacing",
     "value": "One move every 2 seconds per seat, at most 40 a minute and 120 an hour. Talking and challenging are not counted toward the per-move gap."
    },
    {
     "label": "Games you can play in the browser",
     "value": "Hangman, Pachisi and Turnabout. Twenty Questions and a freeform table are playable by agents."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID single sign-on. There is no separate password."
    }
   ],
   "figures": [
    {
     "value": "10",
     "label": "MCP tools an agent plays with"
    },
    {
     "value": "30 days",
     "label": "life of a link that invites a person to a room"
    },
    {
     "value": "4",
     "label": "seats at a Pachisi or Turnabout board"
    },
    {
     "value": "7",
     "label": "room settings to choose from, from card parlour to observatory"
    }
   ],
   "features": [
    {
     "area": "Rooms",
     "rows": [
      {
       "name": "Durable rooms",
       "what": "A room keeps its name, decor, bar, chat and people across every game played in it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Room decor",
       "what": "Pick a setting such as card parlour, library, late-night diner, hotel lounge, garden or observatory.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "The bar",
       "what": "Everyone at the table can order a drink from the room's menu, and the room shows who is drinking what.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Invite a person",
       "what": "Copy a link that seats whoever opens it in this room only, valid for 30 days.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Invite an agent",
       "what": "Create a token that lets one agent into this room and every game played in it.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Play",
     "rows": [
      {
       "name": "Hangman",
       "what": "A setter seals a word and up to four guessers name letters; a person or an agent can set the word.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pachisi",
       "what": "The four-player cross-and-circle race game with server-rolled dice.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Turnabout",
       "what": "A four-player race played from a deck, where cards move you back, swap pawns or send a pawn home.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Twenty Questions",
       "what": "One keeper holds a secret and up to six askers question it; agents can play it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Freeform table",
       "what": "An open table for up to eight players with no fixed game.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Fair play",
     "rows": [
      {
       "name": "Numbered rules",
       "what": "Every game's rules are shown to people and agents as the same numbered clauses.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Advisor",
       "what": "Rates each move against the rules and cites the clause, but never refuses it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Challenges",
       "what": "Any player can challenge a move on the record and cite the rule it broke.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Sealed secrets",
       "what": "A secret is committed by salted hash before play and audited against every answer at the reveal.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rewind without deletion",
       "what": "Taking moves back marks them superseded and keeps them on the record.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "MCP server",
       "what": "Ten tools let an agent find games, take a seat, look, wait for its turn, move, talk, challenge and leave.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Agent keys",
       "what": "Create a key from the home page and any MCP agent can take a seat like a person.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Agents are labelled",
       "what": "Whether a seat is an agent comes from its credential, never from what the agent says.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rate limits",
       "what": "Per-seat pacing stops an agent stuck in a loop from flooding the table.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 19,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Tabletop Simulator",
      "url": "https://store.steampowered.com/app/286160/Tabletop_Simulator/"
     },
     {
      "name": "Chess.com (Basic)",
      "url": "https://www.chess.com/membership"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "No price shown on fun.hoq.app",
      "them": [
       "$19.99 one-time on Steam",
       "Basic membership is free with unlimited games; Gold, Platinum and Diamond are paid"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://support.chess.com/en/articles/8609242-why-should-i-become-a-member-at-chess-com-does-it-cost-anything"
      ]
     },
     {
      "label": "Players at one table",
      "hoq": "Up to 4 at Pachisi or Turnabout, up to 8 at a freeform table",
      "them": [
       "Up to 10",
       "2 (chess)"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://support.chess.com/en/articles/8609242-why-should-i-become-a-member-at-chess-com-does-it-cost-anything"
      ]
     },
     {
      "label": "Rule enforcement",
      "hoq": "Rules told, not enforced; every move is recorded and can be challenged",
      "them": [
       "No rules: a physics sandbox",
       "not published"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://www.chess.com/legal/fair-play"
      ]
     },
     {
      "label": "AI agents as players",
      "hoq": "Yes, over MCP, seated and labelled as agents",
      "them": [
       "not published",
       "Bots, engines and plugins are prohibited during your games"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://www.chess.com/legal/fair-play"
      ]
     },
     {
      "label": "How cheating is handled",
      "hoq": "Hash-chained public record, sealed secrets audited at the reveal, and player challenges",
      "them": [
       "not published",
       "Detection by monitoring games; accounts closed and publicly labelled, lifetime ban on repeat"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://www.chess.com/legal/fair-play"
      ]
     },
     {
      "label": "Scripting and custom games",
      "hoq": "Games are JSON definitions with numbered rules; not editable by users yet",
      "them": [
       "Lua scripting",
       "not published"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://www.chess.com/membership"
      ]
     },
     {
      "label": "Where you play",
      "hoq": "In a web browser",
      "them": [
       "Windows, macOS, SteamOS and Linux app",
       "not published"
      ],
      "sources": [
       "https://store.steampowered.com/app/286160/Tabletop_Simulator/",
       "https://www.chess.com/membership"
      ]
     }
    ]
   }
  },
  {
   "key": "funds",
   "name": "Hoq Funds",
   "status": "live",
   "url": "https://funds.hoq.app",
   "line": "Gift cards, store credit and your payment accounts, shared by every till.",
   "facts": [
    {
     "label": "Who holds the money",
     "value": "Your own Stripe or Square account. Hoq never holds the money; keys are sealed on the server."
    },
    {
     "label": "Payment providers",
     "value": "Stripe (cards, saved cards, card readers, Tap to Pay) and Square (payments and refunds via Square's page)."
    },
    {
     "label": "Expiry by state",
     "value": "No expiry allowed on gift cards or store credit in Washington and California. Promo credit can expire."
    },
    {
     "label": "Cash-out",
     "value": "Offers cash for a gift card under $5 in Washington and under $10 in California, never on store credit."
    },
    {
     "label": "Codes",
     "value": "Stored only as a fingerprint; afterwards only the last four characters show."
    },
    {
     "label": "Square cards",
     "value": "Prints 16-digit numbers registered with Square first, so Square registers activate and scan them."
    },
    {
     "label": "Bookkeeping",
     "value": "Each day as a balanced journal by place; optional posting to Hoq Books as one entry per day."
    },
    {
     "label": "Bring cards over",
     "value": "Imports card numbers and balances from Square or any spreadsheet, once each, as balances brought over."
    },
    {
     "label": "Where the data lives",
     "value": "One .funds file per business in the owner's Hoq drive, shared by all its places."
    }
   ],
   "figures": [
    {
     "value": "$5 / $10",
     "label": "cash-out limits in Washington and California"
    },
    {
     "value": "100",
     "label": "Square-coded cards per print batch"
    },
    {
     "value": "3 mm at 300 dpi",
     "label": "bleed on card art, front and back"
    },
    {
     "value": "4",
     "label": "characters of a card number ever shown after it is made"
    }
   ],
   "features": [
    {
     "area": "Cards",
     "rows": [
      {
       "name": "Sell a gift card",
       "what": "Makes a card, puts on it what the customer paid, and shows its code once so it can be written or printed.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Give a card away",
       "what": "Makes a card the business gives away, counted as a marketing cost rather than money taken.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Check a card",
       "what": "Finds a card by its code however it is typed and shows its balance, what can be spent now and its history.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Spend and refund",
       "what": "Takes money off a card for a sale and puts a refunded sale back on the card that paid.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Hold then take",
       "what": "Lets a till reserve an amount for a few minutes before taking it, so two tills can never spend the same money.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Printed cards",
       "what": "Makes empty cards with a number and a QR code each, shown once, to keep at the counter and load when sold; with a design, in your own art (see Card designs).",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Load a card",
       "what": "Puts money a customer paid onto a card that already exists: a printed card sold, or a top-up.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Bring cards over",
       "what": "Reads a spreadsheet of card numbers and balances from Square or anywhere else and brings each card over once, as a balance brought over, not a sale.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Cash out small balances",
       "what": "Offers to pay out a gift card in cash when less than the law's limit is left (Washington under $5, California under $10), empties the card once, and never on store credit.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Codes kept safe",
       "what": "Keeps a card's code only as a fingerprint; afterwards only its last four characters are ever shown.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Card designs",
     "rows": [
      {
       "name": "Designs",
       "what": "Each design has a front and a back picture, cropped to the card with 3 mm bleed at 300 dpi, kept in the business's own file.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Place the codes",
       "what": "Drag the QR, the Data Matrix, the card number and the balance link onto either side; sizes, white boxes and text colour; warns when two overlap.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Your code, Square's, or both",
       "what": "A design carries our QR to the balance page, a Data Matrix Square registers scan (`sqgc://` and a Luhn-checked number), or both on one number.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Proof",
       "what": "A one-card PDF, front and back, with a sample number.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Art for a print shop",
       "what": "The bare front and back at bleed with crop marks, then a proof, as one PDF.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Print a batch",
       "what": "Makes empty cards and their PDF in one step: a card printer (front, back, or both in pairs), or Letter and 13 × 19 in sheets with crop marks and backs mirrored for duplex. The numbers exist only in that PDF.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Send to Hoq Print",
       "what": "Connects to the business's own Hoq Print and sends a batch straight to its card printer; if Hoq Print does not answer, the PDF downloads instead so no numbers are lost.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Connect Square",
       "what": "Paste the business's own Square access token; Funds checks it with Square, keeps it sealed (never in the business's file), and picks the location, or asks when there are several.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Square-coded printing",
       "what": "Each number (16 digits, Luhn-checked, starting 70) is registered with Square as an empty card before it is drawn, up to 100 a batch; the register turns it on when sold and the money stays in Square.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Square balances on the balance page",
       "what": "A Square card's number, typed or scanned, shows what Square holds, or says it is not turned on yet; existing Square gift cards work too.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Your brand",
       "what": "A colour and a logo for the business; the balance page wears them, with the default design's front as the card.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Apple Wallet pass",
       "what": "An active card can be added to Apple Wallet from the balance page: brand colour, logo, card art as the strip, balance when added, and a code the counter scans (Square's for Square cards). Signed and tested; switches on when Hoq's Pass Type ID certificate is configured.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Google Wallet pass",
       "what": "The same card as a signed \"Add to Google Wallet\" link. Switches on when Hoq's Google Wallet issuer is configured.",
       "status": "beta",
       "verified": "2026-10-25"
      }
     ]
    },
    {
     "area": "Online",
     "rows": [
      {
       "name": "Gift card page",
       "what": "A page anyone can open to buy a gift card, choosing an amount and who it is for, with a message.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Your own Stripe",
       "what": "Takes payment straight into the business's own Stripe account; Hoq never holds the money, and the key is kept sealed on the server.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Sent by email",
       "what": "Makes the card once the payment goes through and emails its number to the person it is for, with a receipt to the buyer that never shows the number.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Never lost",
       "what": "Keeps the number sealed until the email has gone, retries an email that failed, and makes one card however often Stripe repeats itself.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Balance page",
       "what": "A public page where a customer types their card number, or scans the QR on a printed card, to see what is left; a few wrong guesses an hour and it stops.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Limits per buyer",
       "what": "Caps how many cards one buyer may buy in a day.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Held for a look",
       "what": "Holds large orders for a few hours before the card goes; the owner can send one sooner or cancel and refund it through Stripe.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Stolen-card protection",
       "what": "A Stripe fraud warning keeps a held card from going; a chargeback turns a card already sent off.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Orders",
       "what": "Lists the cards bought online with who bought them, who they were for and whether the email went.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Counters",
     "rows": [
      {
       "name": "Counter link",
       "what": "A link for each till or tablet, so staff can check a card, take money off it and load it without signing in.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Scan a card",
       "what": "Reads a card's QR code with the tablet's camera where the browser can.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Kept to its job",
       "what": "A counter reaches only its own business, names cards only by number, records every movement at its place, and can be turned off at once.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Members",
     "rows": [
      {
       "name": "Store credit",
       "what": "Gives a person credit for a refund, found by email or phone, added if they are new.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Promo credit",
       "what": "Gives a person promo credit with its own expiry, counted as a marketing cost.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Wallet",
       "what": "Shows everything one person holds, fund by fund.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Money",
     "rows": [
      {
       "name": "Funds with rules",
       "what": "Keeps several funds of each kind, each with its own expiry and the places that honour it.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "No expiry where the law forbids it",
       "what": "Refuses an expiry date on gift cards and store credit in Washington and California.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "What is owed",
       "what": "Shows the money customers can still spend, fund by fund.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "A day for the bookkeeper",
       "what": "Shows one business day as a balanced journal, by place, in the business's own time zone.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Ledger check",
       "what": "Walks every movement to prove it is chained, balanced and matches every balance.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Retries land once",
       "what": "Takes each movement with the caller's own reference, so a till that retries after a timeout is charged once.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Expiry",
       "what": "Lapses promo balances past their date on the five-minute tick.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "JSON door and MCP",
       "what": "Offers every console action to other apps and agents, with owners alone setting rules and correcting balances.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Books",
     "rows": [
      {
       "name": "Hoq Books, if you use it",
       "what": "Optional: sends each finished day to the business's Hoq Books as one balanced entry, by place, under its own key so a retry never posts twice.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Days in order",
       "what": "Sends days in order and never skips one; a day Books could not take holds the days after it until it goes through.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Accounts set up for you",
       "what": "Uses Books accounts already named for the job, makes the rest, and asks only about the accounts this business can post to.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Books agree check",
       "what": "Compares what is owed here with the Books accounts it posts to, and shows any difference, such as an entry made by hand.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Key kept apart",
       "what": "Keeps the Books key sealed on the server, never in the business's own file.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Paying",
     "rows": [
      {
       "name": "Payment accounts",
       "what": "Holds the business's own Stripe and Square accounts, several of each if needed, and sends each payment to the right one by place, storefront, channel, app, form, product or category; rules can be tried against the last 90 days first.",
       "status": "beta",
       "verified": "2026-10-28"
      },
      {
       "name": "Saved cards",
       "what": "Saves a customer's card on the business's own Stripe account, from Funds' pages, a Shop checkout or a tap at the till, shown only as brand, last four and expiry; the customer can see and remove them from an emailed link.",
       "status": "beta",
       "verified": "2026-10-28"
      },
      {
       "name": "What the customer agreed to",
       "what": "Records for each saved card the words the customer agreed to and for which app, and refuses any charge outside them, such as a renewal bigger than agreed.",
       "status": "beta",
       "verified": "2026-10-28"
      },
      {
       "name": "Pay from anything",
       "what": "Lets Shop, Service and Forms take a payment on the business's account, from a balance first then a card, once however often they ask; a payment whose result was lost is found again, and one the bank wants confirmed sends the customer a confirm page.",
       "status": "beta",
       "verified": "2026-10-28"
      },
      {
       "name": "Card readers and Tap to Pay",
       "what": "Lets Shop's tills take cards on the business's readers or a phone, each a Funds payment with its tip, and keep the card when the customer says yes.",
       "status": "beta",
       "verified": "2026-10-28"
      },
      {
       "name": "Square payments",
       "what": "Takes payments and refunds on the business's own Square account through Square's payment page; no saved Square cards or Square readers yet.",
       "status": "beta",
       "verified": "2026-10-28"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 57,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Square Gift Cards",
      "url": "https://squareup.com/us/en/software/gift-cards/pricing"
     },
     {
      "name": "Givex",
      "url": "https://www.givex.com/"
     }
    ],
    "rows": [
     {
      "label": "Monthly fee",
      "hoq": "not published",
      "them": [
       "None",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/gift-cards/pricing",
       "https://www.givex.com/"
      ]
     },
     {
      "label": "Load fee",
      "hoq": "not published",
      "them": [
       "2.5% of the amount loaded; none on Square Premium",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/gift-cards/pricing",
       "https://www.givex.com/"
      ]
     },
     {
      "label": "Where the money settles",
      "hoq": "Your own Stripe or Square account",
      "them": [
       "Your Square account",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/gift-cards/pricing",
       "https://www.givex.com/"
      ]
     },
     {
      "label": "Expiry",
      "hoq": "Refused on gift cards and store credit in WA and CA; promo credit may expire",
      "them": [
       "Gift cards do not expire",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/gift-cards/pricing",
       "https://www.givex.com/"
      ]
     },
     {
      "label": "Store credit and promo credit",
      "hoq": "Included, each with its own rules",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/gift-cards/pricing",
       "https://www.givex.com/"
      ]
     },
     {
      "label": "Works with Square registers",
      "hoq": "Yes, with Square-coded printed cards",
      "them": [
       "Yes",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/gift-cards/pricing",
       "https://www.givex.com/"
      ]
     }
    ]
   }
  },
  {
   "key": "grimaste",
   "name": "Grimaste",
   "status": "live",
   "url": "https://grimaste.hoq.app",
   "line": "Your own AI agent, on its own Linux container, with access you grant.",
   "facts": [
    {
     "label": "Workspace",
     "value": "Each agent runs in its own Linux container with files, a shell and a browser you can watch and take over."
    },
    {
     "label": "Always on",
     "value": "Agents keep working with the app closed; with the initiative dial at scheduled, an agent acts on its own schedule."
    },
    {
     "label": "Models",
     "value": "HOQ 5.x, HOQ 5.x Flash or MiniMax M3, or your own key from OpenAI, Anthropic, OpenRouter, MiniMax or any OpenAI-compatible endpoint. On your own key, chat bills to you directly."
    },
    {
     "label": "Channels",
     "value": "Reach an agent through Telegram, Discord or email with your own bot token or mailbox password, sealed to that agent."
    },
    {
     "label": "App access",
     "value": "8 Hoq apps can be granted per agent as off, read only, or read and write. Each grant is its own key for that agent alone."
    },
    {
     "label": "Approvals",
     "value": "Risky actions wait for you: approve once, for this session, always, or deny, including from a push notification."
    },
    {
     "label": "Secrets",
     "value": "Vault secrets are pasted once and given to chosen agents as files. Their contents are never returned to the app."
    },
    {
     "label": "Context",
     "value": "Each thread keeps 100k, 250k, 400k or 600k tokens before summarizing older turns, sized automatically by default."
    },
    {
     "label": "Organizations",
     "value": "An agent can belong to an organization; everyone there can open it, and each person keeps their own threads. Turns from people other than the owner get a restricted tool list."
    },
    {
     "label": "Private agents",
     "value": "Agents can be locked behind a PIN, and their notifications then do not show what they ask."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "dials that set how an agent behaves"
    },
    {
     "value": "8",
     "label": "Hoq apps an agent can be granted access to"
    },
    {
     "value": "600k",
     "label": "tokens of conversation context per thread, at the largest setting"
    },
    {
     "value": "3",
     "label": "outside channels: Telegram, Discord and email"
    }
   ],
   "features": [
    {
     "area": "Workspace",
     "rows": [
      {
       "name": "Own container",
       "what": "Each agent runs in its own Linux container with files, a shell and a browser.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Watch and drive the browser",
       "what": "Watch the agent's browser live, take over with mouse and keyboard, and hand it back.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Browser pop-out",
       "what": "Move the agent's browser into its own always-on-top window, or fill the whole window.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Shared bookmarks",
       "what": "You and the agent keep one bookmark list, marked with who saved each one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Terminal",
       "what": "Open several shells into the agent's container in tabs; each one persists between visits.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Conversation",
     "rows": [
      {
       "name": "Threads",
       "what": "Talk to an agent in separate threads, each with its own history.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Context per thread",
       "what": "Each thread keeps 100k to 600k tokens before summarizing older turns, sized automatically or fixed by you.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Turn trail",
       "what": "Each step of a turn shows what it is about and is ticked as it finishes.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Channels",
       "what": "Reach an agent through Telegram, Discord or email with your own bot token or mailbox.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pictures",
       "what": "Pictures the agent sends open full screen.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Control",
     "rows": [
      {
       "name": "Approvals",
       "what": "Risky commands wait for you, showing the command and why it was flagged; approve once, for the session, always, or deny.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Approve from a notification",
       "what": "Answer an approval from the browser notification without opening the app.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Dials",
       "what": "Six settings for reach, asking first, initiative, voice, memory and model, applied in about two seconds.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Private agents",
       "what": "Lock an agent behind a PIN; its notifications then do not show what it asks.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Running or paused",
       "what": "Pause an agent's machine and start it again.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Access to your apps",
     "rows": [
      {
       "name": "Data sources",
       "what": "Grant Hoq apps per agent as off, read only, or read and write; each grant is its own key, revoked when you turn it off.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hoq Repos",
       "what": "The agent reads and writes repositories with a capped agent key, every write labelled as the agent's.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hoq Board",
       "what": "The agent lists, reads and edits boards, and in ask-first areas its changes wait for your approval.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hoq Commerce and Logistics",
       "what": "The agent reads sales reports, orders, stock and shipments, and can make changes if you allow it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vault",
       "what": "Paste a secret once and give it to chosen agents as a file; its contents are never shown back.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Models",
     "rows": [
      {
       "name": "Hoq models",
       "what": "Run on Hoq Intelligence models billed to your Hoq balance.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bring your own key",
       "what": "Use your own OpenAI, Anthropic, OpenRouter, MiniMax or OpenAI-compatible key, billed to you directly.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Teams and notices",
     "rows": [
      {
       "name": "Agents in organizations",
       "what": "An agent can belong to an organization; members open it and each keeps their own threads.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Inbox",
       "what": "One inbox holds notifications and tickets from every agent, with read marks that follow you across devices.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tickets",
       "what": "Agents file tickets you can mark built, answer or decline; tickets about a Hoq app go to that app's builders.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Browser notifications",
       "what": "Replies, approvals and reminders arrive as browser notifications with the app closed, one per thread.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Phone layout",
       "what": "The web app works on a phone, and can be added to the home screen.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 27,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "ChatGPT Business",
      "url": "https://openai.com/business/pricing/"
     },
     {
      "name": "Claude Team",
      "url": "https://claude.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "not published",
      "them": [
       "$25 per user per month billed monthly, $20 billed annually (Standard seat)",
       "$25 per seat per month billed monthly, $20 billed annually (standard seat)"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Minimum team size",
      "hoq": "None; an agent can be just yours",
      "them": [
       "2 seats",
       "2 seats"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Model choice",
      "hoq": "Hoq models or your own key from any OpenAI-compatible endpoint",
      "them": [
       "OpenAI models",
       "Claude models"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Own computer per agent",
      "hoq": "Linux container with files, a shell and a browser",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Reachable from chat apps",
      "hoq": "Telegram, Discord and email",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Scheduled work",
      "hoq": "Yes, initiative dial set to scheduled",
      "them": [
       "not published",
       "Hand off and schedule tasks listed for Pro, Max and Ultra, not Team"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "Training on your data",
      "hoq": "not published",
      "them": [
       "Not by default",
       "Not by default"
      ],
      "sources": [
       "https://openai.com/business-data/",
       "https://claude.com/pricing"
      ]
     },
     {
      "label": "SSO",
      "hoq": "not published",
      "them": [
       "SAML SSO included",
       "Included"
      ],
      "sources": [
       "https://openai.com/business/pricing/",
       "https://claude.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "igen",
   "name": "Hoq Igen",
   "status": "beta",
   "url": "https://igen.hoq.app",
   "line": "Pick a model per picture, paint a mask to change part of it.",
   "facts": [
    {
     "label": "Models on the bench",
     "value": "Ideogram v4 fast, FLUX.2 flex, Gemini 3 Pro Image, Seedream v5 Pro, Recraft v4 vector; FLUX Pro fill and Bria for edits."
    },
    {
     "label": "Edit tools",
     "value": "Fill a painted region from a prompt, or remove it. The mask is strictly black and white."
    },
    {
     "label": "Repeatable",
     "value": "Seeds are a per-model fact shown on each model; most text-to-image models do not offer one."
    },
    {
     "label": "Metadata in the file",
     "value": "PNG iTXt, or XMP in JPEG and SVG, plus a sidecar record."
    },
    {
     "label": "Who pays",
     "value": "Each picture is billed to your Hoq account at the price shown on the button."
    },
    {
     "label": "Where pictures go",
     "value": "Your Hoq Storage."
    },
    {
     "label": "Vector output",
     "value": "Recraft v4 returns real SVG files."
    }
   ],
   "figures": [
    {
     "value": "4",
     "label": "pictures per request on most models"
    },
    {
     "value": "5",
     "label": "aspect ratios on the default models: 1:1, 4:3, 3:4, 16:9, 9:16"
    },
    {
     "value": "1K, 2K, 4K",
     "label": "output sizes on Gemini 3 Pro Image"
    }
   ],
   "features": [
    {
     "area": "Make",
     "rows": [
      {
       "name": "Text to image",
       "what": "Makes up to four pictures from a prompt.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tiers and models",
       "what": "Choose a quality tier or a specific model.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Price on the button",
       "what": "Shows what a run costs before you start it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vector",
       "what": "Makes an SVG through Recraft.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Edit",
     "rows": [
      {
       "name": "Fill",
       "what": "Redraws a painted region from a prompt.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Remove",
       "what": "Erases a painted region with no prompt.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Brush",
       "what": "Brush with undo by stroke, Tab to see the original, Alt+scroll to resize.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Library",
     "rows": [
      {
       "name": "Saved to your drive",
       "what": "Keeps every picture in your Hoq Storage.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Made-with record",
       "what": "Writes the prompt and model into the file.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Retry",
       "what": "Runs a failed or finished request again.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 10,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Midjourney",
      "url": "https://docs.midjourney.com/hc/en-us/articles/27870484040333-Comparing-Midjourney-Plans"
     },
     {
      "name": "Canva Pro (AI tools)",
      "url": "https://www.canva.com/help/ai-access/"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Pay per picture at the price shown; no subscription",
      "them": [
       "$10, $30, $60 or $120 a month",
       "US$120 a year for one person"
      ],
      "sources": [
       "https://docs.midjourney.com/hc/en-us/articles/27870484040333-Comparing-Midjourney-Plans",
       "https://canva.com/pricing/"
      ]
     },
     {
      "label": "Choice of model",
      "hoq": "Several providers' models per picture",
      "them": [
       "Midjourney's own models",
       "not published"
      ],
      "sources": [
       "https://docs.midjourney.com/hc/en-us/articles/27870484040333-Comparing-Midjourney-Plans",
       "https://www.canva.com/help/ai-access/"
      ]
     },
     {
      "label": "Usage limits",
      "hoq": "None beyond your balance",
      "them": [
       "About 3.3 to 60 fast GPU hours a month; extra at $4 an hour",
       "Shared monthly AI allowance, 10x Free on Pro"
      ],
      "sources": [
       "https://docs.midjourney.com/hc/en-us/articles/27870484040333-Comparing-Midjourney-Plans",
       "https://www.canva.com/help/ai-access/"
      ]
     },
     {
      "label": "Private by default",
      "hoq": "Pictures go to your own drive",
      "them": [
       "Stealth mode on Pro and Mega only",
       "not published"
      ],
      "sources": [
       "https://docs.midjourney.com/hc/en-us/articles/32019750070669-Stealth-Mode",
       "https://www.canva.com/help/ai-access/"
      ]
     },
     {
      "label": "Commercial use for large businesses",
      "hoq": "not published",
      "them": [
       "Pro or Mega needed above $1M a year gross",
       "not published"
      ],
      "sources": [
       "https://docs.midjourney.com/hc/en-us/articles/27870375276557-Using-Images-Videos-Commercially",
       "https://www.canva.com/help/ai-access/"
      ]
     },
     {
      "label": "Design layout and templates",
      "hoq": "No; layout builder not built",
      "them": [
       "No",
       "Yes, full design editor"
      ],
      "sources": [
       "https://docs.midjourney.com/hc/en-us/articles/27870484040333-Comparing-Midjourney-Plans",
       "https://canva.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "intake",
   "name": "Hoq Intake",
   "status": "live",
   "url": "https://intake.hoq.app",
   "line": "Scan once. Your rules file each document into the right folder of your drive.",
   "facts": [
    {
     "label": "Where documents go",
     "value": "Folders in your own Hoq Storage drive, named by your rules."
    },
    {
     "label": "How documents arrive",
     "value": "From scanners on Hoq Station computers, Hoq scanning appliances, or POST /v1/documents with an API key."
    },
    {
     "label": "File types read",
     "value": "PDF and images. Intake reads a PDF's text layer and any barcodes or QR codes on the pages."
    },
    {
     "label": "OCR",
     "value": "Scanning stations run OCR before they send, so scanned PDFs arrive with text. Intake itself reads existing text and does not OCR images."
    },
    {
     "label": "Unmatched documents",
     "value": "Filed into a fallback folder you pick when you connect your drive, tagged unrouted. There is no review queue."
    },
    {
     "label": "Trying a rule",
     "value": "Replays the rule against the last 90 days of documents before it can be turned on."
    },
    {
     "label": "Duplicates",
     "value": "Identical bytes are linked to the first copy by default, or filed again if you choose."
    },
    {
     "label": "Separator sheets",
     "value": "Print a sheet with a QR code. Intake splits a scanned stack at each sheet and uses its name in rules."
    },
    {
     "label": "Retries",
     "value": "Each upload carries a reference made when the scan finishes, so a retried upload is the same document and never files twice."
    },
    {
     "label": "Original copies",
     "value": "Intake keeps the source bytes 30 days by default after filing, adjustable from 1 to 365 days."
    },
    {
     "label": "Access to your drive",
     "value": "The drive token is kept server-side, encrypted with AES-256-GCM, and never sent to a browser or device."
    }
   ],
   "figures": [
    {
     "value": "90 days",
     "label": "of past documents each new rule is tried against"
    },
    {
     "value": "30 days",
     "label": "default time the original is kept after filing (1 to 365)"
    },
    {
     "value": "7",
     "label": "facts a rule can test in the editor, from page-one text to page count"
    },
    {
     "value": "0",
     "label": "documents left waiting in an inbox: every one is filed"
    }
   ],
   "features": [
    {
     "area": "Sources",
     "rows": [
      {
       "name": "Scanning stations",
       "what": "An office computer with a scanner shows up as a station you can start a scan on from the console.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Scanner calibration",
       "what": "Scan a white sheet to calibrate a station's scanner.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Claim a device by code",
       "what": "A scanning box shows a pairing code that expires; you claim it in the console.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "API ingest",
       "what": "Post raw document bytes with an intake:ingest key; name the source in a header.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Checksum check",
       "what": "Send a SHA-256 of the file and a mismatch is refused, never filed.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Rules",
     "rows": [
      {
       "name": "Plain conditions",
       "what": "Contains, is, starts with, pattern, greater or less than, between; all conditions must match.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Folder and name templates",
       "what": "Build paths and names from {type} {year} {month} {day} {date} {device} {original} {seq} and more.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Try it first",
       "what": "See which of the last 90 days of documents a rule would have caught before turning it on.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Move what is filed",
       "what": "After a rule change, move earlier documents inside your drive in one step.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rule order",
       "what": "Rules run in the order you set; later also-rules can add tags but not change the folder.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Documents",
     "rows": [
      {
       "name": "Live document list",
       "what": "Pages appear in the console as they arrive, with search and per-source filters.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Page pictures",
       "what": "Preview each page of a document in the console.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Re-file, move, discard, retry",
       "what": "Fix one document by hand from its detail view.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Separator sheets",
       "what": "Print QR separator sheets to split one stack into several documents.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Duplicate policy",
       "what": "Link identical files to the first copy or file them again.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 15,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Dext Business",
      "url": "https://dext.com/us/business/pricing"
     },
     {
      "name": "Paperless-ngx (self-hosted)",
      "url": "https://docs.paperless-ngx.com/"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published",
      "them": [
       "$25.21 per month, or $302.50 a year, for 5 users",
       "Free software; you run the server"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://github.com/paperless-ngx/paperless-ngx/blob/main/LICENSE"
      ]
     },
     {
      "label": "Document allowance",
      "hoq": "Not published",
      "them": [
       "250 documents per month",
       "No limit stated"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://docs.paperless-ngx.com/"
      ]
     },
     {
      "label": "Where filed documents live",
      "hoq": "Folders in your Hoq Storage drive",
      "them": [
       "Dext, then sent on to accounting software",
       "Plain files on your own server"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://docs.paperless-ngx.com/"
      ]
     },
     {
      "label": "Reads amounts and fields",
      "hoq": "No, routes on text, source, pages and codes",
      "them": [
       "Yes, automatic data extraction",
       "Auto-tags with machine learning; optional AI suggestions"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://docs.paperless-ngx.com/"
      ]
     },
     {
      "label": "OCR",
      "hoq": "On the scanning station before upload",
      "them": [
       "not published",
       "Tesseract, 100+ languages"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://docs.paperless-ngx.com/"
      ]
     },
     {
      "label": "Email import",
      "hoq": "No",
      "them": [
       "not published",
       "Yes, multiple accounts with rules"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://docs.paperless-ngx.com/"
      ]
     },
     {
      "label": "Test a rule on past documents",
      "hoq": "Yes, last 90 days",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://docs.paperless-ngx.com/"
      ]
     },
     {
      "label": "Licence",
      "hoq": "Hosted service",
      "them": [
       "Hosted service",
       "GPL-3.0"
      ],
      "sources": [
       "https://dext.com/us/business/pricing",
       "https://github.com/paperless-ngx/paperless-ngx/blob/main/LICENSE"
      ]
     }
    ]
   }
  },
  {
   "key": "intelligence",
   "name": "Hoq Intelligence",
   "status": "live",
   "url": "https://intelligence.hoq.app",
   "line": "One API key for many models, billed per token from a prepaid balance.",
   "facts": [
    {
     "label": "Wire formats",
     "value": "POST /v1/chat/completions (OpenAI, streamed over SSE), POST /v1/messages (Anthropic, streamed over SSE), POST /v1/embeddings and GET /v1/models."
    },
    {
     "label": "Authentication",
     "value": "Hoq ID API keys with the scope ai:infer, sent as Authorization: Bearer or x-api-key."
    },
    {
     "label": "Billing model",
     "value": "Prepaid credits. A request with no balance behind it is refused with HTTP 402 before any upstream call."
    },
    {
     "label": "Metering units",
     "value": "Input tokens and output tokens per request, with cache reads and cache writes reported separately. Generation jobs are metered in job units: video per second of requested duration, 3D per request."
    },
    {
     "label": "Charge precision",
     "value": "Credit amounts are stored to 9 decimal places, and a line under one cent shows its exact value instead of 0.00."
    },
    {
     "label": "Early disconnects",
     "value": "Metering runs on every exit path, and each request meters under its own idempotency key, so a retried meter call debits once."
    },
    {
     "label": "Failed generations",
     "value": "Async generation jobs are charged only when they complete. Failed, cancelled and timed-out jobs cost nothing."
    },
    {
     "label": "Prompt caching",
     "value": "On the Anthropic format, the gateway adds up to two cache breakpoints when the client sent none."
    },
    {
     "label": "Model roles",
     "value": "hoq/fast, hoq/default, hoq/reasoning, hoq/vision, hoq/image, hoq/background and hoq/embed, each resolving to a priced model you can repoint per account."
    },
    {
     "label": "Who pays",
     "value": "An organization can pay for its members' AI, with an optional daily cap per member."
    },
    {
     "label": "Request logs",
     "value": "The access log records status and latency per request. It keeps no request bodies, no keys and no query strings."
    }
   ],
   "figures": [
    {
     "value": "7",
     "label": "named model roles you can repoint without a code change"
    },
    {
     "value": "9",
     "label": "decimal places on every charge"
    },
    {
     "value": "2",
     "label": "wire formats accepted: OpenAI and Anthropic"
    },
    {
     "value": "60",
     "label": "tags per account for grouping spend by API key"
    }
   ],
   "features": [
    {
     "area": "API",
     "rows": [
      {
       "name": "OpenAI format",
       "what": "Streamed chat completions in the OpenAI format, with usage reporting switched on for you.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Anthropic format",
       "what": "Streamed Messages API calls, so Anthropic SDKs and tools work with a new base URL.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Embeddings",
       "what": "Text embeddings through the same key, priced on input tokens only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Model list",
       "what": "GET /v1/models answers in the OpenAI list shape, including your role table.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Async generation jobs",
       "what": "Submit image, video or 3D generations to /v1/jobs and poll status and result URLs.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Models",
     "rows": [
      {
       "name": "Model roles",
       "what": "Ask for a role such as hoq/reasoning and the gateway picks the priced model behind it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Role preferences",
       "what": "Repoint a role for your account, with the price shown beside each candidate.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pooled models",
       "what": "Some models are served from several subscription accounts, and a request moves to the next account when one runs out or fails before sending any bytes.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Billing",
     "rows": [
      {
       "name": "Prepaid balance",
       "what": "Buy credits by card at id.hoq.app/billing; the balance goes up when the payment provider confirms the charge.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Fail closed",
       "what": "No key returns 401, no funds return 402 with a top-up link, an unreachable ledger returns 503.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organization billing",
       "what": "An organization can pay for members' AI and set a daily cap per member.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Dashboard",
     "rows": [
      {
       "name": "Usage view",
       "what": "Balance, daily spend, spend by model and per-request lines with tokens, cache hits and cost.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "API keys and tags",
       "what": "Mint keys and tag them many-to-many to see spend by client or team.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Playground",
       "what": "Try a model in the browser against your own key, with the running cost under the composer.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Refusals on the record",
       "what": "Refused requests and failed jobs appear in your usage with the reason, at zero cost.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 15,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "OpenRouter",
      "url": "https://openrouter.ai/pricing"
     },
     {
      "name": "Anthropic API (direct)",
      "url": "https://platform.claude.com/docs/en/api/rate-limits"
     }
    ],
    "rows": [
     {
      "label": "Request formats",
      "hoq": "OpenAI Chat Completions and Anthropic Messages",
      "them": [
       "OpenAI-compatible: Chat Completions and Responses",
       "Anthropic Messages"
      ],
      "sources": [
       "https://openrouter.ai/docs/api/reference/overview",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     },
     {
      "label": "Model catalogue",
      "hoq": "7 named roles plus the priced models behind them; full list shown after sign-in",
      "them": [
       "600+ models from 80+ providers",
       "Claude models only"
      ],
      "sources": [
       "https://openrouter.ai/pricing",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     },
     {
      "label": "Fee on top of model price",
      "hoq": "Markup built into each per-token price, not published as a percentage",
      "them": [
       "5.5% on credit purchases (Standard plan)",
       "not published"
      ],
      "sources": [
       "https://openrouter.ai/pricing",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     },
     {
      "label": "Spend control",
      "hoq": "Prepaid balance; requests refused with 402 at zero; per-member daily cap for organizations",
      "them": [
       "Budgets and per-key credit caps (Standard and above)",
       "Monthly spend cap per tier: $500 Start, $1,000 Build, $200,000 Scale; your own lower limit"
      ],
      "sources": [
       "https://openrouter.ai/pricing",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     },
     {
      "label": "Teams",
      "hoq": "Organization pays for members' AI",
      "them": [
       "5 workspaces on Standard, 1,000 on Business",
       "Workspaces with their own spend and rate limits"
      ],
      "sources": [
       "https://openrouter.ai/pricing",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     },
     {
      "label": "Zero data retention routing",
      "hoq": "not published",
      "them": [
       "Available on every plan",
       "not published"
      ],
      "sources": [
       "https://openrouter.ai/pricing",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     },
     {
      "label": "SSO",
      "hoq": "not published",
      "them": [
       "Enterprise only",
       "not published"
      ],
      "sources": [
       "https://openrouter.ai/pricing",
       "https://platform.claude.com/docs/en/api/rate-limits"
      ]
     }
    ]
   }
  },
  {
   "key": "inventory",
   "name": "Hoq Inventory",
   "status": "live",
   "url": "https://inventory.hoq.app",
   "line": "Stock, costing and counts for every warehouse and bin you have.",
   "facts": [
    {
     "label": "Costing methods",
     "value": "FIFO, weighted average, specific identification and standard cost, plus landed cost. Changing method is a recorded event."
    },
    {
     "label": "Stock channels",
     "value": "Amazon seller-fulfilled and FBA, Faire, Square, WooCommerce (directly or through the Hoq plugin) and Hoq Shop."
    },
    {
     "label": "Channel modes",
     "value": "Off, watch or mirror per channel. A channel whose key cannot write is held to read-only."
    },
    {
     "label": "Locations",
     "value": "Nested warehouse, zone, aisle and bin, with temperature zones and count locks."
    },
    {
     "label": "Barcodes",
     "value": "UPC, EAN, ISBN, ASIN, MPN, GTIN-14, Code 128, QR and custom codes; a phone camera scans them."
    },
    {
     "label": "Lots",
     "value": "Lot and serial numbers with expiry, sell-by and best-by dates, holds, recalls and a trace of every movement."
    },
    {
     "label": "Counts",
     "value": "Blind by default, with a second person on variances and ABC cadence; posted as adjustments."
    },
    {
     "label": "Where the data lives",
     "value": "One .inventory document per warehouse in the owner's Hoq Storage drive; the service keeps only who may open it."
    },
    {
     "label": "Square counts",
     "value": "Counts are sent as of the moment orders were read, so a till sale in between is not undone."
    }
   ],
   "figures": [
    {
     "value": "4",
     "label": "costing methods: FIFO, weighted average, specific, standard"
    },
    {
     "value": "5",
     "label": "places stock stays in step with: Amazon, Faire, Square, WooCommerce, Hoq Shop"
    },
    {
     "value": "20",
     "label": "versions of each warehouse kept in your drive"
    },
    {
     "value": "9",
     "label": "kinds of barcode and identifier an item can carry"
    }
   ],
   "features": [
    {
     "area": "Catalog",
     "rows": [
      {
       "name": "Items per size",
       "what": "Keeps each size or variant as its own item with its own stock and code.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Products and families",
       "what": "Groups items into products and families without moving their stock.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Collections by rule",
       "what": "Builds collections from tags or rules and counts matches before saving.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bundles",
       "what": "Sells a set of parts as one item and shows how many can be made.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Typed details",
       "what": "Adds fields of your own to items, products and lots, with filters on them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pack sizes",
       "what": "Counts eaches, packs, cases and pallets, converting each to units.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Stock",
     "rows": [
      {
       "name": "Receive, move, adjust, ship",
       "what": "Records every movement in an append-only ledger with who and why.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reservations",
       "what": "Holds stock for carts and orders and lets go when the hold lapses.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Returns",
       "what": "Takes customer returns and sends returns to suppliers.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Camera scanning",
       "what": "Uses a phone's camera to find items and count lines.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Costing and reports",
     "rows": [
      {
       "name": "Four costing methods",
       "what": "Values stock by FIFO, weighted average, specific or standard cost, plus landed cost.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reports",
       "what": "Shows velocity, ABC classes, turnover, KPIs and daily shipped and received.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Forecasts",
       "what": "Forecasts demand per item and suggests order quantities.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Lots and quality",
     "rows": [
      {
       "name": "Lots and serials",
       "what": "Tracks lots with expiry, sell-by and best-by dates, first-expiring first.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Holds and recalls",
       "what": "Holds, inspects, releases or recalls a lot and traces where it went.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Quality checks",
       "what": "Records readings against specs and flags excursions.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Counts",
     "rows": [
      {
       "name": "Cycle counts",
       "what": "Runs blind counts with a second person on variances and ABC cadence.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bin locks",
       "what": "Locks a bin while it is being counted and says which count holds it.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Purchasing",
     "rows": [
      {
       "name": "Purchase orders",
       "what": "Raises, edits and receives purchase orders line by line into a chosen bin.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Supplier price lists",
       "what": "Imports a supplier's catalog and links its items to yours.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Order suggestions",
       "what": "Suggests a quantity up to the reorder level, rounded to supplier minimums.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Channels",
     "rows": [
      {
       "name": "Stock sync",
       "what": "Keeps Amazon, Faire, Square, WooCommerce and Hoq Shop counts off, watched or mirrored.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Sync health",
       "what": "Flags channels that fail, drift or have orders waiting.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Offers",
       "what": "Lists each item on each channel with its own id, status and price.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Price books",
       "what": "Resolves prices by currency, channel, tier, region and date.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 23,
   "beta": 2,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Cin7 Core",
      "url": "https://www.cin7.com/pricing/"
     },
     {
      "name": "inFlow Inventory",
      "url": "https://www.inflowinventory.com/software-pricing-inflow"
     }
    ],
    "rows": [
     {
      "label": "Price per month",
      "hoq": "not published",
      "them": [
       "$349 Standard, $599 Pro, $1,199 Advanced",
       "$129 Lite billed monthly ($99 billed yearly)"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "Users included",
      "hoq": "not published",
      "them": [
       "5 on Standard",
       "2 on Lite, $29 a month each extra"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "Locations",
      "hoq": "Nested warehouses, zones, aisles and bins",
      "them": [
       "not published",
       "1 on Lite, 5 on Core, unlimited on Pro"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "Sales channel integrations",
      "hoq": "Amazon, Faire, Square, WooCommerce, Hoq Shop",
      "them": [
       "2 included on Standard",
       "Shopify, Amazon, WooCommerce included"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "Order volume limit",
      "hoq": "not published",
      "them": [
       "6,000 sale orders a year on Standard",
       "not published"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "Costing methods named",
      "hoq": "FIFO, weighted average, specific, standard",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "Lots and serials",
      "hoq": "Included",
      "them": [
       "not published",
       "$39 a month add-on"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     },
     {
      "label": "API",
      "hoq": "Included JSON API with Bearer keys",
      "them": [
       "Add-on",
       "API and MCP $49 a month add-on"
      ],
      "sources": [
       "https://www.cin7.com/pricing/",
       "https://www.inflowinventory.com/software-pricing-inflow"
      ]
     }
    ]
   }
  },
  {
   "key": "kds",
   "name": "Hoq KDS",
   "status": "live",
   "url": "https://kds.hoq.app",
   "line": "Every order on the right kitchen screen once, even through a dropped connection.",
   "facts": [
    {
     "label": "Order source",
     "value": "Hoq Commerce, connected through Hoq ID with no key to copy; every channel's kitchen work arrives."
    },
    {
     "label": "Offline",
     "value": "Keeps the last board on screen and queues taps until the connection is back."
    },
    {
     "label": "Missed orders",
     "value": "A ring from Commerce plus a check every minute; any order on no board turns every screen's header red."
    },
    {
     "label": "Pairing",
     "value": "A six-digit code on any tablet or TV, or a screen link shown once. A screen reaches only its own shop."
    },
    {
     "label": "Hardware",
     "value": "Any browser; installs to a tablet home screen. Bump bars and keyboards select, bump, recall."
    },
    {
     "label": "Where the data lives",
     "value": "One file per company in the owner's Hoq Storage; changes sent there every 15 seconds."
    },
    {
     "label": "Accessibility",
     "value": "Screen reader announcements, a colour-blind safe palette, 44 px touch targets, hold-to-bump for wet hands."
    },
    {
     "label": "Export",
     "value": "Every order as CSV for today, the last 7 days or the last 30."
    }
   ],
   "figures": [
    {
     "value": "1 minute",
     "label": "between checks that no order is missing a ticket"
    },
    {
     "value": "15 seconds",
     "label": "most work lost if a server is lost"
    },
    {
     "value": "5 and 10",
     "label": "board styles and palettes, one colour-blind safe"
    },
    {
     "value": "50 to 250%",
     "label": "screen zoom, remembered per screen"
    },
    {
     "value": "30×",
     "label": "fastest day replay speed, tap by tap"
    }
   ],
   "features": [
    {
     "area": "Your kitchen",
     "rows": [
      {
       "name": "A kitchen is a file",
       "what": "Keeps each company's locations, stations, screens and tickets in one file in the owner's Hoq Storage.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Always on",
       "what": "Keeps a kitchen open once it has been opened, so a ticket never waits for it to start.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Locations",
       "what": "Gives each shop its own stations and screens inside one company.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Stations",
       "what": "Lets you name stations, pick what kind each one is, and set when a ticket turns amber and red.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Settings",
       "what": "Holds the kitchen's name, timezone, daily order goal, on-time goal and shift hours.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Shops of their own",
       "what": "Lets each shop set its own opening and closing hours, orders goal and on-time goal, which its screens' shift bar, morning clear-out and health checks follow; empty boxes follow the kitchen.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Archive a shop",
       "what": "Keeps a closed shop's history while it takes no orders or screens; refused while it still has screens or tills or is the last open shop, and it can be brought back.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Setup asks what it skipped",
       "what": "Setup asks for the time zone and opening hours, sends items to stations when a shop has more than one, and ends with a test order to bump; kitchens already taking orders count those steps done.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Orders",
     "rows": [
      {
       "name": "Orders from Hoq Commerce",
       "what": "Connects to your Hoq Commerce company through Hoq ID, with no key to copy, and takes every order with kitchen work from every channel.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Straight to the screen",
       "what": "Commerce rings the kitchen the moment an order lands or changes, and the kitchen reads it at once.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Never miss one",
       "what": "Checks Commerce every minute as well, so an order whose ring was lost still arrives.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Edits and cancels",
       "what": "Shows a change made at the till on the same ticket and takes a cancelled order off the board.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Starts from now",
       "what": "Shows orders placed after you connect, not every order Commerce ever took.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Which shop is which",
       "what": "Places each Commerce location, or a single till, at one of your kitchen's locations; a kitchen with one shop places every till on it as it arrives.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Unplaced tills",
       "what": "Holds back an order from a till nobody has placed, counts it and says where to place it, rather than guessing a shop; the warning goes once the till is placed, or after a day with nothing from it.",
       "status": "beta",
       "verified": "2026-10-09"
      },
      {
       "name": "Missing-order alarm",
       "what": "Checks every minute that each kitchen order Hoq Commerce took in the last two hours has a ticket here, reading Commerce's sales rather than the feed this kitchen pulls from.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Puts a missing order on the board",
       "what": "Adds a missing order to its board on its own and tells that shop's screens it arrived late, by number, name and how late.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Red when an order is on no board",
       "what": "Turns every working screen's header red, names the order and sounds an alarm when an order cannot be placed; it stays until it arrives or the owner dismisses it.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "A bad order never holds up the rest",
       "what": "An order from Hoq Commerce that this kitchen cannot read or will not take is skipped so the orders behind it still arrive, and every working screen names it in red until it goes in, is dismissed, or is a day old.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Says when Commerce goes quiet",
       "what": "Warns on every screen when this kitchen has not heard from Commerce for three minutes, and turns red when Commerce has rung with orders it could not read.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Alarm time",
       "what": "Lets the owner choose how long an order may take to arrive before it counts as missing (30 seconds to 15 minutes, 90 by default).",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Disconnect",
       "what": "Stops Commerce ringing, gives the key back to Hoq ID and stops orders arriving.",
       "status": "beta",
       "verified": "2026-10-07"
      }
     ]
    },
    {
     "area": "Routing",
     "rows": [
      {
       "name": "Rules",
       "what": "Sends items to stations by name, size, category, modifier, order type or channel, with \"every test\" or \"any test\"; a name pattern can be up to 1,000 characters.",
       "status": "beta",
       "verified": "2026-10-09"
      },
      {
       "name": "Try an item",
       "what": "Says where an item would go and which rule sent it there, without putting anything on a board.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Change, switch off or delete a rule",
       "what": "Edits any rule, turns it off for a while, or removes it.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Where each item goes",
       "what": "Lists every item the shop sold in the last 60 days, and each category from Hoq Commerce, with where it goes now and why, and a station to pick for each; an item picked on its own beats its category.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Everything else",
       "what": "Lets the owner pick the station that takes anything no rule claims; with none picked it goes to the first station.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Pattern rules under Advanced",
       "what": "Keeps hand-written pattern rules in a collapsed Advanced section below the item list.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Screens",
     "rows": [
      {
       "name": "Pair with a code",
       "what": "Shows a six-digit code on any tablet or TV at kds.hoq.app/pair; type it in the console and the screen opens its board.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Pair in one tap from a station",
       "what": "A pairing page shown as a tab of a Hoq station gives the station a Pair link that opens the kitchen's Screens page with the code filled in, after sign-in if needed and after picking a kitchen when you run several.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Screen links",
       "what": "Makes a link for a screen instead of a code, shown once.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Station, expo and pickup screens",
       "what": "Lets each screen show one station, every station for the expediter, or a customer pickup board.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "A screen only reaches its own shop",
       "what": "Lets a screen work tickets at its own location only, and a pickup board only look.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Open a screen from the console",
       "what": "Opens any screen's board in the browser under your own sign-in, with bumps recorded as you; no tablet or link needed.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Remove a screen",
       "what": "Turns a screen off at once; its link stops working.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Last seen",
       "what": "Shows when each screen last checked in, including a screen opened from the console.",
       "status": "beta",
       "verified": "2026-10-09"
      },
      {
       "name": "Install as an app",
       "what": "Installs each screen to a tablet's home screen as its own full-screen app.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Screen look from the console",
       "what": "Sets each screen's board style and palette from the console, while a tablet where someone chose its own look keeps it.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Move a screen",
       "what": "Changes what a screen shows (a station, Expo or the pickup board) from its Set up, and the tablet reloads into its new job by itself.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Identify",
       "what": "Shows a screen's name across its whole board for 8 seconds so you can tell which tablet is which.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Pickup time for orders placed ahead",
       "what": "A ticket placed ahead shows its pickup time and starts its clock five minutes before it is wanted.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Pick what expo sees",
       "what": "Chooses which stations an expo screen shows.",
       "status": "beta",
       "verified": "2026-10-07"
      }
     ]
    },
    {
     "area": "The board",
     "rows": [
      {
       "name": "Tickets counted once",
       "what": "Puts each order on the board once, however many times the till sends it, and only the change when it is edited.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Tap to bump",
       "what": "Crosses out a whole line with one tap; a second tap brings it back.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Taps land once",
       "what": "Gives every tap its own id, so a tap sent twice by a flaky connection counts once.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Works through a dropped connection",
       "what": "Keeps the last board on screen and queues taps until the connection is back.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Notes on the card",
       "what": "Shows the order's note on the ticket and each drink's note under the drink.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Allergy flag",
       "what": "Marks a ticket whose items, modifiers or notes mention an allergy.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Late warnings",
       "what": "Colours each ticket by age, pulses the late ones and counts them in the header.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Board styles",
       "what": "Offers five board styles, ten palettes including a colour-blind safe one, and three text sizes.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Screen size",
       "what": "Makes everything on a screen bigger or smaller, from 50% to 250%, with A− and A+ in the header and in settings; each screen remembers its own size.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Alarm on and off",
       "what": "A bell in the header turns the late-order and missing-order alarm sound on or off, separately from the new-order chime, and shows \"Alarm off\" in red while it is off.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Alarm snooze, loudness and escalation",
       "what": "The bell offers quiet for 5 or 15 minutes or off for today (back on the next day by itself); loudness is Soft, Normal or Loud; a critical ticket's alarm repeats sooner and louder until nothing is critical, the missing-order alarm repeats every minute, and an optional slow red screen edge shows alarms to staff who cannot hear them.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Not updating band",
       "what": "A screen that has not refreshed for 20 seconds says so across its full width, a tablet that starts offline says it shows the last saved board, and bumps queued offline show as done on it.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Bump bar numbers",
       "what": "While a bump bar is in use each of the first ten tickets shows the key that picks it; Enter with nothing picked picks the first ticket rather than bumping it; Esc or R during the dismiss countdown keeps the ticket; Page Up/Down scroll.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Pickup board sizing",
       "what": "Ready cards grow to fill the TV when few orders are waiting and shrink as more arrive, and the board says when it has stopped updating.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Hold to bump",
       "what": "A wet-hands setting where a tap does nothing and holding half a second bumps (the row fills while held), so a splash or a brushed sleeve never bumps an order; touch targets are at least 44 px everywhere on the screen.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Screen reader support",
       "what": "New orders are announced, items say whether they are done, and the alarm bell says its state in words.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Kitchen's own clock",
       "what": "Screens show the clock and ticket times in the kitchen's time zone, whatever the tablet is set to.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Calm bumping",
       "what": "A bumped ticket leaves an outline of its own size and nothing else moves; the board closes the gaps with a short slide once nobody has touched it for a moment (or straight away, as a setting).",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Screen defaults from the console",
       "what": "The owner sets each screen's size, ticket text, chime, alarm (on, off or always on) and gap closing in the console; a choice made on the tablet itself wins until someone taps \"Use the console's choices\".",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Each screen says how it is set",
       "what": "The Screens list shows what every tablet reports: alarm off and since when, quieted until when, sound blocked until someone taps it, its size, and which choices were changed on the tablet.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Changes saved within seconds",
       "what": "Every change to a kitchen is recorded beside it and sent to Hoq Storage as a small piece every 15 seconds, with a full copy now and then, so a lost server costs seconds of work rather than hours; an encrypted copy can also go somewhere off the server.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Health alerts",
       "what": "Every minute each kitchen checks Hoq Commerce is being read, no order is on no board, screens check in during the shift, no tablet has its alarm off or its sound blocked, and changes reach Hoq Storage; a problem lasting five minutes is emailed from kds@hoq.app, and again when it clears, with the history in Settings.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Readable tickets",
       "what": "Busy periods never shrink the chosen text size; modifiers, notes and small labels keep readable contrast on every palette; allergy tags and notes grow with the text size.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Bump bars and keyboards",
       "what": "Selects tickets with number keys and bumps, recalls and prints from a bump bar or keyboard.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Recall",
       "what": "Brings back the last bumped line, or a whole finished ticket from the recall board.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Rush and 86",
       "what": "Moves a ticket to the front, or marks an item out on its ticket.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Expo",
       "what": "Shows every station's part of each order, with lanes by order type and a hand-out button.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Coursing",
       "what": "Holds later courses until someone fires them.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Shift goal",
       "what": "Shows today's orders against the goal and the pace the shift should be at.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "A clean board each morning",
       "what": "Clears every ticket still on a board from before the shift opens, once a day, and keeps them in history as swept.",
       "status": "beta",
       "verified": "2026-10-09"
      },
      {
       "name": "Pickup board",
       "what": "Shows customers what is being made and what is ready, by first name and last initial, with a chime.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Live updates",
       "what": "Refreshes every screen at a location the moment something changes there; polls every few seconds when it cannot.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Setup checklist",
       "what": "Two steps for a new kitchen: connect Commerce, then put it on a screen; placing tills appears only when there is more than one shop or a till is waiting.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    },
    {
     "area": "Reports",
     "rows": [
      {
       "name": "Metrics",
       "what": "Shows orders, ticket and make times, first-fire time, on-time rate, busiest hours on the kitchen's clock, each station, slowest and busiest items and suggested prep times, for any window up to about three months.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Leaderboard",
       "what": "Ranks who bumped the most and the fastest, with on-time streaks and badges, beside today's goal.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Apply usual prep times",
       "what": "Applies the prep times Metrics learned, one item or all at once; a ticket whose items all have one turns amber after the longest usual time and red after the longest slow time instead of the station's clock; on time in reports, the shift bar, the leaderboard and the daily summary then scores each applied item by its slow time. Each can be removed.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Today against last week",
       "what": "Shows each shop's orders against the same day last week, on-time rate, typical ticket time, busiest hour and items out of stock, with an all-shops total.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Orders as a spreadsheet",
       "what": "Downloads every order as a CSV for today, the last 7 days or the last 30.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Daily summary email",
       "what": "Emails the alert addresses once after the last shop closes with the day's numbers and any missing orders; skips days with no orders and can be switched off in Settings.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Day replay",
       "what": "Plays a location's last day back tap by tap, at up to 30 times speed, on the kitchen's clock.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "From a screen or the console",
       "what": "Opens all three from a station or expo screen's header, or per location from the console's Reports tab; a pickup board cannot open them.",
       "status": "beta",
       "verified": "2026-10-07"
      },
      {
       "name": "Inside a station",
       "what": "A board shown as a tab of a Hoq station keeps the station on it while a bump is in its keep window or on its way, and fetches the board at once when the tab comes back into view; Leaders and Metrics open inside the tab.",
       "status": "beta",
       "verified": "2026-10-13"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 84,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Square KDS",
      "url": "https://squareup.com/us/en/pricing"
     },
     {
      "name": "Fresh KDS",
      "url": "https://www.fresh.technology/"
     }
    ],
    "rows": [
     {
      "label": "Price per screen per month",
      "hoq": "not published",
      "them": [
       "$30 on Square Plus, $20 on Square Premium",
       "$20 Essentials, $27 Premium ($16 / $22 billed yearly)"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://www.fresh.technology/"
      ]
     },
     {
      "label": "Plan required",
      "hoq": "not published",
      "them": [
       "Square Plus ($49) or Premium ($149) per location; not on Free",
       "None stated"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://www.fresh.technology/"
      ]
     },
     {
      "label": "Order sources",
      "hoq": "Every channel in Hoq Commerce: Square, Hoq Shop, and more",
      "them": [
       "Square POS",
       "30+ platforms incl. Square, Clover, TouchBistro, Olo"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://www.fresh.technology/"
      ]
     },
     {
      "label": "Devices",
      "hoq": "Any browser, tablet or TV",
      "them": [
       "not published",
       "iPad (iOS 13+) and Android 7+ tablets"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://www.fresh.technology/"
      ]
     },
     {
      "label": "Works when the internet drops",
      "hoq": "Keeps the board and queues taps",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://www.fresh.technology/"
      ]
     },
     {
      "label": "Free trial",
      "hoq": "not published",
      "them": [
       "not published",
       "7-day Premium trial, no card"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://www.fresh.technology/"
      ]
     }
    ]
   }
  },
  {
   "key": "kerf",
   "name": "Kerf",
   "status": "live",
   "url": "https://kerf.hoq.app",
   "line": "Artwork in, cut line out, with a check against every sticker printer's rules.",
   "facts": [
    {
     "label": "Files out",
     "value": "PDF with the cut on its own layer in a named spot colour, SVG and DXF at true size, and a PNG print file with bleed added."
    },
    {
     "label": "Machine profiles",
     "value": "Roland VersaWorks (CutContour), Esko and Kongsberg, trade printer Dieline, kiss cut plus backer, Cricut and Silhouette, laser (Glowforge, LightBurn, xTool), Ponoko, CNC router or plotter (DXF)."
    },
    {
     "label": "Where it runs",
     "value": "In your browser. Nothing is uploaded unless you sign in and save a project to the cloud."
    },
    {
     "label": "Same file every time",
     "value": "The browser build and the server build produce identical bytes for the same input, so a reorder months later gets the same blade path."
    },
    {
     "label": "PDF checked",
     "value": "The PDF passes qpdf --check and separates CutContour and Backer onto their own plates in Ghostscript, the way VersaWorks reads it."
    },
    {
     "label": "Free and paid",
     "value": "The whole pipeline, live cut path, cut-safety report and SVG are free. The layered PDF, DXF and the bleed print file need a paid plan."
    },
    {
     "label": "Projects",
     "value": "Saved to your own Hoq Storage after sign-in."
    }
   ],
   "figures": [
    {
     "value": "2 mm",
     "label": "minimum feature the cut-safety report checks by default"
    },
    {
     "value": "±0.5 mm",
     "label": "typical print-and-cut registration the bleed is built to cover"
    },
    {
     "value": "9",
     "label": "machine and vendor profiles"
    }
   ],
   "features": [
    {
     "area": "Cut path",
     "rows": [
      {
       "name": "Outline from alpha or white",
       "what": "Reads the shape from transparency, a white background or a key colour.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Offset by bleed",
       "what": "Grows the cut a set distance from the art.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hole handling",
       "what": "Cuts holes in transparent art and fills them in art keyed off white.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Smoothing",
       "what": "Smooths away small features before the cut is traced.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Kiss and backer cut",
       "what": "Writes two cut levels from one shape.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Checks",
     "rows": [
      {
       "name": "Cut-safety report",
       "what": "Reports the narrowest neck, art-to-cut clearance and blade-rounding limit.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Preview is the file",
       "what": "Draws the exact path the file will contain.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Artwork",
     "rows": [
      {
       "name": "Bleed synthesis",
       "what": "Extends the art past the cut by mirroring it across its edge.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Files",
     "rows": [
      {
       "name": "Spot-colour PDF",
       "what": "Puts the cut on its own layer in the spot name the machine expects.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "SVG",
       "what": "Writes the cut at true physical size.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "DXF",
       "what": "Writes the cut for plotters and routers.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vendor profiles",
       "what": "Sets spot name, layer, offset and stroke for each machine.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Account",
     "rows": [
      {
       "name": "Cloud projects",
       "what": "Saves projects to your Hoq Storage after sign-in.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 13,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Silhouette Studio",
      "url": "https://www.silhouetteamerica.com/silhouette-studio"
     },
     {
      "name": "Cricut Design Space",
      "url": "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Free for SVG; paid plan price not published",
      "them": [
       "Basic free; Designer $49.99, Designer Plus $74.99, Business $99.99",
       "not published"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
      ]
     },
     {
      "label": "Runs on",
      "hoq": "A web browser",
      "them": [
       "Mac and Windows, 64-bit",
       "not published"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
      ]
     },
     {
      "label": "Save as SVG",
      "hoq": "Free",
      "them": [
       "Business Edition",
       "not published"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
      ]
     },
     {
      "label": "Largest offset",
      "hoq": "Set by you",
      "them": [
       "not published",
       "1 inch (2.5 cm) from each edge"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
      ]
     },
     {
      "label": "Files for print shops and RIPs (spot-colour PDF)",
      "hoq": "Yes, on the paid plan",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
      ]
     },
     {
      "label": "Drives a cutting machine",
      "hoq": "No, it writes files",
      "them": [
       "Yes, Silhouette cutters",
       "Yes, Cricut machines"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360009387274-How-to-Print-Then-Cut-in-Design-Space"
      ]
     },
     {
      "label": "Print Then Cut size",
      "hoq": "No limit set by Kerf",
      "them": [
       "not published",
       "Up to 9.25 × 6.75 in on the default page"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360009429814-Design-Space-says-printable-image-is-too-large"
      ]
     },
     {
      "label": "Checks against printer rules",
      "hoq": "Cut-safety report on every job",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.silhouetteamerica.com/silhouette-studio",
       "https://help.cricut.com/hc/en-us/articles/360061650414-How-to-use-the-Offset-feature-in-Design-Space"
      ]
     }
    ]
   }
  },
  {
   "key": "link",
   "name": "Hoq Link",
   "status": "beta",
   "url": "https://link.hoq.app",
   "line": "Short links and QR codes on your own domain, with every version kept.",
   "facts": [
    {
     "label": "Where your links live",
     "value": "One workspace file in your own Hoq Storage holds the links, routes and their history."
    },
    {
     "label": "How fast a change is live",
     "value": "Changes go out through one ordered, signed log; every redirect server shows the same thing within seconds."
    },
    {
     "label": "Redirect types",
     "value": "301, 302, 303, 307 or 308. New links default to 302."
    },
    {
     "label": "Browser caching",
     "value": "Browsers may remember a redirect for 10 seconds, so an edited link takes effect quickly."
    },
    {
     "label": "Random addresses",
     "value": "Drawn from 32 letters and digits that cannot be mistaken for each other (no 0, 1, l or o)."
    },
    {
     "label": "Start and end dates",
     "value": "A link can switch on at one time and off at another, and send late visitors to a different page."
    },
    {
     "label": "Tracking tags",
     "value": "The visitor's query string is added to the destination without overwriting tags the link already sets."
    },
    {
     "label": "Click records",
     "value": "Country, browser and referring site for each click. The visitor's IP address is not kept. Previews, crawlers and scripts are marked as bots."
    },
    {
     "label": "Export",
     "value": "CSV, JSON, or a Caddy, nginx or Netlify redirect file any web server can serve."
    },
    {
     "label": "Addresses",
     "value": "An address is never handed out twice, and a deleted address on a shared domain is never given to a different link."
    }
   ],
   "figures": [
    {
     "value": "5",
     "label": "redirect types: 301, 302, 303, 307, 308"
    },
    {
     "value": "10 s",
     "label": "longest a browser caches a redirect"
    },
    {
     "value": "1,000",
     "label": "links deleted in one step, at most"
    },
    {
     "value": "5",
     "label": "export formats: CSV, JSON, Caddy, nginx, Netlify"
    }
   ],
   "features": [
    {
     "area": "Your links",
     "rows": [
      {
       "name": "A workspace is a file",
       "what": "Keeps a workspace's links, routes and their history in one file in the owner's Hoq Storage.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Short links on your domains",
       "what": "Makes a link on any domain connected to the workspace, with your own address or a random one.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Live in seconds",
       "what": "Sends every change to the redirect servers, which serve it within seconds.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Addresses are never shared",
       "what": "Refuses an address already used by anyone, on any workspace.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Every version kept",
       "what": "Keeps each change to a link with who made it, and goes back to any earlier version in one step.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Printed links protected",
       "what": "Asks before changing or deleting a link marked as printed, because every printed copy follows it.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Pattern routes",
       "what": "Sends whole families of addresses, such as gift-card numbers, to a destination built from the address.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "QR codes",
       "what": "Shows each link's QR code and downloads it as an SVG for print.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Delete many at once",
       "what": "Selects links in the list and deletes up to 1,000 in one step, asking first when any are printed.",
       "status": "beta",
       "verified": "2026-10-09"
      },
      {
       "name": "Search",
       "what": "Finds links by address, destination, title, notes or tag.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Take them with you",
       "what": "Exports every link as CSV, JSON or a Caddy, nginx or Netlify redirect file any web server can serve.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    },
    {
     "area": "Agents and API",
     "rows": [
      {
       "name": "JSON API",
       "what": "Runs every console action with a `link:use` key.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "MCP tools",
       "what": "Lets agents list, read, make and change links.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Agents cannot move printed links",
       "what": "Refuses an agent that tries to redirect or delete a printed link, whatever it sends.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 14,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Bitly",
      "url": "https://bitly.com/pages/pricing"
     },
     {
      "name": "Rebrandly",
      "url": "https://www.rebrandly.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid plan",
      "hoq": "Not published",
      "them": [
       "Core: $10/mo billed annually ($120/yr)",
       "Essentials: $8/mo billed annually, $11 monthly"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Links per month",
      "hoq": "No published cap",
      "them": [
       "100 (Core) to 3,000 (Premium)",
       "250 (Essentials) to 3,500 (Growth)"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Changing where a link goes",
      "hoq": "Any number of edits, each version kept and restorable",
      "them": [
       "5 redirects/mo (Core) to 110/mo (Premium)",
       "10 edits/mo (Essentials) to 150/mo (Growth)"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Custom domain",
      "hoq": "Domains are connected to your workspace by Hoq; adding your own from the console is planned",
      "them": [
       "1 complimentary domain from Growth ($29/mo)",
       "1 on Free, 2 on Essentials"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Click analytics in the console",
      "hoq": "Clicks are recorded; the console view is planned",
      "them": [
       "30 days (Core) to 1 year (Premium) of history",
       "Total and unique clicks from Essentials; up to 2 years on Enterprise"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Redirect types",
      "hoq": "301, 302, 303, 307, 308",
      "them": [
       "not published",
       "301 listed on every plan"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Bulk creation",
      "hoq": "Many links in one call with the API links.import action (JSON list)",
      "them": [
       "100 links per upload (Growth), 3,000 (Premium)",
       "not published"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "Every console action, plus MCP tools for agents",
      "them": [
       "1,000 to 50,000 requests/month by plan",
       "100 to 1,000 calls/minute by plan"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     },
     {
      "label": "Export to self-host",
      "hoq": "Caddy, nginx and Netlify redirect files",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://bitly.com/pages/pricing",
       "https://www.rebrandly.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "logistics",
   "name": "Hoq Logistics",
   "status": "live",
   "url": "https://logistics.hoq.app",
   "line": "Orders in, picked by scan, labels bought and printed, tracking sent back.",
   "facts": [
    {
     "label": "Carrier connection",
     "value": "EasyPost, with the company's own key, sealed on the server and never shown again."
    },
    {
     "label": "Order sources",
     "value": "Hoq Commerce, Hoq Shop, manual entry and CSV paste. An order is never imported twice."
    },
    {
     "label": "Label format",
     "value": "4×6 PDF labels; a batch's labels download as one zip in batch order."
    },
    {
     "label": "Voids",
     "value": "Asks the carrier for a refund within its window: USPS 28 days, UPS 90, FedEx 60, others 30."
    },
    {
     "label": "End of day",
     "value": "USPS SCAN forms through EasyPost, or a printable hand-over list for other carriers."
    },
    {
     "label": "Stock",
     "value": "Holds stock in Hoq Inventory when an order arrives, takes it out on label or pack, gives it back on cancel."
    },
    {
     "label": "Webhooks",
     "value": "Rule webhooks signed with the company's own secret (HMAC-SHA256 over time and body)."
    },
    {
     "label": "Where the data lives",
     "value": "One file per company in its owner's Hoq Storage, a person's or an organization's."
    }
   ],
   "figures": [
    {
     "value": "90 days",
     "label": "of past orders a rule is tried on before it goes live"
    },
    {
     "value": "28 / 90 / 60",
     "label": "days to void a USPS, UPS or FedEx label for a refund"
    },
    {
     "value": "3",
     "label": "paper sizes for packing slips: Letter, A4, 4×6"
    },
    {
     "value": "10",
     "label": "past versions kept of each slip or pick-list design"
    }
   ],
   "features": [
    {
     "area": "Your company",
     "rows": [
      {
       "name": "A company is a file",
       "what": "Keeps each company's orders, batches, shipments and labels in one file in its owner's Hoq Storage, a person's or an organization's.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Members and admins",
       "what": "Lets every member of the organization work orders, batches, packing and labels, and keeps the carrier key, store connection, addresses and packages to admins and owners.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Sealed credentials",
       "what": "Keeps the company's EasyPost key and store connection sealed on the server, outside the company file, and never shows them again.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "On the system map",
       "what": "Tells Hoq ID's system map about the company: its carrier, its ship-from addresses and how many orders are waiting.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Agent tools",
       "what": "Gives every action to agents as tools, with read-only keys that cannot change anything.",
       "status": "beta",
       "verified": "2026-10-26"
      }
     ]
    },
    {
     "area": "Orders",
     "rows": [
      {
       "name": "Order list",
       "what": "Shows a page of orders with their age, source, buyer, total, ship-by date, who has it and status, searched, filtered, sorted and counted on the server.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Search",
       "what": "Finds orders by order number, buyer, email, the channel's reference or an item on the order.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Saved views",
       "what": "Keeps a named set of filters (status, tag, who has it, search, sort) for the whole company.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Edit an order",
       "what": "Changes the buyer, email, phone, address, notes and ship-by date of an order that has not shipped.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Check an address",
       "what": "Asks EasyPost whether a carrier can deliver there and offers its corrected address, which you choose to use or not.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Tags",
       "what": "Puts tags on orders and filters by them.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Hold",
       "what": "Holds an order, until a date or until released; on its date it comes back by itself.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Assign",
       "what": "Gives an order to someone, and filters to your own or nobody's.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Ship by",
       "what": "Keeps the date an order must leave by, sorts by it, and shows late ones in red.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Manual order",
       "what": "Makes an order by hand from a buyer and an item code.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "CSV import",
       "what": "Takes orders pasted as CSV, joining rows with the same order number into one order, and never imports an order twice.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Orders from Hoq Commerce",
       "what": "Takes every paid order with something to post from the company's Hoq Commerce, the moment Commerce rings, with a check every five minutes for any ring that was missed.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Tracking back through Commerce",
       "what": "Tells Hoq Commerce the carrier and tracking for each parcel, retried for a day if Commerce is away; Commerce tells the store.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "No order twice",
       "what": "Answers a store's direct webhook without making an order once the company takes its orders from Commerce.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Orders from Hoq Shop",
       "what": "Turns each paid store order with something to ship into an order here, from the store's signed webhook, and never makes the same store order twice.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Change status",
       "what": "Moves one order or many to another status; cancelling gives back any stock held for it.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Batches",
       "what": "Groups selected orders into a batch to pick and ship together, adds more to an open batch, takes one out, and names any order it left out and why.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Batch labels",
       "what": "Buys the label of every order in a batch as each is planned, showing progress, and says on each order that failed why it failed.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Retry failed labels",
       "what": "Buys again only the orders whose label failed, after they are fixed; nothing is bought twice.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Batch summary",
       "what": "Shows a batch's labels bought, failed and waiting, the money spent and each service used, and prints as a page.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Download a batch's labels",
       "what": "Downloads every label bought in a batch as one zip, in batch order.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Pick list in walk order",
       "what": "Lists a batch's picks one stop per bin and item, in the order Hoq Inventory's locations are walked today (each level's pick order), with how many go in each order's tote.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Totes",
       "what": "Gives each order in a batch a tote number, printed with the order's barcode on the pick list.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Pick by scan",
       "what": "Ticks the next pick for a scanned item and says which tote it goes in.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Scan to Verify",
       "what": "At the Pack screen, scan an order then its items; a wrong item or one too many is refused, and each line shows how many are scanned.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Quick Ship by scan",
       "what": "Buys the label as soon as every item of the scanned order is verified, and downloads it.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Void a label",
       "what": "Asks the carrier for the money back within its window (USPS 28 days, UPS 90, FedEx 60, others 30), keeps the label struck through with its refund status, and puts the order back to wait for another label without taking stock out twice.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Store notices on a void",
       "what": "Takes back a tracking notice to Hoq Shop or Hoq Commerce that had not gone yet, and says on the order when one already had.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Reprint",
       "what": "Downloads a label again and says how many times it was printed before.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Order history",
       "what": "Shows what happened to an order, newest first, in the order panel.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "End of day",
       "what": "Lists the labels waiting to be handed over by carrier and ship-from, makes the USPS SCAN form through EasyPost or a printable end-of-day list for other carriers, and keeps past forms; a label on a form can no longer be voided.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Pickups",
       "what": "Prices, books and cancels a carrier pickup from a ship-from address in a time window.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Hoq Print",
       "what": "Connects the company's Hoq Print through Hoq ID, and lists its printers with whether each can print now.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Workstations",
       "what": "Names the pack benches and carts; each person picks theirs at the top of the page.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Print routes",
       "what": "Sends each kind of document from a workstation (or any) to a Hoq Print printer, with a fallback printer, copies, and whether it prints by itself.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Labels print by themselves",
       "what": "Prints a label at the workstation's printer as soon as it is bought, from an order, the Pack screen or a batch; a buy never fails because the printer did.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Print and reprint",
       "what": "Prints a label or a SCAN form on request; pressing Print again sends nothing twice, Reprint sends a new numbered copy, and when Hoq Print is away the file downloads instead.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Print jobs",
       "what": "Shows what was sent to the printers in the last half hour and how each job is doing.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Print news without asking",
       "what": "Leaves Hoq Print a doorbell, so a job's end (printed, failed, out of paper) reaches Logistics as it happens instead of only when someone looks.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Rules",
       "what": "Runs the company's rules top to bottom on every order that arrives, each seeing what the ones above did: ship it as a preset, choose the service, box, weight or ship-from, choose how the rate is picked, add a tag, hold it or give it to someone.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "When rules run",
       "what": "Runs a rule when an order arrives, when someone changes it, when its hold ends on its date, when its ship-by date comes within the rule's hours (once per date), when its label is bought, or when the carrier's tracking says something new.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Rules that tell, send and print",
       "what": "A rule can email people a message that names the order, send a signed webhook to a public https address, or print the label or packing slip at a workstation; each is asked once per occasion, tried again with a growing wait when it fails, and listed with how it went.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Webhook signing",
       "what": "Signs every rule webhook with the company's own secret (Hoq-Signature, HMAC-SHA256 over the time and body), which an admin can see and replace; a name that points inside a private network is never sent to.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Rate rules",
       "what": "Picks the cheapest rate arriving within some days, and prefers a carrier or service when it costs at most a set amount more, saying why the rate it chose is best.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Rule conditions",
       "what": "Tests the order's source, channel, status, totals, service asked for, tags, gift, note, quantities, weight, short stock, hours to its ship-by date, buyer and address, and its label's carrier, service, cost and tracking, combined with all/any groups and not, and line tests: any, every or no line where the item code, name, quantity or shortfall matches.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Try a rule first",
       "what": "Shows how many of the last 90 days' orders a rule would have matched and what it would have done to each, changing nothing.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Who set it",
       "what": "Every field a rule sets says which rule set it, in the order panel and the parcel's reasons; a rule never changes what a person set by hand.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Run rules",
       "what": "Runs every rule that is on, again, on one order or on the selected ones.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Packing slips",
       "what": "Makes a packing slip for an order on Letter, A4 or a 4×6 label (whichever paper its printer holds), with the order's barcode, who it goes to, the lines and the buyer's note and gift message, in any language.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Pick lists as PDFs",
       "what": "Makes a batch's pick list as a PDF in walk order, with each stop's totes and the batch barcode.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Slips and pick lists print by themselves",
       "what": "Prints the packing slip with the label when it is bought, and the pick list when a batch is made, when their routes say so.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Branding",
       "what": "Sets the name, return address, closing line and logo every packing slip carries.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Design your own slips",
       "what": "Opens a packing slip or pick list, for each paper, in a drag-and-drop editor to move and restyle its fields, add fixed words, pictures, lines and sentences that name the order, and save it as the company's own.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Design check",
       "what": "Refuses a design on save when a field is not one the document fills, the page is the wrong size, or a list has the wrong number of columns, and says which field and why.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Design preview",
       "what": "Shows a design as pictures of the printed page, filled with a real order or batch, or with samples.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Design versions",
       "what": "Keeps the last ten versions of each design to open again, and goes back to the built-in design without losing yours.",
       "status": "beta",
       "verified": "2026-10-27"
      }
     ]
    },
    {
     "area": "Stock",
     "rows": [
      {
       "name": "Connect Hoq Inventory",
       "what": "Lets an admin pick which of their Hoq Inventory companies holds the goods; the key is made by Hoq ID and kept sealed on the server.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Orders hold stock",
       "what": "Finds each order line's item in Hoq Inventory by its code and holds the stock there when the order arrives.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Shipping takes stock out",
       "what": "Takes an order's goods out of Hoq Inventory when its label is bought or it is packed, never twice.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Cancelling gives stock back",
       "what": "Releases what a cancelled order held.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Link health",
       "what": "Says on the settings page and the system map when Hoq Inventory did not answer.",
       "status": "beta",
       "verified": "2026-10-26"
      }
     ]
    },
    {
     "area": "Shipping",
     "rows": [
      {
       "name": "Ship-from addresses",
       "what": "Keeps the addresses parcels leave from, with one as the default.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Packages",
       "what": "Keeps the boxes you ship in, so a label uses their size without typing it.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "What items weigh",
       "what": "Keeps each item's weight, size, usual box and customs facts by its code.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Worked-out parcel",
       "what": "Adds up an order's weight from its items and box, picks the box and the ship-from address, and says where each came from.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Learned weight and box",
       "what": "Takes the weight and box of the last parcels of exactly the same items (the middle of the last three weights) ahead of the items' own weights, and says it learned them.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Service map",
       "what": "Maps each service shoppers pay for, by the store's name for it, to the carrier and service the company ships, and lists the ones asked for lately that nothing maps yet.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Shipping presets",
       "what": "Names a way to ship (service, box, weight, ship-from, signature) and gives it a key.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Hotkeys and barcodes",
       "what": "Applies a preset to the open order by its key or by scanning it from a printed sheet.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Quick ship",
       "what": "Rates the parcel as planned and buys the preset's service, or the cheapest, in one press.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Rates",
       "what": "Shows each carrier's price and days for an order, cheapest first, as often as you ask.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Buy a label",
       "what": "Buys a 4×6 PDF label through EasyPost with the company's own key; pressing buy again returns the same label instead of paying twice.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Download the label",
       "what": "Downloads a bought label straight from the company file.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Manual shipment",
       "what": "Records a parcel sent another way, with its carrier and tracking number.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Tracking back to the store",
       "what": "Sends the carrier and tracking number back to Hoq Shop so it can email the shopper, and keeps trying for a day if the store does not answer.",
       "status": "beta",
       "verified": "2026-10-26"
      },
      {
       "name": "Delivered",
       "what": "Marks an order delivered when EasyPost's tracking webhook reports it, finding the company by the label's tracking code.",
       "status": "beta",
       "verified": "2026-10-27"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 81,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "ShipStation",
      "url": "https://www.shipstation.com/pricing/"
     },
     {
      "name": "Shippo",
      "url": "https://goshippo.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price per month",
      "hoq": "not published",
      "them": [
       "$14.99 Starter at 50 shipments; $29.99 Standard at 50",
       "Starter free up to 30 labels; Pro $19 for 1 to 200 labels"
      ],
      "sources": [
       "https://www.shipstation.com/pricing/",
       "https://goshippo.com/pricing"
      ]
     },
     {
      "label": "Carrier rates",
      "hoq": "Your own EasyPost account's rates",
      "them": [
       "Discounted carrier rates included",
       "Discounted rates, or connect your own account"
      ],
      "sources": [
       "https://www.shipstation.com/pricing/",
       "https://goshippo.com/pricing"
      ]
     },
     {
      "label": "Bring your own carrier account",
      "hoq": "Through your EasyPost account",
      "them": [
       "Standard and Premium only",
       "5¢ a label on Starter, free on Pro"
      ],
      "sources": [
       "https://www.shipstation.com/pricing/",
       "https://goshippo.com/pricing"
      ]
     },
     {
      "label": "Users",
      "hoq": "Every member of the organization",
      "them": [
       "3 on Starter, 10 on Standard",
       "1 on Starter, up to 5 on Pro"
      ],
      "sources": [
       "https://www.shipstation.com/pricing/",
       "https://goshippo.com/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "Every action as a tool or JSON call",
      "them": [
       "Standard and above",
       "Priced separately"
      ],
      "sources": [
       "https://www.shipstation.com/pricing/",
       "https://goshippo.com/pricing"
      ]
     },
     {
      "label": "Store integrations",
      "hoq": "Hoq Commerce and Hoq Shop, plus every channel Commerce reads",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.shipstation.com/pricing/",
       "https://goshippo.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "loyalty",
   "name": "Hoq Loyalty",
   "status": "live",
   "url": "https://loyalty.hoq.app",
   "line": "Points customers earn at every till you have, by phone number.",
   "facts": [
    {
     "label": "Earning",
     "value": "Points per dollar before tax, visit bonuses, item and category points, boosts by place, day and hour."
    },
    {
     "label": "Rewards",
     "value": "Money off, a share off up to a limit, or a free item."
    },
    {
     "label": "Refunds",
     "value": "Take back the points refunded money earned, never more and never below zero."
    },
    {
     "label": "Fraud checks",
     "value": "A texted code before a reward is used; members who earn more often than a person visits are flagged."
    },
    {
     "label": "Texts",
     "value": "Sent from the business's own Hoq Phone number, email where there is none; one text per order."
    },
    {
     "label": "Moving from Square",
     "value": "Square loyalty program words, rate and rewards brought across in one step."
    },
    {
     "label": "Bookkeeping",
     "value": "Points owed shown in money; each day as a balanced journal, optionally posted to Hoq Books."
    },
    {
     "label": "Where the data lives",
     "value": "One .loyalty file per business, shared by all its places."
    }
   ],
   "figures": [
    {
     "value": "3",
     "label": "kinds of reward: money off, share off, free item"
    },
    {
     "value": "1",
     "label": "time an order can earn points, however often it is sent"
    },
    {
     "value": "0",
     "label": "accounts a member needs to see their points"
    }
   ],
   "features": [
    {
     "area": "Program",
     "rows": [
      {
       "name": "Your own words",
       "what": "Calls the points whatever the business calls them, in every screen and receipt.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Points per dollar",
       "what": "Gives a set number of points for every dollar spent before tax, rounded down.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "What a point is worth",
       "what": "Keeps a cost for each point so what is owed shows in money for the books.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Rewards",
       "what": "Offers money off, a share off up to a limit, or a free item, each for a number of points.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Ways to earn more",
       "what": "Adds visit bonuses, points for an item or category, and boosts that multiply points by place, day and hour.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Gift cards and points",
       "what": "Lets the business choose whether buying a gift card, or paying with one, earns points.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Start from Square",
       "what": "Brings a Square loyalty program's words, rate and rewards across in one step.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "The card",
       "what": "Each member's points show as a card in the business's chosen colour, with a ring of punch marks filling toward the next reward, the same on their page, the counter display and the staff screen.",
       "status": "beta",
       "verified": "2026-10-25"
      }
     ]
    },
    {
     "area": "At the counter",
     "rows": [
      {
       "name": "Their own page",
       "what": "Each member has a page, with no account, showing their points, how far to the next reward, what they can use and lately.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "A text after each sale",
       "what": "Texts what they earned, what they have and how far to a reward, with their page; the same order never texts twice; they can stop it.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Ask for your link",
       "what": "A public page sends a member their link by text or email, and says the same thing to a stranger, so it never reveals who is a member.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Join by QR",
       "what": "A customer scans a code at the counter, gets a code by text, and joins, with welcome points if the business gives them.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Counter display",
       "what": "A tablet facing the customer: they type their phone to check in or join; staff see who is at the counter and serve them.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Phone checked before rewards",
       "what": "A member proves the phone is theirs with a texted code before a reward can be used, so nobody redeems on someone else's number.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Texts from your own number",
       "what": "Sends through the business's Hoq Phone number; emails instead where there is no phone.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Needs a look",
       "what": "Flags members who earn more times in one day than a real person visits, often a staff member's own number.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Find a member",
       "what": "Finds a customer by phone or email however it is typed, and adds them if they are new.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Record a sale",
       "what": "Gives a member the points an order earns, showing how many as the amount is typed; the same order never earns twice.",
       "status": "beta",
       "verified": "2026-10-25"
      },
      {
       "name": "Use a reward",
       "what": "Holds the reward's points while the till applies the discount, then spends them or gives them back.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Refunds",
       "what": "Takes back the points refunded money earned, never more, and never below zero.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Goodwill points",
       "what": "Lets an owner give or correct points with a reason that stays on the record.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Money",
     "rows": [
      {
       "name": "What is owed",
       "what": "Shows the points out and what they are worth.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "A day for the bookkeeper",
       "what": "Shows one business day as a balanced journal, by place.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Ledger check",
       "what": "Walks every movement to prove it is chained, balanced and matches every balance.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "JSON door and MCP",
       "what": "Offers every console action to other apps and agents, with owners alone changing the program.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    },
    {
     "area": "Books",
     "rows": [
      {
       "name": "Hoq Books, if you use it",
       "what": "Optional: sends each finished day to the business's Hoq Books as one balanced entry, by place, under its own key so a retry never posts twice.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Days in order",
       "what": "Sends days in order and never skips one; a day Books could not take holds the days after it until it goes through.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Accounts set up for you",
       "what": "Uses Books accounts already named for the job, makes the rest, and asks only about the accounts this business can post to.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Books agree check",
       "what": "Compares what is owed here with the Books accounts it posts to, and shows any difference, such as an entry made by hand.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Key kept apart",
       "what": "Keeps the Books key sealed on the server, never in the business's own file.",
       "status": "beta",
       "verified": "2026-10-24"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 30,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Square Loyalty (in Square Plus)",
      "url": "https://squareup.com/us/en/pricing"
     },
     {
      "name": "Smile.io",
      "url": "https://smile.io/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price per month",
      "hoq": "not published",
      "them": [
       "Included in Square Plus, $49 per location",
       "$0 Free, $15 Essential, $79 Standard, $199 Growth"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://smile.io/pricing"
      ]
     },
     {
      "label": "Volume limits",
      "hoq": "not published",
      "them": [
       "not published",
       "200 orders a month on Free, 500 on Essential"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://smile.io/pricing"
      ]
     },
     {
      "label": "Ways to earn",
      "hoq": "Per dollar, per visit, per item or category, timed boosts",
      "them": [
       "Per visit, amount spent, items or categories",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/software/loyalty",
       "https://smile.io/pricing"
      ]
     },
     {
      "label": "In-store",
      "hoq": "Counter tablet, QR join, any till through the API",
      "them": [
       "Square Point of Sale",
       "Shopify POS only"
      ],
      "sources": [
       "https://squareup.com/us/en/software/loyalty",
       "https://smile.io/pricing"
      ]
     },
     {
      "label": "Text messages",
      "hoq": "From your own Hoq Phone number",
      "them": [
       "First 500 texts free, then 3¢ each on Plus",
       "not published"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://smile.io/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API and MCP",
      "them": [
       "not published",
       "Smile Plus ($999, annual) and Enterprise only"
      ],
      "sources": [
       "https://squareup.com/us/en/pricing",
       "https://smile.io/pricing"
      ]
     },
     {
      "label": "Free trial",
      "hoq": "not published",
      "them": [
       "30 days",
       "Free plan"
      ],
      "sources": [
       "https://squareup.com/us/en/software/loyalty",
       "https://smile.io/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "mailer",
   "name": "Hoq Mailer",
   "status": "live",
   "url": "https://mailer.hoq.app",
   "line": "Your list, the consent behind each address, and the email you send.",
   "facts": [
    {
     "label": "Where your list lives",
     "value": "One .mailer file per sender in your own Hoq Storage drive: contacts, consent log, campaigns, sends and automations."
    },
    {
     "label": "Sending channels",
     "value": "Your own SMTP server (STARTTLS, verified TLS), Amazon SES (SESv2 API, SNS events) or Emailit. Set per sender."
    },
    {
     "label": "Channel secrets",
     "value": "Sealed with AES-256-GCM in a separate store, bound to the sender and channel. Write-only in the console and never exported."
    },
    {
     "label": "Authentication check",
     "value": "A channel is checked by a test message: SPF, DKIM and DMARC results are read from the received headers, including DKIM over both unsubscribe headers."
    },
    {
     "label": "Unsubscribe",
     "value": "Signed one-click List-Unsubscribe links, a preferences page with per-list choices, and unsubscribe by replying to the email."
    },
    {
     "label": "Bounces and complaints",
     "value": "Hard bounces and complaints suppress the address at once. Three soft bounces in 30 days count as a hard bounce. Complaints above 0.3% of 30 days of mail pause the channel."
    },
    {
     "label": "Open and click counting",
     "value": "Each open and click is labelled human, privacy proxy or link scanner. Reports lead with human clicks."
    },
    {
     "label": "Signup form protection",
     "value": "Randomized honeypot, signed time stamp, throwaway and no-MX domains refused, ten signups per connection per ten minutes."
    },
    {
     "label": "Erasure",
     "value": "Erasing a person nulls their data at once and keeps only a keyed digest, so a later import cannot add them back."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID single sign-on. API and MCP access by Hoq ID keys with scope mailer:use."
    }
   ],
   "figures": [
    {
     "value": "11",
     "label": "content blocks in the drag-and-drop email designer"
    },
    {
     "value": "7",
     "label": "automation triggers, from list joined to a date field coming round"
    },
    {
     "value": "11",
     "label": "automation steps, including waits, branches on a segment and go-back loops"
    },
    {
     "value": "3",
     "label": "sending services you can connect: SMTP, Amazon SES, Emailit"
    },
    {
     "value": "0.3%",
     "label": "complaint rate that pauses a sending channel"
    }
   ],
   "features": [
    {
     "area": "Audience",
     "rows": [
      {
       "name": "Contacts, lists and tags",
       "what": "Keep people in lists with tags and typed custom fields, and change them in bulk.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Consent record",
       "what": "Every subscribe, confirm and unsubscribe is written to an append-only, hash-chained log you can verify.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Segments",
       "what": "Build saved segments from a fixed set of subjects and operators, with a live count.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "CSV import",
       "what": "Import a CSV with delimiter sniffing; role and throwaway addresses are held back and nobody who left is resubscribed.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Mailster import",
       "what": "Bring a Mailster list across with statuses, confirmation dates, list joins, bounces and custom fields.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Export and erasure",
       "what": "Export contacts as CSV, export one person's data, or erase a person.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Campaigns",
     "rows": [
      {
       "name": "Drag-and-drop designer",
       "what": "Design with 11 blocks on the real email, with desktop, phone and dark previews, undo and autosave.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Letter format",
       "what": "Write in Markdown and get email-safe HTML in your brand colour and font, with a plain-text part.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pre-send checks",
       "what": "A campaign will not start without a sender, postal address, subject, body, a working channel and an audience; warnings flag Gmail's 102 KB clip, missing alt text and http links.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Test, schedule, pause",
       "what": "Send a test, schedule a campaign, pause, resume or cancel it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Click tagging",
       "what": "Tag whoever clicks a given link; clicks from link scanners tag nobody.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Campaign report",
       "what": "Delivered, bounced, complaints, human-estimated opens beside all opens, and clicks.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Sending",
     "rows": [
      {
       "name": "Your own SMTP",
       "what": "Send through any SMTP server, one session per batch, with VERP bounce addresses.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Amazon SES",
       "what": "Connect sets up domain DKIM, a configuration set and SNS events, and imports SES's suppression list.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Emailit",
       "what": "Send through Emailit's API with idempotency keys, signed webhooks and its suppression list kept in sync.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Limits per channel",
       "what": "Per-second, hourly and daily caps, a sending window in your timezone and a breaker that rests a failing channel.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Forms and pages",
     "rows": [
      {
       "name": "Signup forms",
       "what": "Hosted page or embed script with a no-script fallback; single or double opt-in.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Newsletter archive",
       "what": "A public archive per sender with issue pages, RSS and a signup box; you choose which campaigns appear.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Web version and preferences",
       "what": "Each email has a web version and a preferences page where people pick lists and tracking consent.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Tracking consent",
       "what": "Track everyone, only people who agreed, or nobody.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Automation",
     "rows": [
      {
       "name": "Versioned workflows",
       "what": "Editing a live workflow writes a new version; people on a removed step leave with a reason.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Exactly-once steps",
       "what": "Each step is recorded with its effect, so a crash never sends a step's email twice.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Imports never trigger",
       "what": "Importing a list never starts a welcome series.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Access",
     "rows": [
      {
       "name": "JSON API and MCP",
       "what": "89 actions over one JSON door, also offered as MCP tools for AI agents.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 24,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Mailchimp Essentials",
      "url": "https://mailchimp.com/pricing/marketing/"
     },
     {
      "name": "Kit Creator",
      "url": "https://kit.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "Not published",
      "them": [
       "From $13/mo (Essentials, 12-month offer)",
       "$33/mo for 1,000 subscribers ($390 billed yearly)"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "Send through your own SMTP or SES",
      "hoq": "Yes: SMTP, Amazon SES or Emailit, per sender",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "Automations",
      "hoq": "Versioned workflows, 7 triggers, 11 steps",
      "them": [
       "Up to 4 flow steps on Essentials",
       "Unlimited visual automations"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "A/B testing",
      "hoq": "No",
      "them": [
       "Premium plan only",
       "2 subject lines"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "Team seats",
      "hoq": "not published",
      "them": [
       "3 seats",
       "2 users"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "Landing pages",
      "hoq": "Hosted signup page and newsletter archive; no page builder",
      "them": [
       "not published",
       "Unlimited landing pages"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API and MCP server",
      "them": [
       "not published",
       "Yes"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     },
     {
      "label": "Remove vendor branding",
      "hoq": "No Hoq branding in campaigns",
      "them": [
       "Included",
       "not published"
      ],
      "sources": [
       "https://mailchimp.com/pricing/marketing/",
       "https://kit.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "make",
   "name": "Hoq Make",
   "status": "live",
   "url": "https://make.hoq.app",
   "line": "Custom orders from brief to proof to job ticket, approved by the customer online.",
   "facts": [
    {
     "label": "Where a workspace lives",
     "value": "One document per workspace in the owner's Hoq Storage drive. Art files sit beside it as ordinary files in Make/<workspace>/art/."
    },
    {
     "label": "Customer access",
     "value": "A proof link at /p/{token}. No account, no cookies needed."
    },
    {
     "label": "Outside makers",
     "value": "A vendor link at /r/{token} shows the job ticket and takes start and finish."
    },
    {
     "label": "Approval record",
     "value": "Each approval is a hash-chained event that stores the SHA-256 of every file approved. A chain check verifies it later."
    },
    {
     "label": "Proofs and tickets",
     "value": "One template each for the web page and the PDF, so the PDF matches what the customer saw."
    },
    {
     "label": "Product types",
     "value": "Built-in templates for laces, stickers and a generic item, plus your own types with required and conditional fields."
    },
    {
     "label": "Project stages",
     "value": "Brief, design, proofing, approved, in production, done, plus on hold, cancelled and archived."
    },
    {
     "label": "Your own hostname",
     "value": "Proof and vendor pages can be served on a shop's own domain after a DNS TXT check."
    }
   ],
   "figures": [
    {
     "value": "9",
     "label": "project stages from brief to archived"
    },
    {
     "value": "3",
     "label": "built-in product templates: laces, sticker, generic"
    },
    {
     "value": "0",
     "label": "accounts a customer needs to approve a proof"
    }
   ],
   "features": [
    {
     "area": "Projects",
     "rows": [
      {
       "name": "Projects board",
       "what": "Shows every open project by stage and moves it along.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hold and resume",
       "what": "Puts a project on hold and brings it back to the stage it left.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Customers",
       "what": "Keeps the customers who commission projects.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Product types",
       "what": "Defines a type's spec fields, with built-ins you can reset.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Art",
     "rows": [
      {
       "name": "Uploads",
       "what": "Drops art onto an item; the file is stored in your drive and thumbnailed.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Revisions",
       "what": "Numbers each version of an item's art; a revision freezes once it is proofed.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Feedback pins",
       "what": "Lets the customer pin a note on the art, and you reply and resolve it.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Proofs",
     "rows": [
      {
       "name": "Send a proof",
       "what": "Composes one revision per item and sends a link; sending freezes it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Approve or request changes",
       "what": "The customer approves or asks for changes on the proof page.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rotate or revoke a link",
       "what": "Issues a new proof link or shuts the old one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Verify the chain",
       "what": "Checks the approval log has not been altered.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Proof PDF",
       "what": "Renders the proof as a PDF from the same template as the page.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Production",
     "rows": [
      {
       "name": "Production runs",
       "what": "Pins approved revisions into a run for staff or a vendor.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Job ticket",
       "what": "Prints the run's ticket as a PDF.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Vendor link",
       "what": "Gives an outside maker a page to see the ticket and mark progress.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Quality check",
       "what": "Records a QC step on a run.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Account",
     "rows": [
      {
       "name": "Several workspaces",
       "what": "Keeps more than one workspace per person or organisation, each with its own address.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Sign in with Hoq ID",
       "what": "Uses a Hoq account and its organisation for access.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 18,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Printavo",
      "url": "https://www.printavo.com/pricing/"
     },
     {
      "name": "YoPrint",
      "url": "https://www.yoprint.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Entry price per month",
      "hoq": "Not published",
      "them": [
       "$109 (Lite, 20 quotes or invoices a month)",
       "$69 billed monthly, $59 billed annually (Basic)"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Users on the entry plan",
      "hoq": "Not published",
      "them": [
       "2",
       "1, then $10 a user a month"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Customer approves art online",
      "hoq": "Yes, by link, no account",
      "them": [
       "Collects customer and artwork approvals",
       "Artwork and quote approval on both plans"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Approval tied to the exact files",
      "hoq": "Yes, SHA-256 of each file in a hash-chained log",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Quotes and invoices",
      "hoq": "No",
      "them": [
       "Yes",
       "Yes"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Production calendar",
      "hoq": "No; a board by stage",
      "them": [
       "Power Scheduler on Premium",
       "Production calendar, timeline and department views on Basic"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Outside maker gets a work page",
      "hoq": "Yes, a vendor link",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     },
     {
      "label": "Customer portal on your domain",
      "hoq": "Proof and vendor pages, after a DNS TXT check",
      "them": [
       "not published",
       "Pro plan"
      ],
      "sources": [
       "https://www.printavo.com/pricing/",
       "https://www.yoprint.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "pdf",
   "name": "Hoq PDF",
   "status": "live",
   "url": "https://pdf.hoq.app",
   "line": "Read, mark up, organize, redact and send PDFs from your browser.",
   "facts": [
    {
     "label": "Opening a local file",
     "value": "Viewed in the browser without uploading it. It is stored only if you choose Save to my drive."
    },
    {
     "label": "Default PDF app",
     "value": "Installs as an app and registers as a handler for .pdf files, so a double-click can open Hoq PDF."
    },
    {
     "label": "Where saved files live",
     "value": "In your own Hoq Storage drive. Each save is a new version; earlier versions stay in History."
    },
    {
     "label": "What runs in your browser",
     "value": "Viewing, page organizing, markup, form filling, redaction, compression, passwords, watermarks and page numbers. Only OCR and some conversions use our servers."
    },
    {
     "label": "Password protection",
     "value": "AES-256 encryption, with separate open and permissions passwords."
    },
    {
     "label": "Redaction",
     "value": "Boxes follow each letter's real position. The page is burned to an image at 220 dpi, the remaining words are written back as hidden text, and removed objects are dropped from the file."
    },
    {
     "label": "Find to redact",
     "value": "Marks words you type plus email addresses, phone numbers, US Social Security numbers, card numbers (Luhn-checked) and dates."
    },
    {
     "label": "OCR limits",
     "value": "Up to 200 MB and 600 pages per file. The server copy is kept for one hour, then deleted."
    },
    {
     "label": "Convert to",
     "value": "Word, Excel, PowerPoint, PNG or JPEG pictures, plain text and PDF/A. Word, Excel and PowerPoint files also open as PDFs."
    },
    {
     "label": "Edit existing text",
     "value": "Edit text opens the page in the Hoq Documents editor, which is OnlyOffice-compatible."
    },
    {
     "label": "Find form fields",
     "value": "Your browser finds the lines and boxes, and an AI model on your own Hoq Intelligence key names and types them. You review them, then Make fillable writes real PDF form fields."
    }
   ],
   "figures": [
    {
     "value": "200 MB",
     "label": "largest file for OCR"
    },
    {
     "value": "600",
     "label": "pages per OCR job"
    },
    {
     "value": "1 hour",
     "label": "before a file sent for OCR is deleted from our server"
    },
    {
     "value": "AES-256",
     "label": "encryption when you set a password"
    },
    {
     "value": "6",
     "label": "convert targets: Word, Excel, PowerPoint, pictures, text, PDF/A"
    }
   ],
   "features": [
    {
     "area": "Reading",
     "rows": [
      {
       "name": "Viewer",
       "what": "Pages, thumbnails, search, zoom, print and download.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Local files without upload",
       "what": "Open a PDF from your computer and read it without storing it with us.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Locked PDFs",
       "what": "Opens password and permission-locked PDFs and tells you the saved copy has no password.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Pages",
     "rows": [
      {
       "name": "Organize",
       "what": "Drag pages to reorder, rotate, delete, and select by odd, even or file.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Insert",
       "what": "Add blank pages, PDFs, or JPG and PNG images from your computer or your drive.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Split and extract",
       "what": "Split before selected pages, every N pages, or into single pages, and extract a selection.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Combine",
       "what": "Merge several PDFs from your library or computer into one file.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Keeps bookmarks and forms",
       "what": "Pages are rearranged in place, so bookmarks and form fields stay on their pages.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Markup and forms",
     "rows": [
      {
       "name": "Markup",
       "what": "Highlight, add text, ticks, crosses, today's date, drawings and images.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Sticky notes",
       "what": "Notes are saved as standard PDF note annotations, with replies.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Your signature",
       "what": "Draw it, type it in one of 3 script fonts, or use a photo of your signature on paper.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Fill forms",
       "what": "Fill a PDF's own form fields and save.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Find form fields",
       "what": "Turn a flat form into a fillable one, with fields you can rename, retype, move or remove first.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Flatten",
       "what": "Save a copy with every field and mark painted onto the page.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Tools",
     "rows": [
      {
       "name": "Redact",
       "what": "Remove text for good, with find-and-mark for common personal data.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Make smaller",
       "what": "Resamples images to the size they are shown at, only when the result is smaller.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Protect",
       "what": "Set an open password and permissions with AES-256.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Stamp pages",
       "what": "Watermark, page numbers, Bates numbers and headers.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Remove hidden information",
       "what": "Strips hidden data from the file before you share it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "OCR",
       "what": "Adds a searchable text layer to scanned pages, in one or two languages at once.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Convert",
       "what": "Export to Word, Excel, PowerPoint, pictures, plain text or PDF/A.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Signatures",
     "rows": [
      {
       "name": "Request signatures",
       "what": "Pick people and an order, place fields for each person, and send through Hoq Sign.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Out for signature",
       "what": "See status, copy a signer's link, send a reminder or void the request.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Signed copy comes home",
       "what": "The sealed PDF is saved next to the original in your drive.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Seal it",
       "what": "Seal a PDF you signed yourself with a certificate of completion and a tamper seal.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 25,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Adobe Acrobat Pro for teams",
      "url": "https://www.adobe.com/acrobat/pricing/business.html"
     },
     {
      "name": "Foxit PDF Editor+",
      "url": "https://www.foxit.com/pdf-editor/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price per user",
      "hoq": "not published",
      "them": [
       "US$23.99 per month, annual plan",
       "$159.99 per year"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "Runs on",
      "hoq": "Any browser; installs as an app",
      "them": [
       "Desktop, mobile and web",
       "Windows, macOS, web, iOS and Android"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "Cloud storage included",
      "hoq": "Saves to your Hoq Storage drive",
      "them": [
       "100 GB",
       "Unlimited, in Foxit DMS"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "OCR",
      "hoq": "Yes",
      "them": [
       "Yes",
       "Yes"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "Redaction",
      "hoq": "Yes, with find-and-mark for emails, phones, SSNs, cards and dates",
      "them": [
       "Yes (Pro only)",
       "Yes, plus AI Smart Redact"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "Send for e-signature",
      "hoq": "Yes, through Hoq Sign",
      "them": [
       "Yes, no limit stated",
       "Foxit eSign, 150 envelopes a year"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "Native mobile apps",
      "hoq": "No; the web app works on phones",
      "them": [
       "Yes",
       "Yes"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     },
     {
      "label": "Edits work offline",
      "hoq": "No; it needs a connection to load",
      "them": [
       "Yes, desktop app",
       "Yes, desktop app"
      ],
      "sources": [
       "https://www.adobe.com/acrobat/pricing/business.html",
       "https://www.foxit.com/pdf-editor/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "phone",
   "name": "Hoq Phone",
   "status": "beta",
   "url": "https://phone.hoq.app",
   "line": "Business numbers, call flows and a softphone, with transcripts and summaries.",
   "facts": [
    {
     "label": "How staff take calls",
     "value": "Browser softphone (installable on Mac and Windows, rings in the background), or any SIP desk phone or app set up by QR code or a downloaded config."
    },
    {
     "label": "Voice codecs",
     "value": "Opus, G.722, G.711 µ-law and A-law, with DTMF as telephone-event."
    },
    {
     "label": "Encryption",
     "value": "TLS for SIP signalling and DTLS-SRTP for audio in the browser softphone."
    },
    {
     "label": "Call flows",
     "value": "Drafts kept apart from what callers hear; publish checks for dead ends first; every published version kept."
    },
    {
     "label": "Recording",
     "value": "Set by a recording policy, with an announcement to the outside party and a retention period. A consent record is kept per call."
    },
    {
     "label": "Voicemail",
     "value": "Saved to an inbox in the app, transcribed, and sent by email."
    },
    {
     "label": "Meeting uploads",
     "value": "Upload a recording up to 200 MB (mp3, m4a, mp4, wav, ogg, webm, flac) or a VTT, SRT or text transcript for a summary."
    },
    {
     "label": "Carriers",
     "value": "Hoq's carrier, or your own Twilio account: we set up the SIP trunk in your account and bring in your numbers."
    },
    {
     "label": "Number porting",
     "value": "Portability check, signed letter of authorization through Hoq Sign, and tracking to the switch-over date."
    },
    {
     "label": "Sign-in and access",
     "value": "Hoq ID single sign-on. Owners and admins manage settings; members see their own calls."
    }
   ],
   "figures": [
    {
     "value": "500",
     "label": "calls at once carried in our load test, recorded or not"
    },
    {
     "value": "200 MB",
     "label": "largest meeting recording you can upload for a summary"
    },
    {
     "value": "5",
     "label": "calling rules per person, from anyone to no outbound calls"
    },
    {
     "value": "100",
     "label": "undo steps in the call flow editor"
    }
   ],
   "features": [
    {
     "area": "Numbers",
     "rows": [
      {
       "name": "Get a number",
       "what": "Search for a number and add it to your business.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "What callers hear",
       "what": "Each number shows, in plain words, what happens when someone calls it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Forward all calls",
       "what": "Forward a number to another phone until a time you set, then fall back to its flow.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bring your own Twilio",
       "what": "Connect your Twilio account; we build the SIP trunk and bring your numbers in. Removing them releases nothing.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Move numbers to Hoq",
       "what": "Port numbers in with a portability check and a letter signed in Hoq Sign.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Call flows",
     "rows": [
      {
       "name": "Steps view",
       "what": "Lay the flow out as a tree, add steps with +, and work on a phone screen.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Steps",
       "what": "Say something, press a key, ring phones at once or in turn, wait, voicemail, hang up.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Problem check",
       "what": "Lists every way a caller could be hung up before you publish.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Drafts and versions",
       "what": "Edit a draft, publish when ready, and bring back any published version.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Try it",
       "what": "Place a pretend call through the flow, press keys, and hear what a caller would.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Ring groups, queues, rooms",
       "what": "Ring a group of people, hold callers in a queue, or join a conference room.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Answering",
     "rows": [
      {
       "name": "Browser softphone",
       "what": "Take and place calls in the browser with hold and transfer; installable as a desktop app with ring, alerts and a missed-call badge.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Desk phones and apps",
       "what": "QR setup and downloadable configs for SIP phones and apps.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Presence",
       "what": "See who is free, ringing, on a call or not connected.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Caller card and actions",
       "what": "See who is calling from CRM and Service, then write a note, open a job, add a lead or text them during the call.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Inbox",
       "what": "Missed calls, voicemail and texts in one list you mark done.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "After the call",
     "rows": [
      {
       "name": "Transcripts and summaries",
       "what": "Recorded calls are transcribed with each side named and summarised.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Call review",
       "what": "Check each call against your own checklist, item by item, with a quote.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Risk flags",
       "what": "Flag calls that use words you never say or miss words you must say.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Ask your calls",
       "what": "Ask a question across past transcripts and get answers with quotes.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Call history",
       "what": "Every call with direction, who answered and where it was forwarded.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Rules",
     "rows": [
      {
       "name": "Who may call whom",
       "what": "Per person: anyone, only our customers, only their team's, only their own, or no outbound calls.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Do not contact and quiet hours",
       "what": "A do-not-contact list and quiet hours by the customer's clock.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "API",
     "rows": [
      {
       "name": "Call data API",
       "what": "Read calls, recordings, transcripts, summaries and audio with your own Hoq ID key.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Webhooks",
       "what": "Signed events for call ended, recording ready, summary ready, call flagged and texts.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 22,
   "beta": 3,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "RingCentral RingEX Core",
      "url": "https://www.ringcentral.com/office/plansandpricing.html"
     },
     {
      "name": "Dialpad Standard",
      "url": "https://www.dialpad.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest plan",
      "hoq": "Not published",
      "them": [
       "$20/user/mo yearly, $30 monthly",
       "$15/user/mo yearly, $27 monthly"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "Call recording",
      "hoq": "Yes, by policy, with announcement and retention",
      "them": [
       "On-demand recording",
       "not published"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "Transcripts and summaries",
      "hoq": "Yes, after the call",
      "them": [
       "Not listed on Core",
       "Real-time transcripts and call summaries"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "Texting included",
      "hoq": "not published",
      "them": [
       "25 SMS per user/mo",
       "Built-in messaging"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "Bring your own carrier",
      "hoq": "Your own Twilio account",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "Native mobile apps",
      "hoq": "No; browser and SIP apps",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "International numbers",
      "hoq": "not published",
      "them": [
       "not published",
       "Local numbers in over 50 countries"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     },
     {
      "label": "Call data API",
      "hoq": "Yes, with your own key",
      "them": [
       "not published",
       "Not stated for Standard"
      ],
      "sources": [
       "https://www.ringcentral.com/office/plansandpricing.html",
       "https://www.dialpad.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "platform",
   "name": "Hoq ID and platform",
   "status": "live",
   "url": "https://id.hoq.app",
   "line": "One sign-in, one organization and one drive across every Hoq app.",
   "facts": [
    {
     "label": "Sign-in",
     "value": "An emailed code or a passkey on the sign-in page; a password if you set one. Authenticator-app codes as a second step, and recovery codes."
    },
    {
     "label": "Several accounts",
     "value": "Sign in to several accounts in one browser and switch between them. The list is kept on the server, so your devices page is the same list."
    },
    {
     "label": "Sign in on a device",
     "value": "A TV or terminal shows a code; you approve it from your phone at id.hoq.app/device."
    },
    {
     "label": "Roles",
     "value": "Member, admin and owner. An admin cannot invite above their own role or demote the owner."
    },
    {
     "label": "Invitations",
     "value": "Sent by email, bound to that address, valid 7 days."
    },
    {
     "label": "Seats",
     "value": "Per app per organization. No limit means every member. Lowering the limit never removes anyone."
    },
    {
     "label": "Domain claim",
     "value": "Prove you control a domain with a TXT record at _hoq-verify.<domain>. People who sign up at that domain get an invitation, not an automatic membership."
    },
    {
     "label": "Outside apps",
     "value": "Apps not made by Hoq show a consent card listing every scope they ask for, and you can withdraw access later."
    },
    {
     "label": "API keys",
     "value": "Every key is issued by Hoq ID and carries named scopes, such as files:read or sensor:post."
    },
    {
     "label": "Plans",
     "value": "Free: up to 5 people, 3 mail seats, 5 GB mail storage. Team: mail seats for everyone, 10 GB mail per person, 30 days of deleted mail. Business: 50 GB mail per person, 90 days of deleted mail, a named support contact."
    }
   ],
   "figures": [
    {
     "value": "3",
     "label": "organization plans: Free, Team and Business"
    },
    {
     "value": "1,000,000",
     "label": "AI input tokens included each month for every organization, plus 200,000 output tokens"
    },
    {
     "value": "7 days",
     "label": "before an unused invitation expires"
    },
    {
     "value": "14 days",
     "label": "notice to people already using a domain before it becomes an organization's managed domain"
    },
    {
     "value": "108",
     "label": "named API scopes an app or key can ask for"
    }
   ],
   "features": [
    {
     "area": "Sign-in",
     "rows": [
      {
       "name": "Email code",
       "what": "Type your email, get a code, no password.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Passkeys",
       "what": "Sign in with a passkey on the first screen.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Second step",
       "what": "Authenticator-app codes after the first factor.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recovery codes",
       "what": "Get back in when you lose your other factors.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Account roster",
       "what": "Several accounts signed in at once, switched from the menu.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Device sign-in",
       "what": "Approve a TV or terminal from your phone.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Organizations",
     "rows": [
      {
       "name": "Roles",
       "what": "Member, admin, owner, with last-owner protection.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Invitations",
       "what": "Email-bound, 7-day invitations, accepted with an explicit click.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Apps and seats",
       "what": "Turn apps on for the organization and assign seats to named people.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Domain claim",
       "what": "Verify a domain by DNS TXT and invite people who sign up with it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Plans",
       "what": "Free, Team and Business, upgraded now and downgraded at term end.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Access",
     "rows": [
      {
       "name": "One gate",
       "what": "Every app's access is decided once, at sign-in to that app.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "App switcher",
       "what": "A menu in every app listing the apps you may open.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Scoped API keys",
       "what": "Keys carry named scopes; a key never works beyond them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Consent for outside apps",
       "what": "Third-party apps ask once and can be removed from your account page.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "MCP for agents",
       "what": "Todo, Board, Crew, Books and DB serve MCP to AI agents with their own keys.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Storage and billing",
     "rows": [
      {
       "name": "One drive",
       "what": "Documents from Docs, Sheets, Slides and other apps are saved to your Hoq Storage drive with versions.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Prepaid credit",
       "what": "Usage draws from a credit balance; renewals fall back to a card top-up.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organization pays for AI",
       "what": "Members' AI use bills to the organization; an empty balance refuses rather than charging the person.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 19,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Google Workspace",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Microsoft Entra ID",
      "url": "https://www.microsoft.com/en-us/security/business/microsoft-entra-pricing"
     },
     {
      "name": "Okta Workforce Identity",
      "url": "https://www.okta.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid price",
      "hoq": "Not published yet",
      "them": [
       "$7.00 per user per month (Starter, monthly)",
       "$7.00 per user per month (P1, paid yearly)",
       "$6 per user per month, billed annually, $1,500 yearly minimum"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/security/business/microsoft-entra-pricing",
       "https://www.okta.com/pricing/"
      ]
     },
     {
      "label": "Free tier",
      "hoq": "Free plan: up to 5 people, 3 mail seats, 5 GB mail",
      "them": [
       "Essentials Starter, no Gmail",
       "Entra ID Free: MFA and SSO",
       "None; 30-day trial"
      ],
      "sources": [
       "https://workspace.google.com/essentials/",
       "https://www.microsoft.com/en-us/security/business/microsoft-entra-pricing",
       "https://www.okta.com/pricing/"
      ]
     },
     {
      "label": "Passkeys",
      "hoq": "Yes, on the first sign-in screen; no password needed",
      "them": [
       "Yes",
       "Yes, device-bound or synced",
       "Yes"
      ],
      "sources": [
       "https://support.google.com/a/answer/13004165",
       "https://learn.microsoft.com/en-us/entra/identity/authentication/how-to-authentication-passkeys-fido2",
       "https://help.okta.com/oie/en-us/content/topics/security/mfa/webauthn-compatibility.htm"
      ]
     },
     {
      "label": "Single sign-on to outside apps",
      "hoq": "OAuth 2.0 with consent; no SAML",
      "them": [
       "SAML and OIDC with an app catalog",
       "SAML and OIDC",
       "SAML and OIDC in every suite"
      ],
      "sources": [
       "https://knowledge.workspace.google.com/admin/apps/set-up-your-own-custom-saml-app",
       "https://www.microsoft.com/en-us/security/business/microsoft-entra-pricing",
       "https://www.okta.com/pricing/"
      ]
     },
     {
      "label": "Organizations and roles",
      "hoq": "Organizations with member, admin, owner; seats per app",
      "them": [
       "Org units, groups, built-in and custom admin roles",
       "Groups, admin units, built-in and custom roles",
       "Groups, standard and custom admin roles"
      ],
      "sources": [
       "https://knowledge.workspace.google.com/admin/users/administrator-privilege-definitions",
       "https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference",
       "https://help.okta.com/oie/en-us/content/topics/ai-agents/ai-agent-admin-role.htm"
      ]
     },
     {
      "label": "API access",
      "hoq": "API keys with named scopes, one issuer",
      "them": [
       "OAuth 2.0 scopes and service accounts",
       "Microsoft Graph OAuth permissions",
       "OAuth 2.0 scoped tokens and API tokens"
      ],
      "sources": [
       "https://developers.google.com/admin-sdk/directory/v1/guides/authorizing",
       "https://learn.microsoft.com/en-us/graph/",
       "https://developer.okta.com/docs/api/oauth2"
      ]
     },
     {
      "label": "Storage",
      "hoq": "One Hoq Storage drive for every app",
      "them": [
       "30 GB pooled per user (Starter)",
       "None in Entra; 1 TB OneDrive in Microsoft 365 Business Basic",
       "None"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-business-basic",
       "https://www.okta.com/pricing/"
      ]
     },
     {
      "label": "MCP for AI agents",
      "hoq": "Served by several apps (Todo, Board, Crew, Books, DB)",
      "them": [
       "Official MCP servers for Gmail, Drive, Calendar and more, some in preview",
       "MCP Server for Enterprise, public preview, read-only",
       "Official MCP server, self-hosted or Okta-managed"
      ],
      "sources": [
       "https://developers.google.com/workspace/guides/configure-mcp-servers",
       "https://learn.microsoft.com/en-us/graph/mcp-server/overview",
       "https://developer.okta.com/docs/concepts/mcp-server/"
      ]
     }
    ]
   }
  },
  {
   "key": "print",
   "name": "Hoq Print",
   "status": "beta",
   "url": "https://print.hoq.app",
   "line": "Print to a name, from any app or computer, to the first ready printer.",
   "facts": [
    {
     "label": "How printers are reached",
     "value": "A LAN agent that prints through CUPS, save-to-folder or a custom command, or Star CloudPRNT direct from the printer."
    },
    {
     "label": "Print dialog on your computer",
     "value": "A local IPP Everywhere printer per destination on 127.0.0.1. Linux builds today (.deb, Arch package, tarball)."
    },
    {
     "label": "Files it takes",
     "value": "PDFs, pictures and ZPL. PDFs and pictures convert to ZPL for Zebra printers."
    },
    {
     "label": "Paper fitting",
     "value": "A page that is the wrong size is scaled and turned on the server to fit the paper, sent as is, or refused, per destination."
    },
    {
     "label": "Where jobs are kept",
     "value": "One file per space in the owner's Hoq Storage drive. Finished jobs keep their file for reprint from 1 day to a year, and history from 30 days to 2 years."
    },
    {
     "label": "Printer status",
     "value": "Trays, paper and supplies read over IPP from each printer; office printers' CUPS states (paper empty, jam, door open, toner low) shown in the same words."
    },
    {
     "label": "Send once",
     "value": "Apps send their own job key, so a retry never prints the same job twice."
    },
    {
     "label": "Keys for other apps",
     "value": "A send-only key lists destinations, sends jobs and follows only its own jobs."
    },
    {
     "label": "Office computers",
     "value": "Hoq Station packages the print agent and its CUPS setup for Linux as .deb and Arch packages."
    }
   ],
   "figures": [
    {
     "value": "1 to 100",
     "label": "copies on a reprint"
    },
    {
     "value": "85.6 × 54 mm",
     "label": "CR80 card jobs on a card printer, PVC or paper stock"
    },
    {
     "value": "6 ips",
     "label": "top label printer speed shown in plain words"
    },
    {
     "value": "6 digits",
     "label": "code to pair a wall display"
    }
   ],
   "features": [
    {
     "area": "Computers and printers",
     "rows": [
      {
       "name": "Connect a computer",
       "what": "Links a computer that can reach your printers to your account with one key and a small agent, after which it checks in by itself.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Printers found for you",
       "what": "Lists every print queue the computer has, so you add a printer by picking it rather than typing its address.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "One computer, all your spaces",
       "what": "Lets a computer print for your own space and every organisation you run, or only the ones you choose.",
       "status": "beta",
       "verified": "2026-10-10"
      },
      {
       "name": "Places",
       "what": "Groups computers by where they are, such as an office or a shop.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Paper and toner on each printer",
       "what": "Shows each tray with the paper in it, which trays are empty, and supplies running low, read from the printer itself.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Printer settings",
       "what": "Shows the settings each printer's driver offers, such as darkness, speed and paper source, and applies your choices to every job.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Floor console",
       "what": "One place for daily printing: live printers in a side rail, a Needs-you list that only appears when something needs a person (each with its fix), one job list grouped by what happens next, a side panel for any job or printer, ⌘K commands, keyboard shortcuts, bulk actions and Undo.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Check before printing",
       "what": "Drop files anywhere: each shows a proof (as the printer will print it), the fit, where it goes and why it won't print with a one-click fix, then prints in one go.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Setup",
       "what": "Computers, printers, where jobs go, screens, keeping files and connect instructions in one quiet place, out of daily view.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Stations",
       "what": "A paired touchscreen shows a touch bar (bottom, top or side) to switch between this wall and other apps or local panels, each kept running behind it, with badges for what needs a person and a return to the first tab after a quiet spell.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Tab menu",
       "what": "Long-press a station tab to send it back to its start page, show it side by side or swap sides, stay on it for 30 minutes, quiet it for 15 minutes, or close it until the screen next resets; tapping the tab already showing also sends it back to its start page.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Apps that say they are busy",
       "what": "An app in a station tab can say it is mid-task, and the station then neither leaves it nor lets another tab jump in front; apps hear when their tab comes into view or leaves it.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Station keeps itself current",
       "what": "A station reloads by itself after an update once nobody has touched it for a minute, and every night around 3 am; the console can reload it or show one of its tabs now.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Rearrange tabs at the screen",
       "what": "With an owner PIN set in the console, someone at the station can long-press a tab and move tabs left or right; five wrong PINs lock it for ten minutes.",
       "status": "beta",
       "verified": "2026-10-14"
      },
      {
       "name": "Times of day",
       "what": "A station can start on other tabs, alone or side by side, during set hours by its own clock, including hours that run past midnight.",
       "status": "beta",
       "verified": "2026-10-14"
      },
      {
       "name": "Tabs that need a look",
       "what": "A Hoq app tab that does not load is marked Not loading and tried again every minute; the bar says Offline when the station loses its connection.",
       "status": "beta",
       "verified": "2026-10-14"
      },
      {
       "name": "Pair tabs from the console",
       "what": "A tab showing a pairing code puts a Pair link on the screen in the console, which opens that app with the code filled in.",
       "status": "beta",
       "verified": "2026-10-14"
      },
      {
       "name": "Looks",
       "what": "Each screen has a look (Paper, Slate, Harbor, Moss or Signal), each in light and dark, used by its wall and its station bar; the signed-in floor can switch looks with a button.",
       "status": "beta",
       "verified": "2026-10-14"
      },
      {
       "name": "Big screen",
       "what": "Every printer as a column readable across the room — state, live proof, next jobs and the one fix it needs — on a wall display, tablet or phone, signed in at /app/print/floor or paired at /wall.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "What it is",
       "what": "Says what each printer is (thermal or color label, receipt, laser, inkjet, card, sticker, DTG, DTF, UV, wide-format, dye-sub) and what is loaded, such as 4×6 in gap labels, an 80 mm receipt roll or a 16×20 in platen, plus its model, print head width, top speed, how labels leave it and its inks; jobs only go to a printer they fit, and its test page comes out at that size.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Processing",
       "what": "Says what each printer understands — its computer's driver, ZPL, or raw — and converts PDFs and pictures to ZPL for Zebra printers (sharp or dithered black and white, darkness, speed); a printer that cannot take a file says why instead of pretending it printed.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Refresh status",
       "what": "↻ Status on a printer asks its computer to look at it now — state, paper, supplies and what it is — and says what it found.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Retention",
       "what": "Each space chooses how long finished jobs keep their file for reprint (1 day to a year) and how long their history stays (30 days to 2 years); every finished job says until when it can be printed again, or that its file was removed.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Queue",
       "what": "Every printer's line in the order it will print — printing now with progress, then what is next, numbered — with Print next, Pause and Resume, Cancel and Print again on each job; jobs whose destination has no printer that can take them are shown apart with the reason; drop files on a printer to add them.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Print queue",
       "what": "Drop PDFs, pictures or ZPL files on a printer or destination (or open Print queue) and they wait in a queue: each is checked against where it goes (fit, or why it won't print there), previewed exactly as the printer will print it when Hoq Print converts for it, given copies and a title, then printed — and the queue then follows every job to printed or the reason it did not, with Print again.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Alignment",
       "what": "Sets where the image lands across a roll printer's paper and how far the paper is pulled back before each label.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Label printers made simple",
       "what": "Shows a ZyWell label printer's darkness and speed in plain words (speed in inches per second, up to 6) and folds the rest of its driver settings away.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Test print",
       "what": "Prints a page the size of the printer's paper with a border 2 mm in, so you can see at a glance whether size and alignment are right.",
       "status": "beta",
       "verified": "2026-10-11"
      }
     ]
    },
    {
     "area": "Printing",
     "rows": [
      {
       "name": "Print to a name",
       "what": "Lets apps print to a destination such as \"Bag labels\" and never to a particular printer.",
       "status": "beta",
       "verified": "2026-10-10"
      },
      {
       "name": "First ready printer",
       "what": "Sends a destination's job to the first printer on its list that is ready, and to the next when one is not.",
       "status": "beta",
       "verified": "2026-10-10"
      },
      {
       "name": "The right paper",
       "what": "Passes over a printer whose tray for the destination's paper is empty or that does not have it, and says which tray to fill.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Darkness and speed per destination",
       "what": "Lets one destination print darker or slower than another on the same label printer.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Whichever printer is free",
       "what": "Lets a destination share its work across its printers, so whichever ready printer asks first takes the next job, instead of the rest standing behind the first.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Never printed twice",
       "what": "Holds each job for one printer at a time and never reprints a job a printer may already have printed.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Retries and expiry",
       "what": "Tries a failed job again a set number of times and gives up on jobs nobody printed in time.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Print queue",
       "what": "Lets you drop several PDFs or pictures, see each one's pages, check how it fits the destination's paper (size, shape, resolution), set copies and titles, then print them all; files wait a day until printed.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Card printer",
       "what": "Prints card-size jobs (CR80, 85.6 × 54 mm) on the card printer, which lays them two to a tray sheet itself.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Card stock",
       "what": "Lets a destination, or one print from the queue, choose the stock a card printer prints on (PVC or paper), each with its own colour profile; the printer holds the job until that stock is loaded.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Envelope printers",
       "what": "Prints to printers that need their own print command, with the tray and paper choices a job may ask for.",
       "status": "beta",
       "verified": "2026-10-10"
      },
      {
       "name": "Pages fitted to the paper",
       "what": "A file whose pages are a different size from the paper is fitted to it on the server (scaled, turned when that fits better), so it comes out right even on a printer that takes files raw; each destination can instead send such pages as they are or refuse the file, and the job says what was done.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Accept anything",
       "what": "A destination can take whatever is sent: print dialogs offer every common size and every choice, and what its printers cannot do is fitted or left out instead of refused.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Every page",
       "what": "A job's preview pages through the whole document — arrows or ← → in the console, arrows or a swipe on the big screen and walls — each page drawn the first time someone looks, with \"Page 3 of 12\".",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Park destinations",
       "what": "A destination that prints nothing: every file sent to it (any kind, any size) waits under Parked until someone looks at it, renames it, puts several together into one job, and sends it on to a destination or a printer — made ready for that paper on the way — or downloads it.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "Standard page names",
       "what": "Every page size reaches CUPS by its standard name (or width × height in mm), never `Custom.` — which on a driver with no custom sizes silently printed on the queue's default paper.",
       "status": "beta",
       "verified": "2026-10-13"
      }
     ]
    },
    {
     "area": "Jobs",
     "rows": [
      {
       "name": "Every job in one list",
       "what": "Shows jobs from all your spaces together, each with where it printed and what happened.",
       "status": "beta",
       "verified": "2026-10-10"
      },
      {
       "name": "Job history",
       "what": "Records every step of a job, from queued to printed or failed, with the reason.",
       "status": "beta",
       "verified": "2026-10-10"
      },
      {
       "name": "Reprint and cancel",
       "what": "Reprints a finished job as a new one, with however many copies you ask for (1 to 100), or cancels one still waiting.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Kept in your own storage",
       "what": "Keeps each space's jobs in a file in its owner's Hoq Storage, deleted after 30 days.",
       "status": "beta",
       "verified": "2026-10-10"
      }
     ]
    },
    {
     "area": "Seeing and fixing problems",
     "rows": [
      {
       "name": "Live printer state",
       "what": "Shows what each printer is doing now — ready, printing with how far along, needs you, problem, offline, paused — with what is loaded and supply levels, in the same words for every kind of printer.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Needs attention",
       "what": "Lists every printer problem in words with what to do, worst first, and a one-tap fix when the printer offers one (It's loaded, Resume).",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Printer commands",
       "what": "Sends a printer the commands its computer offers — It's loaded, pause, resume, stop this job, print — from the console or a wall screen.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Out of paper from CUPS",
       "what": "Turns what an office printer's CUPS queue says (paper empty, jam, door open, toner low) into the same problems, with nothing new to install.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Job pictures",
       "what": "Shows a picture of each job's first page in the job list, the job's details and on the wall.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Move a job",
       "what": "Sends a waiting job to another printer that prints for its space.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    },
    {
     "area": "Wall screens",
     "rows": [
      {
       "name": "Screens",
       "what": "Saves a choice of printers from any place, in order, as a screen for a wall display.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Pair a display",
       "what": "Pairs a display to a screen with the six-digit code it shows at print.hoq.app/wall; forgetting it stops the display at once.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "The wall",
       "what": "Shows the screen's printers full-screen and touch-first, with the needs-attention bar, and does everything the console does by picture: cancel, reprint, move, test page and the printers' own commands.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    },
    {
     "area": "For apps",
     "rows": [
      {
       "name": "Print API",
       "what": "Accepts a PDF from any app with a Hoq key, for a destination or a printer, and returns the job to follow.",
       "status": "beta",
       "verified": "2026-10-11"
      },
      {
       "name": "Send it once",
       "what": "Takes a job's own key so an app that retries never prints the same thing twice.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Star cloud printers",
       "what": "Lets a Star CloudPRNT printer fetch its own work over the internet, with no computer beside it.",
       "status": "beta",
       "verified": "2026-07-25"
      },
      {
       "name": "Keys that only send",
       "what": "Gives another Hoq app a key that lists destinations, sends jobs and follows or cancels only the jobs it sent; it cannot add printers, change destinations or see anyone else's jobs.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Doorbells for apps",
       "what": "Rings the app that sent a job, with a signed empty call, when the job is printed, fails, expires or is cancelled, so it asks for the news instead of polling; only Hoq app addresses can be rung.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "No ticket needed with a file",
       "what": "Takes a job that brings its own file without the old ticket field.",
       "status": "beta",
       "verified": "2026-10-27"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 63,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "PrintNode",
      "url": "https://www.printnode.com/en/pricing"
     },
     {
      "name": "StarIO.Online (Star Micronics)",
      "url": "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published",
      "them": [
       "Free for 50 prints a month; $9, $29 or $99 a month",
       "90-day free trial, then subscription (prices not published)"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-emea.com/products/stario-online/"
      ]
     },
     {
      "label": "Printers supported",
      "hoq": "Any CUPS queue, plus Star CloudPRNT printers",
      "them": [
       "Printers attached to a computer running the client",
       "Star CloudPRNT devices only"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
      ]
     },
     {
      "label": "Computer agent runs on",
      "hoq": "Linux",
      "them": [
       "Windows, macOS, Linux, Raspberry Pi",
       "No computer; the printer connects itself"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
      ]
     },
     {
      "label": "Print to a purpose with failover",
      "hoq": "Destinations try printers in order",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
      ]
     },
     {
      "label": "Status and job events",
      "hoq": "Live printer state, supplies, and a signed call to the app",
      "them": [
       "not published",
       "Webhooks for device status, print results and new devices"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
      ]
     },
     {
      "label": "Self-hosted option",
      "hoq": "No",
      "them": [
       "Standalone Server, contact sales",
       "not published"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
      ]
     },
     {
      "label": "Shows up in the OS Print dialog",
      "hoq": "Yes on Linux, one printer per destination",
      "them": [
       "not published",
       "Print by email once activated"
      ],
      "sources": [
       "https://www.printnode.com/en/pricing",
       "https://star-m.jp/products/s_print/sdk/stario_online/manual/en/about.html"
      ]
     }
    ]
   }
  },
  {
   "key": "reader",
   "name": "Hoq Reader",
   "status": "beta",
   "url": "https://reader.hoq.app",
   "line": "Your books in your drive, on an Xteink e-reader, with your place kept.",
   "facts": [
    {
     "label": "Readers supported",
     "value": "Xteink X3 and X4 (ESP32-C3) and X4 Pro (ESP32-S3). The X4 Classic is not supported yet."
    },
    {
     "label": "Formats sent to the reader",
     "value": "EPUB, TXT and Markdown."
    },
    {
     "label": "Formats read in the browser only",
     "value": "CBZ, CBR, CB7 comics and PDF."
    },
    {
     "label": "Largest book",
     "value": "200 MB per file."
    },
    {
     "label": "Where books live",
     "value": "In a folder of your Hoq Storage drive, Books by default."
    },
    {
     "label": "Installing",
     "value": "From Chrome or Edge on a computer over USB-C. The installer detects which reader you plugged in. Phones and Safari cannot reach USB devices."
    },
    {
     "label": "Linking a reader",
     "value": "Type a six-digit code from the reader into reader.hoq.app."
    },
    {
     "label": "Progress sync",
     "value": "Speaks the KOReader progress-sync protocol, so KOReader devices can sync to your library too."
    },
    {
     "label": "Catalog for other apps",
     "value": "OPDS feed with All books, Continue reading and Unread lists, behind a per-device password."
    },
    {
     "label": "Firmware updates",
     "value": "Over the air from Hoq's own release feed."
    }
   ],
   "figures": [
    {
     "value": "200 MB",
     "label": "largest book you can add"
    },
    {
     "value": "3",
     "label": "Xteink models supported: X3, X4, X4 Pro"
    },
    {
     "value": "7",
     "label": "file formats in the library: EPUB, TXT, Markdown, CBZ, CBR, CB7, PDF"
    },
    {
     "value": "33",
     "label": "font families in the reading-look catalog"
    }
   ],
   "features": [
    {
     "area": "Library",
     "rows": [
      {
       "name": "Books from your drive",
       "what": "Reads books from a folder you choose in your Hoq Storage drive.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Upload a book",
       "what": "Adds a book up to 200 MB and makes a cover thumbnail from it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Shelves",
       "what": "Groups books onto shelves.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Read in the browser",
       "what": "Opens EPUB, text and Markdown chapter by chapter, and comics and PDF page by page.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "On the reader",
     "rows": [
      {
       "name": "Send books",
       "what": "Delivers the books you send to a linked reader the next time it syncs.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reading progress",
       "what": "Keeps your place in each book in step between the reader and the web.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bookmarks",
       "what": "Keeps bookmarks made on the reader in your library.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Lock screen pictures",
       "what": "Sets the picture each reader shows when it sleeps.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reading look",
       "what": "Picks the reader's font from the web.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Setup and updates",
     "rows": [
      {
       "name": "Browser installer",
       "what": "Puts the firmware on the reader from Chrome or Edge over USB-C.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Six-digit linking",
       "what": "Links a reader to your library with a code typed on reader.hoq.app.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Over-the-air updates",
       "what": "Updates the reader's firmware from Hoq's release feed.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Other reading apps",
     "rows": [
      {
       "name": "KOReader sync",
       "what": "Accepts reading progress from KOReader devices.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "OPDS catalog",
       "what": "Lists your books for any OPDS reading app.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 14,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "CrossPoint Reader (stock)",
      "url": "https://github.com/crosspoint-reader/crosspoint-reader"
     },
     {
      "name": "calibre Content server",
      "url": "https://manual.calibre-ebook.com/server.html"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published on reader.hoq.app",
      "them": [
       "Free, MIT licence",
       "Free and open source"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://calibre-ebook.com/about"
      ]
     },
     {
      "label": "E-readers supported",
      "hoq": "Xteink X3, X4, X4 Pro",
      "them": [
       "Xteink X3, X4, X4Pro, X4Classic, Seeed reTerminal Sticky, M5PaperMono and others",
       "not published"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://manual.calibre-ebook.com/server.html"
      ]
     },
     {
      "label": "Formats on the device",
      "hoq": "EPUB, TXT, Markdown",
      "them": [
       "EPUB, XTC/XTCH, TXT, BMP",
       "not published"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://manual.calibre-ebook.com/server.html"
      ]
     },
     {
      "label": "Where your books live",
      "hoq": "A folder in your Hoq Storage drive",
      "them": [
       "On the reader's SD card; downloads from up to 8 saved OPDS servers",
       "On your own computer running the server"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://manual.calibre-ebook.com/server.html"
      ]
     },
     {
      "label": "Reading position sync",
      "hoq": "Built in, plus KOReader sync protocol",
      "them": [
       "KOReader progress sync (you supply the server)",
       "Remembers last position across devices while the server runs"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://manual.calibre-ebook.com/server.html"
      ]
     },
     {
      "label": "Install",
      "hoq": "Browser installer over USB-C (Chrome or Edge)",
      "them": [
       "Web flasher or esptool",
       "Desktop app on Windows, macOS or Linux"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://calibre-ebook.com/about"
      ]
     },
     {
      "label": "Firmware updates",
      "hoq": "Over the air from Hoq",
      "them": [
       "Over the air from GitHub releases",
       "not applicable"
      ],
      "sources": [
       "https://github.com/crosspoint-reader/crosspoint-reader",
       "https://manual.calibre-ebook.com/server.html"
      ]
     }
    ]
   }
  },
  {
   "key": "rep",
   "name": "Hoq Reputation",
   "status": "live",
   "url": "https://rep.hoq.app",
   "line": "Checks your domain's email records and reads its DMARC reports for you.",
   "facts": [
    {
     "label": "Records checked",
     "value": "SPF, DKIM, DMARC, MTA-STS, TLS-RPT and BIMI, each scored on its own. BIMI is not scored until DMARC is enforcing."
    },
    {
     "label": "How often",
     "value": "Every domain is rescanned every 6 hours, and you can ask for a scan at any time."
    },
    {
     "label": "SPF lookup limit",
     "value": "Counts the DNS lookups your SPF record causes, includes and all, against the limit of 10 in the SPF standard."
    },
    {
     "label": "DKIM key strength",
     "value": "Keys under 1024 bits are flagged as too weak. Keys Reputation makes for you are 2048-bit RSA."
    },
    {
     "label": "DMARC reports",
     "value": "Each domain gets its own report address. Aggregate (rua) reports are parsed, checked for alignment and rolled up by day and by sending source."
    },
    {
     "label": "Who is sending",
     "value": "Sending servers are named from their network and a reverse DNS name that must resolve back to the same address, so a forged name does not pass as a known provider."
    },
    {
     "label": "Before you enforce",
     "value": "At least 21 days of finished reports (30 for reject), at least 2 reporters including Google, Microsoft or Yahoo, DKIM alignment of 99% or more, and under 10% of failing mail from unnamed senders."
    },
    {
     "label": "DKIM key rotation",
     "value": "A rotation always starts a new selector. The old key stays published for 14 days before it can be revoked, and a key is not switched on until it is visible in DNS."
    },
    {
     "label": "Stored keys",
     "value": "Private DKIM keys are stored envelope-encrypted, and every time someone reveals one it is recorded with who and from where."
    },
    {
     "label": "Alerts",
     "value": "Email or an https webhook. Confirmed on two scans 10 minutes apart, the same cause is not repeated within 6 hours, and a domain sends at most 3 alerts a day."
    },
    {
     "label": "Proving a domain is yours",
     "value": "Publish a TXT record at _rep-verify on the domain. Checking public records needs no proof; reports and DKIM keys do."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "DNS records checked on every domain"
    },
    {
     "value": "6 h",
     "label": "between automatic rescans"
    },
    {
     "value": "7",
     "label": "readiness gates before quarantine or reject"
    },
    {
     "value": "99%",
     "label": "DKIM alignment needed before it suggests enforcing"
    },
    {
     "value": "3",
     "label": "alerts per domain per day, at most"
    }
   ],
   "features": [
    {
     "area": "Record checks",
     "rows": [
      {
       "name": "Six records scored",
       "what": "Scores SPF, DKIM, DMARC, MTA-STS, TLS-RPT and BIMI separately, with no single blended grade.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Findings by severity",
       "what": "Lists each problem as critical, serious, warning or info, worst first.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "SPF lookup count",
       "what": "Follows every include and counts the lookups against the limit of 10.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "MTA-STS policy fetch",
       "what": "Fetches and checks the MTA-STS policy file your domain publishes.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "A failed lookup is not a failed record",
       "what": "When DNS cannot be asked, that check is left out of the score instead of scored zero.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "DMARC reports",
     "rows": [
      {
       "name": "Your own report address",
       "what": "Gives each domain a report address to put in its DMARC record.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Alignment checked",
       "what": "Works out SPF and DKIM alignment for every reported message from the published policy.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Reports counted once",
       "what": "A report delivered twice is stored once.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Report charts",
       "what": "Charts messages, pass rates and reporters by day for each domain.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Senders",
     "rows": [
      {
       "name": "Senders named",
       "what": "Names known mail services from the sending server's network and confirmed reverse DNS.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Review queue",
       "what": "Lets you mark each sender as yours, not yours, or ask again later.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Moving to enforcement",
     "rows": [
      {
       "name": "Readiness gates",
       "what": "Seven pass, fail or too-early checks, each showing the number it measured.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Policy simulator",
       "what": "Shows how many reported messages a quarantine or reject policy would have caught, and from which senders.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rollback record",
       "what": "Writes the record to go back to before you make the change.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "DKIM keys",
     "rows": [
      {
       "name": "Key generation",
       "what": "Makes a 2048-bit key and gives the TXT record both whole and split into 255-character pieces.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Publish check",
       "what": "Checks the record is live in DNS before the key can be switched on.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rotation by selector",
       "what": "Rotates to a new selector and keeps the old one for 14 days.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Alerts",
     "rows": [
      {
       "name": "Record-change alerts",
       "what": "Alerts at once when DMARC or SPF disappears, a second DMARC record appears, or a policy breaks.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Digest",
       "what": "Sends a summary built from finished days only, and once a month even when nothing changed.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Webhooks",
       "what": "Posts alerts to an https address you give.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "API",
     "rows": [
      {
       "name": "REST API",
       "what": "Lists and adds domains and reads their checks and findings with a rep:use key.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 21,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "dmarcian",
      "url": "https://dmarcian.com/pricing/"
     },
     {
      "name": "Valimail",
      "url": "https://www.valimail.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid plan",
      "hoq": "Not published",
      "them": [
       "Basic: $19.99/mo billed yearly, $24 billed monthly",
       "Enforce Starter: custom quote"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "Not published",
      "them": [
       "Personal: 2 domains, 1,250 messages/month, 1 month of history",
       "Monitor: free, 5 users"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "Report history kept",
      "hoq": "Kept while the domain is active or archived; no published limit",
      "them": [
       "1 month (free) to unlimited (Enterprise)",
       "not published"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "Records checked",
      "hoq": "SPF, DKIM, DMARC, MTA-STS, TLS-RPT, BIMI",
      "them": [
       "DMARC, SPF, DKIM inspectors listed",
       "DMARC, SPF, DKIM, BIMI listed"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "DKIM key management",
      "hoq": "Generates 2048-bit keys, checks DNS, rotates by new selector",
      "them": [
       "not published (DKIM inspector and validator listed)",
       "Automated DKIM on paid Enforce plans"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "SPF beyond 10 lookups",
      "hoq": "Counts and warns; does not host or flatten SPF",
      "them": [
       "not published",
       "Unlimited SPF on paid plans; 10 lookups on free"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "API",
      "hoq": "Included: domains, checks and findings",
      "them": [
       "API access listed; plans not stated",
       "Add-on on Starter and Premium, included in Enterprise"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     },
     {
      "label": "Single sign-on",
      "hoq": "Hoq ID",
      "them": [
       "not published",
       "SSO/SAML on Enterprise"
      ],
      "sources": [
       "https://dmarcian.com/pricing/",
       "https://www.valimail.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "repo",
   "name": "Hoq Repos",
   "status": "live",
   "url": "https://repo.hoq.app",
   "line": "Git hosting where AI agents get scoped keys and never count as seats.",
   "facts": [
    {
     "label": "Protocols",
     "value": "Git over HTTPS and SSH at git.hoq.app; MCP for agents; signed webhooks."
    },
    {
     "label": "Encryption at rest",
     "value": "AES-256-GCM with a data key per owner (person or organization). Hoq holds the keys so it can serve your code; this is not end-to-end encryption."
    },
    {
     "label": "Where data lives",
     "value": "Repository data encrypted in Cloudflare R2, with a nightly copy at Wasabi in Oregon. Servers are in the United States."
    },
    {
     "label": "Push durability",
     "value": "Every accepted push is stored as a version before git reports success, and branches and tags can be restored to any push with a preview first."
    },
    {
     "label": "Backup retention",
     "value": "Deleted data stays in the nightly backup copy for 60 days, then is dropped."
    },
    {
     "label": "Closing an account",
     "value": "Removes your repositories, keys and settings and destroys the encryption key, so any backup copy left can no longer be read."
    },
    {
     "label": "Push protection",
     "value": "A push that adds what looks like a live key, token or private key is refused. A person can push past it on purpose; an agent key cannot."
    },
    {
     "label": "CI",
     "value": "GitHub Actions workflows from .hoq/workflows or .github/workflows run on runners you add (Gitea's open-source runner). In beta."
    },
    {
     "label": "Webhooks",
     "value": "Signed posts to your URLs, retried for about eight hours."
    },
    {
     "label": "AI and your code",
     "value": "Your code, commit messages and comments are never used to train AI models. Story summaries send only commit messages, and stay off until an admin turns them on."
    }
   ],
   "figures": [
    {
     "value": "$29",
     "label": "a month for an organization of up to 10 people, with agents free"
    },
    {
     "value": "$0.05",
     "label": "per GB a month for storage above a plan's allowance"
    },
    {
     "value": "60 days",
     "label": "that deleted data stays in the off-site backup"
    },
    {
     "value": "100 GB",
     "label": "of pooled storage included in the Team plan"
    }
   ],
   "features": [
    {
     "area": "Git hosting",
     "rows": [
      {
       "name": "Clone and push",
       "what": "Hosts git repositories at git.hoq.app over HTTPS and SSH.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "SSH and HTTPS keys",
       "what": "Adds SSH keys and HTTPS clone keys to your account, and lists or revokes them.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Encrypted storage",
       "what": "Stores every owner's repositories encrypted under a key of their own.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Push log",
       "what": "Records every push with the commits, files and checks it brought in.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Restore",
       "what": "Puts branches and tags back to how they were at any push, with a preview first, in either view.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Mirrors",
       "what": "Follows another repository, or copies every new push to one elsewhere.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Import from another host",
       "what": "Copies every branch and tag from any https git address once, with an optional token for a private one, and then it is an ordinary repository.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Push protection",
       "what": "Refuses a push whose new commits add what looks like a live secret, tells the person behind the key, and lets a repository admin allow exactly that line; a person can also push past it on purpose, an agent cannot.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Webhooks",
       "what": "Posts a signed message to your URLs when something happens, retrying for about eight hours.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Standby server",
       "what": "Keeps a second git server running that can take over if the main one fails; the switch-over is not automatic yet.",
       "status": "beta",
       "verified": "2026-10-02"
      },
      {
       "name": "Deploy keys",
       "what": "Gives one repository its own SSH key or HTTPS token, read-only or read and push, that belongs to the repository rather than a person.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Off-site backup",
       "what": "Copies every repository's encrypted data to a second storage provider each night, keeping deleted data for 60 days.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Browsing code",
     "rows": [
      {
       "name": "Code browser",
       "what": "Shows files, folders, READMEs, raw files and blame, with the last commit on each file.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Code search",
       "what": "Searches a repository's code, with regex and case options.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Commits and diffs",
       "what": "Lists commits and shows each one's changes, side by side or unified.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Signed commits",
       "what": "Marks commits signed by a known person, by an unknown key, or with a bad signature.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Branches and tags",
       "what": "Shows branches as lanes with their checks and changes, lists tags, and creates or deletes a branch or tag from the browser.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Compare",
       "what": "Compares any two branches, tags, commits or pushes, and saves a compare to share as a link.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Downloads",
       "what": "Downloads a file or the whole repository as an archive.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Go to anything",
       "what": "Jumps to any repository, file, branch, tag, commit or push from one search box.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Repository stats",
       "what": "Shows a repository's lines of code by language, commits, contributors, age, size and largest files.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Since you last looked",
       "what": "Shows what was pushed since your last visit, with a count on the repository list.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Editing in the browser",
     "rows": [
      {
       "name": "Edit files",
       "what": "Edits, adds, uploads and deletes files in the browser and commits to a branch or a new one.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Hoq Storage in and out",
       "what": "Adds files from your Hoq Storage drive and saves files from a repository back to it.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Changes and review",
     "rows": [
      {
       "name": "Changes",
       "what": "Opens a change from a branch and merges it by merge, squash or fast-forward, can delete the branch afterwards, and gives fix-up commands for conflicts.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Comments",
       "what": "Discusses a change or a single line, with replies, resolving and an outdated note when the line moves.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Revisions",
       "what": "Shows what each push to a change altered, compares any two, and marks files you have viewed.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Approvals",
       "what": "Requires approval before a change can merge, if the repository turns the rule on.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Checks",
       "what": "Shows test results posted against commits, and can block a merge until they pass.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Required checks",
       "what": "A protected branch names the checks a change into it needs passing; a missing one counts as pending, and hoq-ci/ names can only be reported by Hoq CI.",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Merge when ready",
       "what": "A person or an agent asks a change to merge itself; it merges the moment its approvals, code owners and checks are in, as whoever asked, and stops with a reason if it starts to conflict.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "Code owners",
       "what": "A CODEOWNERS file on the target branch names who owns which paths; with the rule on, a change needs one owner's approval for every file it touches.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "CI on your own runners",
       "what": "Pushes and change requests run GitHub Actions workflows from .hoq/workflows (or .github/workflows) on runners the owner adds (Gitea's open-source runner), with needs, matrices and secrets, each job reporting a hoq-ci/ check with a live log.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI artifacts",
       "what": "upload-artifact@v4 and download-artifact@v4 work unmodified on runner 4.1+; artifacts are listed on the run with a download link, count as repository storage, and expire after seven days (up to thirty).",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI cancel and concurrency",
       "what": "People and agents cancel a job or a whole run (a running job stops within seconds); workflow concurrency groups keep one run in progress, cancel waiting ones, and cancel-in-progress when asked.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI manual and scheduled runs",
       "what": "Workflows with workflow_dispatch run by hand from the CI page or over MCP with typed, checked inputs; on: schedule crons run in UTC on the default branch, at most every five minutes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI log secret scan",
       "what": "Keys and tokens a job prints are hidden before the log line is stored, listed with push-protection findings, and the person who started the run is told.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI reusable workflows",
       "what": "Jobs that call a workflow with jobs.<id>.uses run it inside one task, with inputs and outputs; local ones come from the same commit, another repository's must be public.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI last green and flaky",
       "what": "A failed job shows when the same job last passed (same branch, else the default branch), the commits since, and whether it has failed then passed on a re-run of the same commit; agents get the same in ci_failure_summary.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI secrets",
       "what": "Admins set secrets per repository or per owner (for every repository or chosen ones); values are encrypted, masked in logs, and never given to commits pushed with an agent key or to a workflow an agent last changed until a person approves it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "CI for agents",
       "what": "Agents read a commit's CI, a short failure summary with log line numbers and any range of the log, and re-run a job, at most six times per commit, over MCP.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Issues",
       "what": "Opens, discusses, labels, assigns and closes issues kept in the repository itself, closed automatically when a merged change says \"fixes #N\".",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Review kept in the repo",
       "what": "Change requests with their comments and approvals, and releases with their file lists, are written into the repository itself within moments of every change, so git can fetch them and they survive without our database.",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Releases",
       "what": "Names a tag with notes (written for you from the changes since the last release on request) and files to download, as drafts, pre-releases or published releases.",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Protected branches",
       "what": "Refuses force-pushes or deletion on chosen branches, and can require that work only arrives through a change.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Inbox",
       "what": "Collects changes that need you, grouped with their checks and latest discussion, with approve and reply in place.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Daily email",
       "what": "Sends one email a day, at the hour you pick in your own time zone, listing what came into your inbox, with a one-click link to stop it.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Push notifications",
       "what": "Sends the daily summary, and optionally instant alerts for changes, mentions, approvals and failed checks, to your phone or computer as browser notifications.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Watching",
       "what": "Chooses how closely to follow each repository, with an unread count.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Add to my Todo",
       "what": "Puts an open change on your Hoq Todo list; merging finishes the Todo task, closing lets it go, reopening brings it back.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "People and organizations",
     "rows": [
      {
       "name": "Owners and groups",
       "what": "Organizes repositories under a person or an organization, in groups and subgroups up to eight deep (`owner/a/b/repo`), made from the owner or group page, that you can rename, delete when empty, and move repositories between.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "Public repositories",
       "what": "An owner admin makes a repository public: anyone reads it on repo.hoq.app and clones it over HTTPS without signing in, while pushing and commenting still need an account; visitors see people by name and handle, never by email, and not who else has access.",
       "status": "shipped",
       "verified": "2026-10-20"
      },
      {
       "name": "Signed-out links",
       "what": "Someone signed out who opens a link to something that is not public is told it may be private and offered sign-in, which brings them back to that page.",
       "status": "shipped",
       "verified": "2026-10-20"
      },
      {
       "name": "Teams and access",
       "what": "Gives a person (by email) or a team read, write or admin access to a repository or a whole group (reaching every subgroup below it), and renames or deletes teams.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "Agent keys",
       "what": "Marks a key as an AI agent's with its own name, limits it to chosen repositories or whole organizations, can let it create repositories there or organise them (groups, rename, move, archive, trash, never grants or purging), and pauses one or all agents.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "Agent access without cloning",
       "what": "Lets an AI agent list, read, search and compare repositories through an MCP endpoint, with a ready-to-copy setup on the keys page.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Agents organise repositories",
       "what": "Over MCP an agent lists and creates groups and subgroups, renames, moves, describes and archives repositories, and moves them to the trash and back, where its key is allowed to organise.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "Agent changes",
       "what": "Sends an agent's work on protected branches through a change, and shows agent activity with a pause button.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Protected tags",
       "what": "Admins protect tag patterns (v*, release/**): a matching tag is never moved, deleted only by an admin from the web app, and created by agent keys only where allowed.",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Archived repositories",
       "what": "An admin archives a repository to make it read-only: it still clones and reads, while pushes, web edits, new branches, change requests, mirrors and CI are refused until it is unarchived.",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Trash",
       "what": "Keeps deleted repositories to restore, or deletes them forever after typing the name.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Settings",
       "what": "Renames a repository and sets its rules, keys, mirrors and webhooks from one settings page.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Audit log",
       "what": "Records who changed access, protections, keys, mirrors, webhooks and settings, and shows it per repository, per owner and as your own activity.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "AI summaries switch",
       "what": "Keeps AI story summaries off for an owner until one of its admins turns them on; only commit messages are ever sent.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Storage billing",
       "what": "Bills repository storage daily, to the organization for its repositories and to you for yours.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Invite by email",
       "what": "Granting access to an address with no Hoq account emails an invitation that becomes their access when they first sign in, within 30 days.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Views",
     "rows": [
      {
       "name": "Command center",
       "what": "A dense, live, terminal-style view of every repository and its activity, with table columns you can sort, drag into your own order and resize.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Arrange the layout",
       "what": "Drag the borders between columns and rows to resize them and drag a panel by its header to swap it with another, remembered in your browser with one reset.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Owner filter",
       "what": "Narrows the home page to you, one organization or repositories shared with you from a row of chips with counts and a dot for anything waiting on you, remembered in your browser and cycled with o.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Departures",
       "what": "The home page's running list shows every push, only change activity (opened, notes, approvals, merges) or everything — pushes, changes, issues, CI, checks and releases — from one switch in its header.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Clones and fetches",
       "what": "Records every clone and every fetch that brought something down — who, which repository, how much, over ssh or https, shallow or partial — kept 90 days, and shows them as their own Departures view.",
       "status": "shipped",
       "verified": "2026-10-08"
      },
      {
       "name": "Live updates",
       "what": "Pages update the moment something happens — new and changed rows flash — through a live connection whose state the status bar shows, falling back to refreshing every half minute without it.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Console",
       "what": "A full-screen live display of only real data — commits, merges, comments, CI results, issues and releases as they land, exact 72-hour push counts and each push's changes.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Time zone",
       "what": "Shows times and starts each day in the time zone set in your Hoq account, or your device's own.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Light and dark",
       "what": "Follows your device's light or dark mode, and fits a phone.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Work and story",
     "rows": [
      {
       "name": "Work",
       "what": "Shows how much work landed in a period, for everything, one owner or one repository, with a one-line summary, changes against the period before, a day-by-day chart, who did it and the biggest changes.",
       "status": "shipped",
       "verified": "2026-10-05"
      },
      {
       "name": "Story",
       "what": "Tells a period's commits as readable entries grouped by day, with no code.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Story summaries",
       "what": "Writes a short account of a period with Hoq Intelligence from the newest commit messages, up to a limit you choose.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    },
    {
     "area": "Trust and pricing",
     "rows": [
      {
       "name": "Landing page",
       "what": "Tells a signed-out visitor what Repos is, what it costs next to GitHub, and how to start.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Docs",
       "what": "Public guide to cloning, keys, server host keys, change requests from git, push protection, import, webhooks, the checks API and MCP.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Pricing page",
       "what": "Shows the plans, what is charged today, and that agents are never a seat.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Terms, privacy and security pages",
       "what": "Says in plain words what Hoq Repos promises, what it keeps and where, who helps run it, and how to report a problem.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Export everything",
       "what": "Owner admins download a script that mirrors every repository and one file with every change request, note and audit entry.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Account deletion",
       "what": "Closing a Hoq ID account removes the person's repositories, keys and settings and destroys their encryption key.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Plans",
       "what": "Free, Pro and Team plans bought from the owner's Hoq balance, monthly, falling back to Free with nothing owed when a renewal cannot be paid.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Storage allowance",
       "what": "Each plan includes storage, and only what is above it is charged, at $0.05 per GB a month.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Plan and billing settings",
       "what": "Owner admins see the plan, storage used against what is included, this month's Repos charges and the balance, and choose or stop a plan.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Empty-balance warnings",
       "what": "When storage is above the allowance and the balance is empty, admins get 14 days with email and push warnings at 7, 3 and 1 days left, and a banner on the owner page.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "AI credit",
       "what": "Pro, Team and Business include monthly AI credit that pays back story summaries on that owner's repositories before the asker's own balance is used.",
       "status": "shipped",
       "verified": "2026-10-03"
      },
      {
       "name": "Agent key allowance",
       "what": "Free includes 2 agent keys; more are refused with what to do, never taken away, and anyone in an organization on a paid plan has unlimited.",
       "status": "shipped",
       "verified": "2026-10-03"
      }
     ]
    }
   ],
   "shipped": 78,
   "beta": 12,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "GitHub Team",
      "url": "https://github.com/pricing"
     },
     {
      "name": "GitLab Premium",
      "url": "https://about.gitlab.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "$29 a month per organization up to 10 people, then $3 a person",
      "them": [
       "$4 per user a month",
       "$29 per user a month, billed annually"
      ],
      "sources": [
       "https://github.com/pricing",
       "https://about.gitlab.com/pricing/"
      ]
     },
     {
      "label": "AI agents",
      "hoq": "Agent keys are not seats; unlimited on paid plans, 2 on Free",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://github.com/pricing",
       "https://about.gitlab.com/pricing/"
      ]
     },
     {
      "label": "Secret push protection on private repositories",
      "hoq": "Included on every plan",
      "them": [
       "Secret Protection, $19 per active committer a month",
       "Ultimate tier only"
      ],
      "sources": [
       "https://github.com/security/plans",
       "https://docs.gitlab.com/user/application_security/secret_detection/secret_push_protection/"
      ]
     },
     {
      "label": "Hosted CI minutes included",
      "hoq": "None yet; run workflows on your own runners (beta)",
      "them": [
       "3,000 a month",
       "10,000 compute minutes a month"
      ],
      "sources": [
       "https://github.com/pricing",
       "https://about.gitlab.com/pricing/"
      ]
     },
     {
      "label": "Storage included",
      "hoq": "100 GB pooled on Team, then $0.05 per GB a month",
      "them": [
       "2 GB Packages storage on Team",
       "500 GiB per project"
      ],
      "sources": [
       "https://github.com/pricing",
       "https://about.gitlab.com/pricing/"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "One person, 2 GB, 2 agent keys",
      "them": [
       "$0, 2,000 Actions minutes a month",
       "$0, 5 users per private top-level group, 10 GiB, 400 compute minutes"
      ],
      "sources": [
       "https://github.com/pricing",
       "https://about.gitlab.com/pricing/"
      ]
     },
     {
      "label": "Git LFS",
      "hoq": "Planned",
      "them": [
       "Supported",
       "Supported"
      ],
      "sources": [
       "https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-git-large-file-storage",
       "https://docs.gitlab.com/topics/git/lfs/"
      ]
     },
     {
      "label": "MCP for agents",
      "hoq": "Built-in endpoint: read, search, compare, CI, organise",
      "them": [
       "Official GitHub MCP server",
       "GitLab MCP server with repository tools"
      ],
      "sources": [
       "https://github.com/github/github-mcp-server",
       "https://docs.gitlab.com/releases/19/gitlab-19-4-released/"
      ]
     }
    ]
   }
  },
  {
   "key": "rip",
   "name": "Hoq RIP",
   "status": "live",
   "url": "https://rip.hoq.app",
   "line": "Lay art on the platen, set the white, and download the printer's own file.",
   "facts": [
    {
     "label": "Artwork in",
     "value": "PNG, JPEG, TIFF, PSD and PDF. PSD spot channels rip as their own inks."
    },
    {
     "label": "Files out",
     "value": "Epson ESC/P2 .prn, PrintExp .prn for the Epson i3200, and 1-bit TIFF separations."
    },
    {
     "label": "Printers addressed",
     "value": "Epson L8050 (6 channels: CMYK plus two white bays, 1440×720 dpi) and Epson i3200 (9 channels, 480 or 720 × 2400 dpi)."
    },
    {
     "label": "Proven on hardware",
     "value": "PrintExp files have printed on an Epson i3200 with all nine channels firing. The ESC/P2 encoder matches a reference encoder byte for byte; it has not yet printed on the L8050."
    },
    {
     "label": "Where it rips",
     "value": "The browser lays out the job; the rip runs on a server and hands back the files. The same core builds for the browser and the server and must produce identical bytes."
    },
    {
     "label": "Memory",
     "value": "The surface is rendered in bands, so a 60 cm × 3 m sheet fits in about 33 MiB."
    },
    {
     "label": "Where jobs are kept",
     "value": "Each job is a bundle in the owner's Hoq Storage drive, with its versions. Rendered .prn files stay out of the bundle."
    },
    {
     "label": "Spot inks",
     "value": "A white spot fires white directly; a decorative spot such as a Pantone uses its alternate. Missing inks refuse the job."
    },
    {
     "label": "Ink order",
     "value": "Curve, then per-ink limit, then total ink limit. The total limit counts process inks only, so white does not dim the colour."
    }
   ],
   "figures": [
    {
     "value": "16×20 in",
     "label": "platen at 1440 dpi: 23,040 × 28,800 pixels"
    },
    {
     "value": "9",
     "label": "ink channels on the Epson i3200 file"
    },
    {
     "value": "2400 dpi",
     "label": "vertical resolution of every i3200 job"
    },
    {
     "value": "33 MiB",
     "label": "to rip a 60 cm × 3 m DTF sheet, rendered in bands"
    }
   ],
   "features": [
    {
     "area": "Layout",
     "rows": [
      {
       "name": "Place art on the surface",
       "what": "Drop art on the platen, drag, snap to centre and edges, rotate and nudge with the keyboard.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Align, distribute, tile",
       "what": "Lines up several pieces and repeats one across the sheet.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Mirror for transfer",
       "what": "Flips the whole surface for film that is pressed face down.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Platens and presets",
       "what": "Saves the machine's platens and sheet sizes as presets.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "White",
     "rows": [
      {
       "name": "White modes",
       "what": "Underbase, highlight, white only, or the white named in the file.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Choke and caps",
       "what": "Pulls white in from the edge and limits white under black.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Background removal",
       "what": "Drops a white, black or chosen background, optionally only from the edges.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Colour",
     "rows": [
      {
       "name": "Ink levels per job",
       "what": "Turns each ink up or down from its calibrated level for this rip only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Black generation",
       "what": "Sets GCR, where black starts, and rich black, per job.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Extended gamut",
       "what": "Uses orange, green and blue bays directly where a colour is close to them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Spot colour library",
       "what": "Names shop colours once; each printer says how it makes them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recipes",
       "what": "Saves white, screening, ink levels and black settings under a name.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Screening and output",
     "rows": [
      {
       "name": "Screening",
       "what": "Error diffusion or ordered (Bayer) screening, with a fluid limit.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "ESC/P2 .prn",
       "what": "Writes the Epson command stream with variable-size dots.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "PrintExp .prn for i3200",
       "what": "Writes the i3200's nine-plane file.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "TIFF separations",
       "what": "Writes one 1-bit TIFF per channel for any other RIP.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Channel preview",
       "what": "Shows each channel alone, and tints the underbase so you can see it.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Machines",
     "rows": [
      {
       "name": "Ink bays",
       "what": "Records which ink sits in which bay of each machine.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Calibration",
       "what": "Prints charts and stores each machine's calibration.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Export and import a machine",
       "what": "Saves a machine's setup as JSON and loads it on another account.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 19,
   "beta": 1,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "CADlink Digital Factory DTF (Desktop Edition)",
      "url": "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/"
     },
     {
      "name": "Kothari Print Pro",
      "url": "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published",
      "them": [
       "$379.99 lifetime licence at one reseller",
       "$1,000 to $2,400 per printer model at one reseller"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     },
     {
      "label": "Runs on",
      "hoq": "A web browser; the rip runs on a server",
      "them": [
       "Windows 10 or 11, 64-bit; no Mac version",
       "not published"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     },
     {
      "label": "Printers supported",
      "hoq": "Epson L8050 and Epson i3200 files; TIFF separations for others",
      "them": [
       "Many Epson desktop models and DTF brands, sheets to A2, rolls to 17 in",
       "Epson F2000, F2100, F3070; Ricoh"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     },
     {
      "label": "Ink cost per print",
      "hoq": "No",
      "them": [
       "not published",
       "Yes, from your cartridge prices"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     },
     {
      "label": "Same input, same output bytes",
      "hoq": "Yes, checked on every release",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     },
     {
      "label": "PSD spot channels as inks",
      "hoq": "Yes",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     },
     {
      "label": "Licence",
      "hoq": "Account in the browser",
      "them": [
       "Activation code, no dongle",
       "Free 15-day trial"
      ],
      "sources": [
       "https://dtfgears.com/product/digital-factory-v12-direct-to-film-rip-desktop-edition/",
       "https://aaprintsupplyco.com/pages/kothari-rip-software-for-dtg-printer"
      ]
     }
    ]
   }
  },
  {
   "key": "roast",
   "name": "Hoq Roast",
   "status": "live",
   "url": "https://roast.hoq.app",
   "line": "A touchscreen box that drives your roaster and logs every batch to the cloud.",
   "facts": [
    {
     "label": "Roaster supported",
     "value": "Yoshan 1.5 kg, driven over its own network connection. Other makes are planned."
    },
    {
     "label": "Where roasts are kept",
     "value": "Each roastery is one document in the owner's Hoq Storage drive. Session recordings are separate files beside it."
    },
    {
     "label": "Offline",
     "value": "The box runs standalone. It keeps the blend catalog locally and records every roast, then sends it when connected."
    },
    {
     "label": "Remote control",
     "value": "One person holds control at a time. If the browser holding control goes quiet for 15 seconds with the burner lit, the box cuts the fire. STOP needs no control."
    },
    {
     "label": "Safety backstop",
     "value": "With beans in the drum, the box sends them out 15 °C past the blend's drop temperature, or at a 245 °C ceiling if that is lower. Only STOP holds it."
    },
    {
     "label": "Preheat",
     "value": "Warms the drum to a target and holds it, puts the flame out if the drum runs too hot, and stops after 30 minutes at most."
    },
    {
     "label": "Export",
     "value": "A batch's curve as CSV, or the whole batch as JSON. The box can also copy every roast to a USB stick."
    },
    {
     "label": "Labels",
     "value": "Batch and canister labels print on a USB label printer at the roaster, with your logo."
    },
    {
     "label": "Practice mode",
     "value": "The whole console runs on a computer against a simulated roaster, with no gas."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "automatic steps per roast, each on a time, a temperature or first crack"
    },
    {
     "value": "30",
     "label": "saved step sets you can load into any blend"
    },
    {
     "value": "10 min",
     "label": "roaster dropout a roast survives with its curve and marks kept"
    },
    {
     "value": "245 °C",
     "label": "default ceiling at which the box drops the beans by itself"
    },
    {
     "value": "3 min",
     "label": "minimum length before a roast counts as production"
    }
   ],
   "features": [
    {
     "area": "Today",
     "rows": [
      {
       "name": "Today page",
       "what": "Shows the live roast when one is running, the day's roasts with totals per blend, and the latest batches.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Evening report",
       "what": "Emails a summary of the day at the roaster: every roast, totals per blend, canisters and who roasted.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Live roaster status",
       "what": "A dot in the header says whether the roaster's box is connected right now.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Roasteries home",
       "what": "Opens with what is going on, draws the roastery with a roast in the drum (or the one that roasted last) large with its curve and the day's numbers, and shows every other roastery as a tile.",
       "status": "shipped",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Batches",
     "rows": [
      {
       "name": "Every roast is a batch",
       "what": "Each roast becomes a batch with its blend, charge and drop weights, curve, readings and log.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Batch detail",
       "what": "Opens one roast with its curve, milestones, measurements and activity, and lets you rename or measure it.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "False starts",
       "what": "A roast shorter than three minutes is marked as a test and kept out of blend totals.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Compare roasts",
       "what": "Tick any batches to overlay them on one chart, aligned at charge or first crack, by bean temperature or RoR.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Recordings",
       "what": "Lists the raw recordings from the roaster, roasted ones by default, with what was in the drum.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Between-roast recordings",
       "what": "Stores the roaster's recordings of the drum between roasts with the rest, kept out of the overview, the latest roasts and the roasts arriving now.",
       "status": "beta",
       "verified": "2026-10-17"
      },
      {
       "name": "Export",
       "what": "Downloads a batch's curve as CSV, or the whole batch as JSON.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Blends",
     "rows": [
      {
       "name": "Blend pages",
       "what": "Shows each blend across all its roasts: spread per number and every curve overlaid.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Reference roast",
       "what": "Picks one roast per blend as the reference the roaster's screen draws and warns against.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Where each blend cracks",
       "what": "Learns each blend's first crack temperature from where its last ten roasts were heard cracking and sends it to the box.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Shop",
     "rows": [
      {
       "name": "Shop tether",
       "what": "Sends each finished roast to Shop Manager as a batch, with its roast date, weights and Agtron.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Canisters from the roaster",
       "what": "Makes a canister in the shop from the roaster, prints its label and returns the code.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Shop queue",
       "what": "Shows calls on their way to the shop and the ones it refused, so nothing goes missing quietly.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Batch labels",
       "what": "Gives the roaster a batch's label with the shop's number and QR, blend and beans.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Web console",
     "rows": [
      {
       "name": "Remote console",
       "what": "Runs the roaster's own console in the browser through roast.hoq.app, with control held by one person at a time.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Watch without control",
       "what": "Any roastery member can watch a live roast without taking the controls.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Look",
       "what": "Changes the box screen's skin from the web, remembered per browser.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Wall screens",
       "what": "Pairs a wall touchscreen or tablet by a six-digit code to show each roaster's state, roast time, bean temperature, rate of rise and curve live, read-only, also as a tab of a Hoq station.",
       "status": "beta",
       "verified": "2026-10-13"
      },
      {
       "name": "One-tap pairing from a Hoq station",
       "what": "A wall screen shown as a Hoq station tab hands the station a Pair link that opens Roasters with its code already filled in, one press to confirm, and survives signing in on the way.",
       "status": "beta",
       "verified": "2026-10-13"
      }
     ]
    },
    {
     "area": "Settings",
     "rows": [
      {
       "name": "Roastery settings",
       "what": "Sets the roastery's time zone and evening report.",
       "status": "shipped",
       "verified": "2026-10-02"
      },
      {
       "name": "Belongs to",
       "what": "Moves a roastery between you and an organization you administer, keeping its address, recordings and batches.",
       "status": "shipped",
       "verified": "2026-10-04"
      },
      {
       "name": "Push notifications",
       "what": "Pushes roast trouble, milestones, finished-roast summaries and a daily roundup to the phones and computers each person turns on, with the groups they choose.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Roaster gone quiet",
       "what": "Warns when a roaster's box stops sending in the middle of a roast, before the drop.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agent at the roaster",
       "what": "Links a Grimaste agent that is told each charge, crack, drop and any trouble as it happens, as its own roast.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Sign in with Hoq ID",
       "what": "Uses a Hoq account and its organization for access.",
       "status": "shipped",
       "verified": "2026-10-02"
      }
     ]
    },
    {
     "area": "Apps",
     "rows": [
      {
       "name": "Roast for iOS",
       "what": "A phone app that watches and drives the roaster live, built against the published console spec.",
       "status": "beta",
       "verified": "2026-10-02"
      }
     ]
    }
   ],
   "shipped": 22,
   "beta": 8,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Cropster Roast",
      "url": "https://www.cropster.com/packages/"
     },
     {
      "name": "Artisan",
      "url": "https://artisan-scope.org/about/"
     },
     {
      "name": "RoastPATH",
      "url": "https://roastpath.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published",
      "them": [
       "Static monthly price plus a volume price; volume charges start after 250 kg a month",
       "Free software (AGPLv3)",
       "Free, $9, $79 or $129 a month"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://roastpath.com/pricing"
      ]
     },
     {
      "label": "Roasters supported",
      "hoq": "Yoshan 1.5 kg",
      "them": [
       "not published",
       "One-click setup for roasting machines of 80+ brands",
       "Machines from 37 manufacturers per the company"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://dailycoffeenews.com/2023/12/15/mill-city-roasters-launches-roastpath-software-and-sharing-platform"
      ]
     },
     {
      "label": "Drives the burner, fan and drum",
      "hoq": "Yes, from the box, the browser or steps",
      "them": [
       "not published",
       "Yes, sliders, buttons and PID",
       "Roast Replay automation on $79 and $129 plans"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://roastpath.com/pricing"
      ]
     },
     {
      "label": "What you install",
      "hoq": "A dedicated Linux box at the roaster",
      "them": [
       "not published",
       "Windows, macOS, Linux, Raspberry Pi",
       "A desktop roasting app"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://roastpath.com/"
      ]
     },
     {
      "label": "Watch a roast live from elsewhere",
      "hoq": "Yes, any roastery member in the browser",
      "them": [
       "not published",
       "not published",
       "Consultants can watch a client roast live"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://roastpath.com/pricing"
      ]
     },
     {
      "label": "Green and roasted inventory",
      "hoq": "Not in Roast; Hoq Inventory holds stock",
      "them": [
       "Live green inventory from the Core plan",
       "Inventory in the paid artisan.plus service",
       "not published"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://roastpath.com/"
      ]
     },
     {
      "label": "Free tier",
      "hoq": "Not published",
      "them": [
       "Starter includes 10 free roasts a month",
       "The software is free",
       "Hobby plan, 1 roaster, 3 days of history"
      ],
      "sources": [
       "https://www.cropster.com/packages/",
       "https://artisan-scope.org/about/",
       "https://roastpath.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "screen",
   "name": "Hoq Screen",
   "status": "live",
   "url": "https://screen.hoq.app",
   "line": "Design, schedule and play signage on one screen or a whole video wall.",
   "facts": [
    {
     "label": "Players",
     "value": "Any web browser at /play, a Linux kiosk player for Raspberry Pi 5 and mini-PCs (.deb or AppImage), Fire TV through a launcher app, Google Cast TVs, and Hoq Player Pro on Linux mini-PCs."
    },
    {
     "label": "Pairing",
     "value": "The screen shows a six-digit code. You type it into the console and pick what the screen plays."
    },
    {
     "label": "Check-in",
     "value": "Players send a heartbeat every 30 seconds and get pushed changes over a live socket in between."
    },
    {
     "label": "Offline playback",
     "value": "Player Pro downloads the media its config uses to local disk and boots from its last good config, so it keeps playing through outages and reboots. The web player caches images and the last good config."
    },
    {
     "label": "Video walls",
     "value": "A canvas is divided into viewports, one per screen. Screens on a wall can be driven by one player or several."
    },
    {
     "label": "Wall cost check",
     "value": "Every wall, scene and layout is checked against the boxes that play it: decode limits, missing hardware decoders, oversized video and canvas no screen shows."
    },
    {
     "label": "Video re-encoding",
     "value": "A video too large for its box, or in a codec the box cannot decode in hardware, can be re-encoded to the exact size it shows, as HEVC or H.264."
    },
    {
     "label": "Proof of play",
     "value": "Download a CSV of what played, for any period from 1 to 365 days."
    },
    {
     "label": "Roles",
     "value": "Members author content, admins delete and run fleet-wide actions, owners manage the account. People can be limited to named locations."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID: an emailed code or a passkey."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "digits in the pairing code a new screen shows"
    },
    {
     "value": "30 s",
     "label": "between player heartbeats"
    },
    {
     "value": "365",
     "label": "days of proof-of-play history in one CSV export"
    },
    {
     "value": "4",
     "label": "ready-made templates: lobby welcome, clock and weather, headlines ticker, cafe menu board"
    }
   ],
   "features": [
    {
     "area": "Design",
     "rows": [
      {
       "name": "Zone designer",
       "what": "Lay out a fixed-size canvas with zones for video, image, text, clock, weather, web page, data and audio.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Templates",
       "what": "Start from a lobby welcome, clock and weather, headlines ticker or cafe menu board.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "AI layout",
       "what": "Describe a layout in a sentence and get a first draft in the designer.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Scenes and timeline",
       "what": "Arrange clips on a timeline across a canvas, with fades and zooms, and play a scene as content.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Live data zones",
       "what": "Show rows from a CSV, JSON or RSS feed, or a URL, inside a zone.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Scheduling",
     "rows": [
      {
       "name": "Playlists",
       "what": "Order items, set each item's duration and reuse a playlist on many screens.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Schedules",
       "what": "Rules pick content by weekday, time window and date range; the highest priority match wins, else a fallback.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Emergency takeover",
       "what": "One message or image on every screen in the account until you lift it.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Walls",
     "rows": [
      {
       "name": "Viewports",
       "what": "Split one canvas across several screens, each showing its own rectangle.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Wall editor",
       "what": "Place screens on the wall, set bezels and preview what each screen shows.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Ready-made moves",
       "what": "Chase, Cascade, Mirror and Hero + sides built from the wall's own screens.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Cost meter",
       "what": "Flags video a box cannot decode, oversized video and seams that cut through small boxes.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Test pattern",
       "what": "Show a full-wall test pattern to line up screens; it turns itself off after 15 quiet minutes.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Fleet",
     "rows": [
      {
       "name": "Pair by code",
       "what": "A new screen shows six digits; type them in to claim it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Screenshots",
       "what": "See what a screen is showing right now from the console.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Remote commands",
       "what": "Reboot, restart, reload or screenshot a player.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Locations and rooms",
       "what": "Group screens by location and room, and limit people to the locations they look after.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Proof-of-play CSV",
       "what": "Export what played for up to 365 days.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Content API",
       "what": "Swap the content of one box on a canvas with an API key (scope screen:api).",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Players",
     "rows": [
      {
       "name": "Web player",
       "what": "Any browser at /play; a service worker keeps the last good config and up to 150 images.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Linux kiosk player",
       "what": "Electron kiosk for Raspberry Pi 5 and mini-PCs that reloads itself after a crash or hang.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Fire TV",
       "what": "A launcher app installs the player on Fire TV.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Google Cast",
       "what": "Cast receiver page for Cast TVs, set up from a box on the same network.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Player Pro",
       "what": "Native Linux player that composites several screens as one GPU wall and plays from local disk.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 24,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Yodeck",
      "url": "https://www.yodeck.com/pricing/"
     },
     {
      "name": "ScreenCloud",
      "url": "https://screencloud.com/pricing"
     },
     {
      "name": "OptiSigns",
      "url": "https://www.optisigns.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price per screen per month",
      "hoq": "Not published yet",
      "them": [
       "$8 (Basic); $12 Premium; $16 Enterprise",
       "$20 (Core, billed annually)",
       "$10 monthly or $9 billed yearly (Standard)"
      ],
      "sources": [
       "https://www.yodeck.com/pricing/",
       "https://screencloud.com/pricing",
       "https://www.optisigns.com/pricing"
      ]
     },
     {
      "label": "Player hardware",
      "hoq": "Any browser, Raspberry Pi 5 and Linux mini-PCs, Fire TV, Google Cast TVs, Player Pro on Linux",
      "them": [
       "Own Raspberry Pi player, web, Android, Fire OS, ChromeOS, Windows, Samsung Tizen, LG webOS, BrightSign",
       "Own OS player, Fire OS, Android/Google TV, ChromeOS, Windows, Samsung Tizen, LG webOS Signage, BrightSign, iPadOS",
       "Own players, Fire TV, Android, Windows, Linux, Raspberry Pi, ChromeOS, BrightSign, LG, Samsung, Roku, Apple TV, macOS"
      ],
      "sources": [
       "https://www.yodeck.com/docs/user-manual/yodeck-registration-code/",
       "https://screencloud.com/supported-hardware",
       "https://support.optisigns.com/hc/en-us/articles/360021855653-What-hardware-and-devices-are-supported"
      ]
     },
     {
      "label": "Offline playback",
      "hoq": "Player Pro plays cached media from disk through outages and reboots; web player keeps images and the last config",
      "them": [
       "Media runs at least 30 days offline; web pages and live streams do not",
       "Caches images, video and documents; no offline on iOS/iPadOS",
       "Offline playback on all plans"
      ],
      "sources": [
       "https://www.yodeck.com/docs/user-manual/does-yodeck-work-offline/",
       "https://help.screencloud.com/en/articles/10120871-screen-showing-offline-how-to-troubleshoot-connectivity-issues",
       "https://www.optisigns.com/pricing"
      ]
     },
     {
      "label": "Video wall",
      "hoq": "Built in: one canvas split into viewports, one or many players; Player Pro drives several screens from one box",
      "them": [
       "Video wall support, one player per screen",
       "Windows players with several outputs, or a separate wall controller",
       "Add-on at $25.00/mo per wall; needs Pro (3 screens) or ProMax (4) player"
      ],
      "sources": [
       "https://www.yodeck.com/pricing/",
       "https://help.screencloud.com/en/articles/10121614-how-to-set-up-a-video-wall-with-screencloud",
       "https://support.optisigns.com/hc/en-us/articles/33382537925267-Making-a-Video-Wall-with-OptiSigns-Video-Wall-App"
      ]
     },
     {
      "label": "Pairing a screen",
      "hoq": "6-digit code on the screen",
      "them": [
       "8- or 9-digit registration code",
       "6-character code",
       "Pair code on the screen"
      ],
      "sources": [
       "https://www.yodeck.com/docs/user-manual/yodeck-registration-code/",
       "https://help.screencloud.com/en/articles/10097048-how-do-i-add-set-up-or-delete-a-screen-in-screencloud",
       "https://support.optisigns.com/hc/en-us/articles/360016374813-Set-up-add-a-screen"
      ]
     },
     {
      "label": "Proof of play",
      "hoq": "CSV export, up to 365 days",
      "them": [
       "Playback reports, Basic and up",
       "Proof-of-play logs on Pro",
       "Proof of play report on higher plans"
      ],
      "sources": [
       "https://www.yodeck.com/pricing/",
       "https://help.screencloud.com/en/articles/10116158-upgrade-your-screencloud-subscription-to-gain-new-features-and-apps-available-on-the-pro-plan",
       "https://www.optisigns.com/pricing"
      ]
     },
     {
      "label": "Emergency alerts",
      "hoq": "Manual takeover of every screen; no CAP feed",
      "them": [
       "Emergency alerts plus CAP",
       "Emergency Alerts app with CAP sources, Pro and Enterprise",
       "Emergency message and CAP via webhook, Pro Plus and up"
      ],
      "sources": [
       "https://www.yodeck.com/pricing/",
       "https://screencloud.com/apps/emergency-alerts",
       "https://support.optisigns.com/hc/en-us/articles/360052513253-How-to-use-Emergency-Message-Alert-App"
      ]
     },
     {
      "label": "Public API",
      "hoq": "Content swap per box with a scoped key",
      "them": [
       "REST API, Premium and Enterprise",
       "GraphQL API",
       "OptiSync from Pro Plus; GraphQL on Enterprise"
      ],
      "sources": [
       "https://www.yodeck.com/features/yodeck-api/",
       "https://screencloud.com/pricing",
       "https://www.optisigns.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "scrum",
   "name": "Hoq Scrum",
   "status": "beta",
   "url": "https://scrum.hoq.app",
   "line": "A sprint board whose whole history is a file in your drive.",
   "facts": [
    {
     "label": "Where your board lives",
     "value": "An append-only journal kept as a .scrum document in the owner's Hoq Storage. Cards, sprints and charts are rebuilt from it."
    },
    {
     "label": "Sharing",
     "value": "A board owned by a Hoq organization is reachable by every member with their own sign-in."
    },
    {
     "label": "One sprint at a time",
     "value": "A team has one active sprint; starting a second is refused."
    },
    {
     "label": "Closing a sprint",
     "value": "The close page asks what happens to every unfinished card; a close that leaves one undecided is refused."
    },
    {
     "label": "Charts",
     "value": "Burndown and velocity, drawn on the server."
    },
    {
     "label": "Without scripts",
     "value": "Drag and drop is an addition; every move also has a button."
    }
   ],
   "figures": [
    {
     "value": "1",
     "label": "active sprint per team at a time"
    },
    {
     "value": "2",
     "label": "charts per team: burndown and velocity"
    },
    {
     "value": "0",
     "label": "scrum records kept on our servers; the history is in your drive"
    }
   ],
   "features": [
    {
     "area": "Board",
     "rows": [
      {
       "name": "Teams",
       "what": "Make a team with its own board.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Cards",
       "what": "Add numbered cards to the backlog.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Columns",
       "what": "Move cards between the board's columns by dragging or by button.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Estimates",
       "what": "Put points on a card.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Assignees",
       "what": "Name who is on a card.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "People",
       "what": "Add people to a team's list of names.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Sprints",
     "rows": [
      {
       "name": "Plan and start",
       "what": "Create a sprint, add cards to it and start it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Close with a decision per card",
       "what": "The close page asks what happens to each unfinished card.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Burndown",
       "what": "A burndown chart for the sprint, with a table of the same numbers.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Velocity",
       "what": "Velocity across past sprints with the average.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Your data",
     "rows": [
      {
       "name": "History in your drive",
       "what": "Every change is appended to a journal in a .scrum document in your Hoq Storage.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organization boards",
       "what": "A board owned by an organization is open to all its members.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 12,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Jira Standard",
      "url": "https://www.atlassian.com/software/jira/pricing"
     },
     {
      "name": "Linear Basic",
      "url": "https://linear.app/pricing"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "$8.48 per user per month, monthly billing",
       "$10 per user per month, billed yearly"
      ],
      "sources": [
       "https://www.atlassian.com/software/jira/pricing",
       "https://linear.app/pricing"
      ]
     },
     {
      "label": "Free plan",
      "hoq": "No public price yet",
      "them": [
       "Up to 10 users, 2 GB",
       "Unlimited members, 2 teams, 250 issues"
      ],
      "sources": [
       "https://www.atlassian.com/software/jira/pricing",
       "https://linear.app/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "None",
      "them": [
       "Jira REST API",
       "API, webhooks and MCP on every plan"
      ],
      "sources": [
       "https://developer.atlassian.com/cloud/jira/platform/rest/v3/",
       "https://linear.app/pricing"
      ]
     },
     {
      "label": "Export",
      "hoq": "The journal is a .scrum document in your drive; no CSV",
      "them": [
       "not published",
       "Import and export on every plan"
      ],
      "sources": [
       "https://www.atlassian.com/software/jira/pricing",
       "https://linear.app/pricing"
      ]
     },
     {
      "label": "Sprint charts",
      "hoq": "Burndown and velocity",
      "them": [
       "Yes",
       "Not stated on pricing page"
      ],
      "sources": [
       "https://www.atlassian.com/software/jira/pricing",
       "https://linear.app/pricing"
      ]
     },
     {
      "label": "Integrations",
      "hoq": "None",
      "them": [
       "Atlassian Marketplace",
       "GitHub, agents and MCP"
      ],
      "sources": [
       "https://www.atlassian.com/software/jira/pricing",
       "https://linear.app/pricing"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage",
      "them": [
       "Vendor cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://www.atlassian.com/software/jira/pricing",
       "https://linear.app/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "sell",
   "name": "Hoq Sell",
   "status": "beta",
   "url": "https://sell.hoq.app",
   "line": "Photograph a thing once: studio shots and an honest listing per marketplace.",
   "facts": [
    {
     "label": "Marketplaces",
     "value": "Copy kits for Poshmark, Mercari, Facebook Marketplace, Grailed and Depop; eBay account connection."
    },
    {
     "label": "No bots",
     "value": "Copy kits open each marketplace's own new-listing page. Nothing acts on your account."
    },
    {
     "label": "Brand check",
     "value": "A brand appears only after you confirm it on the item; changing it un-ticks the check."
    },
    {
     "label": "Revisions",
     "value": "Every version of every listing kept, marked as AI-written or person-edited."
    },
    {
     "label": "Photos",
     "value": "Kept in your Hoq Storage drive under Sell/Photos, in your order."
    },
    {
     "label": "Studio shots",
     "value": "Made by Hoq Studio and billed to your Hoq account; a free clean cut-out mode keeps your pixels."
    },
    {
     "label": "eBay keys",
     "value": "Sealed per seller and renewed on their own; disconnect any time."
    }
   ],
   "figures": [
    {
     "value": "5",
     "label": "marketplaces with copy kits"
    },
    {
     "value": "0",
     "label": "bots run on your marketplace accounts"
    },
    {
     "value": "Every",
     "label": "listing version kept, AI or person"
    }
   ],
   "features": [
    {
     "area": "Items",
     "rows": [
      {
       "name": "Items with facts",
       "what": "Keeps each thing you sell with what it is, brand, model, size, color, material, measurements, era, flaws, what is included, barcode, condition, price and quantity.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Brand you have checked",
       "what": "Keeps a brand out of every listing until you tick that you checked it on the item itself; changing the brand un-ticks it.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Photos in your drive",
       "what": "Keeps every photo in your Hoq Storage drive under Sell/Photos, shrunk in the browser before upload, in the order you choose.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    },
    {
     "area": "Studio shots",
     "rows": [
      {
       "name": "Studio shots by Hoq Studio",
       "what": "Turns one of your photos into a studio shot through Hoq Studio, billed to your Hoq account, and makes it the cover.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Free clean cut-out",
       "what": "Offers Studio's free mode that keeps your own pixels and only cleans up the background and framing.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Your Studio look",
       "what": "Uses one of your Hoq Studio brands for every shot, or a plain white marketplace square when none is chosen.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    },
    {
     "area": "Listings",
     "rows": [
      {
       "name": "Listings written for each marketplace",
       "what": "Writes a title, description, tags and item specifics for each marketplace you choose, from your facts and the cover photo.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Honest by rule",
       "what": "Takes out any brand that is not confirmed, and any material, size, model or era nobody stated, and says what it took out.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Questions worth answering",
       "what": "Lists the facts that would make the listing better, starting with confirming a brand the writer recognised.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Marketplace limits",
       "what": "Counts characters against each marketplace's title, description and tag limits and refuses a save that breaks them.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Every revision kept",
       "what": "Keeps every version of every listing, marked as written by AI or edited by a person, and says when the facts changed since.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Copy kits",
       "what": "Copies a ready listing for Poshmark, Mercari, Facebook Marketplace, Grailed and Depop and opens their new-listing page; no bots on your account.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    },
    {
     "area": "eBay",
     "rows": [
      {
       "name": "Connect your eBay account",
       "what": "Sends you to eBay to sign in and agree, then keeps that account's keys sealed and renews them on their own; disconnect any time.",
       "status": "beta",
       "verified": "2026-10-15"
      },
      {
       "name": "Account deletion notices",
       "what": "Answers eBay's endpoint check and stores every account-deletion notice, then forgets that person's eBay connection once eBay's signature checks out.",
       "status": "beta",
       "verified": "2026-10-12"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 14,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Vendoo",
      "url": "https://vendoo.co/pricing"
     },
     {
      "name": "List Perfectly",
      "url": "https://listperfectly.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Price per month",
      "hoq": "not published",
      "them": [
       "$14.99 Starter ($12.49 billed yearly)",
       "$29 Simple"
      ],
      "sources": [
       "https://vendoo.co/pricing",
       "https://listperfectly.com/pricing/"
      ]
     },
     {
      "label": "Marketplaces",
      "hoq": "5 copy kits plus eBay connection",
      "them": [
       "10+ marketplaces",
       "9 named, incl. eBay, Etsy, Poshmark, Vinted (Lite)"
      ],
      "sources": [
       "https://vendoo.co/pricing",
       "https://listperfectly.com/pricing/"
      ]
     },
     {
      "label": "Posts listings for you",
      "hoq": "No; you paste a ready listing. eBay publishing planned",
      "them": [
       "Yes, crossposting",
       "Yes, unlimited crosslisting"
      ],
      "sources": [
       "https://vendoo.co/pricing",
       "https://listperfectly.com/pricing/"
      ]
     },
     {
      "label": "Delist when sold",
      "hoq": "No",
      "them": [
       "Sale detection and auto-delist on Starter",
       "Sales detection, except Vinted"
      ],
      "sources": [
       "https://vendoo.co/pricing",
       "https://listperfectly.com/pricing/"
      ]
     },
     {
      "label": "AI listings",
      "hoq": "Per marketplace, with unconfirmed facts removed",
      "them": [
       "not published",
       "25 a month on Simple"
      ],
      "sources": [
       "https://vendoo.co/pricing",
       "https://listperfectly.com/pricing/"
      ]
     },
     {
      "label": "Background removal",
      "hoq": "Free clean cut-out; studio shots billed to your Hoq account",
      "them": [
       "not published",
       "25 a month on Simple"
      ],
      "sources": [
       "https://vendoo.co/pricing",
       "https://listperfectly.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "sensor",
   "name": "Hoq Sensor",
   "status": "live",
   "url": "https://sensor.hoq.app",
   "line": "Keep every reading from your fridges, rooms and meters, with alerts when one drifts.",
   "facts": [
    {
     "label": "Where readings come from",
     "value": "Any device or service that can send an HTTP POST or a webhook. A Hoq Devices box can also forward nearby Bluetooth sensors."
    },
    {
     "label": "Keyless webhook",
     "value": "POST JSON or a form to /hook/{token}. Common names like temperature and humidity map to the feed's fields; add a timestamp and temperature_unit when needed."
    },
    {
     "label": "Batches",
     "value": "Up to 5,000 readings per post. A batch is idempotent on its reference, so retries never double-count."
    },
    {
     "label": "Rules",
     "value": "Above, below or silent, each held for a number of seconds, up to 30 days. Up to 32 rules per feed."
    },
    {
     "label": "Alerts",
     "value": "Email and a webhook per rule. Each alert is sent once when it opens and once when it clears."
    },
    {
     "label": "History",
     "value": "Live 60 seconds, or 1 hour, 6 hours, 24 hours, 7 days and 30 days, drawn with min-max bands."
    },
    {
     "label": "Retention",
     "value": "Raw readings 90 days by default, adjustable from forever to 3,650 days. Hourly summaries are kept after the raw data goes."
    },
    {
     "label": "Units",
     "value": "Celsius, Fahrenheit and Kelvin. A field can store one unit and show another."
    },
    {
     "label": "Organizations",
     "value": "An organization can own feeds. Members view; admins and owners change rules and settings."
    }
   ],
   "figures": [
    {
     "value": "5,000",
     "label": "readings accepted in one batch"
    },
    {
     "value": "90 days",
     "label": "of raw readings kept by default, up to 3,650"
    },
    {
     "value": "32",
     "label": "alert rules per feed"
    },
    {
     "value": "32",
     "label": "fields per feed"
    }
   ],
   "features": [
    {
     "area": "Feeds",
     "rows": [
      {
       "name": "Presets",
       "what": "Start a feed as a temperature probe, temperature and humidity, power meter, motion sensor or event log.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Pause and close",
       "what": "A paused feed refuses posts with 409 so the sender drops them instead of retrying.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Sources",
       "what": "The first post from a key or webhook makes a source; revoking it stops it for good.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Move between owners",
       "what": "Move a feed with its rules and alerts from you to an organization.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Ingest",
     "rows": [
      {
       "name": "Keyed API",
       "what": "POST /v1/feeds/{key}/readings with a sensor:post key.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Webhooks",
       "what": "Keyless /hook/{token} for Home Assistant and similar senders.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Bluetooth via Hoq Devices",
       "what": "A box with the sensor role forwards motion sensors and Bluetooth advertisements.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Alerts",
     "rows": [
      {
       "name": "Threshold rules",
       "what": "Above or below a value for a set time.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Silence rules",
       "what": "Alert when a feed stops reporting for a set time.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Email and webhook",
       "what": "Notices to the owner by email and to a webhook per rule.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Alert log",
       "what": "Every alert with its peak, last value, start and end.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Viewing",
     "rows": [
      {
       "name": "Status cards",
       "what": "Dashboard cards with latest values and ok, alert, quiet or no-data status.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Charts",
       "what": "Live and 1 hour to 30 days, with bands, rule lines and alert spans; hide a series from the legend.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Motion marks",
       "what": "Mark a pose and ask how far a thing has tilted or moved since, in degrees and plain words.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 14,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "SensorPush",
      "url": "https://www.sensorpush.com/products/p/ht1"
     },
     {
      "name": "Monnit iMonnit",
      "url": "https://www.monnit.com/products/software/imonnit-sensor-management-software/"
     }
    ],
    "rows": [
     {
      "label": "Sensor hardware",
      "hoq": "Bring your own; anything that can send a webhook",
      "them": [
       "HT1 sensor $54.95",
       "ALTA temperature sensor $116.00"
      ],
      "sources": [
       "https://www.sensorpush.com/products/p/ht1",
       "https://www.monnit.com/products/sensors/temperature/standard-temperature/MNS2-9-W2-TS-ST/"
      ]
     },
     {
      "label": "Gateway for remote monitoring",
      "hoq": "None for webhook senders; a Linux box with Hoq Devices for Bluetooth",
      "them": [
       "G1 WiFi Gateway $99.95",
       "ALTA Ethernet Gateway $242.00"
      ],
      "sources": [
       "https://www.sensorpush.com/products/p/g1-gateway",
       "https://www.monnit.com/products/gateways/ethernet-gateways/egw4/MNG2-9-EGW-CCE/"
      ]
     },
     {
      "label": "Cloud price",
      "hoq": "Not published yet",
      "them": [
       "No monthly fee",
       "Basic free (1 network, 1 user); Premiere from $45.00/year per location"
      ],
      "sources": [
       "https://www.sensorpush.com/products/p/g1-gateway",
       "https://www.monnit.com/products/software/imonnit-sensor-management-software/"
      ]
     },
     {
      "label": "History kept",
      "hoq": "Raw 90 days by default, up to 10 years; hourly summaries after",
      "them": [
       "Indefinitely in app and cloud (support FAQ)",
       "Basic 45 days; Premiere 1 year"
      ],
      "sources": [
       "https://support.sensorpush.com/hc/en-us/articles/360051554154",
       "https://www.monnit.com/software-comparison/"
      ]
     },
     {
      "label": "Alert channels",
      "hoq": "Email and webhook",
      "them": [
       "Email and phone notifications",
       "Email and push; SMS and voice with paid credits"
      ],
      "sources": [
       "https://www.sensorpush.com/products/p/g1-gateway",
       "https://www.monnit.com/products/software/imonnit-notification-credits/"
      ]
     },
     {
      "label": "Reading interval",
      "hoq": "Set by your device",
      "them": [
       "Every 1 minute",
       "Basic 2 hours, Premiere 10 minutes, 1 minute with extra credits"
      ],
      "sources": [
       "https://www.sensorpush.com/products/p/ht1",
       "https://www.monnit.com/software-comparison/"
      ]
     },
     {
      "label": "Export and API",
      "hoq": "JSON API; no CSV export",
      "them": [
       "CSV export and Gateway Cloud API",
       "CSV or PDF reports and webhooks"
      ],
      "sources": [
       "https://support.sensorpush.com/hc/en-us/articles/6825994502679",
       "https://support.monnit.com/article/344-reports-and-historical-sensor-data"
      ]
     }
    ]
   }
  },
  {
   "key": "service",
   "name": "Hoq Service",
   "status": "beta",
   "url": "https://service.hoq.app",
   "line": "Customers, their equipment and its due dates, jobs, quotes and invoices.",
   "facts": [
    {
     "label": "Where your data lives",
     "value": "One Service file per company in the owner's Hoq Storage."
    },
    {
     "label": "Trades",
     "value": "Backflow testing, plumbing, irrigation, electrical, heating and cooling, generators, and other."
    },
    {
     "label": "Backflow assemblies",
     "value": "The USC Foundation approved list is fetched weekly; each unit says whether it is approved in its size."
    },
    {
     "label": "Water district reports",
     "value": "Each test makes a report for the address's district, sent by email in one tap or automatically, with filing tracked."
    },
    {
     "label": "Offline",
     "value": "The tech's day, units, records and photos work without signal and send when it returns."
    },
    {
     "label": "Quotes",
     "value": "One price or up to three options; the customer approves by typing their name; a deposit can be asked for."
    },
    {
     "label": "Card payments",
     "value": "Taken on the business's own payment account through Hoq Funds. Service keeps no card connection of its own."
    },
    {
     "label": "Equipment tags",
     "value": "QR tags printed as CR80 cards on your own printer through Hoq Print, with a public page per unit."
    },
    {
     "label": "Accounting",
     "value": "Every invoice, payment, fee, refund and deposit is posted to double-entry books in the company file, and can be sent to Hoq Books."
    },
    {
     "label": "Moving in and out",
     "value": "Import customers, addresses and equipment from a spreadsheet by its own headings; export a zip of CSVs and the books."
    }
   ],
   "figures": [
    {
     "value": "7",
     "label": "trades with their own equipment types"
    },
    {
     "value": "3",
     "label": "options a quote can offer"
    },
    {
     "value": "100",
     "label": "tags printed in one batch"
    }
   ],
   "features": [
    {
     "area": "Getting started",
     "rows": [
      {
       "name": "A company in one file",
       "what": "Naming your company makes one Service file in your own Hoq Storage, kept warm so customers never wait.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Getting set up",
       "what": "Today lists the steps a new company needs (name and phone, trades, sales tax, people, prices, first customer) until they are done or hidden.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Trades",
       "what": "Pick the trades you work in; their equipment comes first and their usual items join your price list without a price.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Moving in",
       "what": "Import customers, addresses and equipment from a spreadsheet by its own headings, see what would happen first, and re-run it safely.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Moving out",
       "what": "Download everything as a zip: a units sheet that imports straight back, every record as CSV, and the books.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    },
    {
     "area": "Customers, places and equipment",
     "rows": [
      {
       "name": "Customers and addresses",
       "what": "Add a customer with their address in one form; a place keeps who owns, rents or manages it over time.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Equipment with its history",
       "what": "Each unit has the fields its type needs, every test, service and repair, and when it is next due.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Approved backflow assemblies",
       "what": "The USC Foundation's approved list is fetched every week; adding a unit suggests makes and models from it, and each unit says whether it is approved in its size.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Service tags",
       "what": "QR tags on equipment open a public page with the unit, its next date and recent results, and optionally visit photos.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Guessing protection on tags",
       "what": "An address that asks for ten tag codes that don't exist within ten minutes, or forty in a day, is told to wait before any tag page opens. New tags get eight-character codes with no look-alike letters; older twelve-character tags keep working.",
       "status": "shipped",
       "verified": "2026-10-12"
      },
      {
       "name": "Print tags",
       "what": "Prints generic QR tags as CR80 cards on your own printer through Hoq Print, to bring to the field and attach by scanning: a top band in your own words and color, QR and code, and an empty test-date punch grid (rainbow months and years); reprints any tag from the Tags list, or tick several (up to 100) and print them together. See the tag before printing: a live preview in Settings › Tag printing and a thumbnail in each print window.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Tag packs",
       "what": "Hoq staff make packs of generic unclaimed tags with a claim card each (or straight into one company); a company adds a pack under Tags › Add a pack with its claim code, and an unclaimed tag scans to a plain \"not set up yet\" page.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Windows and pages",
       "what": "Short actions open in a small centered window; adding or editing a customer, property, unit, job or invoice opens as its own page with a back link (the browser Back button works too).",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Hoq Print link",
       "what": "Connects the company to Hoq Print with a key that can only send print jobs, kept sealed; an admin picks the card printer and can disconnect.",
       "status": "beta",
       "verified": "2026-10-12"
      },
      {
       "name": "Warranty registration",
       "what": "Units keep their registration number, and Today lists installs not yet registered.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Customer page",
       "what": "Each customer has a page with no sign-in showing their equipment, quotes and bills, and a form to ask for a visit.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Due reminders",
       "what": "Customers are emailed before equipment comes due and once if it goes overdue, with a link to pick a time and one-click stop.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    },
    {
     "area": "Jobs and the day",
     "rows": [
      {
       "name": "Leads",
       "what": "Website form requests and phone calls become leads; a booking request from the customer page becomes a job without retyping.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Jobs and the board",
       "what": "Book visits by dragging onto a person and a time; clashes and missing certifications are flagged.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "The tech's day on the phone",
       "what": "My day, On my way, the visit's units, records and photos, all working without signal and sent when it returns.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Photos and signatures",
       "what": "Photos on any record and a finger signature on a visit, kept in your own drive.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Certifications and crews",
       "what": "Each person's licences with expiry dates; crews book as one; regulated forms refuse a lapsed tester or gauge.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Permits and inspections",
       "what": "A job's permits, booked and failed inspections and reinspections; the job cannot be finished until the final passes, and the fee can be billed.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Reports to water districts",
       "what": "Each passed or failed test makes a report for the address's district; email it in one tap (or automatically), mark it filed on their website or by post, record their answer, and bill their fee.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Visit emails",
       "what": "The customer hears when a visit is booked or moved, the afternoon before, when the tech is on the way, and gets a review request after; each one is a switch.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Add to my Todo",
       "what": "Put a job on your Hoq Todo list; finishing or cancelling the job closes the task.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    },
    {
     "area": "Money",
     "rows": [
      {
       "name": "Quotes",
       "what": "One price or up to three options, emailed to the customer, approved by typing their name on the page.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Deposits",
       "what": "A quote can ask for a deposit; approving sends a deposit invoice due now, and the final invoice takes off what was paid.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Invoices and payments",
       "what": "Invoices emailed with a Pay button, checks and cash recorded, card payments on the business's own payment account in Hoq Funds (Service keeps no Stripe connection of its own), refunds back through the account that took them.",
       "status": "beta",
       "verified": "2026-10-29"
      },
      {
       "name": "Service plans",
       "what": "A price per term covering units; renewals are drafted a month ahead and covered visits bill $0.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Books",
       "what": "Every invoice, payment, fee, refund and deposit is posted to double-entry books in the company file, and can be sent on to Hoq Books.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Grimaste agents",
       "what": "Connect a Grimaste agent from Settings and choose, area by area, whether it may look, ask first or change; asks wait for your approval and its changes are labelled as its own.",
       "status": "beta",
       "verified": "2026-10-08"
      },
      {
       "name": "Agent tools (MCP)",
       "what": "Every Service action is an MCP tool at /mcp/service, held to the same per-agent rules.",
       "status": "beta",
       "verified": "2026-10-08"
      }
     ]
    }
   ],
   "shipped": 1,
   "beta": 32,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Jobber Core",
      "url": "https://www.getjobber.com/pricing/"
     },
     {
      "name": "Housecall Pro Basic",
      "url": "https://www.housecallpro.com/pricing/"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "No public price yet",
      "them": [
       "$29 per month billed annually, $49 month to month, 1 user",
       "$59 per month billed annually, $79 monthly, 1 user"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Extra users",
      "hoq": "No public price yet",
      "them": [
       "$29 per month each",
       "$35 each on Max"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Card processing",
      "hoq": "On your own payment account through Hoq Funds",
      "them": [
       "2.9% + 30¢ cards, 1% ACH",
       "Built in, from 2.59%"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Offline on phone",
      "hoq": "Tech's day, records and photos work without signal and sync later",
      "them": [
       "Notes offline; wider offline access claimed",
       "Offline viewing on all plans"
      ],
      "sources": [
       "https://productupdates.getjobber.com/13924-create-and-save-text-notes-while-offline",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API and MCP on every company",
      "them": [
       "GraphQL API for approved developers",
       "Max plan only"
      ],
      "sources": [
       "https://developer.getjobber.com/docs/custom_integrations/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Export",
      "hoq": "Zip with CSVs, a re-importable units sheet and the books",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Backflow test reports to water districts",
      "hoq": "Built in",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Accounting sync",
      "hoq": "Own double-entry books, posts to Hoq Books",
      "them": [
       "QuickBooks and Xero sync on Core",
       "Not stated on pricing page"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     },
     {
      "label": "Integrations marketplace",
      "hoq": "Hoq apps only",
      "them": [
       "100+ apps plus Zapier",
       "Zapier on Max"
      ],
      "sources": [
       "https://www.getjobber.com/pricing/",
       "https://www.housecallpro.com/pricing/"
      ]
     }
    ]
   }
  },
  {
   "key": "sheets",
   "name": "Hoq Sheets",
   "status": "live",
   "url": "https://sheets.hoq.app",
   "line": "Excel spreadsheets in your browser, saved as versions in your own drive.",
   "facts": [
    {
     "label": "Formats it opens",
     "value": "xls, xlsx, xlsm, xlt, xltx, xltm, ods, ots, csv"
    },
    {
     "label": "Where files live",
     "value": "In your own Hoq Storage drive as normal files, so Hoq Storage, Documents, Sheets and Slides all see the same file."
    },
    {
     "label": "Saving",
     "value": "Ctrl+S saves straight to your drive. Each save is a new version of the same file."
    },
    {
     "label": "History kept",
     "value": "The 10 most recent versions of a file are kept. Replaced versions older than 90 days are removed, unless a retention date holds them."
    },
    {
     "label": "Editor",
     "value": "Built on the open-source ONLYOFFICE Docs editor (AGPLv3), credited in the editor's About box."
    },
    {
     "label": "PDFs",
     "value": "PDFs show up in the list and open in Hoq PDF, which owns them."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID. Your token is held by the page, never in a cookie shared across Hoq apps."
    },
    {
     "label": "Offline",
     "value": "No. The editor needs a connection to open and save."
    }
   ],
   "figures": [
    {
     "value": "9",
     "label": "file types it opens and edits"
    },
    {
     "value": "4",
     "label": "built-in starting points, blank included"
    },
    {
     "value": "10",
     "label": "past versions kept per file"
    },
    {
     "value": "90 days",
     "label": "before a replaced version is removed"
    }
   ],
   "features": [
    {
     "area": "Start and find",
     "rows": [
      {
       "name": "Starting points",
       "what": "4 built-in starting points: Blank spreadsheet, Budget, Invoice and Task tracker.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recent and search",
       "what": "The start screen lists your recent files and filters them as you type.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rename and trash",
       "what": "Rename a file or move it to the trash from the list; trash is recoverable in Hoq Storage.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organization drives",
       "what": "Switch between your own drive and the drives of organizations you belong to.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Editing",
     "rows": [
      {
       "name": "New files are XLSX",
       "what": "New spreadsheets are saved as .xlsx, the Microsoft Office format.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Edit on a phone",
       "what": "The editor opens in edit mode on mobile browsers, not view-only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Download and print",
       "what": "Download or print any file you can open, from the editor's File menu.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "AI tab",
       "what": "Chat, summarize, translate and grammar actions in the editor, billed to your Hoq account with no key to paste.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Saving and history",
     "rows": [
      {
       "name": "Save on Ctrl+S",
       "what": "Every Ctrl+S writes the file back to your drive at once, not only when you close it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Every save is a version",
       "what": "Each save becomes a new version of the same file, so your drive holds one file with its history.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Version History",
       "what": "Open an earlier version from the editor's Version History panel.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 10,
   "beta": 1,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Google Sheets (Workspace Business Starter)",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Microsoft Excel (Microsoft 365 Business Basic)",
      "url": "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month, cheapest business plan",
      "hoq": "No price published on sheets.hoq.app",
      "them": [
       "$7.00 (Business Starter, as listed; a 50% off offer runs to Feb 15, 2027)",
       "$7.00, paid yearly (Business Basic)"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Storage included",
      "hoq": "Uses your Hoq Storage drive",
      "them": [
       "30 GB pooled per user",
       "1 TB per user"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Desktop app",
      "hoq": "No, browser only",
      "them": [
       "No desktop app listed on the plan",
       "No, web and mobile apps only on Business Basic"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Works offline",
      "hoq": "No",
      "them": [
       "Yes, in Chrome or Edge with offline access turned on",
       "not published"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6388102",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Excel files (.xlsx, .xlsm)",
      "hoq": "Stored and saved in their own format",
      "them": [
       "Edited in Office Compatibility Mode or converted to Sheets",
       "Native format"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6055139",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "OpenDocument (.ods)",
      "hoq": "Opens and edits",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6055139",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Spreadsheet size limit",
      "hoq": "Not published",
      "them": [
       "20 million cells or 100 MB",
       "not published"
      ],
      "sources": [
       "https://support.google.com/drive/answer/37603",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     }
    ]
   }
  },
  {
   "key": "shop",
   "name": "Hoq Shop",
   "status": "live",
   "url": "https://shop.hoq.app",
   "line": "A store of your own, kept as one file in your drive.",
   "facts": [
    {
     "label": "Where the store lives",
     "value": "One document in your own Hoq Storage drive holding catalog, stock, customers, orders, theme and pages."
    },
    {
     "label": "Who holds the money",
     "value": "Your own Stripe or Square account, connected in Hoq Funds. Card details never touch Hoq Shop."
    },
    {
     "label": "Payment methods",
     "value": "Cards on a Stripe-hosted page from your own Stripe account, or on Square's payment page. Gift cards and store credit from Hoq Funds can pay all or part of an order."
    },
    {
     "label": "Counter payments",
     "value": "Stripe card readers paired to a till, or Tap to Pay on an Android phone running the Hoq Till app, each taken as a Funds payment."
    },
    {
     "label": "Moving in",
     "value": "Imports past orders from Shopify or WooCommerce, and copies products, photos, categories and pages from a WooCommerce store."
    },
    {
     "label": "Tax",
     "value": "Your own rates, or Stripe Tax, with tax-included prices supported."
    },
    {
     "label": "Languages",
     "value": "English, Spanish, French, German, Italian, Portuguese and Dutch per storefront."
    },
    {
     "label": "Backups",
     "value": "Nightly backup to your drive, two weeks kept, a restore tested every week."
    },
    {
     "label": "Cookies",
     "value": "Only the cart, the Hoq Pay sign-in and a form-protection token. No advertising or tracking cookies."
    },
    {
     "label": "If credit runs out",
     "value": "The store is paused, shoppers see a closed page, nothing is lost, and it reopens when you top up."
    }
   ],
   "figures": [
    {
     "value": "7",
     "label": "theme presets, Hoq Default plus six designed themes"
    },
    {
     "value": "7",
     "label": "storefront languages"
    },
    {
     "value": "3",
     "label": "options per product, with a variant for each mix"
    },
    {
     "value": "30 days",
     "label": "a closed store's final copy is kept"
    },
    {
     "value": "2 weeks",
     "label": "of nightly backups kept in your drive"
    }
   ],
   "features": [
    {
     "area": "Your store",
     "rows": [
      {
       "name": "A store in one file",
       "what": "Keeps the whole store — catalog, stock, customers, orders, theme and pages — in one file in the owner's own Hoq drive.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Set up in five steps",
       "what": "Walks a new owner through name, address, payments, shipping and going live.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Your stores",
       "what": "Opens every store a person owns or works in from one home page.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Staff by email",
       "what": "Lets the owner add people by email as managers or staff, with staff unable to change settings or money.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Your own domain",
       "what": "Serves the storefront on the owner's own domain with its own certificate.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Export and close",
       "what": "Hands the owner the whole store as one archive, and closes a store with a final copy kept for 30 days.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Nightly backups",
       "what": "Backs up every store each night and tests a restore every week.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Changes with undo",
       "what": "Records each edit as a change the owner can undo, and lets agents' and staff's changes wait as drafts to apply or discard.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Work in a draft",
       "what": "Lets the owner switch on a draft so storefront and catalog edits wait, preview the store with them, then put them live together or discard them.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Catalog",
     "rows": [
      {
       "name": "Products with options",
       "what": "Sells products with up to three options (size, color, …) and a variant for each mix, each with its own price, SKU and stock.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Collections",
       "what": "Groups products by hand or by rules such as tag, type or price.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Digital downloads",
       "what": "Sells files that the shopper downloads after paying.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Specs and sizes",
       "what": "Keeps specifications, weights and dimensions on each product.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Import and export",
       "what": "Reads and writes the catalog as a spreadsheet, and brings over past orders from Shopify or WooCommerce.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Reviews",
       "what": "Collects product reviews from shoppers, shown once the owner approves them.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Gift cards",
       "what": "Sells gift cards that pay for later orders, alone or with a card.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Gift cards in Hoq Funds",
       "what": "Links the store to its business's Hoq Funds so every café's till and the website share one set of gift cards, moving the store's own cards across with their codes and balances.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Gift card holds",
       "what": "Holds a gift card's part when payment starts and takes it when the order is placed, so two tills can never spend the same money.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Gift cards when Funds is down",
       "what": "Places a paid order even if Hoq Funds cannot be reached, marks it, and takes the card's part once Funds answers.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Refunds by payment",
       "what": "Splits a refund across what paid for the order: the card or cash first and the gift card last, unless the store says otherwise.",
       "status": "beta",
       "verified": "2026-10-24"
      },
      {
       "name": "Stock from Hoq Commerce",
       "what": "Can leave stock to Hoq Commerce, which then sets what the store may sell.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Stock from Hoq Inventory",
       "what": "Can leave stock to Hoq Inventory, which reads the store's orders and sets what the store may sell without undoing sales it has not seen yet.",
       "status": "beta",
       "verified": "2026-10-27"
      },
      {
       "name": "Your own fields",
       "what": "Adds fields of the owner's own to products and variants, shown on product pages and to search engines.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Records",
       "what": "Keeps lists of the owner's own things (makers, materials, …) that products can point to.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Tags and filters",
       "what": "Groups tags and lets shoppers filter listings by price, stock, options, tags and fields.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Move in from WooCommerce",
       "what": "Copies products, photos, attributes, categories, pages and old addresses from a WooCommerce store, safe to repeat.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Selling",
     "rows": [
      {
       "name": "Cart and checkout",
       "what": "Takes a shopper from cart through contact, shipping and payment, with prices and stock checked again before paying.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Card payments through Hoq Funds",
       "what": "Charges cards on the business's own Stripe or Square account connected in Hoq Funds, with no Hoq fee; Hoq never holds the money.",
       "status": "beta",
       "verified": "2026-11-02"
      },
      {
       "name": "Sign in with Hoq at checkout",
       "what": "Lets a shopper fill in their details from their Hoq account in one tap, store by store, never their card.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Discount codes",
       "what": "Gives money or percent off, free shipping, buy X get Y, and batches of one-time codes, limited to chosen products.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Shipping rates",
       "what": "Prices shipping by zone, flat, by weight or by order amount, with free shipping over an amount.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Tax",
       "what": "Works out tax from the owner's own rates, or with Stripe Tax.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Payment links",
       "what": "Makes a link that sells one thing without the storefront.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Abandoned carts",
       "what": "Emails a reminder with a link that brings the cart back.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Subscriptions",
       "what": "Sells products on a schedule with a discount, renews them by card and emails the shopper before and after.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Forms on store pages",
       "what": "Puts a Hoq Forms form on any store page, drawn in the store's theme.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Orders",
     "rows": [
      {
       "name": "Orders",
       "what": "Lists orders with search, filters and a spreadsheet export.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Fulfilment by line",
       "what": "Marks lines shipped as they go, with tracking and a packing slip.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Refunds by line",
       "what": "Refunds chosen lines or shipping, returning the money through Stripe.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Order emails",
       "what": "Sends order, shipping and refund emails from orders@hoq.app in the store's name.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Webhooks",
       "what": "Sends signed notices of orders, products and stock to the owner's other systems, retried until they land.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Orders to Hoq Commerce",
       "what": "Sends orders to Hoq Commerce for packing and shipping, and takes the tracking back.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Storefront",
     "rows": [
      {
       "name": "Seven theme presets",
       "what": "Starts the store's look from Hoq Default or six designed themes, each with its own colors, hosted font pair and home page.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Looks that hold up on any catalog",
       "what": "Keeps the menu to one row with the rest under More, stops card titles at two lines, shows photos whole without borders, sends sharp copies to phones and puts a placeholder where a product has no photo.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Card, button, nav and badge styles",
       "what": "Applies the theme's card (flat, bordered, shadow), button (solid, outline, pill), menu (inline, centered, stacked) and badge choices to the storefront.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "One-row phone header",
       "what": "Fits the menu, store name, search and cart into one row on a phone.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Tidy up after moving in",
       "what": "Joins products that differ only by size into one product with sizes to choose, shortens long names, builds the menu from the collections, shapes tiles to the photos, lays out the home page and hides test pages, all as one draft to preview, put live or undo.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Product page that sells",
       "what": "Shows choices as buttons with sold-out ones struck through, a quantity stepper, a stock line, shipping, returns and sizing from the store's own pages, and related products.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Cart beside its summary",
       "what": "Lists the cart beside the totals and code field, with quantities that save themselves and a phone layout that fits.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Sections on every page",
       "what": "Lays out the product and collection pages from sections you add, reorder and set, like the home page, keeping the part that sells.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Shop by category",
       "what": "Shows collections as picture tiles on the home page or a collection's own sub-collections on its page.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Custom CSS",
       "what": "Takes CSS of your own for the storefront, kept to the storefront and refused with a reason if it would load or run something.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Free design",
       "what": "Lets a storefront be any page you or AI can write — layout, markup, styling, motion — while prices, stock, the cart and checkout stay the shop's own.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Free design with AI",
       "what": "Writes a whole storefront from a few sentences using your real catalog, or changes the one you have, and checks it before it is saved.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Free design sandbox",
       "what": "Runs a free design where it cannot reach the network, cookies or anything outside, so it can only show the catalog and add to the bag.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Back to Hoq Default",
       "what": "Puts a storefront with a free design back on its sections and theme in one click.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Storefront check for free designs",
       "what": "Walks a free design like a shopper, from the home page to an open checkout, and fails it if a product cannot be found or bought.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Theme editor with live preview",
       "what": "Changes colors, fonts and home page sections and shows the storefront as it will look.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Design with AI",
       "what": "Turns a sentence into a theme through Hoq Intelligence, checked like a hand edit.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Pages and policies",
       "what": "Keeps the store's own pages, with refund, privacy and shipping policies written to start from.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Search engines",
       "what": "Gives each product its own address, search data and sitemap.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Shopper accounts",
       "what": "Lets shoppers see their orders and ask for their data or its removal.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Page blocks",
       "what": "Builds pages from the same blocks as the home page.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Menus",
       "what": "Edits header menus with dropdowns, a phone menu and footer columns; with no menu set, shows top-level collections and a footer of policy and contact pages only.",
       "status": "beta",
       "verified": "2026-10-30"
      },
      {
       "name": "Blog",
       "what": "Publishes articles on the storefront.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Addresses and redirects",
       "what": "Keeps old addresses working with redirects and lists pages shoppers could not find.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Menu, till and order-ahead",
     "rows": [
      {
       "name": "Made-to-order menu",
       "what": "Builds items whose sizes each come with their own recipe (a 16 oz latte has 2 shots), from a shared library of choices that cost only what they add, with a size's own prices and choices a size does not offer.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Sold out now",
       "what": "Marks an item or a choice sold out from the console, and brings everything back at close.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Bring in a WordPress menu",
       "what": "Copies a menu from our earlier WordPress menu plugin into the store, safe to repeat.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "The till",
       "what": "Rings up at the counter on a tablet: tap size, milk and syrups in any order, send to the bar, then cash, a card reader or pay later, with staff PINs.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Card readers at the till",
       "what": "Takes cards on a Stripe reader with its tip screen, through the store's own Stripe account: pick a reader already on the account or pair one by its code, one per till, and a tap the till never came back for still settles its order.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Tap to Pay on a phone",
       "what": "Takes cards on an Android phone running the Hoq Till app instead of a reader: the tip is chosen on the till, then the customer taps their card on the phone.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Orders to the kitchen",
       "what": "Sends each order to Hoq Commerce the moment it is rung up, so the drink shows on the Hoq KDS screen with only what changed (Oat Milk), and the sale turns paid when the money is taken.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Say it",
       "what": "Turns words said or typed at the till into priced lines, asking when something is missing and never inventing.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Order ahead",
       "what": "Lets shoppers build drinks on their phones, choose a pickup time and pay, with no address asked.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Storefronts, languages and currencies",
     "rows": [
      {
       "name": "Several storefronts",
       "what": "Runs more than one storefront from one store, each with its own domain, theme, menus, pages and contact address.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "What each storefront sells",
       "what": "Limits a storefront to chosen collections or tags, everywhere from listings and search to checkout.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Checkout rules per storefront",
       "what": "Sets the countries a storefront ships to, a smallest order, account-only checkout and an order note.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Languages",
       "what": "Shows a storefront in English, Spanish, French, German, Italian, Portuguese or Dutch, remembering the shopper's choice.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Translations",
       "what": "Translates products, collections, pages, articles, menu links and home page wording, with AI first drafts that wait to be saved.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Price lists",
       "what": "Keeps prices in another currency, filled from the store's prices by a rate and rounding, and charges exactly those.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Shipping in each currency",
       "what": "Prices shipping rates in each storefront's currency.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Prices with tax included",
       "what": "Shows tax-included prices and takes the tax out of them, at checkout and with Stripe Tax.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Pages and menus of its own",
       "what": "Lets a storefront keep its own pages and menus, drawn there in place of the store's.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Copy a storefront",
       "what": "Makes a draft copy of a storefront, with its own copy of the theme, pages and menus, to change without touching the original.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Preview links",
       "what": "Shows a storefront before it is live, or with the owner's draft, to anyone holding a link that expires and can be revoked; the preview follows every link on the page.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Test checkout",
       "what": "Lets anyone in a preview go through checkout to a receipt, with nothing charged, held or kept.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Ready to launch",
       "what": "Checks a storefront before it goes live — something to sell, shipping that reaches its countries in its currency, working menu links and home page blocks, payments — and lists what is worth a look.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Swap and retire",
       "what": "Puts one storefront in another's place in one step, moving its web addresses, carts and shoppers, with an exact undo; the old one sends shoppers on and is cleared away after 30 days.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Booked swaps",
       "what": "Books a storefront to take another's place at a time in the store's clock and go back at another, checked again when the time comes, with an email if it cannot happen.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Storefront API",
       "what": "Lets the owner's own website or app read a storefront and start carts with a public key, checking out on Hoq's pages.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Agents in the store",
       "what": "Gives an agent the store's tools with a level per area, where \"ask first\" makes a draft for the owner.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    },
    {
     "area": "Running it",
     "rows": [
      {
       "name": "Health checks",
       "what": "Checks each store and the service, and warns when something changes.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Help and status pages",
       "what": "Publishes help topics and a public status page.",
       "status": "beta",
       "verified": "2026-10-23"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 94,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Shopify Basic",
      "url": "https://www.shopify.com/pricing"
     },
     {
      "name": "Square Online (Square Free and Plus plans)",
      "url": "https://squareup.com/us/en/online-store/plans"
     }
    ],
    "rows": [
     {
      "label": "Price per month",
      "hoq": "First store free; each further store about 9 Hoq credits a month, by the hour",
      "them": [
       "$39 billed monthly, $29 billed yearly",
       "$0 on Square Free; $49 per location on Square Plus"
      ],
      "sources": [
       "https://www.shopify.com/pricing",
       "https://squareup.com/us/en/online-store/plans"
      ]
     },
     {
      "label": "Online card rate",
      "hoq": "Stripe's or Square's own rate on your own account",
      "them": [
       "2.9% + 30¢",
       "3.3% + 30¢ on Free; 2.9% + 30¢ on Plus"
      ],
      "sources": [
       "https://www.shopify.com/pricing",
       "https://squareup.com/us/en/payments/our-fees"
      ]
     },
     {
      "label": "Platform fee per order",
      "hoq": "None on orders paid through Hoq Funds",
      "them": [
       "2% when you use a third-party payment provider",
       "not published"
      ],
      "sources": [
       "https://www.shopify.com/pricing",
       "https://squareup.com/us/en/pricing"
      ]
     },
     {
      "label": "Staff accounts",
      "hoq": "Staff by email as managers or staff",
      "them": [
       "Additional staff accounts not included on Basic",
       "not published"
      ],
      "sources": [
       "https://www.shopify.com/pricing",
       "https://squareup.com/us/en/online-store/plans"
      ]
     },
     {
      "label": "Sales channels beyond the store",
      "hoq": "Hoq Commerce channels; no social or marketplace selling in Shop itself",
      "them": [
       "Social, marketplaces and AI chats included",
       "Selling on search and social on Free"
      ],
      "sources": [
       "https://www.shopify.com/pricing",
       "https://squareup.com/us/en/online-store/plans"
      ]
     },
     {
      "label": "Where your store data lives",
      "hoq": "One file in your own drive, exportable as one archive",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.shopify.com/pricing",
       "https://squareup.com/us/en/online-store/plans"
      ]
     }
    ]
   }
  },
  {
   "key": "sign",
   "name": "Hoq Sign",
   "status": "beta",
   "url": "https://sign.hoq.app",
   "line": "Send a PDF for signature, get back one sealed copy with its audit trail.",
   "facts": [
    {
     "label": "Signers",
     "value": "No account needed. The link in their email is their access to that one document."
    },
    {
     "label": "Routing",
     "value": "Sequential (one after another) or parallel (everyone at once)."
    },
    {
     "label": "Field types",
     "value": "Signature, initials, date, text, name and checkbox."
    },
    {
     "label": "Signing methods",
     "value": "Draw, type, or upload a picture of a signature, on desktop or phone."
    },
    {
     "label": "Finished document",
     "value": "Field values written onto the pages, a certificate of completion page added, then a PAdES seal over the whole file."
    },
    {
     "label": "Certificate of completion",
     "value": "Lists each signer, when they signed, their IP address, their verification level, the document's SHA-256 hash and the audit chain head."
    },
    {
     "label": "Audit trail",
     "value": "Append-only and SHA-256 hash-chained per envelope, so a changed entry breaks the chain."
    },
    {
     "label": "Extra signer check",
     "value": "A request can require a one-time code sent to the signer's email. The code expires in 10 minutes."
    },
    {
     "label": "Reminders and expiry",
     "value": "Reminders go to the person whose turn it is every 72 hours, at most three. Requests close at their expiry date."
    },
    {
     "label": "Signer options",
     "value": "Signers can decline, and can download the document from their signing page."
    },
    {
     "label": "Email",
     "value": "Hoq Sign sends the invitation, your-turn, reminder, declined and signed-copy emails itself."
    }
   ],
   "figures": [
    {
     "value": "6",
     "label": "field types: signature, initials, date, text, name, checkbox"
    },
    {
     "value": "72 hours",
     "label": "between reminders, at most 3 per signer"
    },
    {
     "value": "10 minutes",
     "label": "life of a one-time signer code"
    },
    {
     "value": "2",
     "label": "routing modes: in order or all at once"
    }
   ],
   "features": [
    {
     "area": "Sending",
     "rows": [
      {
       "name": "Request signatures from Hoq PDF",
       "what": "Add people, set an order, place fields for each person and send.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Send by API",
       "what": "Create an envelope with a PDF, fields and recipients, and send it in one call.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Field detection",
       "what": "An API call suggests where the fields go on an uploaded PDF.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Personal message",
       "what": "Add a note that goes out with the invitation.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Tracking",
     "rows": [
      {
       "name": "Status",
       "what": "See who has opened, signed or declined each request.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Remind",
       "what": "Send a reminder now to whoever is waiting.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Void",
       "what": "Cancel a request that is still out.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Automatic reminders and expiry",
       "what": "A schedule reminds and expires requests without you.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Signing",
     "rows": [
      {
       "name": "Guided signing page",
       "what": "Walks the signer from field to field, with a bottom sheet on phones.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Consent step",
       "what": "Signers agree to sign electronically before they can sign.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Email code check",
       "what": "Optional one-time code before signing.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Decline",
       "what": "A signer can refuse, and the sender is told.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Proof",
     "rows": [
      {
       "name": "PAdES seal",
       "what": "A digital seal over the finished PDF that shows if anything changes afterwards.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Certificate of completion",
       "what": "A page added to the PDF with who signed, when, from where and the document hash.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hash-chained audit log",
       "what": "Every event is linked to the one before it so tampering shows.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Seal your own signature",
       "what": "Seal a PDF you signed yourself, in one step, with the same certificate and seal.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Signed copy saved to your drive",
       "what": "When sent from Hoq PDF, the sealed PDF is saved next to the original.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 17,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Docusign eSignature Standard",
      "url": "https://ecom.docusign.com/plans-and-pricing/esignature"
     },
     {
      "name": "Dropbox Sign Standard",
      "url": "https://sign.dropbox.com/products/dropbox-sign/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "not published",
      "them": [
       "$30, annual commitment",
       "$25 monthly, or $17.50 billed yearly"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign/pricing"
      ]
     },
     {
      "label": "Sending limit",
      "hoq": "None set in the product",
      "them": [
       "100 envelopes per user per year",
       "Unlimited signature requests"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign/pricing"
      ]
     },
     {
      "label": "Templates",
      "hoq": "Not in the app yet",
      "them": [
       "Yes",
       "15"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign/pricing"
      ]
     },
     {
      "label": "API access",
      "hoq": "Included",
      "them": [
       "Business Pro ($45) and up",
       "Separate API plans, from 50 requests a month"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign-api/pricing"
      ]
     },
     {
      "label": "Bulk send",
      "hoq": "No",
      "them": [
       "Business Pro and up",
       "not published"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign/pricing"
      ]
     },
     {
      "label": "Signer verification",
      "hoq": "One-time email code",
      "them": [
       "SMS and ID verification as paid add-ons",
       "SMS authentication"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign/pricing"
      ]
     },
     {
      "label": "Signed copy saved to your own drive",
      "hoq": "Yes, when sent from Hoq PDF",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://ecom.docusign.com/plans-and-pricing/esignature",
       "https://sign.dropbox.com/products/dropbox-sign/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "slides",
   "name": "Hoq Slides",
   "status": "live",
   "url": "https://slides.hoq.app",
   "line": "PowerPoint decks in your browser, saved as versions in your own drive.",
   "facts": [
    {
     "label": "Formats it opens",
     "value": "ppt, pptx, pptm, pot, potx, potm, odp, otp"
    },
    {
     "label": "Where files live",
     "value": "In your own Hoq Storage drive as normal files, so Hoq Storage, Documents, Sheets and Slides all see the same file."
    },
    {
     "label": "Saving",
     "value": "Ctrl+S saves straight to your drive. Each save is a new version of the same file."
    },
    {
     "label": "History kept",
     "value": "The 10 most recent versions of a file are kept. Replaced versions older than 90 days are removed, unless a retention date holds them."
    },
    {
     "label": "Editor",
     "value": "Built on the open-source ONLYOFFICE Docs editor (AGPLv3), credited in the editor's About box."
    },
    {
     "label": "PDFs",
     "value": "PDFs show up in the list and open in Hoq PDF, which owns them."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID. Your token is held by the page, never in a cookie shared across Hoq apps."
    },
    {
     "label": "Offline",
     "value": "No. The editor needs a connection to open and save."
    }
   ],
   "figures": [
    {
     "value": "8",
     "label": "file types it opens and edits"
    },
    {
     "value": "3",
     "label": "built-in starting points, blank included"
    },
    {
     "value": "10",
     "label": "past versions kept per file"
    },
    {
     "value": "90 days",
     "label": "before a replaced version is removed"
    }
   ],
   "features": [
    {
     "area": "Start and find",
     "rows": [
      {
       "name": "Starting points",
       "what": "3 built-in starting points: Blank presentation, Pitch deck and Team update.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recent and search",
       "what": "The start screen lists your recent files and filters them as you type.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Rename and trash",
       "what": "Rename a file or move it to the trash from the list; trash is recoverable in Hoq Storage.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Organization drives",
       "what": "Switch between your own drive and the drives of organizations you belong to.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Editing",
     "rows": [
      {
       "name": "New files are PPTX",
       "what": "New presentations are saved as .pptx, the Microsoft Office format.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Edit on a phone",
       "what": "The editor opens in edit mode on mobile browsers, not view-only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Download and print",
       "what": "Download or print any file you can open, from the editor's File menu.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "AI tab",
       "what": "Chat, summarize, translate and grammar actions in the editor, billed to your Hoq account with no key to paste.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Saving and history",
     "rows": [
      {
       "name": "Save on Ctrl+S",
       "what": "Every Ctrl+S writes the file back to your drive at once, not only when you close it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Every save is a version",
       "what": "Each save becomes a new version of the same file, so your drive holds one file with its history.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Version History",
       "what": "Open an earlier version from the editor's Version History panel.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 10,
   "beta": 1,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Google Slides (Workspace Business Starter)",
      "url": "https://workspace.google.com/pricing"
     },
     {
      "name": "Microsoft PowerPoint (Microsoft 365 Business Basic)",
      "url": "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month, cheapest business plan",
      "hoq": "No price published on slides.hoq.app",
      "them": [
       "$7.00 (Business Starter, as listed; a 50% off offer runs to Feb 15, 2027)",
       "$7.00, paid yearly (Business Basic)"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Storage included",
      "hoq": "Uses your Hoq Storage drive",
      "them": [
       "30 GB pooled per user",
       "1 TB per user"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Desktop app",
      "hoq": "No, browser only",
      "them": [
       "No desktop app listed on the plan",
       "No, web and mobile apps only on Business Basic"
      ],
      "sources": [
       "https://workspace.google.com/pricing",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Works offline",
      "hoq": "No",
      "them": [
       "Yes, in Chrome or Edge with offline access turned on",
       "not published"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6388102",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "PowerPoint files (.pptx)",
      "hoq": "Stored and saved as .pptx, no conversion",
      "them": [
       "Edited in Office Compatibility Mode or converted to Slides",
       "Native format"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6055139",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "OpenDocument (.odp)",
      "hoq": "Opens and edits",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://support.google.com/docs/answer/6055139",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     },
     {
      "label": "Presentation size limit",
      "hoq": "Not published",
      "them": [
       "100 MB for converted presentations",
       "not published"
      ],
      "sources": [
       "https://support.google.com/drive/answer/37603",
       "https://www.microsoft.com/en-us/microsoft-365/business/compare-all-microsoft-365-business-products"
      ]
     }
    ]
   }
  },
  {
   "key": "studio",
   "name": "Hoq Studio",
   "status": "live",
   "url": "https://studio.hoq.app",
   "line": "Desk photo in, marketplace-ready listing image out, matched to your shipped pictures.",
   "facts": [
    {
     "label": "Marketplace presets",
     "value": "Amazon main image: 2000×2000, pure white, at least 1000 px a side. Etsy: 2000×2000. Your own shop: 1600×1600."
    },
    {
     "label": "Two modes",
     "value": "AI studio shot then finish, or finish only on your real pixels."
    },
    {
     "label": "Model",
     "value": "Google Gemini 3.1 Flash Image by default, as an edit of your photo."
    },
    {
     "label": "Whose key pays",
     "value": "Each account renders through its own Hoq Intelligence key, so spend shows against the person who rendered."
    },
    {
     "label": "Cutout",
     "value": "U-2-Net segmentation, then trim, scale and composite at the canvas size."
    },
    {
     "label": "Quality check",
     "value": "Each file reports canvas, border purity, product width and whether it passes for the chosen marketplace."
    },
    {
     "label": "Colour",
     "value": "Embedded ICC profiles and EXIF orientation are honoured before anything is measured."
    },
    {
     "label": "Where files go",
     "value": "Sources and results are saved to your Hoq Storage."
    }
   ],
   "figures": [
    {
     "value": "2000×2000",
     "label": "Amazon main image preset, pure white"
    },
    {
     "value": "40 MB",
     "label": "largest source photo"
    },
    {
     "value": "10,000 px",
     "label": "largest canvas side"
    }
   ],
   "features": [
    {
     "area": "Standard",
     "rows": [
      {
       "name": "Reference measuring",
       "what": "Reads canvas, backdrop and product width from a picture you shipped.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Brands",
       "what": "Keeps a brand's standard, marketplace and file naming once.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Marketplace rules",
       "what": "Checks output against Amazon, Etsy or your own shop.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Render",
     "rows": [
      {
       "name": "AI studio shot",
       "what": "Redraws a desk photo as catalogue work, product from your photo only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Real pixels",
       "what": "Cuts out and places your own photo with no model.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Batch tray",
       "what": "Drop several photos and run them together.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "HEIC from iPhone",
       "what": "Takes iPhone HEIC photos.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Review",
     "rows": [
      {
       "name": "Every attempt kept",
       "what": "Lists past attempts after a reload.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Compare",
       "what": "Wipe or side by side against the original.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Redraw with a note",
       "what": "Reruns the model with a short instruction.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Re-frame free",
       "what": "Reruns the finisher on the stored render with a new spec.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 11,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Photoroom",
      "url": "https://www.photoroom.com/pricing"
     },
     {
      "name": "Pebblely",
      "url": "https://pebblely.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Billed per render from your Hoq credits; rate not published",
      "them": [
       "Pro, Max, Ultra billed yearly; amounts not shown on the pricing page",
       "$9, $19 or $39 a month"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Images per month",
      "hoq": "No monthly cap published",
      "them": [
       "1,000, 3,000 or 10,000 exports",
       "30, 200 or 500"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Matches a picture you already shipped",
      "hoq": "Yes, measured from a reference",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Pure white 255 backdrop check",
      "hoq": "Yes, per marketplace",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Keep your real pixels",
      "hoq": "Yes, finish-only mode",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Batch",
      "hoq": "Yes",
      "them": [
       "Batch processing",
       "Bulk generation on Basic and Pro"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Video and 4K",
      "hoq": "No",
      "them": [
       "Video on Max; 4K images and HD video on Ultra",
       "not published"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     },
     {
      "label": "Shop integration",
      "hoq": "No",
      "them": [
       "Shopify on Max and Ultra",
       "not published"
      ],
      "sources": [
       "https://www.photoroom.com/pricing",
       "https://pebblely.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "suite",
   "name": "Hoq Suite",
   "status": "dev",
   "url": "https://suite.hoq.app",
   "line": "Operations and admin console for Hoq staff. Not sold to customers.",
   "facts": [
    {
     "label": "Access",
     "value": "Granted by hand; there is no sign-up."
    }
   ],
   "figures": [],
   "features": [],
   "shipped": 0,
   "beta": 0,
   "competitors": null
  },
  {
   "key": "support",
   "name": "Hoq Support",
   "status": "live",
   "url": "https://support.hoq.app",
   "line": "Every customer who writes to you, in one inbox your whole team answers.",
   "facts": [
    {
     "label": "Where the help desk lives",
     "value": "One .support file per company in its owner's Hoq Storage drive. Attachments go to the owner's drive."
    },
    {
     "label": "How mail arrives",
     "value": "Each inbox has its own forwarding address on hoq.app. Forward your existing mailbox to it; changing the address keeps old conversations working."
    },
    {
     "label": "Sender check",
     "value": "A reply joins a conversation only if the sender is the customer and passes DMARC by our receiving servers' Authentication-Results. Otherwise it is held."
    },
    {
     "label": "Threading",
     "value": "By a reply token in the address and by Message-ID and References headers."
    },
    {
     "label": "Attachments",
     "value": "Up to 25 MB per attachment."
    },
    {
     "label": "Replies",
     "value": "Sent from the Hoq mail cluster as \"Your company via Hoq Support\", retried on failure. A reply that waited more than two days unsent is not sent late."
    },
    {
     "label": "Team alerts",
     "value": "Phone or browser push first, then email if nobody has seen it after 15 minutes."
    },
    {
     "label": "Retention",
     "value": "Keep files 7 to 3,650 days and closed conversations 3 to 120 months, or forever."
    },
    {
     "label": "Sensitive data",
     "value": "Remove a card number or password from a message; the message stays, marked removed."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID single sign-on. Teammates are invited by the email they sign in with, as teammate or admin."
    }
   ],
   "figures": [
    {
     "value": "25 MB",
     "label": "largest attachment taken from an incoming email"
    },
    {
     "value": "3",
     "label": "automatic emails at most per outside address per day"
    },
    {
     "value": "7 days",
     "label": "life of the emailed link to a customer's past conversations"
    },
    {
     "value": "4",
     "label": "permission levels per area for each AI agent: off, read, ask, change"
    },
    {
     "value": "15 min",
     "label": "before an unseen push alert is sent again by email"
    }
   ],
   "features": [
    {
     "area": "Conversations",
     "rows": [
      {
       "name": "Views",
       "what": "Mine, unassigned, open, pending, snoozed, closed and all, with search.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Assign and round robin",
       "what": "Give a conversation to a teammate, or let an inbox hand new ones out in turn.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Status, snooze, priority, tags",
       "what": "Open, pending or closed; snooze until a time in your company's timezone; low to urgent priority; tags with counts.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Notes",
       "what": "Notes only the team sees, beside the customer's messages.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Merge and split",
       "what": "Merge duplicate conversations or move some messages into a new one.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Who else is here",
       "what": "See which teammate is reading or typing in the same conversation.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Log a phone call",
       "what": "Write down what a customer said by phone or in person as their own message.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Start a conversation",
       "what": "Write to a customer first, as the team.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Email",
     "rows": [
      {
       "name": "Held messages",
       "what": "Mail that cannot be verified as the customer waits for a teammate to accept or discard it.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Spam and blocked senders",
       "what": "Mark spam and block an address or a whole domain.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Delivery state",
       "what": "See whether a reply went out, and try a bounced or failed one again.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Quiet thank-yous",
       "what": "A one-line thanks from the customer does not reopen a closed conversation.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Your customers",
     "rows": [
      {
       "name": "Contact form",
       "what": "An optional web form per inbox, with a bot trap, a timed stamp and per-address limits.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Conversation page",
       "what": "Customers read and answer their conversation on the web and rate the answer.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Past conversations link",
       "what": "Customers ask for an emailed link to their past conversations; it works for 7 days.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Customer records",
       "what": "Customers with name, email, phone, company and notes; merge duplicates.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Team",
     "rows": [
      {
       "name": "Saved replies",
       "what": "Saved replies with shortcuts and eight variables such as customer name and conversation number.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Signatures",
       "what": "A signature per teammate and per inbox.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Push alerts",
       "what": "Phone and browser notifications for conversations given to you.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Agents and API",
     "rows": [
      {
       "name": "Agent permissions",
       "what": "Set each AI agent per area to off, read, ask or change; approve or turn down what it asks.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "JSON API and MCP",
       "what": "55 actions over one JSON door, also offered as MCP tools.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 21,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Zendesk Support Team",
      "url": "https://www.zendesk.com/pricing/"
     },
     {
      "name": "Help Scout Standard",
      "url": "https://www.helpscout.com/pricing/"
     },
     {
      "name": "Front Starter",
      "url": "https://front.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Cheapest paid tier",
      "hoq": "Not published",
      "them": [
       "$19/agent/mo yearly, $25 monthly",
       "$25/user/mo",
       "$25/seat/mo billed yearly, up to 10 seats"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "Contact form",
      "hoq": "Yes, per inbox, off by default",
      "them": [
       "Not on Support Team",
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "Inboxes",
      "hoq": "not published",
      "them": [
       "Unlimited email addresses",
       "2 included, up to 20",
       "not published"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "Attachment size",
      "hoq": "25 MB per attachment",
      "them": [
       "Up to 50 MB",
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "Knowledge base",
      "hoq": "No",
      "them": [
       "not published",
       "2 Docs sites",
       "not published"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "AI",
      "hoq": "Bring your own agent over MCP, with per-area permissions",
      "them": [
       "5 automated resolutions per agent/mo, then $1.50 to $2.00 each",
       "AI Assist, Drafts and Summarize included",
       "Copilot $20/seat/mo add-on"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "JSON API and MCP server",
      "them": [
       "Included",
       "200 requests/min",
       "Not listed on Starter"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     },
     {
      "label": "Live chat, social, phone channels",
      "hoq": "No; email, web form and logged calls only",
      "them": [
       "Messaging needs a higher plan",
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.zendesk.com/pricing/",
       "https://www.helpscout.com/pricing/",
       "https://front.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "sync",
   "name": "Hoq Sync",
   "status": "dev",
   "url": "https://sync.hoq.app",
   "line": "Folders kept in step across your computers, encrypted before they leave each one.",
   "facts": [
    {
     "label": "File encryption",
     "value": "XChaCha20-Poly1305 per chunk, with sizes padded (Padmé) to hide exact lengths. Change records, including paths, are sealed the same way."
    },
    {
     "label": "Who holds the keys",
     "value": "A random 256-bit key per folder, made on the device that creates it. The server stores it only wrapped to each member device's X25519 public key."
    },
    {
     "label": "Chunk names",
     "value": "A chunk's id is a BLAKE3 keyed hash under the folder key, so the server cannot test whether you hold a known file."
    },
    {
     "label": "Device-to-device protocol",
     "value": "Noise_IK_25519_ChaChaPoly_BLAKE2s, end to end between your devices, inside TLS WebSockets on port 443 when relayed."
    },
    {
     "label": "Direct paths",
     "value": "TCP, QUIC over UDP with hole punching, and router port mapping by PCP, NAT-PMP or UPnP IGD. Each can be turned off, leaving web traffic only."
    },
    {
     "label": "Chunking",
     "value": "Content-defined chunks of 256 KiB to 4 MiB, about 1 MiB on average, so an edit re-sends only nearby chunks."
    },
    {
     "label": "Conflicts",
     "value": "Version vectors decide; the other version is kept as name.sync-conflict-<date>-<device>.ext."
    },
    {
     "label": "Platforms",
     "value": "Linux (systemd user service) and macOS (launchd agent). Windows is planned."
    },
    {
     "label": "Ignore rules",
     "value": "A .hoqignore file in gitignore syntax, synced like any other file."
    }
   ],
   "figures": [
    {
     "value": "256-bit",
     "label": "folder key that never leaves your devices unwrapped"
    },
    {
     "value": "~1 MiB",
     "label": "average chunk, so a small edit re-sends little"
    },
    {
     "value": "443",
     "label": "the only port relayed traffic needs"
    }
   ],
   "features": [
    {
     "area": "Folders",
     "rows": [
      {
       "name": "Create and join",
       "what": "Make a synced folder from a directory and join it on another of your computers.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Share to a device",
       "what": "Give another of your computers a folder by wrapping its key to that device.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Conflict copies",
       "what": "Keeps the losing side of a simultaneous edit as a named conflict copy.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Cross-OS names",
       "what": "Handles NFC/NFD names, case-only collisions and names Windows refuses.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Ignore file",
       "what": "Skips paths listed in .hoqignore.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Network",
     "rows": [
      {
       "name": "Relay over 443",
       "what": "Devices meet through a relay over TLS WebSockets, end-to-end encrypted with Noise.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Direct connections",
       "what": "Devices introduced by the relay connect directly over TCP when they can.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Hole punching",
       "what": "QUIC over UDP reaches devices behind NAT without a forwarded port.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Router port mapping",
       "what": "Asks the router to forward the direct port by PCP, NAT-PMP or UPnP.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Web only",
       "what": "One setting turns off direct paths and UDP, leaving TLS on 443 only.",
       "status": "beta",
       "verified": null
      }
     ]
    },
    {
     "area": "Setup",
     "rows": [
      {
       "name": "Pair with Hoq ID",
       "what": "Adds a computer to your account by a device sign-in that you approve.",
       "status": "beta",
       "verified": null
      },
      {
       "name": "Background service",
       "what": "Installs itself as a systemd user service on Linux or a launchd agent on macOS.",
       "status": "beta",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 12,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Syncthing",
      "url": "https://syncthing.net/"
     },
     {
      "name": "Dropbox",
      "url": "https://help.dropbox.com/security/how-security-works"
     }
    ],
    "rows": [
     {
      "label": "Platforms",
      "hoq": "Linux and macOS; Windows planned",
      "them": [
       "macOS, Windows, Linux, FreeBSD, Solaris, OpenBSD and others",
       "not published"
      ],
      "sources": [
       "https://syncthing.net/",
       "https://help.dropbox.com/security/how-security-works"
      ]
     },
     {
      "label": "Where files are stored",
      "hoq": "Only on your computers",
      "them": [
       "Only on your computers",
       "Dropbox servers"
      ],
      "sources": [
       "https://syncthing.net/",
       "https://help.dropbox.com/security/how-security-works"
      ]
     },
     {
      "label": "Client-side encryption by default",
      "hoq": "Yes, XChaCha20-Poly1305 with keys only your devices hold",
      "them": [
       "Untrusted (encrypted) devices are optional and marked beta",
       "Dropbox doesn't offer client-side encryption; end-to-end encryption is an add-on"
      ],
      "sources": [
       "https://docs.syncthing.net/users/untrusted.html",
       "https://help.dropbox.com/security/how-security-works"
      ]
     },
     {
      "label": "Relayed traffic",
      "hoq": "End-to-end encrypted with Noise; relays run by Hoq",
      "them": [
       "End-to-end encrypted; public relays or your own",
       "not applicable"
      ],
      "sources": [
       "https://docs.syncthing.net/users/relaying.html",
       "https://help.dropbox.com/security/how-security-works"
      ]
     },
     {
      "label": "What a relay or untrusted peer can see",
      "hoq": "Padded sizes, timing and IP addresses; never names, paths or contents",
      "them": [
       "Folder ID and label, approximate file sizes, IP addresses, device IDs and traffic volume",
       "not applicable"
      ],
      "sources": [
       "https://docs.syncthing.net/users/untrusted.html",
       "https://help.dropbox.com/security/how-security-works"
      ]
     },
     {
      "label": "Transport",
      "hoq": "TLS WebSocket on 443 with Noise inside; direct TCP and QUIC",
      "them": [
       "TLS with perfect forward secrecy",
       "TLS between apps and Dropbox servers"
      ],
      "sources": [
       "https://syncthing.net/",
       "https://help.dropbox.com/security/how-security-works"
      ]
     }
    ]
   }
  },
  {
   "key": "term",
   "name": "Hoq Term",
   "status": "live",
   "url": "https://term.hoq.app",
   "line": "Every terminal session on every machine you own, in one browser list.",
   "facts": [
    {
     "label": "Where sessions run",
     "value": "In tmux on your own machine. Term never runs your shell on its servers."
    },
    {
     "label": "Encryption",
     "value": "End to end on every connection: Noise_NK_25519_AESGCM_SHA256, keyed to the machine and bound to a one-time pass. The relay and proxy see only ciphertext."
    },
    {
     "label": "Network exposure",
     "value": "Machines connect out to the relay. Nothing on them listens to the internet, so it works behind home routers."
    },
    {
     "label": "Access passes",
     "value": "The daemon accepts only single-use passes that last one minute and were made for that machine's owner."
    },
    {
     "label": "Supported machines",
     "value": "Linux (systemd user service) and macOS (launchd). Needs Node and tmux."
    },
    {
     "label": "Install",
     "value": "curl -fsSL https://term.hoq.app/install.sh | sh, with a pairing ticket that works once for 15 minutes."
    },
    {
     "label": "Updates",
     "value": "The daemon installs only builds whose SHA-256 is signed with the Hoq Ed25519 release key, and keeps the previous version."
    },
    {
     "label": "File transfer",
     "value": "Up to 50 MB a file over its own encrypted connection, 500 MB kept per machine with the oldest cleared first. Photos are resized to 2048 px and stripped of location data."
    },
    {
     "label": "View-only sharing",
     "value": "A link for 1 hour, 1 day or until you stop it shows one session live, end to end encrypted, last 500 lines. Only the link's hash is stored."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID. Machines are paired to your Hoq ID account and show which account approved them."
    }
   ],
   "figures": [
    {
     "value": "1 minute",
     "label": "life of the single-use pass that opens a session"
    },
    {
     "value": "5",
     "label": "tiled workspaces on a computer, synced to your phone"
    },
    {
     "value": "4",
     "label": "live sessions side by side in one window"
    },
    {
     "value": "50 MB",
     "label": "largest file you can send to or save from a session"
    },
    {
     "value": "0",
     "label": "inbound ports opened on your machine"
    }
   ],
   "features": [
    {
     "area": "Sessions",
     "rows": [
      {
       "name": "Sessions that keep running",
       "what": "Each session is a tmux session on your own machine, so it carries on when you close the page or lose signal.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "One list across machines",
       "what": "Every machine you added and every session on it, with busy or idle, how long ago, the last two lines and the machine's load and free disk.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Session tabs",
       "what": "Sessions you open line up as tabs along the top, come back after a reload, mark new output and \"needs you\", and close without stopping the session; Alt+1–9 and Ctrl+Shift+[ ] switch on a computer.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Tab menu",
       "what": "Right-click a tab, or press and hold it on a phone, to rename the session, move the tab left or right, or close it or the others (the session keeps running).",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Session menu",
       "what": "The same menu on every session in the list: open, move up or down, rename, mute notifications, close its tab, or end the session after a confirm.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Name sessions anything",
       "what": "A session can be called anything (spaces, commas, dots, up to 60 characters); the name is kept on the machine so every device shows it.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Start without a name",
       "what": "Leave the name empty and the session is named after its folder.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "What a session is running",
       "what": "The list shows how many commands a session is running in the background (hover for which), for shells and for Claude Code.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Claude Code status",
       "what": "With `hoq-term hooks on`, Claude Code reports when it needs permission, when its turn is over and how many agents are running, so \"Needs you\" and its notification are exact.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Answer Claude from anywhere",
       "what": "When Claude Code asks permission, the session shows the question with Allow, Always (when Claude offers a rule) and Deny, in the list and in a bar over the terminal; Deny lets you say why. Claude takes whichever answer comes first, the desk or the app, and the buttons go when it is answered either place. Needs `hoq-term hooks on` again on machines set up before.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Reply to Claude",
       "what": "When Claude ends its turn waiting for you, Reply on its card in the session list opens a box (dictation and paste work there) and types your answer into the session.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Answer from a notification",
       "what": "On computers and Android the permission notification has Allow and Deny buttons; iPhone shows none, so tapping opens the session with the question on top. Can be turned off in Notification settings.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Encrypted end to end",
       "what": "Each machine has its own key, registered once with id.hoq.app; every connection runs a Noise NK handshake (X25519, AES-GCM) bound to its one-time pass, so the relay and the proxy carry only ciphertext and a copied pass is useless. The page refuses plain text from a machine that has a key. A machine's key can only change by pairing it again.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Hide what is on screen",
       "what": "A per-device setting that makes notifications say only what happened and where, since notification text travels through id.hoq.app and Apple or Google.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Compose",
       "what": "A real text box for a session (keyboard dictation and paste work there), sent as one paste with or without Enter; the last ten are kept to send again and an unsent draft stays.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Send files and photos",
       "what": "Attach from Compose, or drop or paste onto the terminal on a computer: files go over their own encrypted connection (typing never waits behind them) to `~/.local/share/hoq-term/uploads/<session>/` and their paths go into your text. Photos are resized to 2048 px and lose their location and camera details. 50 MB a file, 500 MB kept, oldest cleared first.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Download a file",
       "what": "Hold a path in the output and tap Save, or use Download a file in the session menu: paths are taken from the session's folder; links are not followed; up to 50 MB. On a phone it opens the share sheet.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "View-only share link",
       "what": "Session menu, Share view-only: a link for 1 hour, 1 day or until you stop it. Anyone with it watches live at term.hoq.app/v without signing in (encrypted end to end, the last 500 lines, never your other sessions); they cannot type or resize. An eye on the session shows how many are watching; Stop closes them at once. Only the link's hash is stored, and the code sits after the # so it never reaches a server log.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "hoq-term doctor",
       "what": "Checks Node, tmux, pairing, that the daemon runs, the relay link, the encryption key, linger, PATH, the Claude Code and shell hooks, and the clock (passes last a minute), with the fix for each.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Open a port",
       "what": "Session menu, Open a port: lists what you have listening on that machine (your own processes only) and opens one on a private address for 12 hours, for you only (a one-time key becomes a cookie the app never sees), hot reload included. Machines reached through the relay; switched off until the relay has its own preview domain. Not end-to-end encrypted, and the sheet says so.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Typing ahead",
       "what": "On a computer, when the line to the machine is slow (round trip over 80 ms), what you type shows at once, faintly underlined, until the machine's echo replaces it; never in full-screen programs, and off until Enter at a prompt that does not echo (passwords) or after any mismatch. On a slow line / Always / Off in the account menu.",
       "status": "beta",
       "verified": "2026-10-23"
      },
      {
       "name": "Side by side",
       "what": "On a computer, \"Open beside\" (right-click a session or tab) shows up to four sessions next to each other, each fitted to its pane and streaming live; click a pane to type into it, × closes the pane and leaves the session running.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Workspaces",
       "what": "Five workspaces (1–5 in the terminal bar) on a computer, each with its own tiled panes; a new pane splits the focused one along its longer side; workspaces you are not looking at stop streaming and come back painted; kept after a reload.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Workspace keys",
       "what": "Alt (or Ctrl+Alt) + 1–5 switch, + Shift+1–5 send the pane, + arrows move focus, + Shift+arrows swap, + J flip the split, + F full size, + W close the pane, + Enter start a shell beside.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Arrange by dragging",
       "what": "Drag the line between panes to resize (double-click evens it out); drag a pane by its header onto another pane's edge to put it there, or onto its middle to swap; drop a session from the list or a tab onto a pane, a pane's edge, or a workspace number.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Workspaces on a phone",
       "what": "The strip under the bar shows 1–5 and that workspace's sessions; tap a number to jump to its last session; hold a tab to move it to another workspace; what you open lands in the current one.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Colours",
       "what": "Right-click a terminal's title bar (hold the title on a phone) for ten background colours; each session keeps its own, on every device, shown as a chip in the list and a line under its tab.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Same workspaces everywhere",
       "what": "Workspaces follow you between computers and your phone (a phone shows a workspace's panes as its tabs); a change made elsewhere reaches the workspace you are looking at when you come back to the app, never while you type.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Updates itself",
       "what": "An open page reloads into a new version when you come back to it.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Your own session order",
       "what": "Sessions stay where you put them: drag them on a computer (or Alt+↑/↓), use Reorder on a phone; new ones go at the top. Name or recent activity are options.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Hide the session list",
       "what": "On a computer the session list folds away for a wider terminal, and stays that way.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "List that scrolls with status",
       "what": "The list scrolls on its own under a fixed header, machine names stay in view, machines fold away, and each row shows working / needs you / ended, when it last did something and where else it is open.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Filter the list",
       "what": "With six or more sessions, a filter box (/ on a computer) and All · Needs you · Working buttons with counts.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Compact list",
       "what": "Smaller rows with the last lines shown only when a session needs you or has ended; previews can be turned back on.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Pick up where you left off",
       "what": "Opening a session redraws its screen as it is now, including output from while you were away, the cursor and full-screen programs.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "New session",
       "what": "Start one in a folder with a shell, Claude Code or your own command.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Rename and close",
       "what": "Rename a session, or close it after a confirm.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Reconnects by itself",
       "what": "When the tab or phone comes back or the network returns, it checks the connection and reconnects.",
       "status": "shipped",
       "verified": "2026-10-21"
      }
     ]
    },
    {
     "area": "Phone",
     "rows": [
      {
       "name": "Phone does not shrink the desktop",
       "what": "A phone opens a session at its real width and lets you scroll, unless you choose to fit it to the phone.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Key bar",
       "what": "Esc, Ctrl, Tab, arrows, ^C and Paste above the phone keyboard; swipe to see more, customisable.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Key bar editor",
       "what": "Choose small, medium or large keys and one or two rows, move and remove keys, add from a catalogue, start from a set (Claude Code, Vim), and copy a layout to another device.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Your own keys",
       "what": "Make a key that types a command or sequence (^C, \\e, Enter after), with its own label and width.",
       "status": "shipped",
       "verified": "2026-10-22"
      },
      {
       "name": "Text size",
       "what": "Make the terminal text larger or smaller.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Installable app",
       "what": "Add to Home Screen with its own icon; it opens full-screen and the page loads without signal.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Instant return",
       "what": "The last screen of each session is kept on the device and shows at once while the live one loads.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "History, search and copy",
       "what": "Scroll a session's history as text, search it, rejoin long lines and copy a selection or all of it.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Pinch for text size",
       "what": "Pinch the terminal on a phone to make the text larger or smaller.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Phone layout",
       "what": "Dark throughout, large-title list with + and account, one bar in a session, bottom sheets, 44 px targets, landscape too.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Fits the phone",
       "what": "A session fits the phone unless someone else has it open; the choice is remembered per session.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Swipe to scroll",
       "what": "Swipe scrolls the history with momentum, and moves full-screen programs like less and vim.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Select and copy",
       "what": "Long-press a word to select it, then Copy, Paste or open History.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Switch sessions",
       "what": "Tap the session name to jump to any other session on any machine.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Follows the keyboard",
       "what": "The terminal and key bar stay above the on-screen keyboard.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Notifications",
       "what": "Tell you when Claude Code is waiting, a long command finished or a session ended; not while you are looking at it.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Mute a session",
       "what": "Turn notifications off for one session from its ⋯ panel; it shows 🔕 in the list.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Tap to open",
       "what": "Tapping a notification opens Term on that session.",
       "status": "shipped",
       "verified": "2026-10-21"
      }
     ]
    },
    {
     "area": "Machines",
     "rows": [
      {
       "name": "Add a machine",
       "what": "Register a machine and get its setup file, shown once.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Machine daemon",
       "what": "hoq-termd runs as your own user and only accepts one-minute, single-use passes made for that machine's owner.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Command line",
       "what": "`hoq-term ls`, `new`, `attach`, `rename`, `kill`, `status` on the machine itself.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Add a Linux or Mac computer in one line",
       "what": "`curl -fsSL https://term.hoq.app/install.sh | sh` installs the daemon for your user (systemd on Linux, launchd on macOS) and pairs it with a short code you approve in Hoq ID.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Works behind home routers",
       "what": "Paired machines connect out to relay.hoq.link; nothing on them listens to the internet.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Back after sleep",
       "what": "A laptop that wakes or changes network reconnects at once; a link that silently died is replaced.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Pairing shows who approved",
       "what": "The machine says which account approved it and asks before saving; the pairing key is thrown away.",
       "status": "shipped",
       "verified": "2026-10-21"
      },
      {
       "name": "Machines update themselves",
       "what": "`hoq-term update`, Update in a machine's menu, or automatic (`hoq-term update --auto on`, waits while you use it); only builds signed with the Hoq release key are installed, and the old version is kept.",
       "status": "shipped",
       "verified": "2026-10-24"
      },
      {
       "name": "Update ready",
       "what": "A machine running an older hoq-termd says \"update ready\" in the list, and `hoq-term doctor` names the newer version.",
       "status": "shipped",
       "verified": "2026-10-24"
      }
     ]
    }
   ],
   "shipped": 53,
   "beta": 12,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Termius Pro",
      "url": "https://termius.com/pricing"
     },
     {
      "name": "tmux with Tailscale SSH",
      "url": "https://tailscale.com/kb/1193/tailscale-ssh"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "No price shown on term.hoq.app",
      "them": [
       "$10 per month, billed annually (Starter tier free)",
       "$0 on Tailscale Personal, up to 6 users"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://tailscale.com/pricing"
      ]
     },
     {
      "label": "Session keeps running after you disconnect",
      "hoq": "Yes, every session is tmux on your machine",
      "them": [
       "not published",
       "Yes, tmux sessions keep running in the background after you detach"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://github.com/tmux/tmux/wiki/Getting-Started"
      ]
     },
     {
      "label": "Protocols",
      "hoq": "Its own daemon over an outbound relay link; no SSH",
      "them": [
       "SSH, SFTP, Telnet, Mosh, local terminal",
       "SSH over WireGuard"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://tailscale.com/kb/1193/tailscale-ssh"
      ]
     },
     {
      "label": "Encryption",
      "hoq": "Noise NK (X25519, AES-GCM) end to end; relay sees ciphertext",
      "them": [
       "Vault encrypted with X25519, XSalsa20 and Poly1305; sessions over SSH",
       "WireGuard with Tailscale node keys"
      ],
      "sources": [
       "https://docs.termius.com/security/encryption-overview",
       "https://tailscale.com/kb/1193/tailscale-ssh"
      ]
     },
     {
      "label": "Port forwarding",
      "hoq": "Built but switched off for now",
      "them": [
       "Included on the free Starter tier",
       "not published"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://tailscale.com/kb/1193/tailscale-ssh"
      ]
     },
     {
      "label": "Several devices on one session",
      "hoq": "Yes; the list shows where else a session is open",
      "them": [
       "not published",
       "Yes, a tmux session can be attached to more than one client"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://github.com/tmux/tmux/wiki/Getting-Started"
      ]
     },
     {
      "label": "Watching or recording a session",
      "hoq": "View-only share link for 1 hour, 1 day or until stopped",
      "them": [
       "not published",
       "SSH session recording for audit"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://tailscale.com/kb/1193/tailscale-ssh"
      ]
     },
     {
      "label": "Coding-agent prompts",
      "hoq": "Claude Code permission requests answered from the list or a notification",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://termius.com/pricing",
       "https://tailscale.com/kb/1193/tailscale-ssh"
      ]
     }
    ]
   }
  },
  {
   "key": "todo",
   "name": "Hoq Todo",
   "status": "beta",
   "url": "https://todo.hoq.app",
   "line": "Your list, shared lists, and your AI agents, with whose move it is.",
   "facts": [
    {
     "label": "Where your list lives",
     "value": "One file in your own Hoq Storage."
    },
    {
     "label": "Phone and computer sync",
     "value": "CalDAV: Reminders on iPhone and Mac (with Siri), Thunderbird and Android task apps, both ways, a password per device."
    },
    {
     "label": "Import",
     "value": "Things (its own database file), Todoist or TickTick exports, or any CSV, with a preview first."
    },
    {
     "label": "Export",
     "value": "Download a readable copy of everything at any time."
    },
    {
     "label": "Offline",
     "value": "Changes made offline are kept on the device and saved when you reconnect, even if you were signed out."
    },
    {
     "label": "Agents",
     "value": "Eleven MCP tools; an agent writes only to its own list and asks before it emails anyone."
    },
    {
     "label": "Email in",
     "value": "Forward anything to your list's private address."
    },
    {
     "label": "Attachments",
     "value": "Up to 25 MB per file, kept in your own Hoq Storage."
    },
    {
     "label": "Backups",
     "value": "Every changed list is copied nightly into its owner's Hoq Storage, kept two weeks, and test-restored weekly."
    },
    {
     "label": "Sign-in",
     "value": "Hoq ID."
    }
   ],
   "figures": [
    {
     "value": "25 MB",
     "label": "per attached file"
    },
    {
     "value": "10",
     "label": "emails a day an agent may send for you without asking, once you allow it"
    },
    {
     "value": "5",
     "label": "looks, each with a light and dark side"
    },
    {
     "value": "1 week",
     "label": "before an agent's unused suggestion expires"
    }
   ],
   "features": [
    {
     "area": "Your list",
     "rows": [
      {
       "name": "Your own list on first visit",
       "what": "Signing in makes your personal list as one file in the Todo folder of your Hoq Storage and opens it.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Today, This Evening, Upcoming, Anytime, Someday, Logbook",
       "what": "Every task lands in one of these by its soft date, with no setup.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Quick add",
       "what": "One line understands days, \"tonight\", \"by\" deadlines, times, repeats, estimates and #tags, and shows what it understood before you press Enter.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Soft dates and hard deadlines",
       "what": "A planned day rolls forward quietly; only a real deadline turns amber, never red.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Repeats",
       "what": "Fixed repeats (every 15th, last Friday) and repeats counted from when you finish (\"every! 3 days\").",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Steps, notes, tags and lists",
       "what": "Break a task into steps, write notes, tag it and file it in a list.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Shopping lists",
       "what": "A list can be a shopping list: checked items clear, and past items come back as one-tap suggestions.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Completion that feels like it",
       "what": "The task gets lighter as the strike draws through it, with an optional rising chime and Undo.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Undo anything",
       "what": "Every change is in the task's history with who made it, and can be undone unless it changed since.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Keyboard and command palette",
       "what": "One key per action, J/K to move, and ⌘K to search or jump anywhere.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Phone layout",
       "what": "Bottom bar, a thumb-reach add button and a drawer for everything else.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Works offline",
       "what": "Changes made offline are kept on the device and saved when you reconnect.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Phone and computer sync",
       "what": "Your lists appear in Reminders on iPhone and Mac (with Siri and the widget), Thunderbird and Android task apps over CalDAV, with changes both ways and a password per device.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Attachments",
       "what": "Attach files to a task (up to 25 MB each, or drop them on it); they live in your own Hoq Storage, and pictures show a preview.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Search",
       "what": "Finds every word in any order, ignores accents, and looks in notes, steps, comments, tags and attachment names too.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Agents",
     "rows": [
      {
       "name": "Agents keep their own lists",
       "what": "An agent adds to its own list, which you can see and add to; it never adds to yours directly.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Asks",
       "what": "When an agent needs you, its question appears in your Today as \"needs you\", and your answer hands it back.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Handing work to an agent",
       "what": "Hand a task with what \"done\" looks like and a budget; the agent reports progress and returns it ready for review with proof.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Suggestions that expire",
       "what": "Agents and Hoq suggest tasks into a tray; nothing joins your list until you add it, and suggestions expire after a week.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Letting go",
       "what": "After a task has moved forward several days, Hoq offers once to let it go, shrink it or keep it.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Brain dump",
       "what": "Write what is on your mind; Hoq sorts it into suggested tasks you look over and add, one at a time or all at once.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Make it smaller",
       "what": "Hoq proposes small steps for a task you keep putting off, the first one tiny; you pick which to keep.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Your week",
       "what": "A one-screen letter on Sundays: what you finished, what keeps slipping, deadlines coming, and what is worth deciding.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Weekly review",
       "what": "Go through what has gone stale one card at a time: today, later, someday or let it go, by key or by swipe.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Assistant on or off",
       "what": "Turn the Hoq assistant off in Settings; everything else keeps working.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "MCP for agents",
       "what": "Eleven tools at /mcp/todo, with each agent's writes labelled from its own key.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agents ask before todo acts",
       "what": "An agent asks to send an email for you; you see the message and say Send it or Not this one, and replies come to you.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Trust you give an agent",
       "what": "After you have said yes three times, you can let an agent email people you already approved without asking (up to 10 a day), and take that back on its page.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Checks on handed work",
       "what": "When you hand a task to an agent, Todo can check the proof (a confirmation number, every step ticked, a page showing certain words) and close it when it passes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agent spending",
       "what": "Each agent's page shows this month's spend; a monthly limit stops work that would go past it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "What agents did",
       "what": "One feed of every step your agents took, newest first, with costs.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agents hold calendar time",
       "what": "An agent can ask to hold time on your Hoq Mail calendar; it goes on after your yes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agents send links",
       "what": "An agent can ask to email someone a link to one of your tasks; it goes after your yes.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Connect your own agent",
       "what": "Give Claude, ChatGPT or your own agent a key from the sidebar; it gets a list of its own beside yours, and you can disconnect it from its page.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Agents invited to a shared list",
       "what": "Give an agent a key to one shared list; it works there as itself, sees none of your other lists, and you can turn it off.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "A first step for a stuck task",
       "what": "When a task has sat untouched for over a week, Hoq offers once a two-minute first step you can accept or ignore.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "People and reminders",
     "rows": [
      {
       "name": "Waiting on",
       "what": "Tasks handed to someone, or waiting on something with a check-back date, gather in one view.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Comments",
       "what": "Talk on a task; choose whether the person you sent it to can see each message.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Reminders",
       "what": "Reminders arrive as notifications, or by email when notifications are off, even while the list is put away.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Import",
       "what": "Bring your list from Things (its own database file), a Todoist or TickTick export or any CSV, see a preview, then add.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Export",
       "what": "Download a readable copy of everything; the list itself is your own file.",
       "status": "beta",
       "verified": "2026-10-03"
      },
      {
       "name": "Shared lists",
       "what": "Make a list with other people by email, kept by you or by an organization you run; everyone sees every task in it and changes appear as they happen.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Move to a shared list",
       "what": "Move a task from your own list into a shared one (or into a new one made on the spot); it arrives with its steps, comments and history.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Shared work in your Today",
       "what": "Tasks handed to you in any shared list show up in your own Today and Waiting on, marked with the list they live in.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Notifications from shared lists",
       "what": "Being handed a task, @mentioned, commented on or seeing a task finished tells you, bundled for five minutes and held to daytime in your time zone.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Email to your list",
       "what": "Each person gets a private address; what you send or forward there lands in your Inbox, the subject as the task.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Your Hoq Mail calendar",
       "what": "Connect it with your Hoq ID; Todo gets a calendar-only key for the mailbox you pick and shows its events beside your tasks.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Add to Todo from Hoq Mail",
       "what": "A message's menu in Hoq Mail opens Todo with the subject, sender and a link back already filled in.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Calendar beside your tasks",
       "what": "Add a calendar by its secret address and see its events, read-only, on Today and Upcoming.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "How much fits today",
       "what": "Today compares your time estimates with the free time left on your calendar before evening.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Links for people without an account",
       "what": "Send one task to someone by link — no account, nothing else from your list; they tick steps, message you and mark it done, and you are told.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    },
    {
     "area": "Getting started and leaving",
     "rows": [
      {
       "name": "Welcome",
       "what": "A new person's Today shows four first steps that tick themselves off and hide for good.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Landing page",
       "what": "Visitors without an account see what Todo is, on a page that opens on today's date.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Help",
       "what": "Eighteen short help pages at /help, checked against what the app does.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Terms and privacy",
       "what": "Plain-language terms and a privacy page that says what is kept, where, and who sees it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Status page",
       "what": "/status and /status.json show whether lists, reminders, notices, email in, the assistant, live updates, backups and capacity are working.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Leave Todo",
       "what": "Removes what the service keeps about you outside your files and takes you off shared lists you did not make; your files stay.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Accessibility",
       "what": "Every page passes the WCAG 2 A/AA checks in light and dark.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Big lists",
       "what": "Lists of ten thousand tasks open quickly; long views show two hundred tasks and load more as you scroll.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Keyboard and screen readers",
       "what": "Skip to tasks, every task opens from the keyboard, panels hold and return focus, ? lists every shortcut.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Offline",
       "what": "Changes made offline show as not synced yet and save when you reconnect, even if you were signed out meanwhile.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Phone gestures",
       "what": "Swipe right to finish a task, left for Later; pull down to refresh in the installed app.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Areas",
       "what": "Group lists and projects under areas like Home and Work; removing an area keeps its lists.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Projects",
       "what": "Lists you finish, with a start, a due date, a progress ring, and Finish project that closes what is left.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Headings",
       "what": "Split a list into parts, add straight under a heading, and move a heading to another list with its tasks.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Assign",
       "what": "Give a task on a shared list to another member; it counts on their load and they are told.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Team",
       "what": "See what each member has open, today, this week and past its deadline, and filter a shared list to one person or to yours.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "What happened",
       "what": "Everything people and agents did on a shared list, newest first.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Mentions",
       "what": "Type @ in a comment for the names on the list; the person is told.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Morning email",
       "what": "Optional email at 7 with what is yours today across your shared lists.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Templates",
       "what": "Save a list, project or task as a template and start a fresh copy with dates moved and blanks like {{person}} filled in.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Repeating projects",
       "what": "A template can start itself every week, month, quarter or year; a missed stretch makes one copy.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Plan the day",
       "what": "Today by the hour beside your calendar; drag tasks onto times or let Fill my day place them in the free gaps.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Focus",
       "what": "One task with its steps and a 25-minute timer; the time you focus is kept on the task.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Week",
       "what": "Seven days with how full each one is; drag a task to another day or use [ and ].",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "What got done",
       "what": "The last week or month: done by day and by list, time focused, added and let go.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Tasks from other apps",
       "what": "Add a Hoq Service job, CRM deal, Chat message, email, Repos change, Crew task or Shop order to your Todo; the task links back and closes itself when that thing is finished there.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Habits",
       "what": "Things you want to do often (every day, on chosen days, or a few times a week), kept with a tap on the Habits page or at the top of Today.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Counted habits",
       "what": "A habit can be kept several times a day, like 8 glasses of water; each tap adds one and the ring fills.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Kind runs",
       "what": "A run of kept days lets off one missed day a week, and days marked away are never due and never count against it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Twelve weeks at a glance",
       "what": "Each habit shows its last twelve weeks, and you can fill in or take back any of the last seven days.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Routines",
       "what": "Group habits you do together, like a morning start, with one reminder for the group.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Habit reminders",
       "what": "A reminder time sends a notification, never an email, and skips days you have already kept it.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Nightly backups",
       "what": "Every list that changed is copied into its owner's Hoq Storage each night, kept two weeks, and the copies are test-restored every week.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Looks",
       "what": "Five looks, each with a light and dark side: Paper, Ledger, Harbor, Moss and Dusk; they follow you to every list and device.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Spacing and text size",
       "what": "Compact, comfortable or roomy rows, and normal, large or larger text.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "List colours and icons",
       "what": "Give a list a colour and an icon; its tasks show a matching dot on Today.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Focus backdrops",
       "what": "A dawn, sea, forest or night backdrop behind the focus timer.",
       "status": "beta",
       "verified": "2026-10-04"
      },
      {
       "name": "Today on the wall",
       "what": "A full-screen Today with the day, time, next event, tasks and habits, tap to finish, screen kept awake.",
       "status": "beta",
       "verified": "2026-10-04"
      }
     ]
    }
   ],
   "shipped": 0,
   "beta": 89,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Things 3",
      "url": "https://apps.apple.com/us/app/things-3/id904280696"
     },
     {
      "name": "Todoist Pro",
      "url": "https://www.todoist.com/pricing"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Free while Todo is new",
      "them": [
       "One-time: Mac $49.99, iPhone $9.99, iPad $19.99",
       "$5 per month billed yearly, $7 monthly"
      ],
      "sources": [
       "https://apps.apple.com/us/app/things-3/id904280696",
       "https://www.todoist.com/pricing"
      ]
     },
     {
      "label": "Platforms",
      "hoq": "Any browser; Apple, Android and Thunderbird task apps over CalDAV",
      "them": [
       "Apple only",
       "Web, Windows, Android and Apple"
      ],
      "sources": [
       "https://culturedcode.com/things/support/articles/2803552/",
       "https://www.todoist.com/pricing"
      ]
     },
     {
      "label": "CalDAV sync",
      "hoq": "Yes, both ways",
      "them": [
       "not published",
       "No; read-only calendar feed"
      ],
      "sources": [
       "https://culturedcode.com/things/support/articles/2803552/",
       "https://www.todoist.com/help/articles/add-a-todoist-calendar-feed-pAk3tk"
      ]
     },
     {
      "label": "Shared lists",
      "hoq": "Yes, plus links for people without an account",
      "them": [
       "No",
       "Yes; 5 collaborators per project on the free plan"
      ],
      "sources": [
       "https://culturedcode.com/things/support/articles/2803552/",
       "https://www.todoist.com/pricing"
      ]
     },
     {
      "label": "AI agents",
      "hoq": "Agents keep their own lists and ask before acting; 11 MCP tools",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://apps.apple.com/us/app/things-3/id904280696",
       "https://www.todoist.com/pricing"
      ]
     },
     {
      "label": "API",
      "hoq": "MCP and CalDAV",
      "them": [
       "not published",
       "Developer API"
      ],
      "sources": [
       "https://apps.apple.com/us/app/things-3/id904280696",
       "https://developer.todoist.com/"
      ]
     },
     {
      "label": "Offline",
      "hoq": "Yes, saved on reconnect",
      "them": [
       "Yes, local by design",
       "Not published"
      ],
      "sources": [
       "https://culturedcode.com/things/support/articles/2803552/",
       "https://www.todoist.com/pricing"
      ]
     },
     {
      "label": "Where data lives",
      "hoq": "A file in your own Hoq Storage",
      "them": [
       "On your devices, synced by Things Cloud",
       "Vendor cloud"
      ],
      "sources": [
       "https://culturedcode.com/things/support/articles/2803552/",
       "https://www.todoist.com/pricing"
      ]
     }
    ]
   }
  },
  {
   "key": "vault",
   "name": "Hoq Vault",
   "status": "live",
   "url": "https://vault.hoq.app",
   "line": "Files sealed under your own passphrase. While sealed, nobody at Hoq can read them.",
   "facts": [
    {
     "label": "Encryption",
     "value": "AES-256-GCM. Every file has its own key, and that key is wrapped under the vault key."
    },
    {
     "label": "Passphrase",
     "value": "Turned into a key with Argon2id (libsodium moderate settings). The passphrase is never stored."
    },
    {
     "label": "Ways to open it",
     "value": "Passphrase, a passkey on your device, or the recovery key. The recovery key cannot be removed, and the last two ways in cannot be removed."
    },
    {
     "label": "Recovery key",
     "value": "32 random bytes shown once as 8 groups of 7 characters. Capitals and spaces do not matter when you type it back."
    },
    {
     "label": "What a sealed vault shows",
     "value": "Its label, size and last open. No file count, no names, no folder tree, no thumbnails."
    },
    {
     "label": "Auto-seal",
     "value": "8 hours after you open it by default. You choose the time when you make the vault."
    },
    {
     "label": "Wrong guesses",
     "value": "8 unlock attempts per 15 minutes from one address, then it waits."
    },
    {
     "label": "Hold until a date",
     "value": "Seal it until a date up to 90 days out. Your passphrase and passkey are refused until then; only the recovery key opens it early."
    },
    {
     "label": "Deleting",
     "value": "You must open the vault and type its name. It is sealed and deleted 7 days later. You can cancel without the key."
    },
    {
     "label": "Share links",
     "value": "Links to a file in a sealed vault answer with a locked page that names nothing."
    }
   ],
   "figures": [
    {
     "value": "AES-256",
     "label": "GCM encryption, a separate key per file"
    },
    {
     "value": "8 hours",
     "label": "until an open vault seals itself, by default"
    },
    {
     "value": "90 days",
     "label": "the longest you can hold a vault shut"
    },
    {
     "value": "7 days",
     "label": "to change your mind after you delete a vault"
    }
   ],
   "features": [
    {
     "area": "Sealing",
     "rows": [
      {
       "name": "Seal and unseal",
       "what": "Seal a vault and the server forgets its key; open it with any of your keys.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Sealed index",
       "what": "Names, folders, tags and versions live in an index that is encrypted with the files.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Auto-seal",
       "what": "An open vault seals itself after the time you set, 8 hours by default.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hold until a date",
       "what": "Lock a vault for up to 90 days so only the recovery key can open it early.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Keys",
     "rows": [
      {
       "name": "Passphrase",
       "what": "Set when you make the vault, typed twice.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Recovery key",
       "what": "A sheet you must confirm you saved before the vault is made.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Passkeys",
       "what": "Open the vault with Face ID, Touch ID or a security key that supports the WebAuthn PRF extension.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Keys panel",
       "what": "See every way in and remove the ones you no longer use.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Files",
     "rows": [
      {
       "name": "Same browser as your drive",
       "what": "Folders, tags, versions, thumbnails and quick look work inside an open vault.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Share links",
       "what": "Share a file from an open vault; the link goes dark when the vault seals.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Delete with a grace week",
       "what": "Proof of key and the typed name start a 7-day countdown you can stop.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 11,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Proton Drive Professional",
      "url": "https://proton.me/drive/pricing"
     },
     {
      "name": "Tresorit Business",
      "url": "https://tresorit.com/pricing/business"
     }
    ],
    "rows": [
     {
      "label": "Price per user per month",
      "hoq": "Not published",
      "them": [
       "$9.99",
       "not published"
      ],
      "sources": [
       "https://proton.me/drive/pricing",
       "https://tresorit.com/pricing/business"
      ]
     },
     {
      "label": "Storage included",
      "hoq": "Uses your Hoq Storage quota",
      "them": [
       "1 TB per user",
       "From 6 TB (2 TB per user, 3 users minimum)"
      ],
      "sources": [
       "https://proton.me/drive/pricing",
       "https://tresorit.com/pricing/business"
      ]
     },
     {
      "label": "Largest file",
      "hoq": "Not published",
      "them": [
       "not published",
       "15 GB"
      ],
      "sources": [
       "https://proton.me/drive/pricing",
       "https://tresorit.com/pricing/business"
      ]
     },
     {
      "label": "Encryption model",
      "hoq": "Encrypted on our server; the key is held in memory only while the vault is open",
      "them": [
       "End-to-end encrypted in your app",
       "End-to-end encrypted, zero-knowledge"
      ],
      "sources": [
       "https://proton.me/drive/pricing",
       "https://tresorit.com/pricing/business"
      ]
     },
     {
      "label": "Lock until a date",
      "hoq": "Yes, up to 90 days",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://proton.me/drive/pricing",
       "https://tresorit.com/pricing/business"
      ]
     },
     {
      "label": "Data residency choice",
      "hoq": "Not offered",
      "them": [
       "not published",
       "Included on Business"
      ],
      "sources": [
       "https://proton.me/drive/pricing",
       "https://tresorit.com/pricing/business"
      ]
     }
    ]
   }
  },
  {
   "key": "vision",
   "name": "Hoq Vision",
   "status": "beta",
   "url": "https://vision.hoq.app",
   "line": "Turn a Linux box with USB cameras or barcode guns into a shared scanner.",
   "facts": [
    {
     "label": "Install",
     "value": "One command: curl -fsSL https://vision.hoq.app/install | sudo sh. The box enrolls itself; no secret is typed on it."
    },
    {
     "label": "Pairing",
     "value": "A six-digit code that expires after 15 minutes and allows 5 tries. The box collects its credential once."
    },
    {
     "label": "Inputs",
     "value": "USB cameras, USB barcode guns that type like a keyboard, and USB-serial scanners. Each scan records which input it came from."
    },
    {
     "label": "Camera codes",
     "value": "Cameras read QR codes. A barcode gun passes on whatever it reads."
    },
    {
     "label": "Leases",
     "value": "Session leases last 120 seconds and renew on heartbeat. Permanent leases last until released."
    },
    {
     "label": "Offline",
     "value": "Scans queue in a bounded on-disk SQLite spool and replay when the link returns, including after a restart."
    },
    {
     "label": "Self-healing",
     "value": "The client runs under a systemd watchdog with a 60-second timeout and is restarted if it stops responding."
    },
    {
     "label": "Box health",
     "value": "Each heartbeat reports disk, CPU temperature, load, memory, uptime, pending security updates and whether a reboot is needed."
    },
    {
     "label": "Access keys",
     "value": "Apps use API keys with the vision:use scope. Boxes use vision:device. Wildcard keys are refused."
    }
   ],
   "figures": [
    {
     "value": "120 s",
     "label": "session lease, renewed by each heartbeat"
    },
    {
     "value": "15 min",
     "label": "before an unused pairing code expires"
    },
    {
     "value": "57 fps",
     "label": "1080p capture and decode with no dropped frames on an Intel N100 mini-PC"
    },
    {
     "value": "1.7 ms",
     "label": "to decode a QR code in a frame on that box"
    }
   ],
   "features": [
    {
     "area": "Appliances",
     "rows": [
      {
       "name": "One-line install",
       "what": "Installs the client as an unprivileged user with root-owned code.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Hardware discovery",
       "what": "Lists cameras with their modes and manual exposure and focus, barcode guns and serial ports.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Late hardware",
       "what": "A gun plugged in after pairing appears without pairing again.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Aim readout",
       "what": "Shows pixels per code module and the belt speed that implies, to help you place a camera.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Watchdog",
       "what": "systemd restarts the client if it stops responding for 60 seconds.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Scanning",
     "rows": [
      {
       "name": "Camera QR reading",
       "what": "Reads QR codes from live video across several cameras, counting a code seen by two cameras once.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Barcode guns",
       "what": "Takes exclusive hold of USB guns so scans do not leak into other windows.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Serial scanners",
       "what": "Reads USB-serial scanners when switched on per port.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Durable spool",
       "what": "Queues scans on disk through outages and restarts, bounded by count and size.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Apps",
     "rows": [
      {
       "name": "Leases",
       "what": "Take a box for a session or permanently; renew, release and list scans.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Live scans",
       "what": "Scans push to the lease holder over a socket scoped to that one lease.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Catch-up",
       "what": "After a reconnect, fetch every scan since the last id you saw.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Unclaimed scans kept",
       "what": "A scan with no live lease is still recorded.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Console",
     "rows": [
      {
       "name": "Claim by code",
       "what": "Type the six digits a box shows to make it yours.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Appliance list",
       "what": "See each box, its inputs, whether it is online and who holds it.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 15,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Scandit Smart Data Capture SDK",
      "url": "https://www.scandit.com/pricing/"
     },
     {
      "name": "Cognex DataMan",
      "url": "https://www.cognex.com/en/products/fixed-mount-barcode-scanners"
     },
     {
      "name": "Datalogic Matrix",
      "url": "https://www.datalogic.com/eng/manufacturing-transportation-logistics-healthcare-gs1-digital-link/stationary-industrial-scanners/matrix-220-pd-841.html"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Not published yet",
      "them": [
       "Quote only",
       "Quote only",
       "Quote only"
      ],
      "sources": [
       "https://www.scandit.com/pricing/",
       "https://www.cognex.com/en/products/fixed-mount-barcode-scanners",
       "https://www.datalogic.com/eng/manufacturing-transportation-logistics-healthcare-gs1-digital-link/stationary-industrial-scanners/matrix-220-pd-841.html"
      ]
     },
     {
      "label": "What reads the codes",
      "hoq": "Your Linux box with USB cameras, USB guns or serial scanners",
      "them": [
       "Software SDK on phones, tablets and handhelds",
       "Cognex fixed-mount readers",
       "Datalogic Matrix fixed imagers"
      ],
      "sources": [
       "https://www.scandit.com/products/barcode-scanner-sdk/",
       "https://www.cognex.com/en/products/fixed-mount-barcode-scanners/dataman-390",
       "https://www.datalogic.com/eng/manufacturing-transportation-logistics-healthcare-gs1-digital-link/stationary-industrial-scanners/matrix-220-pd-841.html"
      ]
     },
     {
      "label": "Uses existing USB barcode guns",
      "hoq": "Yes",
      "them": [
       "Not supported",
       "No, Cognex hardware only",
       "No, Datalogic hardware only"
      ],
      "sources": [
       "https://docs.scandit.com/sdks/web/add-sdk/",
       "https://cmbdn.cognex.com/handheld-terminal-sdk",
       "https://www.datalogic.com/eng/manufacturing-transportation-logistics-healthcare-gs1-digital-link/stationary-industrial-scanners/matrix-220-pd-841.html"
      ]
     },
     {
      "label": "Symbologies from a camera",
      "hoq": "QR Code",
      "them": [
       "About 33, 1D and 2D (count of the SDK list; no total published)",
       "1D, stacked and 2D including direct part marks",
       "1D, stacked, 2D, postal, direct part marks, Digimarc"
      ],
      "sources": [
       "https://docs.scandit.com/data-capture-sdk/dotnet.ios/barcode-capture/api/symbology.html",
       "https://www.cognex.com/products/barcode-readers/fixed-mount-barcode-readers/dataman-370/symbologies",
       "https://cdn.datalogic.com/Download?iddwnfile=25790"
      ]
     },
     {
      "label": "Fleet management",
      "hoq": "Hosted console: pair by code, leases, box health",
      "them": [
       "Account dashboard for licences and scan counts",
       "Edge Intelligence, run on site",
       "DL.CODE Windows tool; cloud Connect for handhelds"
      ],
      "sources": [
       "https://support.scandit.com/hc/en-us/articles/4417758844178-What-can-you-do-in-your-Account-dashboard",
       "https://www.cognex.com/en/products/edge-intelligence",
       "https://www.datalogic.com/eng/retail-manufacturing-transportation-logistics-healthcare-gs1-digital-link-other-applications/software-solutions/datalogic-connect-pd-1138.html"
      ]
     },
     {
      "label": "Offline buffering",
      "hoq": "On-disk queue, survives restarts, replays on reconnect",
      "them": [
       "Scanning works offline on the device",
       "Reader image buffer; Edge Intelligence keeps days of results",
       "Not published"
      ],
      "sources": [
       "https://www.scandit.com/products/barcode-scanner-sdk/",
       "https://docs.cognex.com/EI_100/EN/Edge_Intelligence_Reference_Manual.pdf",
       "https://www.datalogic.com/eng/manufacturing-transportation-logistics-healthcare-gs1-digital-link/stationary-industrial-scanners/matrix-220-pd-841.html"
      ]
     },
     {
      "label": "Integration",
      "hoq": "REST leases and scans, live WebSocket push",
      "them": [
       "SDKs for iOS, Android, Web, Linux, .NET, React Native, Flutter and more",
       "DataMan SDK (.NET) and industrial protocols",
       "Fieldbus and OPC UA"
      ],
      "sources": [
       "https://www.scandit.com/developers/",
       "https://docs.cognex.com/dmst_2541/EN/CommunicationsAndProgramming.pdf",
       "https://www.datalogic.com/eng/manufacturing-transportation-logistics-healthcare-gs1-digital-link/stationary-industrial-scanners/matrix-220-pd-841.html"
      ]
     }
    ]
   }
  },
  {
   "key": "vortex",
   "name": "Vortex",
   "status": "live",
   "url": "https://vortex.hoq.app",
   "line": "Halftone films that show what the mesh, ink and screen wear will do.",
   "facts": [
    {
     "label": "Films out",
     "value": "PDF with one page per screen at your imagesetter's resolution, and 1-bit TIFF with PackBits compression and no grey pixels."
    },
    {
     "label": "Plates",
     "value": "Up to eight, separated against a GRACoL profile, with a white underbase and choke."
    },
    {
     "label": "Labelled films",
     "value": "Each film carries its plate, angle, LPI and size burned into the slug."
    },
    {
     "label": "Engines",
     "value": "Ten: vector, AM, wave, spiral, stipple, flow, rings, TSP line, glyph and reaction."
    },
    {
     "label": "Correction curve",
     "value": "A Photoshop .acv built from your own printed target."
    },
    {
     "label": "Repeat runs",
     "value": "The browser and native builds render the same job byte for byte before release, so next year's films match this year's."
    },
    {
     "label": "Where your art goes",
     "value": "Nothing is sent while you work. Saving to the cloud uploads your art; that is off until you sign in."
    },
    {
     "label": "Other exports",
     "value": "PNG and SVG at physical size for laser and vinyl software."
    }
   ],
   "figures": [
    {
     "value": "8",
     "label": "ink plates per job"
    },
    {
     "value": "10",
     "label": "screening engines"
    },
    {
     "value": "3% to 12%",
     "label": "smallest held dot after 2,000 impressions in the wear model"
    }
   ],
   "features": [
    {
     "area": "Screening",
     "rows": [
      {
       "name": "AM halftone",
       "what": "Round, euclidean, square, line or stochastic dots at a set angle and LPI.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Stipple and line engines",
       "what": "Weighted stipple, flow lines, single-line TSP and spirals.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Glyph and reaction",
       "what": "Builds tone from characters or a reaction-diffusion pattern.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "ICC separation",
       "what": "Separates to CMYK with a GRACoL profile.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Press model",
     "rows": [
      {
       "name": "Dot gain",
       "what": "Grows each dot by its own edge, more on a white underbase than on cotton.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Smallest dot",
       "what": "Drops highlight dots the emulsion would not hold.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Impression counter",
       "what": "Wears the screen by how many pulls you have made.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Directional damage",
       "what": "Draws drag, roller marks and moiré along the direction that causes them.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Cracked ink and photocopy edges",
       "what": "Builds crazing with T-joints and copier edge build-up.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Proof only",
     "rows": [
      {
       "name": "Misregistration",
       "what": "Shows drift between screens on screen only.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Optical gain and paper",
       "what": "Simulates light in the paper, tooth and show-through on screen only.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Measure",
     "rows": [
      {
       "name": "Dot Gain Report",
       "what": "Prints a PDF target and reads your photo of it into a gain curve.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Correction .acv",
       "what": "Writes a Photoshop curve from your measured press.",
       "status": "shipped",
       "verified": null
      }
     ]
    },
    {
     "area": "Output",
     "rows": [
      {
       "name": "PDF films",
       "what": "One page per screen with a slug, size fixed.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "1-bit TIFF films",
       "what": "PackBits, mirrored if asked, labelled in the file.",
       "status": "shipped",
       "verified": null
      },
      {
       "name": "Projects",
       "what": "Saves a .vortex project, or to the cloud after sign-in.",
       "status": "shipped",
       "verified": null
      }
     ]
    }
   ],
   "shipped": 16,
   "beta": 0,
   "competitors": {
    "checked": "2026-11-01",
    "products": [
     {
      "name": "Separation Studio NXT (with AccuRIP Emerald)",
      "url": "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald"
     },
     {
      "name": "UltraSeps",
      "url": "https://ultraseps.com/"
     }
    ],
    "rows": [
     {
      "label": "Price",
      "hoq": "Free in the browser; paid cloud plan price not published",
      "them": [
       "$399 a year, bundled with AccuRIP Emerald",
       "not published on the vendor page"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://ultraseps.com/"
      ]
     },
     {
      "label": "Runs on",
      "hoq": "A web browser",
      "them": [
       "Windows 10 or 11 x64, macOS Catalina to Tahoe",
       "Inside full Photoshop (not Elements)"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://m.ultraseps.com/photoshop-color-separation-plugin/"
      ]
     },
     {
      "label": "Simulated process separations",
      "hoq": "No; CMYK and spot plates with underbase",
      "them": [
       "Yes",
       "Three simulated process modules"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://ultraseps.com/"
      ]
     },
     {
      "label": "Prints the films",
      "hoq": "Writes PDF and TIFF films; you print them",
      "them": [
       "AccuRIP Emerald in the bundle",
       "not published"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://ultraseps.com/"
      ]
     },
     {
      "label": "Measures your own dot gain",
      "hoq": "Yes, free, from a photo of a printed target",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://m.ultraseps.com/photoshop-color-separation-plugin/"
      ]
     },
     {
      "label": "Shows screen wear and press defects",
      "hoq": "Yes, kept apart from the film",
      "them": [
       "not published",
       "not published"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://ultraseps.com/"
      ]
     },
     {
      "label": "Free trial",
      "hoq": "No trial needed for the free tool",
      "them": [
       "8 days",
       "15 days"
      ],
      "sources": [
       "https://www.screenprinting.com/s/fb_sep-studio-nxt-accurip-emerald",
       "https://ultraseps.com/"
      ]
     }
    ]
   }
  }
 ]
}