Documentation

Set up a panel.

From a bare tablet to a published board, in order.

Requirements

  • Android 9 or newer. A tablet, TV box or HDMI stick.
  • A network. Wi-Fi or Ethernet, on a LAN you trust.
  • A browser on the same network, for the admin panel.

No Google services are required. No server, no account and no subscription. The panel is the whole system.

1. Install

Sideload the APK. Over ADB:

adb install -r unikiosk.apk
adb shell am start -n io.unikiosk.kiosk/.MainActivity

Or copy the file to the device and open it in a file manager. You will need to allow installs from unknown sources once.

Make it the home app. The app registers as an Android launcher. Choose it as home so the panel returns to itself after any reboot. Settings → System → Device has a shortcut.

2. First run

A brand-new panel has no layout, so it shows the setup card with its own address on it. That address is where you configure it.

The admin panel sign-in page.
The console sign-in, served by the panel itself.

3. Admin access

A locked panel has no visible way in — that is the point. The way in is a gesture only an installer would know.

  1. Tap the bottom-left corner five times. Quickly, in the same spot.
  2. Enter the admin PIN. The keypad appears over whatever is playing.
  3. Settings open. The board keeps running behind the dialog.
The PIN keypad over a running menu board.
Five corner taps bring up the keypad. Wrong entries are counted and locked out.

Change the PIN before you mount anything. Settings → System → Access. Change the panel's username and password there too.

4. The web panel

Open http://<device-ip>:8080/ from any browser on the network. The device's address is printed on its own setup screen, and in Settings → General → Network.

The console has seven tabs:

  • Status — a live preview of each screen, plus connection and device readouts.
  • General — name, refresh, recovery, network.
  • Display — appearance, orientation, screens, power, screen saver.
  • Content — start page, allowed pages, browser behaviour, toolbar.
  • System — lockdown, hardware, access, device actions.
  • Screens & layouts — the layout library and what is attached where.
  • Media — uploads, including fonts and video.

Every setting here is the same setting as on the device, drawn from one shared spec — so the two can never disagree.

The General settings tab with identity, refresh and recovery sections.
Settings → General, on the device.

5. Start from a template

A blank grid is the slowest way to begin. There are 451 boards already written, across 44 industries, in four screen shapes.

  1. Find one. Filter the template gallery by industry, shape or widget.
  2. Download it. You get a .json layout file, not a picture.
  3. Import it. Screens and layouts, then Import, in the panel.
  4. Make it yours. Swap the words and the photographs, then publish.

The pictures are placeholders. Template photography is licensed for demonstration. Replace it with your own before a board goes on a wall.

6. Design a layout

Go to Screens & layouts → New layout.

  1. Pick a grid. 12×8 suits most boards; 24×16 gives finer control.
  2. Pick a fit. Any screen fills whatever it is put on. This shape keeps the ratio. This size scales the design exactly.
  3. Add widgets. From the palette on the left, or start from a preset.
  4. Place them. Drag to move, pull a corner to resize. They snap to cells.
  5. Configure. Select a widget; its settings appear on the right.
The layout designer with a retail board open, showing palette, canvas and layer list.
The designer. Layers list at the bottom, widget settings on the right.

Design in cells, not pixels. A layout drawn on a 16:10 canvas and shown on a 9:16 totem is not the layout anyone designed. Draw for the shape you will mount.

7. Widget settings

Every widget shares four style fields, whatever its type:

  • Theme — inherit, light, dark, glass, accent or plain. plain removes the cell background and border.
  • Accent colour — overrides the palette accent for that cell.
  • Padding and radius — in pixels.

Common settings worth knowing:

  • Text — pick display for headlines, body for sentences, mono for labels.
  • Imagecover fills the cell and crops; contain fits and letterboxes.
  • Directory — one entry per line, as Name = Room 204.
  • Ticker — plain text or an RSS URL, with a separator between items.
  • QR code — a URL, free text, or Wi-Fi credentials a visitor can join with.
  • Weather — give a latitude and longitude for an exact place.

8. Publish it

Saving does not change the wall. That separation is deliberate: you can edit a board that people are standing in front of.

  1. Save. A version is minted only if something actually changed.
  2. Publish. The chosen version goes to every screen holding this layout.
  3. Attach. In Screens & layouts, pick which display shows it.

The last 20 versions are kept. History restores any of them. Publishing warms the media cache first, so the wall does not spend ten minutes buffering in front of a customer.

9. Media

Four kinds of source, told apart by their prefix:

media:<id>             a file uploaded to this panel
folder:<connector>/…   every file in a network folder
https://…              fetched, and cached unless very large
embed:<url>            a YouTube, Vimeo or Aparat player

Supported files. JPEG, PNG, GIF, WebP, BMP, SVG, AVIF and HEIC. MP4, WebM, MKV, MOV, AVI and TS. MP3, M4A, WAV, OGG and FLAC. PDF.

Network folders. Add a WebDAV, Nextcloud, FTP or HTTP connector and the panel polls it every 15 minutes, so it notices a new poster somebody dropped in.

10. Fonts and right-to-left

Three faces ship with the app: Archivo for headings, Inter for prose and JetBrains Mono for machine text. Any other typeface you need is an upload.

  1. Upload the file on the Media page. TTF, OTF, WOFF and WOFF2 all work.
  2. The family is the filename. Vazirmatn-Bold.ttf becomes Vazirmatn-Bold.
  3. Pick it in any text widget's Typeface field.

Three tweaks turn a widget into a right-to-left one:

  • Text directionrtl flips the run and the alignment.
  • Languagefa-IR or ar-SA drives date and number formatting.
  • Digitsarabext gives Persian digits, arab gives Arabic ones.

Tickers take a direction too, so a Persian crawl runs the right way. The gallery has ready-made Persian and Arabic boards to start from.

Any character, any script. Currency symbols, dashes and percent signs all render, and a script the bundled faces do not cover will render once you upload a face that does.

11. Lock it down

Settings → System. Before a panel goes on a wall, set at least these:

  • Hide the status bar and navigation bar.
  • Require the PIN to leave, so the drawer and console are gated.
  • Launch on boot and restart after a crash.
  • Disable the volume keys for a public panel.
  • Set the app as home, so Android returns to it.

For a display-only board, turn touch off in Settings → Display → Interaction. The corner gesture and PIN pad still work, so you cannot lock yourself out.

12. Power schedule

Settings → Display → Screen and power.

  • Wake at and sleep at — a daily window, in HH:mm.
  • Wake on power connect — recovers from a building power cut.
  • Respect the schedule on wake — a wake command outside opening hours is declined, rather than lighting an empty shop window.
  • Brightness — set a level, or leave the panel alone.

13. Offline behaviour

Cached media keeps playing with the uplink down. When a page genuinely cannot load, the panel shows its own offline card — with your support number on it — and retries on a countdown.

The offline card with a support number, retry button and countdown.
Set the support number in Settings → General.

Recovery is driven by four independent triggers:

  • A fixed reload interval.
  • An idle timeout, with a choice of action.
  • Reconnecting to the network.
  • A page error, retried on its own timer.

Set a startup delay if the panel shows an error for the first few seconds of every power cycle. Without it, the app races DHCP.

14. The API

Everything the console does is a REST call you can script.

# sign in and keep the session
curl -c jar -X POST http://PANEL:8080/api/login \
     -H 'Content-Type: application/json' \
     -d '{"username":"admin","password":"…"}'

# who is this panel?
curl http://PANEL:8080/api/identity

# change settings by dotted key
curl -b jar -X POST http://PANEL:8080/api/settings \
     -H 'Content-Type: application/json' \
     -d '{"display.orientation":"rotation_90"}'

# put a layout on the built-in screen
curl -b jar -X POST http://PANEL:8080/api/screens/assign \
     -H 'Content-Type: application/json' \
     -d '{"screenKey":"","layoutId":"lobby-board"}'

Also available: /api/config, /api/layout with /publish and /revert, /api/media, /api/playlists, /api/storage, /api/status, /api/reload, /api/sleep, /api/wake and /api/brightness.

Troubleshooting

The screen says "Nothing to show yet"

No layout is attached to this display, or the attached one has no visible widgets. Attach one in Screens & layouts, and check the layer list for widgets switched off.

I published, but the wall did not change

Confirm the layout is attached to that screen as well as published — they are separate steps. If it still holds, restart the app from Settings → System → Device.

A board renders as the setup card

The layout has no visible widgets, or none is attached to this screen. Check the layer list for widgets switched off.

I cannot find the panel on the network

Guest Wi-Fi and client isolation block the discovery broadcast. Read the IP from the device's own screen and browse to it directly.

The panel rotated itself

Set a fixed rotation in Settings → Display → Orientation rather than leaving it unlocked.

Video does not start on a second monitor

A known gap: autoplay is not yet enabled on attached displays. Use the built-in screen for video until this ships.

I forgot the PIN

There is no recovery path by design. Reinstall the app, which clears its configuration, and set it up again.

Stuck on something?

Tell us what happened. We answer.