desktop_windows Desktop admin console · macOS

Copiq.

The control room for your app.

Copiq was built to run Splora. Business listings with a built in chat. A live view of the Postgres data. Feedback and location reports. Users and analytics. Server monitoring and backups. All of it in one calm window on the Mac, with parts detached by design so the same console can support your app.

checkTalks to your API, never to the database checkFirebase authentication built in checkThresholds that warn you in a macOS notification
What it does
01 · Overview

Everything, at a glance.

The first screen every morning. A welcome line that says what is waiting. Seven counts that each open their section. One warnings list that names what needs a person.

check_circleStat tiles for unread business messages · feedback · open location reports · coordinates to verify · businesses pending · app ratings.
check_circleWarnings in one list: a server resource near its limit · a business waiting for a reply · a data check finding.
check_circleRecent activity from the console's own audit trail, each row expanding into field by field changes.
The welcome banner naming what is waiting
02 · Business listings

A queue that talks back.

Every business request from the app or the website lands in one queue. Each one carries a chat with the person who asked, so the whole conversation from first contact to a live listing happens inside the console.

check_circleTabs for Unread · Pending · Contacted · Live · Declined · Unsubscribed · Delisted. The section opens on Unread whenever a customer is waiting.
check_circleSix stage journey from details to live, with a two step approval for the card design and the listing text.
check_circlePush to Splora saves the listing, then asks the same routes a phone reads. Only when a phone is handed the row does the request go live.
check_circleData check after every refresh: a listed request with no listing · a name that differs · a served listing nobody requested. Zero issues is the only clean answer.
check_circleWord filter on both sides of the chat, so an unkind message never leaves either keyboard.
03 · Design studio

From a logo to a live card.

Drop in the customer's logo. Copiq traces it to a clean vector and pulls the colours out of it. Then it shows the Discover card exactly as a phone will draw it. One click sends the design into the chat for approval.

check_circleRaster to SVG through VTracer for full colour marks and potrace for single colour ones. An SVG is used as it is.
check_circleColour swatches read from the logo itself, so the card's title and text colours match the brand.
check_circleLive preview of the card, rendered to a PNG for the chat at up to 2048 pixels on the long edge.
check_circleStored as data, not as a screenshot. The vectors and colours are saved on the listing and every phone draws the card from them.
04 · Discover

Your Postgres data, live.

The master table of places behind Splora's Discover feed as a spreadsheet: search it, sort it and edit it. Every save goes through the API and reaches phones on their next pull.

check_circle34 columns straight from the table, paged in blocks of 2000 with a true row count.
check_circleServer side search over name · category · address · town · province · description · contact fields, with a 250 ms debounce.
check_circleVerify coordinates walks every unverified row with a map. Two people can work top down and bottom up and meet in the middle.
check_circleEdit pane with the right control per column and the same five core fields enforced on every save.
check_circlePaid style pane holding the vectors and colours a Paid listing is drawn with.
05 · Feedback

What people are telling you.

Every message from the app's Send feedback form, newest first. Each carries its category and the app version and the device it came from. Read it and mark it resolved. Reopen it if it comes back.

check_circleBug · idea · praise · other as colour coded chips you can filter on, alongside a resolved or unresolved filter.
check_circleMark resolved and reopen with one click, and mark everything from one person resolved from their user record.
check_circleRefreshes itself every ten minutes and keeps the last good list behind a stale banner if a refresh fails.
06 · Location reports

A decision that reaches the phone.

When someone presses and holds a place in the app and says something is wrong, it lands here grouped by place with every reason. Your decision travels back to the reporter's phone as a banner on the card.

check_circleApprove and the reporter's card reads Updated with their reason and a thank you, once.
check_circleDecline or delete and their card reads Reviewed with no change needed, once, then clears.
check_circleClosed for good asks for a ticked confirmation, then every phone shows a Closed banner and the listing leaves the feed two days later.
check_circleDecided targets prune themselves fourteen days after the decision. Moving one back to Pending stops that clock.
07 · Users

Every account, with its history.

The user grid with search and a standing filter, and a record pane that reads straight from Firebase Authentication. Notes, warnings and account actions are recorded against the person and never rewritten.

check_circleFirebase read of the sign in providers · last sign in · creation date · disabled flag.
check_circleStanding of good · watch · warning · restricted with a reason, visible to staff only.
check_circleDisable · delete · send a reset link · mark all of a person's feedback resolved.
check_circleActivity panel listing their business requests · feedback · location reports · created events, newest first.
08 · Promo events

Reach the people nearby.

Write a promotional event and drop a pin. Pick a radius and send. Every phone inside the ring receives it as a push notification and the event appears on their home feed.

check_circleRadii of 2 · 5 · 10 · 50 kilometres, previewed as a ring on the map before you send.
check_circleNo half sends. An address and a valid coordinate pair are both required and a dialog names whichever is missing.
check_circleThe draft survives a closed pane or a change of section and clears only after a successful send.
09 · Analytics

The numbers, without the tabs.

Google Analytics 4 and Crashlytics read on the server and shown as tiles in the console, so nobody has to sign in to Google to know how the app is doing.

check_circleActive users · new users · sessions · screen views · crash free users over 7 · 30 · 90 days.
check_circleCrashes, non fatal errors and ANRs from Crashlytics on the same page.
check_circleKeys stay on the server. The console never talks to Google directly.
10 · System

Know before it hurts.

Live server health polled every minute. Postgres connections · disk · memory · database size as gauges, with history over 24 hours or 7 days or 30 days. Thresholds that come to find you.

check_circleAmber at 70 percent, red at 90. The marks sit on the gauge so the margin is visible.
check_circleA macOS notification with sound the moment a resource crosses 70 percent, repeating every 30 minutes while it lasts.
check_circleA red pill on every page and a Warnings row on the Overview until it clears. With the console closed the server emails instead.
11 · Backups

A dump a day, on your Mac.

Cloud snapshots on your host are the first line of defence. Copiq adds a second one you can see: a full SQL dump of the database saved to a folder on your own machine.

check_circleAutomatic once a day. Every launch starts with a dump. If today's file exists the job is skipped, otherwise it runs quietly in the background.
check_circleMade for smaller businesses. In addition to your cloud backups you can automate local ones, and choose which tables and which content go in and when it runs.
check_circleOne button for a backup right now. The last time, the duration and any error stay on screen.
check_circleA restore command ready to copy, and an Open folder action.
12 · Transactions

Both stores, one ledger.

Subscriptions from the App Store and Google Play arrive on their own as the stores report them, so both stores are one ledger.

check_circleBoth stores in one list with status pills and four summary tiles over the whole table.
check_circleLapsed at a glance. A subscription past its renewal gets an amber pill, and one due inside seven days is called out.
check_circleStore rows are never hand edited. Corrections belong in App Store Connect or the Play Console.
13 · Team chat

The team, in the same window.

A chat for the admins that lives next to the work. Who is online and what was said, with an unread count on the bell at the top of every page.

check_circlePresence from a heartbeat every 30 seconds. A green dot means seen inside the last 90 seconds, otherwise the last seen time.
check_circleFaster while open. The thread reads every 10 seconds while the section is on screen.
check_circleThe same word filter as the customer chat, applied before a message leaves.
14 · App ratings and notifications

Small things, done properly.

App Store reviews pulled into the console with a reply box, and a notification system that is quiet until it is not.

check_circleApp ratings. Reviews synced from App Store Connect with a summary of count and average, and replies you publish or withdraw from the console.
check_circleThe bell carries the team chat unread count. The red pill in the top bar carries server risk. The sidebar badge carries unread business messages.
check_circlemacOS notifications for a server resource over its threshold and for a new customer message in a listing chat.
check_circleAn API status pill that watches every store, counts failures and opens a list with the exact error text to copy.
Built for Splora. Made to be shared.

Detached by design.

Copiq exists because Splora needed a control room. It was built as a console that talks to an API and never to a database, so the shell and most of its sections work for any app with a Postgres backend and Firebase sign in. Point it at your API and the same login · monitoring · backups · analytics · feedback · team chat run for your product.

desktop_mac

Copiq on the Mac

A Flutter desktop app. Signs in with Firebase over REST and sends the token as a Bearer header on every call. Nothing is cached that should not be.

api

Your API

A Node service with a set of admin routes gated on an allow list of admin ids. Every write lands on the API first and is recorded in an activity trail.

database

Postgres

Self hosted, with PostGIS for the map work. The console never opens a database connection of its own, so there is nothing to leak and nothing to bypass.

Comes with the console

The parts that are about running an app rather than about Splora.

  • check_circleLogin, session and the admin allow list
  • check_circleSystem monitoring with thresholds and macOS notifications
  • check_circleDaily backups and a manual dump
  • check_circleAnalytics from GA4 and Crashlytics
  • check_circleFeedback inbox and app ratings
  • check_circleTeam chat, the bell and the status pill
  • check_circleThe shared map, date and colour pickers

Shaped around Splora

The parts that follow Splora's data and would follow yours the same way.

  • check_circleBusiness listings with the customer chat and the design studio
  • check_circleDiscover, the live grid over the master table of places
  • check_circleLocation reports and the banner loop back to the phone
  • check_circleUsers with standing, notes and activity
  • check_circlePromo events pushed by radius
  • check_circleStore transactions from Apple and Google

Your app deserves a control room.

Copiq runs Splora every day. If you run an app and want the same calm window over it, we would like to hear from you.