nexa
ExploreServicesAboutTeamFAQBlogContact
GitHubStart a project
Blog · Engineering

From web tool to Chrome extension in a weekend

World Time Buddy started life as our Time Converter website. Turning it into an extension was mostly about deleting UI, not adding it.

Ethan

Tech Lead · Mobile & Web

August 5, 20262 min read

On this page

  1. The weekend, as a timeline
  2. A popup is not a page
  3. One core, two shells
  4. Storage that follows you
  5. Permissions we did not ask for
  6. What we would do differently

People kept telling us they had the Time Converter site pinned in a tab all day. That is usually a sign a tool wants to live closer to where the work happens. So one weekend we tried packaging it as a Chrome extension. This post is the build log, roughly as it happened.

The weekend, as a timeline

  1. Saturday, morningDecide what the popup is forLook at saved zones, check one meeting time. Nothing else.
  2. Saturday, afternoonMove the core into its own moduleThe time-zone maths already had no DOM access. It moved with a few import changes.
  3. Saturday, eveningSwap localStorage for extension storageThe only genuinely new code in the whole project.
  4. Sunday, morningCut the UI down to popup sizeSearch behind one input, saved zones first, timeline second.
  5. Sunday, afternoonStore listing and screenshotsThe part that took longest, and the part we should have done first.
The build, in order. The highlighted step is the only code that had to be written from scratch.

A popup is not a page

The web version has room for a city search, a timeline across the day, saved zones and settings. A popup has roughly the width of a phone held sideways, and it closes the moment you click elsewhere. That changes the job completely.

FeatureWebsiteExtension popup
Saved zonesSidebar listFirst thing you see
Day timelineFull widthCompact, below the zones
City searchDedicated panelOne input at the top
Settings pageYesRemoved, only a 12/24h toggle

One core, two shells

  1. Two shellsDifferent UI and storage, same behaviour
    Website · localStoragePopup · storage.sync
  2. Time-zone corePlain TypeScript, imported by both
    conversiontimelineformatting
  3. Browser time-zone dataComes from the platform, not bundled
    Intl
A fix in the core ships to both products.

Storage that follows you

The website keeps saved zones in localStorage, which belongs to one browser profile on one machine. The extension uses sync storage instead, so zones follow the user to every computer where they are signed in. Listening for changes means an open popup updates without a reload.

const saved = await chrome.storage.sync.get("zones");
render(saved.zones ?? DEFAULT_ZONES);

chrome.storage.onChanged.addListener((changes) => {
  if (changes.zones) render(changes.zones.newValue);
});
  1. Add a cityOn your laptop
  2. storage.syncChrome syncs the change
  3. onChanged firesOn your other machine
  4. Popup re-rendersNo reload needed
How a saved zone travels between machines.

Permissions we did not ask for

We requested storage and nothing else. The extension does not read the pages you visit or inject anything into them. Fewer permissions mean a shorter install prompt, an easier review and fewer reasons to hesitate.

Every permission is a question the user has to answer. Ask as few as you can.

What we would do differently

  • Write the store listing before writing codeIt forces the question of what the product is for.
  • Take screenshots at the required sizes from day one
  • Draft the privacy statement alongside the permission list

Mentioned in this post

World Time Buddy

Case study

Work with us

Need an app like World Time Buddy built?

Our services

Keep reading

All posts
  • AI can design an app now. Are designers redundant?
    Read post

    Design

    AI can design an app now. Are designers redundant?

    AI makes the first draft of a screen cheap. That shifts design work to what matters most: understanding users and choosing what is right for them.

    Tina· Oct 10, 20266 min read
  • AI in software development: turn change into an advantage
    Read post

    Engineering

    AI in software development: turn change into an advantage

    AI does not replace technical thinking. With the right process, it frees teams to focus on the decisions that make products better.

    Ethan· Oct 9, 20264 min read
  • Adding AI to an app without a surprise bill
    Read post

    Engineering

    Adding AI to an app without a surprise bill

    Most of the cost of an AI feature is decided before the first request. Model routing, caching, context size and hard limits, in order of impact.

    Ethan· Oct 7, 20267 min read
nexa
ExploreServicesAboutTeamFAQBlogContact

© 2026 Nexa Tech. All rights reserved.

Web · Mobile · Open source