Projects Lingo

Lingo

Language of the Singapore Public Service

The glossary I wish I had when I started work.

A searchable glossary, onboarding guide, and lightweight quiz for people learning the abbreviations, service names, and workplace language of the Singapore Public Service.

Visit site (opens in a new tab)
Lingo landing page for searching Singapore public-service terminology
Search, browse, explore, or start with the newbie guide.

Why it exists

The glossary began with an onboarding problem.

When I joined, documents and conversations were full of abbreviations I did not know.

Colleagues said the same, and internal employee surveys pointed to unfamiliar terminology as a particular pain point during onboarding. The available references were scattered across PDFs, Word documents and intranet pages, so I started collecting terms in one place.

The collection began with abbreviations, then widened to branded names such as ServiceSG and LifeSG, along with workplace expressions such as “seek a steer”, “take offline” and “first cut”. Eventually I renamed it Lingo, a glossary for the language of the Singapore Public Service.

Lingo directory showing Singapore public-service terms beginning with C
The list grew beyond acronyms into the language people meet at work.

Finding a term

Search should tolerate imperfect memory.

Someone might remember a few letters, part of a phrase, roughly how a name sounded, or only what the term did. Lingo has to make use of whichever fragment survived.

Lingo search results showing multiple meanings of DC across Singapore Public Service domains
A query can lead to several meanings, with context to separate them.
First version
Jaro-Winkler and Metaphone handled partial and phonetic matches.
Why it changed
Ranking became expensive to tune as the glossary grew.
Current approach
Meilisearch handles typo tolerance and ranking, with separate description search.
Fallback
The original search still takes over when Meilisearch is unavailable.

Learn from failed searches

Lingo keeps 90 days of submitted searches, including results that found nothing. A short survey can ask what someone expected to find.

Keep identity out of the log

URLs, emails, identity numbers and long phone-like numbers are redacted. IP addresses, user agents and session identifiers are not stored with searches.

Learning earlier

Search starts after a term gets in the way.

The original pain point was onboarding, so I arranged terms around how new officers encounter the Public Service: starting work, attending meetings, writing papers, navigating the hierarchy, handling procurement and working across agencies.

The newbie guide now brings together 222 terms across eight situations. It begins with ten starter terms, then opens into 51 essentials and the wider glossary.

Lingo newbie guide organised around eight common Public Service workplace situations
The guide follows situations a new officer can recognise before they know what to search for.

Explore the shape of the glossary

Nine views surface lookalikes, changing names, workplace language, acronym families and terms with several meanings. The data can teach more than a search box alone.

Practise without ceremony

The quiz uses ten-question rounds and returns missed answers for review. Completed-round totals stay in the browser, with no account, timer or leaderboard.

Inside the newbie guide

Select to enlarge

Explore and quiz

Select to enlarge

Earning trust

Make contributing easy. Make publishing deliberate.

Workplace language varies across agencies, so Lingo needs help finding gaps. It also needs every public entry to pass through research and review.

How an entry reaches search

  1. 01 A lead arrives

    A suggestion, report, survey response or failed query points to a gap.

  2. 02 Research it

    I check the meaning, context and available public sources.

  3. 03 Review and edit

    The private panel keeps evidence, proposed changes and the decision together.

  4. 04 Prepare the draft

    An accepted suggestion becomes JSON for a final manual change.

  5. 05 Release to search

    The embedded JSON remains the source of truth and the index updates with the release.

The first suggestion form asked separately for the term, meaning, agency, source and context. That made submissions easier to process, but suggesting something felt like work. The default is now one text box where someone can paste whatever they have, even if it is only a rough lead.

People can report a problem with an existing entry and point to the fields that need attention. Suggestions, reports, survey responses and analytics sit in one private panel, while the public forms warn contributors to leave out classified, sensitive or personal information.

Running it

Built for the browser people actually have.

Many users reach Lingo through Menlo Security's remote browser isolation, where extra client-side work can become more noticeable than it would on a normal connection.

Application
Go and Templ render the main experience on the server. HTMX handles focused interactions, and JavaScript is divided into page-specific bundles.
Analytics
PostHog loads only on selected public pages. Recording stops when someone types a search, and query pages use event tracking without replay. Authentication, submissions and the admin panel are excluded.
Release
A self-hosted GitHub Actions runner generates code, builds the app, runs Go and browser tests, lints, and checks formatting. It synchronises the Meilisearch indexes before triggering the Coolify deployment.

Most people will use Lingo when a term gets in their way, and that is fine.

They look it up, find the explanation and return to whatever they were doing. The newbie guide gives new officers somewhere to start before that happens, with situations they recognise and a way to practise the terms.

I started with a glossary because that was the simplest answer to the onboarding problem. Over time it has become much closer to the onboarding resource I wanted when I joined.

Built with

Application
Go, Templ, HTMX, Tailwind CSS
Search
Meilisearch, Jaro-Winkler, Metaphone
Data and identity
Embedded JSON, PostgreSQL, Stytch
Product analytics
PostHog, Umami
Observability
Grafana Cloud, OpenTelemetry
Delivery
GitHub Actions, Playwright, Coolify

© 2026 Zixian Chen