TJC Service Docs / Overview

What is TJC Service?

TJC Service is a locally-hosted projection system for True Jesus Church services. It displays sermon titles, Bible verses, and hymn lyrics on a projector screen during services. It is based on the open-source Sporeas project and extended with Google Sheets integration for automatic sermon data.

The system runs entirely on your church's local network on a Proxmox VM (CT102). It works offline — all hymns and Bible data are cached locally.

Who is it for?

RoleAccessWhat they do
AV Membersservice.tjc.org.auSelect church, control hymns, Bible verses during service
Projector screen/projector.htmlDisplayed on the projector — no interaction needed
Admins/admin (PIN)Configure Google Sheets, colour profiles, church list

Key Features

  • 📖 Display sermon titles (English + Chinese) from Google Sheets automatically
  • 🎵 Hymn lyrics in English and Chinese with verse-by-verse display
  • 📖 Bible verses (NASB + CUVT) with chapter/verse selection
  • 🎨 Colour profiles per church (Melbourne warm brown, dark, navy, white)
  • ⛪ Per-device church selection — each AV computer remembers its own church
  • 🔒 Google Sheets access via Service Account — sheet stays private
  • 🌐 Accessible at service.tjc.org.au from any device on the internet

Access URLs

URLPurposeWho
service.tjc.org.auMain app (control panel)AV members
service.tjc.org.au/projector.htmlProjector displayProjector screen
service.tjc.org.au/select-churchChurch selectionAV members (first use)
service.tjc.org.au/adminAdmin panel (PIN required)Admins only
service.tjc.org.au/docsThis documentationEveryone
service.tjc.org.au/api/sermonSermon data APISermonTitles integration

First time setup (AV member)

  1. Open service.tjc.org.au/select-church
  2. Select your church from the dropdown (e.g. Melbourne)
  3. Click Continue — your choice is saved on this computer
  4. You're taken to the main app — sermon data loads automatically
ℹ️

You only need to select your church once per computer. It's saved locally and remembered each visit.

Service day workflow

  1. Open service.tjc.org.au on the control laptop
  2. Open service.tjc.org.au/projector.html on the projector display
  3. Verify today's sermon title appears in the Sermon tab
  4. During service — use Hymns tab for hymn lyrics, Bible tab for verses
  5. Slides tab for announcements and special slides

Changing your church selection

  1. Go to service.tjc.org.au/select-church
  2. Click Clear saved church selection
  3. Select a different church and click Continue

System Overview

Internet
    │
    ▼
service.tjc.org.au (Cloudflare DNS / Synology reverse proxy)
    │
    ▼
Proxmox CT102 — Ubuntu LXC
    ├── Python HTTP Server (port 9000)
    │     ├── Serves React SPA (index.html + assets)
    │     ├── Serves projector.html
    │     ├── GET /api/sermon  → Google Sheets API
    │     ├── GET /api/churches → church list
    │     └── POST /api/set-title → localStorage push
    │
    ├── config.json  (Sheet ID, column mapping, churches)
    ├── service-account.json  (Google auth — admin only)
    └── assets/  (cached JS/CSS/hymn data from CloudFront)

Data Flow — Sermon Auto-fetch

AV computer browser
  → GET /api/sermon?church=Melbourne
  → CT102 server reads config.json (Sheet ID, columns)
  → Server uses service-account.json to get Google OAuth token
  → Calls Google Sheets API v4 (private, authenticated)
  → Finds today's row by date/time
  → Returns: { title, ch_title, speaker, interpreter, hymns }
  → Browser displays in Sermon tab

Offline Capability

All hymn JSON files (1–500) and Bible data are cached locally in /assets/data/ on first load. Once cached, hymns and Bible work without internet. Only sermon data requires internet (Google Sheets API).

Before service

  1. Turn on projector and set input to the AV computer's HDMI
  2. Open Chrome/Edge on the AV computer
  3. Navigate to service.tjc.org.au
  4. Click Hymns tab — verify hymn numbers match the service sheet
  5. Click the Projector button — a popup opens showing what displays
  6. Drag the popup window to the projector screen and maximise it
⚠️

Always open the projector popup BEFORE moving it to the projector screen. Some browsers block popups — allow them for service.tjc.org.au in browser settings.

During service

What to displayWhere to go
Hymn lyricsHymns tab → select hymn → click verse
Bible verseBible tab → select book/chapter/verse
Sermon titleSermon tab → shows automatically
AnnouncementsSlides tab
Clear screenClick the X / blank button

How church selection works

Each AV computer selects its church independently. The selection is saved in the browser's local storage — it persists between visits and browser restarts, but is specific to that computer and browser.

💡

If you use Chrome on one computer and Edge on another, each browser needs its own church selection.

To select / change your church

  1. Go to service.tjc.org.au/select-church
  2. Pick your church from the list
  3. Click Continue

To clear selection

  1. Go to service.tjc.org.au/select-church
  2. Click Clear saved church selection at the bottom

This only clears the church selection — no other data is affected.

Opening the projector

In the app, click the Projector/Output button. A separate popup window opens — this is what goes on the projector. Move it to the second screen and press F11 or maximise it.

If the projector popup closes unexpectedly

  1. Click the Projector button again in the main app
  2. If Chrome is blocking popups: click the popup icon in the address bar → Allow

Direct URL option

You can also open the projector directly by navigating to service.tjc.org.au/projector.html in a separate browser window — useful if you want to use a separate device as the projector display.

Accessing the Admin Panel

  1. Go to service.tjc.org.au/admin
  2. Enter the Admin PIN (default: 1234 — change this immediately)
⚠️

The PIN is stored per browser. Each admin device needs to set its own PIN. Change the default immediately via Admin → Security tab.

Adding churches

  1. Admin → Server tab → Churches
  2. Add each church name exactly as it appears in the Google Sheet tab
  3. Save — the church appears in the AV member dropdown at /select-church

Configuring Google Sheets

See the Google Sheets guide.

Uploading service-account.json

  1. Open Filebrowser at 192.168.178.169:8080 (LAN only)
  2. Drag service-account.json into the app folder
  3. Restart: systemctl restart tjc-service

Required Google Cloud setup

  1. Go to Google Cloud Console
  2. Create a project → Enable Google Sheets API
  3. IAM → Service Accounts → Create → name it tjc-service-reader
  4. Keys tab → Add Key → JSON → download the file
  5. Copy the service account email (ends in @...iam.gserviceaccount.com)
  6. Share the SermonTitles sheet with that email as Viewer
  7. Upload service-account.json via Filebrowser

Sheet column layout

ColumnFieldExample
ADate27/03/2026
BDayFriday
CTime8:00 PM-9:00 PM
DSermon SpeakerBro. Ferry Teja
EInterpreterSis. Yvonne Lim
FSermon Title (English)Waiting for God's Timing
GSermon Title (Chinese)等候神的时间
HStarting Hymn3
IEnding Hymn144

How sermon matching works

The server reads all rows and finds the one closest to now that is either upcoming or within 3 hours in the past (covers services in progress). If no upcoming service is found, it returns the most recent past service.

Available profiles

ProfileGlobal BGAccentPanel BGUsed by
Melbourne#534948 (warm brown)#c7694c (orange)#d9d9d9 (grey)Melbourne TJC
Dark#000000#000000Generic dark
Navy Blue#1a2744#c9a84c (gold)#f0f0f0
Clean White#ffffff#0066cc#ffffff

Applying a profile

  1. Go to /admin → Display tab
  2. Select a profile card
  3. Click Apply Profile to App
  4. The projector screen updates immediately (refresh if needed)

Import your own settings

Export settings from the live service.tjc.org app using their export function, then import the JSON file in Admin → Display → Import.

GET /api/sermon

Returns today's sermon data for a given church.

Query Parameters

ParamRequiredDescription
churchNoChurch tab name. Falls back to server default if not provided.

Example Request

GET /api/sermon?church=Melbourne

Example Response

{
  "date": "03/04/2026",
  "time": "8:00 PM-9:00 PM",
  "title": "Waiting for God's Timing",
  "ch_title": "等候神的时间",
  "speaker": "Bro. Ferry Teja",
  "interpreter": "Sis. Yvonne Lim",
  "hymns": "3, 144",
  "church": "Melbourne"
}

GET /api/churches

Returns the list of configured churches.

{
  "churches": ["Melbourne", "Sydney", "Brisbane"]
}

POST /api/set-title

Push sermon data directly to the projection screen.

POST /api/set-title
Content-Type: application/json

{
  "title":    "Grace of God",
  "ch_title": "神的恩典",
  "hymns":    "123, 456"
}

GET /api/settings

Returns current server configuration (API key masked).

POST /api/settings

Save server configuration.

ProblemCauseFix
Sermon data not loadingservice-account.json missing or wrongCheck Admin → Server tab. Re-upload JSON via Filebrowser.
Title is blankSpeaker hasn't entered title in sheet yetNormal — title shows once entered in the spreadsheet
Wrong church loadedChurch selection mismatchGo to /select-church → Clear → re-select
Projector popup closesBrowser blocking popupsAllow popups for service.tjc.org.au in browser settings
Hymn not foundData not cached yetNeed internet for first load. Once cached, works offline.
Site not loadingCT102 or Synology offlineCheck Proxmox — systemctl status tjc-service
Caller does not have permissionSheet not shared with service accountShare sheet with service account email as Viewer

Restarting the service

systemctl restart tjc-service
systemctl status tjc-service

Viewing live logs

journalctl -u tjc-service -f
v1.3.0 Latest April 2026
  • Added Admin panel at /admin with PIN lock
  • Added Per-device church selection saved to localStorage
  • Added Church selector page at /select-church
  • Added GET /api/churches endpoint for church list
  • Added ?church= parameter on /api/sermon
  • Added Colour profiles — Melbourne, Dark, Navy, White
  • Added Import/Export settings JSON in admin
  • Added This documentation page at /docs
  • Changed Settings page renamed to /admin — hidden from AV members
  • Changed Google Sheets config now admin-only
v1.2.0 Previous March 2026
  • Added Google Sheets API integration via Service Account
  • Added GET /api/sermon — auto-fetch today's sermon by date/time
  • Added Settings page with Test Connection for Google Sheets
  • Added Hymn numbers H and I columns from sheet
  • Fixed HTML footer column leaking into hymns field
  • Fixed Chinese characters displaying correctly in API response
  • Changed col-hymn-end corrected to column I (was J)
v1.1.0 March 2026
  • Added projector.html served correctly with own JS bundle
  • Added CloudFront asset proxy with local caching
  • Added Auto-download missing JS chunks on first request
  • Added data/intl/ language pack proxy
  • Fixed Projector popup showing admin panel instead of lyrics
  • Fixed popup-BMzUajQO.js bundle downloaded and served locally
v1.0.0 March 2026
  • Added Initial deployment — service.tjc.org/v1 cloned via HTTrack
  • Added Proxmox CT102 LXC container running Ubuntu 22.04
  • Added Python HTTP server serving the React SPA locally
  • Added Systemd service — auto-starts on boot
  • Added service.tjc.org.au DNS via Cloudflare + Synology reverse proxy
  • Added Filebrowser at port 8080 (LAN only) for file management
  • Added POST /api/set-title for SermonTitles integration