A collaborative starting point

Make the next
scene a group decision.

Copy a small Google Meet add-on starter that lets a team, family, or couple choose a public scene together. The screen-share bridge can surface the activity while someone is presenting, before anyone sends a portrait.

Open the attributed demo

The Meet moment

A presentation banner
becomes a shared choice.

Google Meet can promote a published add-on from a screen-shared page. The starter keeps the first step lightweight: a bounded, browser-local duel that asks the group to choose a scene before the app handoff.

Read Google’s screen-sharing guidance ↗
Meet activitytogetherlens.app
Neon city scene previewA · Neon city
Front porch scene previewB · Front porch

Choose a scene together. No account or portrait is needed for the first decision.

The free loop

From presentation
to portrait plan.

Use the artifacts below in an owner-controlled Google Cloud project. Nothing is registered or published from this page.

  1. 01
    Copy the deployment manifest

    Set the side-panel URL and allowed origin, then replace the explicit project-number placeholder in your own deployment.

  2. 02
    Start one Meet activity

    The add-on opens a public two-scene choice. Its additional state contains only the finite TogetherLens acquisition tuple.

  3. 03
    Let the group continue by choice

    After the decision, participants can follow the normal Meet-room handoff. Store links contain no meeting, participant, or claim identifier.

Copy-safe artifacts

Three small files.
One clear route.

The examples use Google’s Meet Add-ons SDK method names and keep all user-owned configuration visible. They never embed a meeting ID, account, participant, or uploaded image.

01 · deployment.jsonMeet manifest
{
  "addOns": {
    "common": {
      "name": "TogetherLens Photo Room",
      "logoUrl": "https://togetherlens.app/icon.png"
    },
    "meet": {
      "web": {
        "sidePanelUrl": "https://togetherlens.app/resources/google-meet-photo-room/",
        "supportsScreenSharing": true,
        "addOnOrigins": [
          "https://togetherlens.app"
        ],
        "logoUrl": "https://togetherlens.app/icon.png",
        "darkModeLogoUrl": "https://togetherlens.app/icon.png"
      }
    }
  }
}
02 · main.jsStart the activity
import { meet } from "@googleworkspace/meet-addons/meet.addons";

const CLOUD_PROJECT_NUMBER = "YOUR_CLOUD_PROJECT_NUMBER";
const MAIN_STAGE_URL = "https://togetherlens.app/duel/?round=17&utm_source=google_meet&utm_medium=activity&utm_campaign=meet_group_room&utm_content=participant";
const SIDE_PANEL_URL = "https://togetherlens.app/resources/google-meet-photo-room/";

export async function setUpTogetherLensActivity() {
  const session = await meet.addon.createAddonSession({
    cloudProjectNumber: CLOUD_PROJECT_NUMBER,
  });
  const sidePanelClient = await session.createSidePanelClient();
  document.querySelector("#start-togetherlens-activity")?.addEventListener("click", async () => {
    await sidePanelClient.startActivity({
      mainStageUrl: MAIN_STAGE_URL,
      sidePanelUrl: SIDE_PANEL_URL,
      additionalData: JSON.stringify({
        source: "google_meet",
        medium: "activity",
        campaign: "meet_group_room",
        content: "participant",
      }),
    });
  });
}
03 · presenter.htmlScreen-share bridge
<script src="https://www.gstatic.com/meetjs/addons/1.1.0/meet.addons.screenshare.js"></script>
<script>
  meet.addon.screensharing.exposeToMeetWhenScreensharing({
    cloudProjectNumber: "YOUR_CLOUD_PROJECT_NUMBER",
    startActivityOnOpen: true,
    mainStageUrl: "https://togetherlens.app/duel/?round=17&utm_source=google_meet&utm_medium=activity&utm_campaign=meet_group_room&utm_content=participant",
    sidePanelUrl: "https://togetherlens.app/resources/google-meet-photo-room/",
  });
</script>

When the group agrees

Bring the chosen scene
into TogetherLens.

The demo is free and browser-local. If everyone has permissioned source portraits ready, continue to the app through the existing Meet-room cohort.