# 360ForYou - full product documentation > Complete knowledge base for 360-for-you.com: accounts, uploading, supported formats, viewers (virtual tours, point clouds, 3D Gaussian splats, BIM/IFC, 360 video, PDF, GeoTIFF), collaboration, downloads, pricing and the public API. ## User Accounts: Registration, Login, 2FA, OAuth, Profile, Email Verification ### Sign-in methods available The platform supports two independent sign-in methods, either of which may be enabled or disabled: - Email and password sign-in. - Sign in with an identity provider (SSO): Google, Microsoft, or a generic OpenID Connect provider (shown under its own configured name). When email/password sign-in is disabled, a message states that email and password sign-in is currently disabled. When every sign-in method is disabled, the invite page shows a message to contact the administrator. Self-service registration and auto-provisioning of new SSO accounts can each be turned off separately. When registration is closed, the sign-up page shows a "registration closed" notice. ### Registration (email/password) The sign-up form is at `/signup`. It collects: - **E-mail** - **Name** - **Country** (required; pre-selected from your IP location as a guess) - **Time zone** (required; the browser suggests your time zone) - **Language** (the UI language for the new account; chosen from the available languages) - **New password** - A required consent checkbox agreeing to the Terms and Conditions of Use and/or the Privacy Policy **Password requirements:** at least 12 characters, at least 1 uppercase letter, and at least 1 digit. The form shows live pass/fail indicators for each rule. If the email is already registered, you are told to log in instead. A submission may be rejected as spam. After successful sign-up you are logged in automatically and a verification email is sent. If a message lands in Spam, mark it "Not spam" and move it to your Inbox. If email confirmation is required, you are taken to a confirm-email page; otherwise you go to the upload page. You can carry a `next` destination through sign-up via `/signup?next=...`; you are redirected there after registration if it is a safe local path. ### Registration / sign-in with an identity provider (SSO / OAuth) Buttons: "Sign up with Google", "Sign up with Microsoft", "Sign up with " on the sign-up page, and the equivalent "Sign in with ..." buttons on the login page. Routes: `/google-login`, `/google-signup`, `/ms-login`, `/ms-signup`, `/oidc-login`, `/oidc-signup`. On first SSO sign-in for an address with no account, you are taken to a consent confirmation page (`/oauth-signup-confirm`) where you review your email and name, may edit the display name, choose country / time zone / language, and must accept the terms. The email address comes from the provider and cannot be changed there. The sign-up session expires after 10 minutes. - If the provider reports your email as unverified, sign-in is refused until you verify it with the provider. - If your email is already registered when you complete the confirmation, you are asked to log in instead. - A new SSO account is created with the email already verified; a welcome/verify email is still sent. - Your profile picture from the provider is imported as your userpic (only if it can be safely fetched; max 20 MB). - An SSO account is created without a password. You can later set a password from your profile to also enable email/password sign-in. ### Login (email/password) The login form is at `/login`. You enter your email and password. The login page also links to sign-up and to password reset. - You can pass a `next` destination via `/login?next=...`; after login you are redirected there if it is a safe local path, otherwise to your projects. - Login is rate-limited and the account is temporarily locked after repeated failed attempts; you are told to try again later. - If credentials are wrong, you see a generic "invalid email or password" message plus a reset-password link. - If two-factor authentication is enabled on your account, you are taken to a 2FA verification step before being logged in. - Already-authenticated users visiting login/sign-up are redirected to their profile or projects. ### Two-factor authentication (2FA) 2FA uses a TOTP authenticator app (e.g. Google Authenticator). **Enabling:** From your profile, "Enable 2FA" (`/profile/enable-2fa`) shows a QR code and a text "Security key" you can copy into your authenticator app. You then enter the 6-digit code to verify and activate. The code field auto-submits when 6 digits are entered. **Verifying at login:** On the verify-2fa page you enter the 6-digit code; it auto-submits at 6 digits. Codes are numeric. 2FA attempts are rate-limited and locked out temporarily after repeated failures. **Disabling:** From your profile (`/profile/disable-2fa`). Password accounts must enter their current password and a valid 2FA code. Passwordless (SSO) accounts confirm with the 2FA code alone. Disabling requires confirmation (a "Disable 2FA?" prompt). If 2FA is active, it is also required to change/set a password and to delete the account. ### Password reset and one-time links **Reset password** (`/reset-password`): enter your email. If an account exists, a reset link is emailed (the message may go to spam). The response is the same whether or not the account exists. **Quick-login / set-password link** (`/quick-login?email=...&key=...`): a one-time emailed link that lets you set a new password and sign in. You provide the new password (subject to the password rules); if 2FA is active you also enter your 2FA code. The link may expire or already be used. These links are rate-limited. ### Invitations Invited accounts are created by a project owner and activated via `/invite?email=...&key=...`. The invitee sets their name, country, time zone, language, and a password (password rules apply), and accepts the terms. Invitation links are valid for **14 days**. An invite can be completed instead by signing in with an SSO provider, which activates the account without a password. Invite links only work for accounts that were never signed in to; already-active accounts are told to sign in normally. ### Email verification - After sign-up (or when required), you land on a confirm-email page (`/confirm-email`) that waits for you to open the emailed verification link. The page auto-advances once verification succeeds, even if the link is opened on another device (`/confirm-email/status`). - Verification links (`/verify-email?token=...`) are valid for **1 day**. Expired or invalid links automatically trigger a new verification email. - You can request a new verification email with "Verification email sent" from your profile (`/send-verification-email`). This is rate-limited. - SSO sign-in marks your email as verified. ### Logout and sessions - **Log out** (`/logout`) ends your current session. - **Sign out of all other devices** (`/profile/logout-other-devices`): signs you out everywhere except your current session. There is a confirmation prompt. ### Profile page The profile page (`/profile`) is organized into collapsible sections. **Subscription & billing:** - Shows your current plan title, and (for paid plans) the paid period end date. - Usage summary: number of tours (unlimited), storage time in days (or unlimited), space used out of your plan's GB (or unlimited), max panoramas per tour (or unlimited), and yes/no indicators for offline projects, dedicated server, and support. - Price of your plan (per month, or per N months) when shown. - Free-plan users see "Upgrade your plan!" linking to the pay page; paid users see "Manage subscription". - **Tokens** balance and total used are shown. You can buy tokens (minimum 1, priced at €1 per token). Token usage: CAD conversion costs 0.01 tokens per MB. Payment results show success / cancelled / error banners. **Account & display:** - **Userpic**: upload or delete your profile picture. Allowed file types: `.jpg`, `.jpeg`, `.png`, `.webp`. Max file size 20 MB. Images larger than roughly 5000×5000 pixels (25,000,000 pixels) are rejected. The image is cropped to a circular 100×100 WebP. - **Name**: change your display name (`/profile/change-name`). - **Language**: change your UI language. - **Standard measurement units**: choose Metric or Imperial (applied immediately). - **Country** and **Time zone**: set from dropdowns; the platform can suggest your country (from IP) and time zone (from your browser) with a "Yes" shortcut when not yet set. **Branding & project defaults** (custom logo, subdomain, custom CSS require a paid plan — disabled on the free plan when billing is active): - **Custom logo in projects**: upload/delete a logo (same file types and 20 MB limit as userpic). Set an optional **Custom logo link** (a URL). Opt in to **"Show my logo on the public clients page"** (off by default). - **Custom subdomains**: create a branded subdomain like `https://your-company-name./`. The subdomain must be **5–63 characters**, only Latin letters, digits, and hyphens, and must not start or end with a hyphen. Setting one also gives you a portfolio page listing all your public projects at `.../public-projects`, with copy and QR-code buttons. Clearing the field deletes the subdomain. Taken subdomains are rejected. - **Custom virtual tour CSS stylesheet**: paste CSS applied to your tours. `url()` is not allowed and is stripped; angle brackets are neutralized. - **Default frame-ancestors for new projects**: a whitelist of websites allowed to embed your projects via iframe, separated by spaces (e.g. `example.com another-site.com`). `*` allows embedding anywhere (the default); an empty field prohibits embedding anywhere. This applies as the default for new projects and can be overridden per project. Projects must also have appropriate privacy settings. **Security:** - **Change/Set password**: change an existing password (requires current password) or set a first password on a passwordless account. Password rules apply. If 2FA is active, a 2FA code is also required. A confirmation email is sent when the password is set/changed. - **Active sessions**: sign out of all other devices. - **Two-factor authentication**: enable or disable 2FA. **Integrations** (shown when the corresponding features are enabled): - **API keys**: create, list, and revoke API keys used to upload files and create projects programmatically. Each key has a label (max 100 characters), a set of scopes, created and last-used timestamps, and an Active/Revoked status. Only a short key prefix is shown in the table; the full key is displayed once at creation with a warning to copy it immediately, as it will not be shown again. Revoking a key cannot be undone. Creating keys requires a plan that allows API access; otherwise the button is disabled with "This feature is not available on your plan." Links to the integration guide (`/api-guide`) and API documentation (`/api/v1/docs/`) are provided. - **Google Street View**: connect your Google account to publish 360° tours to Street View; publishing is then done from the Street View panel inside a project. Available only on plans that permit Street View publishing. - **Telegram notifications**: receive notifications in Telegram instead of email. Start a chat with `@threehundredsixty_bot`, then paste your chat ID (or use the provided link) and save. A test message is sent on save. Clear the field and save to stop notifications. The Telegram ID must be numeric. **Privacy & data:** - **Export my data**: download all your personal data as a JSON file (GDPR Articles 15 and 20). Limited to once per day. - **Delete account** (`/profile/delete`): permanently removes all your personal data immediately; cannot be undone. Confirmation depends on your account: - Password accounts confirm with their current password. - If 2FA is active, a 2FA code is also required. - Passwordless (SSO) accounts with no 2FA confirm by re-authenticating through their identity provider ("Confirm with Google/Microsoft/"). ### Language and locale - You can change the interface language at any time (`/set-language`); the choice is saved to your account when logged in. - A cookie-consent state can be recorded (`/cookie-consent`). - Measurement units, country, and time zone can be updated from the profile (`/set-measurement-units`, `/set-country`, `/set-timezone`). ### Account fields stored Each account has an email (verified flag), name, language, country, time zone, optional Telegram ID, measurement units preference, creation date, last-login time, plan and plan-end date, token balance, and customization settings (userpic, custom logo, custom logo link and public-consent flag, custom tour CSS, default frame-ancestors). ## User Groups and Collaboration ### Overview User groups let you organize other users into named groups and grant those groups access to your projects. You must be logged in to use any user group feature. ### Managing Your Groups - View your user groups at `/usergroups`. - Create a group by submitting a title. The new group is owned by you. - Edit a group at `/usergroups/`, where you can change its title. - Delete a group. Only the group owner can delete it. - Group titles are sanitized. Only the owner of a group can view, edit, delete, or manage the members of that group. ### Managing Members - Add a member by entering their email address. The email is validated. - The user must already have an account on the platform; if no user is found for that email, you receive a "User not found." error. - Remove a member from a group at any time. - Adding or removing a member returns you either to the group edit page or the groups list, depending on where you started the action. ### Granting Group Access to Projects - Only a project owner can assign a group to a project. - From a project, you can toggle a group's access using `/projects//set-group`. - If the group is not already assigned to the project, this adds it; if it is already assigned, this removes it. - You must own the group you are assigning. ## Downloading and Exporting Data ### Offline Archive Overview You can export a project as a downloadable ZIP archive that runs offline without an internet connection. The archive contains all project data plus self-contained viewer pages, so every mode of your project keeps working locally. Downloading offline archives is available only on plans that include the offline tours feature. If your plan does not include it, the download option is unavailable. ### Who Can Download Only the project owner can generate a project's offline archive. You must be logged in. ### Generating a Single-Project Archive 1. Go to your project settings. 2. Start the download from `/projects//download`. 3. File generation runs in the background. You receive a message that generation has started and will be notified by email when it is complete. 4. When ready, you get an email containing the download link and the file size. If an archive for the project is already being created, you are told the file is still being processed and that you will be notified by email when it is ready. A new generation is not started while one is in progress. The archive is named after your project title, with a `.zip` extension. ### Archive Contents The archive includes a top-level `index.html` landing page with buttons linking to each available mode of the project. Buttons appear only for the modes your project actually contains: - **Virtual tour** — opens `index.html` - **Point cloud** — opens `potree/pointcloud.html` - **IFC** — opens `ifc/ifc.html` - **3DGS** — opens `3dgs/3dgs.html` - **Map** (shown when the project has GeoTIFF or KML data) — opens `geotiff/geotiff.html` - **PDF** — opens `pdf/pdf.html` - **360° Video** — opens `video360/list.html` Each project's files are stored under `projects//` within the archive. ### Supported Data Types in the Archive The archive bundles whatever your project contains, including: - Virtual tour panoramas (with per-scene pages) - Point clouds, including per-scene and per-sitemap point cloud pages - OBJ and GLB meshes (shown inside the point-cloud viewer; included even if the project has no point cloud) - IFC models (with generated viewer page) - 3D Gaussian Splatting (3DGS) scenes - PDF documents (with a built-in PDF viewer) - 360° videos (with a per-video player and a list page; includes a track minimap) - GeoTIFF map layers and KML overlays (shown on a map) If your project uses a coordinate reference system (EPSG code or custom projection), the required projection grid-shift file is included so coordinates display correctly offline. Your custom logo is included if you have one set; otherwise the default logo is used. ### Running the Archive Offline The archive includes a small local web server to serve the files: - `start_server_windows.exe` for Windows - `start_server_macos` for macOS - `start_server.py` as a cross-platform script Open the served `index.html` to launch the project locally. ### All-Projects Archive You can also receive a single archive containing every healthy, non-deleted project you own. Each project appears under `projects//` with shared assets deduplicated, and the top-level `index.html` lists all your projects and their available modes. This archive is rendered in your chosen language. When the all-projects archive is ready, you are notified by email with the download link, the file size, and the number of projects included. ### Download Endpoints - Project archives are downloaded from `/downloads//.zip`. Access requires that you are the project owner, a project user, a group member, someone with a valid share link, or that the project is public. - The all-projects archive is downloaded from `/downloads/user-projects//.zip`. Only the owning user can fetch it, and you must be logged in. Downloads are served as ZIP file attachments. ### Language The archive's landing pages and viewer text are generated in the language active when you request the download. ### Edge Cases - If a single project inside the all-projects archive fails to build, the rest of the archive is still produced. - Only files with a `.zip` extension that actually exist can be downloaded from the download endpoints; other requests return "not found". ## Automatic Anonymization: Blurring People, Faces, Vehicles and License Plates in Panoramas ### What It Does The platform can automatically detect and blur sensitive objects in your panoramas during processing. Detected objects are covered with a Gaussian blur so they cannot be identified. Four types of objects can be anonymized: - Faces - People (whole persons) - License plates - Vehicles Each type has its own toggle. You can enable any combination of these; only the types you select will be detected and blurred. If none are selected, no anonymization pass runs. ### How It Works When anonymization is enabled, each panorama is analyzed across all six faces of its cubemap. Any detected object of a selected type is blurred in place. If detection cannot run for a tile, that tile is left unchanged and the rest of the panorama continues processing. Enabling anonymization triggers a recompose step so the blurred result is applied to the final panorama. ### Anonymization Engines Two engines are available: - The built-in anonymizer, which is free to use and processes all six cubemap faces. - A paid detection engine. The paid engine requires a positive prepayment balance. If your balance is at or below zero, the paid engine will not run and you will be told you don't have enough tokens to use the object detection service. The free anonymizer has no such requirement. ### Requirements and Edge Cases - The built-in anonymizer must be available on the platform for anonymization to run; if it is unavailable, panoramas are returned unmodified. - If a selected object type is not detected in a panorama, nothing is blurred for that type. - Very small detected regions (one pixel or less in width or height) are skipped. - Selecting an unknown or unsupported engine disables the anonymization pass. ## Pricing, Tariffs, Tokens, and Payments ### Plans and Pricing Overview 360-for-you.com offers a free plan, paid subscription plans, account tokens, and a self-hosted standalone version. Pricing and subscription options are shown on the `/pay` page. Each tariff plan defines: - **Storage period** — how many days projects are stored. - **Storage space** — total storage in GB. - **Number of panoramas** allowed. - **Maximum number of projects** — a specific limit or unlimited. - **Offline tours** availability. - **Dedicated server** availability. - **Support** availability. - **API access** availability. - **Street View publishing** availability. - **Price** and **billing period** (in months). ### Free Plan Users without a subscription can host up to **3 projects** on the site, subject to these restrictions: - Project storage period: **30 days** - Maximum number of setups per project: **10** - Total size of all projects: no more than **1 GB** Point cloud data uses the Entwine Point Tile format, which requires up to 10 times less space than E57 or LAS. ### Subscribing - The `/pay` page displays the pricing table with available subscription plans. - To subscribe, you must be signed up or logged in. Guests see an overlay prompting them to sign up or log in before subscribing. - Subscriptions are handled through the Stripe payment system. - If you are already logged in and have an active paying subscription, visiting `/stripe` redirects you to the Stripe billing portal, where you can manage your subscription (pre-filled with your account email). ### Automatic Renewal and Cancellation - Subscriptions renew automatically each month. - At the end of each billing period, your subscription is automatically renewed and charged using the payment method you specified when subscribing. - Stripe sends you an email notification before each automatic charge, informing you about the upcoming renewal, the charge amount, the date, and other details. - You may cancel at any time without notice. - After cancellation, access to paid features continues until the current billing period ends. - When a subscription ends or is deleted, your account is downgraded to the free plan, and you receive a subscription-expired email. - When a payment is received and a new plan is activated, you receive a payment-received confirmation email. ### Account Tokens - 1 token = **EUR 1.00**. - You can buy whole account tokens from your profile page. Enter a whole number of tokens; the number must be between **1 and 10000**. - Purchasing tokens starts a Stripe Checkout session. On success, you return to your profile at `profile?tokens=success#tokens`; on cancellation, to `profile?tokens=cancel#tokens`; on error, to `profile?tokens=error#tokens`. - If you enter something that is not a whole number, or a number outside the allowed range, you are shown an error and returned to the profile. - Tokens are credited to your prepayment balance after the payment succeeds. Token purchases are one-time and are not treated as a subscription. - The token purchase action is rate-limited. - On your invoice, token purchases read as "1 Token × N". ### Promo Codes - If you have a promo code, you can enter and activate it on the `/pay` page. - Promo code activation is available **only to authorized users on the free plan**. Users on a paid plan see the promo code field disabled. - Enter the code and click **Activate**. A success or error message is shown. - Promo codes can be disabled, may have a maximum number of uses, and may have an expiration date. - Promo code activation is rate-limited. ### Payment Methods Payment for paid services can be made through the Stripe payment system or by direct wire transfer via IBAN. Supported payment methods through Stripe: - Visa, Mastercard, American Express, Discover, Diners Club, China UnionPay - Apple Pay, Google Pay, Link, PayPal - BLIK, Bancontact, EPS, giropay, iDEAL, Sofort, Klarna, SEPA Direct Debit For direct payment by bank transfer (IBAN), contact the platform by email. Stripe features described to users: - Payment information is transmitted and stored only in encrypted form. - Real-time transaction confirmation at the time of payment. - Automatic debiting for subscription services. ### Invoices and Payments - Each payment records the amount, amount paid, associated plan, billing period end, invoice number, and status. - If a payment fails, Stripe may retry the charge; you may be notified of the outcome. - Invoices can be marked paid, uncollectible, or voided, and credit notes may be issued; your payment records are updated to reflect these statuses. ### New Accounts Created via Payment - If a payment is made for an email address that does not yet have an account, an account is created automatically and a password-reset (login) email is sent so you can set up access. ### Self-Hosted Standalone Version - For users especially concerned about data security, a standalone version of the site is available to run on your own server. - The software is supplied as a Docker container and does not require complex installation. - The container includes detailed installation and startup instructions. - To obtain the standalone version, contact the sales department at **sales@360-for-you.com**. ### Terms The full Terms and conditions of use are available at `/terms-of-service`. ## Project Settings Project settings are available only to a project owner. Each settings page lives under `/projects//...`, where `` is the project's 8-character code. A navigation menu links between the settings pages and the project's viewers (Tour, Point cloud, IFC, 3DGS, Map, PDF, 360° Video), which are shown only when the corresponding data exists. While a project is still processing, its settings pages show a spinner with a percentage and the message that processing may take a long time and you will receive an email when it is complete. Pages auto-refresh until processing finishes. ### Basic Settings The Basic settings page (`/projects//settings`) shows a summary table for the project: - **Date** — creation date - **Project** — title - **Setups** — number of enabled setups - **Mode** — privacy mode: public (globe icon), via link (link icon), or private (lock icon) - **Size, MB** - **Last used** date (or `-`) - **Views** count Available actions: - **Add files to the project** (`/projects//add-files-to-the-project`) - **Edit project settings** (opens the edit dialog) - **Download the offline version of the project** (`/projects//download`) - **Duplicate project** — copies the project. Requires confirmation. Copying fails if you have no remaining storage or have reached the maximum number of projects allowed by your plan; in either case you are prompted to upgrade your plan. The copy is created as a non-public project titled " (copy)" and starts empty of views; its files are copied in the background. - **Delete project** or, if the project is a redirect, **Delete project files**. Both require confirmation and cannot be undone. #### Editing project settings The edit dialog offers: - **Name** (project title, required) - **Privacy mode** — public, via link, or private - **Tag** — choose one project tag (or None); a link to manage tags is provided - **Links to other projects** — 8-character project codes, space separated - **Redirect to another project** — a single 8-character project code - **EPSG code or PROJ.4 string** — the project's coordinate system - **Coordinate unit** — the unit in which the project's source coordinates are stored, chosen from a list - **Sites where embedding iframes is allowed** (frame ancestors) - **Commentators** — who may add comments: - `0` — Any visitor (file uploads prohibited) — not recommended - `1` — Any user authorized on the website - `2` — Project users and project owners (default) - `3` — Only project owners - `4` — No one #### Owners Lists current owners with names and emails. You can add an owner by email and remove an owner (removal is only possible when more than one owner exists). Adding owners requires a confirmed email address. Whether or not the invited person has an account, they receive an email invitation that includes the project name, your name, and your email address. You can optionally include a message to the recipient (up to 1000 characters) and choose whether to notify by email. #### Users and groups Lists project users and user groups. You can: - Add a user by email (requires confirmed email); the invitee receives an email invitation containing the project name, your name, and your email address. An optional message (up to 1000 characters) and a "Notify by email" option are available. If the project has links to other projects, an "Also apply to all linked projects" option is offered. - Remove a user. - Attach or detach your own user groups. Groups managed by someone else are shown with a "managed by" note. #### Privacy switch If the project is in private mode, sharing links are hidden and a button lets you switch to "via link" mode. #### Sharing links When the project is ready and healthy, and not private, the page shows link and iframe embed code for each available viewer (Tour, Point cloud, IFC, 3DGS, Map, PDF, Video360). Each section provides a copyable link, a QR code (`/projects/<url>/qr/<path>`), and an iframe snippet. If the owner has a subdomain configured, links use that subdomain. #### Offline version If an offline ZIP has been generated, a download link and its size are shown. #### Log The project log is shown to owners, displaying only error records. Errors are shown in red and warnings in orange. A **clear** button downgrades error markers in the log. #### Copy A "Copy" action duplicates the project including its sitemaps and setups. #### Format-specific notices - **LGS files**: Point cloud import is only available for the LGSx format; a link to the free Leica LGS Converter Tool is shown to convert LGS to LGSx. - **JPG projects**: JPG files do not contain north-direction information. Two ways to fix this: use the "Use GPS coordinates to calculate rotation" button on the Coordinates tab (if images have GPS coordinates and the camera faced the direction of travel with frequent capture positions), or set north manually per station using the "Set North" button. - **RMX files**: RMX files contain incorrect north-direction information. Set north manually per station, or use a CSV file instead. - **Insta360**: If all setups have zero coordinates and the project uses JPG panoramas, a tutorial for creating a tour from Insta360 photos is shown. #### Feedback When enabled, a feedback form lets you send questions, wishes, or suggestions about the project. ### Interface The Interface page (`/projects/<url>/interface`) controls the viewer interface. #### Welcome overlay A text area where you can insert welcome text or safe HTML; it is displayed as a welcome overlay in the tour. HTML is sanitized and plain URLs are turned into links. #### Virtual tour options (on/off switches) - **Left sidebar** (default on) - **Title** (default on) - **Autorotate button** (default off) - **Fullscreen button** (default on) - **Map button** (default on) - **VR button** (default on) - **Device orientation button** (default on) - **Share button** (default on) - **Comment button** (default on) - **Spheres button** (default on) - **Show comment author** (default on) - **Standard-quality panoramas in virtual tour** (default on; if disabled — preview quality) - **Show intensity panoramas** (default on; if disabled — only color panoramas) - **Show north arrow on the floor** (default off) #### Point cloud options - **Panoramas in the point cloud** (default on) #### Spheres scale A numeric spheres-scale value can be stored, bounded between 0.05 and 20.0. #### Apply to all / defaults - **Apply these settings to all my projects** — copies the current on/off settings to all of your projects. - **Set as default for new projects** — saves the current settings as defaults for your future projects. Changing any switch saves immediately. #### Map annotations The project can store up to 500 saved map measurements. Measurement types include measured polyline (length) and area, plus decorative shapes (line, arrow, rectangle, circle, freehand) available only on the standalone big-map. Each measurement may have a color specified as a 6-digit hex value (`#rrggbb`). ### Preview (Thumbnail) The Preview page (`/projects/<url>/thumbnail`) shows the project thumbnail (`/projects/<url>/tiles/logo.jpg`). - **Recreate** — regenerates the thumbnail automatically in the background. - **Change thumbnail** — upload a new image. Accepted formats: `.jpg`, `.jpeg`, `.png`, `.webp`. The uploaded image is trimmed of surrounding white, centered on a white background, and fit into a 512×210 thumbnail. You can also set the tour's main preview from a specific setup using **Make main** (`/projects/<url>/make-main/<mid>`) on the Setups page, which copies that setup's panorama as the project logo. ### Assets The Assets page (`/projects/<url>/assets`) lists the files in the project's assets folder with their sizes, or "No Assets found." if empty. Individual asset files can be opened at `/projects/<url>/assets/<path>`. ### Source Files The Source files page (`/projects/<url>/source-files`) shows the uploaded source archive if present: - Supported archive formats: `.zip` and `.7z`. The archive's file tree and total size are shown. - **Download ZIP** (`/projects/<url>/source-files/download`) — downloads the source archive. - **Delete source files** (`/projects/<url>/source-files/delete`) — deletes the source archive. - **Create a new project from source files** — opens the upload page pre-filled with a download link to this project's source archive. If no source archive exists, "No source files found." is shown. ### Setups The Setups page (`/projects/<url>/setups`) shows an editable table of setups. All fields except `id` can be edited; the virtual tour updates automatically. Table columns: - Panorama thumbnail - **enabled** — on/off toggle - **id** (`mId`, not editable; hovering shows the capture/import time) - **Name** (editable; supports filter with `*` wildcards) - **Type** — RGB, intensity, or RGB+intensity (rows with unknown type are highlighted red) - **Links** — comma-separated list of connected setup ids (editable) - **Sitemap** — assign the setup to a sitemap (editable from a list) - **Action** — Open the setup in a new tab (`./?scene=<mId>`) or delete it Deleting a setup deletes only the panorama; point clouds must be deleted separately. Rows can be reordered by dragging (persisted). You can select visible rows and apply a new value for **enabled** or **Sitemap** to the whole selection at once. #### Sorting - **Sort by ID** - **Sort by name** (natural sort, so "Station 2" comes before "Station 10") - **Sort by time** (by creation time) #### Enabling / disabling setups - **Enable all** (`/projects/<url>/enable-setups`) — enables every setup. - **Keep one setup every X meters along the trajectory and hide others if they are too close** — enter a radius in meters to disable setups too close to a kept one, then links are regenerated. - **Delete all disabled setups** — permanently removes disabled setups and their files. The number of enabled panoramas may be capped by the project owner's plan; excess setups beyond the plan's panorama limit are automatically disabled. #### Regenerate links - **Sequentially (forwards only)** — one-way sequential links - **Sequentially (backward and forward)** — two-way sequential links - **Occlusion filter (high filtering)** — optimal for indoor use - **Occlusion filter (low filtering)** — optimal for outdoor use - **Occlusion filter v2** — experimental, runs in the background - **Delaunay triangulation on each level** - **All-to-all on each sitemap** — links setups within a specified radius (default 10), per sitemap - **All-to-all** — links setups within a specified radius (default 10), across the whole project - **Delete all** — removes all links #### Blur people and vehicles (when available) An anonymizer lets you blur, in the panoramas: - People's faces (including partial) - Whole person (body) - License plates - Whole vehicles This overwrites the original panoramas and cannot be undone. ### Coordinates The Coordinates page (`/projects/<url>/coordinates`) shows an editable table with columns id, Name, PosX, PosY, PosZ, RotW, RotX, RotY, RotZ. All fields except `id` are editable; the tour updates automatically. Tools: - **Set view direction for all stations (degrees)** — sets the same absolute view direction for all setups. An "Apply to enabled setups only" option is available. - **Rotate view direction for all setups (degrees)** — rotates the existing view direction of setups by the given angle. An "Apply to enabled setups only" option is available. - **Use GPS coordinates to calculate rotation** — computes each setup's direction from its position relative to neighbours and regenerates links. Requires at least two setups. #### Set North From the tour viewer, rotating a specific setup to north and applying it sets that setup's rotation, and adjusts the yaw of that setup's comments accordingly. #### Reset coordinates On the Map page, **Reset coordinates** lays out enabled setups on a simple grid (10 per row) at Z=0. This action requires confirmation. ### Sitemaps and Map The Sitemaps/Map page (`/projects/<url>/map`) manages sitemaps (levels) and the map background. #### Sitemaps table Columns: id (`mId`, not editable), Name (editable), Setups (count), Color (editable color picker), Action (delete; if a point cloud exists, a "Point cloud" link is shown per sitemap at `pointcloud?sitemap=<mId>`). - **Add** — creates a new sitemap named "Level N" with a color from a preset palette. If a previous sitemap had a background image, the new sitemap inherits a copy of it. - Rows can be reordered by dragging. - Deleting a sitemap removes it and resets the slider values. New sitemaps are assigned colors from a preset palette of eight colors (sage green, steel blue, warm sand, muted purple, soft coral, teal, golden, lavender blue). #### Set sitemaps for setups by height When setups span a range of Z values, a slider lets you split setups into sitemaps by elevation. Set the slider thresholds, then apply to assign each setup to a sitemap based on its Z position. A **Regenerate links according to Delaunay on each sitemap** button is available here. #### The map view The map shows enabled setups as colored circles with links between them, labeled by setup id (hovering shows the setup name), over an optional background image, with a coordinate grid. Controls: - **Scale** in/out (with a percentage step) - **Rotate** left/right (with a degree step) - **Font size** in/out - **Reset** - **Show names** / **Hide names** - **Edit mode** — lets you drag and drop setups on the map to change their X/Y positions - **Reset coordinates** (with confirmation) #### Map background (basemap) You can upload a basemap by tapping or dragging files onto the drop area. Accepted files: JPG, PNG, WEBP, TIF, TXT, PDF. Uploads are chunked (20 MB chunks) with a per-file maximum of 100 MB. Hidden files (names starting with a dot) are rejected. Options: - **JPG / PNG / WEBP / PDF** — used directly as the background image. - **Faro Scene**: a TIF background together with a TXT file that contains scale and coordinate information positions the background automatically. - **PDF** — is converted to an image for the background. - Alpha channel (transparency) is supported. After uploading a single image, use **Set map position** and adjust scale and rotation, then confirm to place the background for the current sitemap. Images larger than 16000 px on a side are scaled down. - **Delete basemap** — removes the background image for the current sitemap. #### Map settings - **Show links** — toggles whether connections between setups are drawn on the map (default on). #### Colored links The map can color setups by elevation (a height legend is shown) instead of by sitemap color. This is toggled per project (`/projects/<url>/set-colored-links`). #### Regenerate basemaps **Regenerate basemaps** rebuilds all sitemap background maps in the background. ### Comments The Comments page (`/projects/<url>/comments`) lists all comments across setups in an editable table. Columns: setup thumbnail, id (`mId`), Name, **Type** (editable from a list of comment types), **Color** (editable from a list of comment colors), **yaw** (editable), **pitch** (editable), **Text** (editable), **files**, and **Action**. Actions per comment: - **Show** — opens the tour at the comment's setup and view direction (`./?scene=<mId>&pitch=<pitch>&yaw=<yaw>&fov=1.571`) - **Delete** — removes the comment (with confirmation) #### Adding comments Comments can be added from the tour viewer (`/projects/<url>/comments/add`). Who may comment is controlled by the project's Commentators setting. A comment has a scene id, type, color, text, and a yaw/pitch coordinate. - Comment text (HTML) is sanitized. - File attachments to comments are allowed only when the commentator level is above "Any visitor". Uploading files is blocked if the owner's storage quota would be exceeded. - Attached files are shown as file-type icons linking to the file; supported preview icons include jpg, png, txt, pdf, doc, docx, xls, xlsx. - When "Show comment author" is enabled, the author's name and date are shown; otherwise comments appear anonymous. #### Task comments A comment of the task type shows a checkmark to mark the task complete (`/projects/<url>/comments/set-task-complete`), which strikes through its text. #### Editing and deleting - Editing a comment's type or color is limited to the supported values. - Owners can edit any comment. A non-owner can delete only their own comments; owners can delete any comment. Deleting a comment also removes its attached files. #### Sensor embeds Only the project owner can embed their own live sensor readouts into a comment (via a `data-mqtt` span referencing one of their own sensors). Embeds referencing someone else's sensors are removed. Sensor embeds are cleaned up automatically when no comment references them anymore. ### Privacy modes A project's privacy mode is one of: - `0` — public - `1` — via link - `2` — private (default for new projects) ## Project Management: Project List, Cards/Table View, Project Tags, Public Projects ### Project List Overview The project list is available to logged-in users. It shows all projects you own or have access to. It can be displayed in two layouts: - **Cards** view, at `/my-cards` - **Table** view, at `/my-projects` Two buttons at the top ("Cards" and "Table") switch between the layouts. Your last chosen layout is remembered and becomes your default. If your tariff plan includes storage space, a "Create a new project" option is shown, linking to the upload page. If your plan has no storage space, this option is hidden, and if you have no projects, the page shows "You don't have any projects yet." While any project is still processing (not fully ready), the page automatically refreshes periodically to update its status. ### Cards View (`/my-cards`) Each project is shown as a card. Projects that are not attached to any tag appear first. Projects that have tags are grouped into collapsible accordion sections by their root tag; nested tags appear as indented sub-sections. "collapse all" and "expand all" links let you fold or unfold all tag groups at once. The open/closed state of groups is remembered. Each project card shows: - A thumbnail image (once the project is ready), linking to the project. - A processing spinner with a percentage (e.g. "42%") while the project is still being processed. - A privacy indicator icon: - Globe icon = public - Link icon = accessible via link - Lock icon = private - The project title, linking to the project. - A gear (settings) icon linking to `/projects/<name>/settings`, shown only if you are an owner of the project. - A map-pin badge if the project has geographic coordinate information. - A view counter (eye icon) with the number of views. - The project creation date. - The number of enabled setups (record-circle icon), if any. Cards also show badges linking to the available content types of the project: - **Tour** — virtual tour, shown when the project has enabled setups (`/projects/<name>/`) - **Cloud** — point cloud (`/projects/<name>/pointcloud`) - **IFC** — Industry Foundation Classes BIM model (`/projects/<name>/ifc`) - **3DGS** — 3D Gaussian Splatting (`/projects/<name>/3dgs`) - **Map** — GeoTIFF or KML map (`/projects/<name>/geotiff`) - **PDF** — Portable Document Format (`/projects/<name>/pdf`) - **360°** — 360° Video (`/projects/<name>/video360`) Cards for projects that are still processing are highlighted with a colored background. ### Table View (`/my-projects`) The table lists projects with the following columns: - **#** — row number - **Date** — creation date (format dd.MM.yyyy) - **Project** — privacy symbol plus the project title, linking to `/projects/<name>/` - Point cloud icon column (link to the point cloud viewer if available) - Settings gear icon column (link to project settings; shown only for projects you own) - **Setups** — number of enabled setups - **Size, MB** — project size in megabytes - **Source, MB** — size of the uploaded source archive in megabytes; this column appears only when at least one project has a stored source file - **Last used** — date the project was last used (falls back to creation date) - **Views** — number of views Column footers show sums for the Setups, Size, Source, and Views columns. A "Visible:" counter shows how many rows are currently displayed. Each column with a header filter lets you filter rows by typing. The Project title filter supports wildcard matching using `*` (for example, `test*` matches titles starting with "test"). You can sort by clicking column headers. Date columns sort by date. Rows for projects that are still processing (not ready) are highlighted with a colored background. The table refreshes automatically while any project is still processing. **Grouping by tags:** When at least one project is tagged, a "Group by tags" checkbox appears. When enabled, rows are grouped by tag path; untagged projects are grouped under "Untagged". "collapse all" and "expand all" links fold or unfold all groups. Your grouping preference is remembered. **Linking projects together:** Select multiple projects using the row checkboxes, then click "Link selected projects together" to link them into a multiproject. If no rows are selected, nothing happens. A confirmation ("Done") or error message is shown. ### Public Projects The public projects page is at `/public-projects`. It lists projects that users have chosen to make publicly accessible. Each project appears as a card, and public project cards are highlighted with a colored border. The page notes that these are projects posted by website users who chose to grant public access, and that the website developers are not responsible for information posted by users. When the site is accessed through a user's personal subdomain, the public projects page shows only that user's public projects, along with that user's custom logo and logo link. ### Project Privacy Modes Each project has a privacy mode (`privacy_mode`): - `0` — Public - `1` — Accessible via link - `2` — Private (default) ### Project Tags Project tags let you organize your projects into a hierarchy. Tags are managed at `/projecttags`. **Tag list:** The tags page shows all your tags in a nested tree, sorted by full path. Each tag displays its title and the number of projects attached to it. Root tags are shown first, with child tags nested underneath. Each tag has a gear icon to edit it and a trash icon to delete it. If you have no tags, the page shows "No tags have been created yet". **Creating a tag:** Use the "Create new tag" form. Enter a **Title** (required) and optionally choose a **Parent** tag from the dropdown (default "None"). Click "Create". Tag titles are sanitized. **Editing a tag:** From a tag's edit page (`/projecttags/<id>`), you can change its **Title** and **Parent**, then click "Save". You cannot set a tag as the parent of itself or of any of its descendants; attempting this shows: "A tag cannot be set as the parent of itself or any of its descendants." **Deleting a tag:** Click the trash icon next to a tag. Deleting a tag also deletes its child tags. **Restrictions:** You can only view, edit, or delete tags that you own; attempting to access another user's tag is forbidden. A tag's full path is shown as the chain of parent titles joined by " / " (for example, "Site A / Building 1 / Floor 2"). ### Project Attributes Shown to Users - **name** — the project's URL slug, up to 8 characters, used in URLs like `/projects/<name>/`. - **title** — the project's display name. - **created** — creation date. - **views** — number of views (each view increments the view counter). - **size** — project size in MB. - **enabled_setups** — number of enabled setups. - **last_usage** — date the project was last used. - Geographic coordinate information (coordinate system) may be associated with a project. - Content types a project may contain: virtual tour setups, point cloud, IFC, 3D Gaussian Splatting, GeoTIFF map, KML, PDF, 360° video. - **status** — processing status: in queue, started, or ready (100 = fully ready). ### Comment Access Levels Each project has a minimum access level required to comment (`access_level_for_comments`): - **Any visitor (file uploads prohibited)** — including anonymous visitors; at this level file uploads in comments are blocked - **Any user authorized on the website** — any logged-in user - **Project users and project owners** (default) - **Only project owners** - **No one** — comments disabled entirely ## Public REST API v1 ### Overview 360-for-you.com provides a public REST API for third-party integrations. The base path for all endpoints is `/api/v1/`. Interactive API documentation is available at `/api/v1/docs/`, and the machine-readable OpenAPI specification at `/api/v1/apispec.json`. Access to the API requires a tariff plan that permits API use. If your plan does not allow API access, requests return an error indicating the tariff does not allow the API. ### Authentication All API requests authenticate with an API key sent as a Bearer token in the `Authorization` header: ``` Authorization: Bearer sk_... ``` - API keys begin with the prefix `sk_`. - A missing or malformed `Authorization` header returns `401` with `missing_bearer_token`. - An unknown or revoked key returns `401` with `invalid_api_key`. - If your plan does not permit API use, requests return `403` with `tariff_does_not_allow_api`. ### API keys You manage API keys on your profile page at `/profile#api-keys`. #### Creating a key - Available only on plans that allow the API. On other plans, key creation is refused. - Your email must be verified to create a key. - You provide an optional **label** (up to 100 characters). - You select one or more **scopes** (at least one is required). Available scopes: - **projects:read** — List and read your projects via the v1 API. - **projects:write** — Create projects via the v1 API. - **mqtt:publish** — Send MQTT messages from sensors. - When a key is created, the full key value is shown once. Copy it immediately — it will not be shown again. #### Revoking a key - You can revoke any of your own keys from the profile page. - Once revoked, the key can no longer be used. - If a revoked key had the **mqtt:publish** scope, existing MQTT connections that used it stay alive until they disconnect or reconnect — the key is only re-checked when a new connection is opened. #### Scopes Each endpoint requires specific scopes. A request with a valid key that lacks the required scope returns `403` with `insufficient_scope` and the list of required scopes. ### MQTT publishing (mqtt:publish scope) With a key that has the **mqtt:publish** scope, you can send sensor messages over MQTT: - Connect over TLS to `mqtts://<host>:8883`, or from a browser/WebSocket client to `wss://<host>/mqtt/`. - Use your user ID as the username and the API key as the password. - Publish under the topic `users/<your_id>/sensors/<sensor_id>`. ### Rate limits The following per-endpoint rate limits apply: - List projects (`GET /api/v1/projects`): 60 requests/minute - Get project (`GET /api/v1/projects/<url>`): 60 requests/minute - Create project (`POST /api/v1/projects`): 10 requests/hour - Create upload session (`POST /api/v1/uploads`): 10 requests/hour - Upload file/chunk (`PUT /api/v1/uploads/<upload_id>/<filename>`): 1200 requests/minute - File upload status (`GET /api/v1/uploads/<upload_id>/<filename>`): 600 requests/minute - Session status (`GET /api/v1/uploads/<upload_id>`): 120 requests/minute - Delete session (`DELETE /api/v1/uploads/<upload_id>`): 60 requests/minute Exceeding a limit returns `429`. ### Listing projects `GET /api/v1/projects` (scope: projects:read) Returns all projects you own that are not deleted, as a JSON object with a `projects` array. Each item is minimal while the project is still processing (only `name` and `status`) and becomes the full project record once processing is complete. ### Getting a single project `GET /api/v1/projects/<url>` (scope: projects:read) `<url>` is the project's URL slug. - Returns the project summary: minimal while processing, full record once `status == 100`. - `404` (`project_not_found`) if the project does not exist or is deleted. - `403` (`not_your_project`) if the project belongs to another user. #### Project status values - `status` ranges from `0` (queued) through `99` while processing, to `100` (ready). - While `status` is below `100`, only `name` (the URL slug) and `status` are returned. - Once `status` is `100`, the full project record is returned, including fields such as title, privacy mode, size, view count, number of setups, coordinate reference (EPSG), and flags indicating which outputs exist (point cloud, IFC, 3D Gaussian splatting, OBJ, GLB, GeoTIFF, PDF, 360 video, KML). #### privacy_mode values - `0` = public (anyone can access; may appear in Public projects) - `1` = via link (anyone with the link, including guests) - `2` = private (only the owner and invited project users) #### access_level_for_comments values - Any visitor (including anonymous; file uploads also blocked at this level) - Any user authorized on the website - Project users and project owners (default) - Only project owners - No one (comments disabled entirely) ### Uploading files To create a project from your own files, you first create an upload session, stream files into it, then create a project referencing the session's `upload_id`. #### Creating an upload session `POST /api/v1/uploads` (scope: projects:write) - Returns `upload_id` and `expires_in_seconds`. - Abandoned sessions are garbage-collected after they expire (`expires_in_seconds`, 3 days). - The `upload_id` also becomes the project's URL slug on creation, if that slug is still free. - `403` (`tariff_forbids_upload`) if your plan does not allow uploads. - `402` (`storage_quota_exceeded`) if you are out of storage. #### Uploading a file or chunk `PUT /api/v1/uploads/<upload_id>/<filename>` (scope: projects:write) - Upload a whole file in one request, or upload it in chunks. - For a single-shot upload, omit the `Content-Range` header; a `Content-Length` is required (otherwise `411 length_required`). - For chunked uploads, provide a `Content-Range` header of the form `bytes <start>-<end>/<total>`. Chunks must be contiguous and in order. - Path separators in the filename are stripped — no nested folders. To upload a directory tree, upload an archive instead. - Only file extensions allowed for tour creation are accepted; a disallowed extension returns `415` with the offending extension and the list of allowed extensions. - Per-file and per-session size limits apply. Exceeding them returns `413` with `file_too_large` or `session_too_large` (each response includes the applicable limit). - Response body reports `received`, `total`, and `complete`. `complete` becomes `true` once `received == total` and the file is finalized. Error responses: - `400` — `invalid_upload_id`, `invalid_filename`, `invalid_content_range`, or `chunk_length_mismatch` - `404` — upload session not found - `409` — non-contiguous chunk (a gap exists before this offset); the response includes `received` so you can resume #### Checking upload progress `GET /api/v1/uploads/<upload_id>/<filename>` (scope: projects:write) — progress for one file (`received`, `total`, `complete`). Use `received` to resume after an interruption. `404` if the session or file is not found. `GET /api/v1/uploads/<upload_id>` (scope: projects:write) — lists all files in the session with their `name`, `received`, `total`, and `complete`. `404` if the session is not found. #### Deleting an upload session `DELETE /api/v1/uploads/<upload_id>` (scope: projects:write) - Discards the session and everything in it. - Idempotent — succeeds and returns `{"deleted": true}` even if the session no longer exists. ### Creating a project `POST /api/v1/projects` (scope: projects:write) The request body is a JSON object. Files come from either a completed upload session or a remote link. Exactly one of `upload_id` or `download_link` must be provided (not both, and not neither). Requirements and error responses: - `400` — invalid input (for example, both or neither file source provided, an invalid `upload_id`, an invalid `download_link`, or a malformed body) - `402` (`storage_quota_exceeded`) — out of storage - `403` (`project_limit_reached`) — your tariff's project limit is reached - `403` (`email_not_verified`) — a confirmed email is required to create a project or add files (when email confirmation is enabled) - `404` (`upload_session_not_found`) — an `upload_id` was given but no such session exists - `429` — rate limit exceeded On success returns `201` with the project summary plus `"message": "processing_started"`. #### Request body fields - **title** — Any characters allowed, including emojis. Leave blank to auto-generate from the filename or date. Changeable later in Project settings. - **download_link** — Import files from a remote link. Supported sources: direct download link, Google Drive, Dropbox, Yandex.Disk, WeTransfer. Provide this or `upload_id`, not both. - **upload_id** — ID of an upload session whose files have all finished uploading. Provide this or `download_link`, not both. - **privacy_mode** — `0` public, `1` via link, `2` private. Default `2`. Changeable later. - **projecttag** — ID of an existing project tag to attach. Tags organize projects into folders and support a multi-level hierarchy. Changeable later. - **add_setups** — URL slug of an existing project you own, to add files to instead of creating a new one. Equivalent to the web `/projects/<url>/add-files-to-the-project` flow. Does not consume a new project slot. - **autostart** — Start processing immediately after files/links are uploaded. Default `true`. - **save_source** — Store the uploaded source files with the project so they can be downloaded at any time. Paid plans only. Default `false`. - **coordinate_system** — EPSG code, PROJ string, or WKT string. Required to link coordinates to the project's real position on the map. - **correct_very_big_coordinates** — If CAD files contain very large coordinates, try correcting them. Experimental — may work poorly and can damage the model. Default `false`. - **intensity_pano_synthesis** — For SLAM projects, synthesize intensity panoramas in addition to color panoramas. Default `false`. - **autocontrast** — Auto-contrast panorama images. Default `true`. - **correct_equirectangular_panorama** — Reorient panoramas using the provided quaternion to remove tilt and align with the global axes. Default `true`. - **do_not_use_photos** — Do not use embedded panoramic photos; synthesize panoramas from the point cloud instead. Default `false`. - **detect_objects_engine** — Engine for blurring people and vehicles in panoramas. `""` = off (default), `anonymizer` = on-premise (free). - **detect_faces** — Blur faces, including partial. Default `true`. - **detect_people** — Blur whole people (full body). Default `true`. - **detect_plates** — Blur license plates. Default `true`. - **detect_vehicles** — Blur whole vehicles (car/truck/bus/motorcycle/bicycle). Default `true`. - **pano2to1type** — Adjust panoramas to 2:1 aspect ratio. `0` = enlarge canvas (default), `1` = stretch image. - **canvas_size_factor** — Canvas size factor for synthesized panoramas. Default `1.0`. If generated panoramas have many empty pixels, try `0.5`. - **min_time_delta** — Minimum time interval in seconds between JPG panoramas from mobile laser scanners. Panoramas captured more frequently are ignored. Default `1.0`. - **min_distance** — Minimum distance in meters between JPG panoramas from mobile laser scanners. Panoramas captured closer are ignored. Default `2.0`. - **share_s20** — Share S20 panorama stitching mode. `nice` = slow precise stitching, `fast` = quick stitching (default). In both modes panoramas do not exactly match the point cloud. - **new_levels** — Number of floors scanned (for multi-storey buildings). The corresponding number of levels is created; stations are auto-assigned based on elevation. Default `1`. Reconfigurable later. - **process_structured_pc** — Process each point cloud separately (LGSX, RCP, RCS, E57, LAS, LAZ, PTX, PLY, PTS, XYZ). Default `true`. - **process_merged_pc** — Process the merged point cloud for the whole scene. Default `true`. - **e57_ignore_invalid_state** — For E57 files, load points marked as InvalidState. Default `true`. - **decimate** — Simple thinning: keep every N-th point. Allowed values: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512. `1` = no thinning (default). - **max_point_count** — Point limit per point cloud. Default `2000000000`. For a higher limit, contact technical support. - **z_cross_section_on_the_map** — Leave blank to auto-calculate. - **rvt_converter** — Converter for Revit (.rvt) files. `datadrivenconstruction` (default) — free of charge; `Autodesk Model Derivative API` — 0.01 tokens per MB. - **rvt_extended** — For the datadrivenconstruction converter, use extended mode, which rebuilds the IFC geometry as solids. Slower, produces larger files, and may distort the model. Default `false`. - **rvt_property_sets** — For the datadrivenconstruction converter, export Revit parameters and IFC common property sets. Applied on top of the standard geometry (does not change geometry or schema). Default `true`. - **video_1080p** — Generate 1080p (1920×1080, ~6 Mbps) rendition for 360 video. Only generated if source resolution allows. Default `false`. - **video_2k** — Generate 2K (2560×1440, ~10 Mbps) rendition. Only if source allows. Default `false`. - **video_4k** — Generate 4K (3840×2160, ~18 Mbps) rendition. Only if source allows. Default `true`. - **video_5_7k** — Generate 5.7K (5760×2880, ~30 Mbps) rendition. Not supported by iPhone. Only if source allows. Default `false`. - **video_codec** — Video codec used for 360 video renditions. Default `h264`. - **video_preset** — Encoder preset trading off encoding speed vs compression: `veryfast` (~4× faster, ~25% larger files), `faster` (~2× faster, ~15% larger), `fast` (default, ~1.5× faster, ~5% larger), `medium`, `slow` (~1.5× slower, ~5% smaller). ### Typical workflow 1. Create an API key on `/profile#api-keys` with the required scopes. 2. Create an upload session with `POST /api/v1/uploads`, or use a `download_link` instead. 3. If using an upload session, `PUT` each file into it (whole or in chunks), polling status to confirm every file is complete. 4. Create the project with `POST /api/v1/projects`, passing `upload_id` (or `download_link`) plus any processing options. 5. Poll `GET /api/v1/projects/<url>` until `status` reaches `100`, at which point the full record with output flags is returned. ## Publishing 360 Virtual Tours to Google Street View Publish your 360° tours to Google Street View on Google Maps, under your own Google account. Once published, visitors can find your panoramas on Google Maps and walk through them. ### Requirements - A Google account, which you connect once. - The project must have a coordinate system with real-world GPS coordinates. Tours shot on a phone qualify, as do projects with a coordinate system set on the Coordinates page. - The project must have at least one enabled setup (panorama). - Your pricing plan must include Street View publishing. If your plan does not include it, the Street View page is shown in a read-only "not available on your plan" state. If a project has no coordinate system, its panoramas cannot be placed on Google Maps. You will see a warning directing you to set a coordinate system on the Coordinates page first. ### Connecting your Google account Account connection is per user. You can connect from your Profile page or from a project's Street View panel. 1. Click **Connect Google account** and approve access on Google's consent screen. 2. After approving, you are returned to the site and the account is shown as **Connected as** your Google email address. The connection is stored with offline access so the platform can publish on your behalf. If Google does not grant offline access, you are told to remove the app's access at `myaccount.google.com/permissions` and connect again. To disconnect, use the **Disconnect** button on the connect card. Disconnecting deletes the stored credential but does **not** remove panoramas already published — those stay on your Google Maps profile. ### The Street View panel Reach it by opening the project and going to **Settings → Street View** (`/projects/<url>/streetview`). The panel shows a table of your panoramas, one row per enabled setup, with: - A selection checkbox (all selected by default), plus a "select all" header checkbox. - **id** (the setup's id / mId) - **Name** - **Latitude** and **Longitude** (shown to 6 decimal places, or "—" if no coordinates) - **Status** - **Link** ### Status values The **Status** column shows the publishing progress of each panorama: - **Not published** — no publish attempt yet - **Pending** - **Created** — photo uploaded to Street View, navigation connections not yet added - **Published** — connections synced - **Failed** — hovering shows the error message **Status** describes the upload to Google, not Google's own review. Google does not report review progress back to the platform, so the panel cannot show whether a panorama is already live on the map — Google emails you when it is. ### Publishing 1. In the table, leave all panoramas selected or pick specific ones. 2. Click **Publish selected**. 3. Publishing runs in the background and may take a while for large tours. Refresh the page to see each panorama's status. 4. Linked panoramas are connected to each other so visitors can step between them — this appears as the blue navigation line on Google Maps. These links come from the connections in your project. 5. Once a panorama is published, a link to it on Google Maps appears in the **Link** column. You must connect your Google account before publishing. If you are not connected, you are prompted to connect first. On your first publish, Google may ask you to accept the Street View contributor terms in the Google Maps app. After publishing, Google needs time — often days — to review, process, and show panoramas on the map and draw the blue navigation line. Google emails you when a panorama goes live. Follow the **Link** column to check a panorama on Google Maps. The publishing and remove actions are rate-limited. ### Tokens If billing is enabled, publishing charges **1 token per panorama** from your prepayment balance. If your balance is empty, you are told you do not have enough tokens before publishing starts. If your balance is low, publishing processes as many panoramas as it can and then pauses; publish again later to continue. ### Removing panoramas To take panoramas down, select them and click **Remove from Street View**. You are asked to confirm. Removal runs in the background. Disconnecting your Google account does not remove already-published panoramas. ### Publishing rules and requirements Street View has technical and content requirements. Panoramas that don't meet them may be rejected by Google during review. **Technical** - Each panorama must be a full 360° sphere with a 2:1 aspect ratio and valid Photo Sphere metadata. Google identifies a 360 photo by this metadata, not by the pixels. The app prepares all of this for you automatically. - Each image is limited to **75 MB** and **100 megapixels**. - Real GPS coordinates are required — without a position a panorama cannot be placed on the map. **Content** - Publish only your own photography — no third-party or copyrighted imagery. - Photos must look realistic: no heavy editing, collages, or visible stitching artefacts. - No advertising, logos, watermarks, borders, or added text. - Respect privacy. Google automatically blurs faces and licence plates, but don't upload content that depends on it. No private, offensive, or illegal content. - Content must genuinely represent the real-world location it is placed at. **Positioning and connections** - Accurate coordinates keep panoramas in the right spot on the map. - The blue navigation line is built from the links between panoramas in your project. Google may adjust, reposition, or re-create photos and connections to keep the tour realistic. ### Good to know - Street View photos are **public** on Google Maps — only publish tours you want to be publicly discoverable. - Very large projects publish in batches across several days, because Google limits how many photos can be uploaded per day. Just press **Publish** again the next day to continue where it left off. - A guide is linked from the panel and the connect card at `/faq/streetview-guide`. ## Supported File Formats and Processing ### Overview 360-for-you.com processes uploaded files to build virtual tours, point clouds, meshes, 3D Gaussian splats (3DGS), BIM/CAD models, 360-video, PDF, and GeoTIFF visualizations. When you create a project you upload one or more files, and the platform automatically detects the file type and processes it into the tour. ### File Extensions Accepted for Project Creation The following file extensions can be uploaded when creating a project: - Images: `jpg`, `jpeg`, `png`, `tif`, `tiff`, `exr` - Point clouds and scans: `e57`, `las`, `laz`, `lgs`, `lgsx`, `rmx`, `out`, `pts`, `ptx`, `xyz`, `dat`, `opt` - Databases and metadata: `db`, `txt`, `csv`, `json` - Archives: `zip`, `7z`, `rar` - 3D Gaussian splats (3DGS): `ply`, `spz`, `splat`, `ksplat`, `sog`, `rad` - Video and track: `mp4`, `gpx` - Geolocation: `kml`, `kmz` - Documents: `pdf` - ReCap projects: `rcp`, `rcs`, and associated files (`diff`, `llt`, `rcc`, `thumbnail`) ### CAD and BIM Formats - These formats are always accepted: `ifc`, `glb`, `stl`, `obj`, `mtl`, `frag`. - Autodesk Revit files (`rvt`) can be processed when CAD conversion is enabled. - Additional CAD/model formats can be processed when the Autodesk conversion service is enabled: `asm`, `f3d`, `fbx`, `iam`, `ipt`, `neu`, `prt`, `sldasm`, `sldprt`, `smb`, `smt`, `step`, `stp`, `stpz`, `wire`, `x_b`, `x_t`. ### CAD/Model Processing Rules - Processing of Autodesk-converted model formats (the extended CAD list and `rvt` when converted through the Autodesk service) is **not available on the free plan**. - Converting these formats consumes prepaid tokens. The token cost is based on file size: roughly the file size in megabytes divided by 100. - Using models already in IFC or OBJ format is free. - OBJ files larger than 100 MB are automatically decimated (reduced in detail, to about 50% of geometry) before display. - OBJ files are compressed for storage; their reported size reflects the original uncompressed file. - MTL material files are processed together with their matching OBJ file (a file with the same base name must be present). Referenced texture images are imported alongside the model. ### Comment Attachments Files you can attach to a comment: `jpg`, `jpeg`, `png`, `txt`, `pdf`, `doc`, `docx`, `xls`, `xlsx`, `dwg`, `e57`, `ply`, `lgs`, `lgsx`, `ifc`. ### Point Cloud Processing Point clouds are read from E57, LAS/LAZ, PLY, PTS, PTX, XYZ, LGS, LGSX, and ReCap (RCP/RCS) sources. During processing: - Point positions, color (RGB), and intensity are read where present. - Classification and point-source information are preserved from LAS files where present. - A coordinate reference system is detected automatically from embedded metadata (for example WKT in LAS files, or EPSG codes). Files marked as using a local-only coordinate system are treated as having no georeferencing. - Intensity values are normalized to a 0–255 range. #### Point and Cloud Limits - The number of setups (panorama positions) per project is limited by your tariff plan. Files that would exceed this limit are ignored. - The number of point clouds per project is limited by your tariff plan. Clouds beyond the limit are ignored. - A point cloud must contain at least 2 points to be processed. - Panorama synthesis from point clouds is skipped when a cloud exceeds 350 million points. - LGSX export honors a maximum point count; if the limit is reached, extra points are dropped. ### E57 Files - Both 2D images and 3D point clouds inside an E57 file are extracted. - Panoramic (spherical) images, cube-face (pinhole) images, and other embedded images are read. Pinhole faces are assembled into panoramas; non-square pinhole images and other reference images are saved as comment attachments. - Scanner types are auto-detected (including RIEGL, FARO/Faro, Matterport, NavVis) and orientation is corrected accordingly. For NavVis scans, setups are sorted by capture time. - RGB and intensity panoramas are generated. When both exist for one position, the setup is marked as containing both RGB and intensity. - A depth map is generated per panorama where enough points exist. - If a panorama fills less than about 4% of its canvas, it is treated as empty and ignored. - Capture date/time is read from the E57 header where available and used as the setup's creation time. - Synthesized panorama width scales with the "canvas size factor" setting, up to a maximum of 8192 px wide (4096 px for SLAM scans, and lower for lower-resolution captures). - Panoramas whose spherical representation has an incorrect (non-2:1) canvas size may be corrected automatically, or you can change the **Adjust panoramas to 2:1** setting in the project creation options (option value "Stretch image"). - Panorama images are downscaled to a maximum tile size of 2048 px. ### JPG Images with GPS For plain JPG images, GPS coordinates, altitude, and image direction are read from EXIF data if present and used to place the panorama. When a numeric coordinate system is set, coordinates are transformed into it; otherwise a UTM zone is chosen automatically. ### CSV Pose Files CSV files describing panorama positions and orientations are supported from many sources, including: - RIEGL image lists (`imagelist.csv`) - Lixel (`panoramicposes.csv`) - Generic pose files with quaternion columns - `pano_pose_info.csv` - OmniSLAM exports - Register360 exports - Semicolon- and space-delimited pose formats Each recognized row creates a panorama position with location and orientation. Unknown CSV structures are rejected with an error. ### Text and Proprietary Pose Formats - `txt`: iQscene exports and Leica position/orientation text files are supported. - `out`: adjusted station rotation and translation parameters are read to place setups. - `rmx`: translation vector, rotation axis, and rotation angle are read. - `dat`/OmniSLAM binary: camera positions and orientations are extracted. - RiPano JSON: panorama positions are read from a transform matrix; the project coordinate system may be inferred from the file. ### Leica LGS and LGSX - LGS files: an embedded database is located and read for setups, links, sitemaps, and coordinate systems, then panorama images (RGB and intensity cube faces) are extracted directly from the file. BLK2GO captures are detected and handled with forward-only links. - LGSX files: point cloud data and per-setup structuring are extracted. Structured point clouds are split per setup; unstructured clouds are handled as a single cloud. Coordinate transformations found in the project are applied. Any CAD files embedded in the LGSX are processed as CAD. ### Camera-Specific Multi-Image Stitching The platform stitches multi-camera captures into equirectangular panoramas: - CHCNAV RS10 (with Metashape pose files, three-camera setups, and RS10-with-Insta360 variants) - Share S20 (dual fisheye, using `ImgPose.txt` plus `Left.opt`/`Right.opt` optical property files) For these captures: - Setups are filtered by minimum time and minimum distance between successive positions (controlled by the project's minimum time and minimum distance settings). - The number of panoramas is limited by your tariff plan; remaining lines are ignored once the limit is reached. - Share S20 offers a "fast" and a "nice" stitching mode. ### ReCap (RCP/RCS) - RCP projects and RCS scans are read to extract per-scan panoramas and point clouds. - Panoramas are reprojected to correct equirectangular size based on the stored azimuth and elevation ranges. - Grayscale panoramas are treated as intensity; color panoramas as RGB. - Normals can be imported when the "import normals" option is enabled. - The point cloud limit per project (based on your tariff plan) applies; extra clouds are ignored. ### PDF Files Uploaded PDF files are stored with the project and made available in the project's PDF viewer. ### Compression The following file types are stored compressed to reduce storage: `db`, `txt`, `csv`, `e57`, `ply`, `las`, `rmx`, `out`, `pts`, `ptx`, `xyz`, `dat`, `opt`, `rcs`, `llt`, `ifc`, `stl`, `obj`, `mtl`, `step`, `stp`, `gpx`. ### PTS / PTX / XYZ Point Clouds - These text point cloud formats are read with 3, 4, 6, 7, 9, or 10 columns per point (position, optional intensity value, optional RGB color). - Points at the exact origin (0,0,0) are removed as empty. - PTX files additionally apply the per-scan rotation matrix and translation stored in the file header. ### API Upload Limits When uploading through the public REST API (available when the API is enabled for your account): - Maximum size per file: 1 TiB. - Maximum total size per upload session: 1 TiB. ## Uploading Files to the Platform ### Access and Requirements - Uploading requires being logged in with a verified email address. - Creating a new project is available at `/upload`. - Adding files to an existing project is available at `/projects/<url>/add-files-to-the-project`; only the project owner can add files. - If your plan includes no storage space, you are redirected to your projects list instead of the upload page. - If your account has no remaining storage, you cannot create a new project or add files; you are prompted to upgrade your plan. - On the free plan, if you have reached the maximum number of projects allowed by your plan, you cannot create a new project and are prompted to upgrade. - Starting September 1, 2026, a limit on the maximum number of projects per user will be introduced for the Pro and Expert plans. Until then, users on these plans see an informational notice showing their allowed maximum and current project count; if already over the limit, they see a warning that new projects will be blocked after that date. ### Uploading Files - Files are uploaded by tapping the dropzone or dragging and dropping files into it. - The list of supported file formats is available at `/supported-files`. - Files can be compressed using ZIP, 7-Zip, or RAR before uploading. - Only files with allowed extensions are accepted; the accepted extension list is enforced by the dropzone. - Files and folders whose names begin with a dot are rejected as hidden. - Files are uploaded in chunks of 20 MB. Uploads are chunked and retried automatically if a chunk fails. - The page shows an uploaded/total files counter and an estimated time remaining (ETA) during upload. - If you leave the page while an upload is in progress, the browser warns you. ### Resuming Interrupted Uploads - If an upload is interrupted for any reason, simply repeat the same action with the same set of files. Already uploaded data is skipped automatically. - Resume of already-uploaded data is available within 24 hours of the initial upload. ### Download by Link - Instead of uploading, you can paste a link into the URL box to have the platform download the file. - Supported link sources: direct download link, Google Drive, Dropbox, Yandex.Disk, WeTransfer. - An invalid URL is rejected. - Use the "Download and Create new project" (or "Download and update project") button after entering a link. ### RCP Files - Uploading an RCP file alone is not sufficient to process a project. All files from the RCP file's "Support" folder must also be uploaded. If you try to auto-start with only a single RCP file, you are reminded of this. ### Project Options (New Project) - **Project title** — optional. Any characters are allowed, including emojis. Leave blank to auto-generate from filename or date. Can be changed later in Project settings. - **Privacy mode** — options: - `public` (privacy_mode 0) — Anyone can access; may appear in Public projects. - `via link` (privacy_mode 1) — Anyone with the link, including guests. - `private` (privacy_mode 2) — Only the owner and invited project users. - Can be changed later in Project settings. - **Project tag** — assign the project to a tag/folder. Tags can be created to organize projects into folders and support a multi-level hierarchy. Disabled if you have no tags. Can be changed later in Project settings. - **Start processing immediately after files are uploaded** — an autostart switch that automatically begins processing once uploads complete. ### Processing Settings A "Set default values" button resets the form fields to their default values. #### Base Project Settings - **Save source files** — uploaded files are stored with the project and can be downloaded at any time. On the free plan this option is disabled and available only on paid plans. - **Coordinate system** — accepts an EPSG code, PROJ string, or WKT string. Required to link coordinates to the project's real position on the map. - **Levels** — number of levels to create. Stations are automatically assigned to levels based on elevation; when possible, an orthophoto is generated per level; helps create links between stations. For multi-storey buildings, specify the number of floors scanned. Minimum 1. Can be configured later after the project is created. #### SLAM Settings - **Synthesize intensity panoramas** — for SLAM projects, synthesize intensity panoramas in addition to color panoramas. - **Min. time (sec)** — minimum 0.5, step 0.5. Applicable only to projects with JPG panoramas from mobile laser scanners. Panoramas created more frequently than this time interval are ignored. - **Min. distance (m)** — minimum 0.5, step 0.5. Applicable only to projects with JPG panoramas from mobile laser scanners. Panoramas created closer together than this distance are ignored. - **Share S20** — options: - `nice panoramas` — slow processing, panoramas do not match the point cloud. - `poorly composed panoramas` — fast processing; panoramas may not fully match the point cloud, but to a lesser extent. #### Panorama Settings - **Auto contrast** — applies automatic contrast. - **Apply orientation correction** — reorient the panorama using the provided quaternion to remove tilt and align with the global axes. - **Do not use embedded panoramic photos** — synthesizes panoramas from the point cloud instead. - **Blur people and vehicles** (when available) — options: Off, or On-premise (free of charge). When enabled, you can additionally choose to detect and blur: - People's faces (incl. partial) - Whole person (body) - License plates - Whole vehicles - **Adjust panoramas to 2:1** — options: Enlarge canvas, or Stretch image. - **Canvas size factor** — minimum 0.1, step 0.1. If website-generated panoramas have many empty pixels, try reducing the value to 0.5. #### Point Cloud Settings - **Process each point cloud separately** — supported for E57, LAS, LAZ, PTX, PLY, PTS, XYZ (and LGSX, RCP, RCS when those formats are enabled). - **Process the merged point cloud** — processes the combined point cloud. - **For E57 files, load points marked as InvalidState** — includes points marked InvalidState. - **Import normals** — supported for E57 (and RCP, RCS when enabled). - **Simple thinning / Keep every [n]th point** — options: no thinning, 2, 4, 8, 16, 32, 64, 128, 256, 512. - **Z for cross-section on the map** — leave blank to auto-calculate. - **Point limit** — maximum point count. Limits apply per point cloud. To process larger clouds, contact technical support. #### CAD Settings - **RVT Converter** — options depend on which converters are enabled: - datadrivenconstruction.io — free of charge. - Autodesk Model Derivative API — costs 0.01 tokens per MB. - **Export Revit parameters and IFC common property sets** — recommended; adds properties without changing the geometry. - **Extended mode for the datadrivenconstruction converter** — rebuild IFC geometry as solids; slower, larger files, and may distort the model. - **Correct very large coordinates** — if CAD files contain very large coordinates, try correcting them; may work poorly and can completely damage the model. #### 360° Video Settings - **Generate renditions** — choose which resolutions to produce: - 1080p (1920×1080, ~6 Mbps) - 2K (2560×1440, ~10 Mbps) - 4K (3840×2160, ~18 Mbps) — default - 5.7K (5760×2880, ~30 Mbps) — not supported by iPhone - Only renditions that do not exceed the source resolution are generated. Higher resolutions require significantly more time to transcode and more disk space. - **Encoder preset** — options: - veryfast — ~4× faster, ~25% larger files - faster — ~2× faster, ~15% larger files - fast — ~1.5× faster, ~5% larger files (default) - medium - slow — ~1.5× slower, ~5% smaller files - Controls the trade-off between encoding speed and compression efficiency at the same visual quality. ### Adding Files to an Existing Project - The add-files page includes the same processing settings, autostart switch, and download-by-link option. - If the project is not fully processed (status other than 100), the page auto-refreshes to reflect ongoing status. - Submitting updates the existing project rather than creating a new one. ## 3D Gaussian Splatting (3DGS) Viewer ### Supported formats The 3DGS viewer accepts these uploaded file formats: - `.ply` - `.spz` - `.splat` - `.ksplat` - `.sog` When you upload a 3DGS file, it is optimized into a pre-built level-of-detail file for fast loading. If the optimization step is unavailable or fails, the original uploaded file is kept and the viewer still loads it. For `.ply` files, the file is recognized as Gaussian Splatting when its header contains the properties `f_dc_0`, `scale_0`, `rot_0`, and `opacity`. Non-standard spherical-harmonics data in a 3DGS PLY is automatically padded to the nearest standard degree so the file can be processed; this is lossless. A camera-framing bounding box is computed automatically from `.spz`, `.ply`, and `.splat` files so the camera frames the scene on load. For `.ksplat` and `.sog` files no precomputed bounding box is produced; the viewer falls back to a runtime bound or a default camera position. ### Opening the viewer - The viewer is available at `/projects/<url>/3dgs`. - Without any parameters, the viewer loads all 3DGS files in the project. - To open a single file, use `/projects/<url>/3dgs?filename=<name>`. If the named file does not exist, the page returns Not Found. - If the project has no 3DGS files, the page returns Not Found. - A loading spinner shows the download progress as a percentage while files load. - After loading, on-screen keyboard hints are shown briefly (about 5 seconds) and then hidden. #### noUI mode - Add `?noUI=` (the `noUI` parameter) to hide the toolbar, the welcome overlay, and the site logo. - In noUI mode the scene background is white. In normal mode the background is dark blue. ### View controls The viewer has two control modes, selectable from the toolbar or keyboard. #### Orbit mode (default) - Rotate the view by dragging. - Zoom with the mouse wheel or a two-finger pinch. The zoom is an "infinity dolly": when the camera gets very close, it can pass through objects. - `W`/`A`/`S`/`D` (or arrow keys) move the camera and target in the horizontal plane. `R`/`E` move up, `Q`/`F` move down. - Press `O` to return to orbit mode. #### First Person mode - Click the First Person toolbar button to enter this mode, then click the scene to start (pointer lock). A crosshair is shown. - Movement keys: - `W` – Forward - `A` – Left - `S` – Backward - `D` – Right - `R` (or `E`) – Up - `F` (or `Q`) – Down - Mouse – Rotate view - Shift – Acceleration (faster movement) - Exiting pointer lock returns you to orbit mode. #### Toolbar buttons - **Orbit** – switch to orbit navigation. - **First Person** – switch to first-person navigation. - **Reset View** – return the camera to its initial framing. #### Resetting the camera - Click the Reset View button, or - Double-click the middle mouse (wheel) button. The viewer resizes automatically with the browser window. ### 3DGS settings (project owner only) The settings page is at `/projects/<url>/3dgs-settings` and is available only to the project owner (login required). The page lists all 3DGS files in the project in a table with these columns: - **#** – row number - **Name** – the file name (supports filtering, including `*` wildcard matching) - **Size, MB** – file size in megabytes (one decimal place), with a column total - **Rotation X, °** – the mesh rotation angle around the X axis in degrees, editable - **Action** – Open, Download, and Delete controls #### Editing rotation - Click the **Rotation X, °** cell to edit the rotation angle (in degrees) for a file. The step is 1. - The value is saved per file. If the value is invalid, an error message is shown and the previous value is restored. #### Per-file actions - **Open** – opens the single file in the viewer in a new tab (`3dgs?filename=<name>`). - **Download** – downloads the file. - **Delete** – deletes the file (with a confirmation prompt). Deleting a file also removes its stored settings. When the last 3DGS file is deleted, 3DGS is turned off for the project and its 3DGS file extensions are removed. #### Adding files - Use **Add files to the project** (`/projects/<url>/add-files-to-the-project`) to upload more 3DGS files. ### Processing status - While the project is still processing (status not yet complete), the settings page refreshes automatically to reflect progress. ### Sharing / preview image - For projects that are not in private mode, a preview image (`tiles/logo.jpg`) is used as the social sharing image for the viewer page. ## GeoTIFF and KML Map Viewer ### Overview The map viewer displays a project's geographic data as a full-page interactive map. It can show GeoTIFF raster layers, KML/KMZ overlays, camera setups, sitemaps, and GPS tracks from 360° videos. The map is available when the project has map data to display; otherwise the page is not found. ### Accessing the viewer The viewer opens at either of these paths: - `/projects/<url>/big-map` - `/projects/<url>/geotiff` From the project's GeoTIFF & KML settings page, each GeoTIFF layer has an **Open** button that opens the viewer to that specific layer: `/projects/<url>/geotiff?layer=<dir_name>` (opens in a new tab). ### URL parameters - `?layer=<name>` — open the map focused on a specific GeoTIFF layer. - `?noUI` — open a minimal map with the interface controls hidden. - `?scene=...` and other map state are preserved in the URL so the current view can be shared or reloaded. - `?pip=1` — indicates the page was opened via a viewer's "pop out the map" button; the map stays linked to that viewer within the same browser profile. - `?epsg=4326` — honored from a geo pop-out source to keep the map in full geographic mode. - `?video=<stem>` — when opened from a 360° video player, marks which video track is the active/primary one. ### Coordinate reference system behavior - The map uses the project's coordinate reference system (CRS) when available. - If a project has no committed CRS but does have 360° video GPS tracks, the map falls back to WGS84 (EPSG:4326) so it stays geographic with base map tiles. - Projects with a proper geographic CRS show base map tiles (OpenStreetMap / Esri). Projects without one fall back to a local coordinate display with a plain background and no base tiles. ### Map interface controls When the interface is shown (default, not `noUI`), the map provides: - Zoom controls - Attribution - Scale bar - Fullscreen - Mouse position display - Layer switcher (layer panel expanded by default) - Opacity slider - Measurement tools - Gradient display - Connections between setups - Full annotation toolset (available in the standalone big-map view) When `noUI` is set, all of these controls are hidden. ### 360° video GPS tracks - If the project has 360° videos with GPS tracks, the map renders those tracks as lines: one primary track plus neighbour polylines for the other videos. - Clicking a track line navigates to that video's page at the corresponding playback time: `/projects/<url>/video360/<stem>#t=<seconds>`. - Clicking a neighbour line navigates to the other video's page at the corresponding time. - When the map is popped out and linked to a video player, clicking a track seeks the linked player, and clicking a neighbour line switches the linked player to that video and re-links the map to follow it. ### Pop-out / linked map mode When the map is opened as a pop-out linked to a viewer (same browser profile only): - The viewer pushes camera position, active setup, and filters to the map. - The map shows the viewer's camera position as an arrow indicator and recenters when the active setup changes. - The layer panel starts collapsed. - Setup clicks and hovers in the map are sent back to the viewer. - Toggling gradient, visible floors, or hidden panorama types in the pop-out is mirrored to the source viewer, and vice versa. - The page title is prefixed with a map icon. ### GeoTIFF & KML settings page Available at `/projects/<url>/geotiff-settings`. This page requires the user to be signed in and to be the project owner. It lists all GeoTIFF layers and KML/KMZ overlays and allows managing them. #### GeoTIFF layers table Each GeoTIFF layer row shows: - **Name** - **Size, MB** (rounded to one decimal; a column total sum is shown) - **Format** (the tile format) - **Zoom** (the min–max zoom range of the layer) Actions per row: - **Open** — opens the layer in the map viewer. - **Delete** — removes the layer (asks for confirmation). Deleting the last GeoTIFF layer clears the project's GeoTIFF status and removes `tif`/`tiff` from the project's file extensions. #### KML / KMZ overlays table Each KML/KMZ overlay row shows: - **Name** - **Type** (e.g. KML or KMZ, shown in uppercase) - **Size, MB** (rounded to three decimals; a column total sum is shown) Actions per row: - **Delete** — removes the overlay (asks for confirmation). Deleting the last overlay clears the project's KML status and removes `kml`/`kmz` from the project's file extensions. Both tables support filtering by column, including wildcard filtering with `*`. A refresh indicator is shown while the project is still processing (status not yet complete). #### Adding files An **Add files to the project** button links to `/projects/<url>/add-files-to-the-project` for uploading additional GeoTIFF/KML files. ### Export annotations as KMZ The settings page has a **Save annotations as KMZ** button that downloads the project's map annotations as a KMZ file from `/projects/<url>/annotations.kmz` (owner-only). - The download file is named `<project>-annotations.kmz`. - The button is always visible but is disabled with an explanatory tooltip unless **both** conditions are met: - The project is geo-referenced (coordinates can be reprojected to WGS84). Otherwise the tooltip reads "KMZ export is available only for geo-referenced projects". - The project has at least one saved annotation. Otherwise the tooltip reads "No annotations to export". - The heading shows the count of annotations when there are any. ### Social preview When the project is not in private mode, a project logo image is used as the page's Open Graph preview image. ## IFC/BIM Model Viewer ### Overview The IFC/BIM viewer displays 3D building models in the browser. Each project can contain one or more model files that are shown together in a single interactive 3D scene. The viewer is opened at `/projects/<url>/ifc`. ### Opening a model - The viewer URL is `/projects/<url>/ifc`. - Add `?filename=<name>` to open one specific model file. If the named file does not exist, the viewer returns a "not found" error. - Without a `filename` parameter, all model files in the project are loaded together into the same scene. - If the project contains no model files, the viewer returns a "not found" error. - Add `?noUI` to load the model without the on-screen toolbar, panels, and the welcome overlay (a clean embeddable view). - The page title shows the project title. - A loading spinner with a percentage indicator is shown while models download; the percentage counts up to 99% and the spinner disappears once loading finishes. ### Supported file types - Models are shown from converted fragment files (`.frag`), produced from uploaded `.ifc` files. - The project's CAD file area also handles `.obj` and `.glb` files. - Opening a file through `/projects/<url>/open-cad?filename=<name>`: - `.frag` files open in the IFC viewer. - `.obj`, `.glb`, and `.ifc` files open in the point-cloud viewer. ### Camera and navigation - Orbit, pan, and zoom with the mouse. The middle mouse button pans the view. - Double-click the middle mouse button to fit the whole model to the view. - Keyboard movement (when not typing in a field): - `W` move forward, `S` move backward, `A` move left, `D` move right. - `R` or `E` move up, `Q` or `F` move down. - Hold `Shift` to move faster. - Camera position is stored in the URL as `x`, `y`, `z` (camera position) and `tx`, `ty`, `tz` (target) parameters, updated as you move. Opening a URL with these parameters restores that exact camera view, so a specific viewpoint can be shared by copying the URL. ### View cube - A view cube is shown in the top-right corner. - Its faces are labeled U (up/top), D (down/bottom), L (left), R (right), F (front), B (back). - Clicking a face moves the camera to that standard view and fits the model to the screen. ### Toolbar tools The bottom toolbar (hidden in `noUI` mode) provides: - **Cross section** — create a cross-section (clipping plane) of the model. Double-click (or long tap on touch devices) in the scene to create a cross-section plane. The plane can be dragged to move the cut. Press `Escape` to remove all cross-sections. - **Measure length** — click to start; click points in the scene to measure length. Measurements can display rectangular dimensions. Press `Escape` to cancel the current measurement. - **Measure area** — click to start; click points to outline an area, right-click to finish the area. Press `Escape` to cancel. - **Reset all** — clears all measurements, cross-sections, hidden elements, and selections, and shows all categories again. ### Measurement units - Measurement labels are shown in either metric or imperial units, based on the viewer's unit profile (for anonymous viewers, the project owner's setting is used). - Metric length is shown in m, switching to km at 1000 m and above. Metric area is shown in m², switching to km² at 1,000,000 m² and above. - Imperial length is shown in ft, switching to mi at 5280 ft and above. Imperial area is shown in ft², switching to acres (ac) at 43,560 ft² and above, and to mi² at 27,878,400 ft² and above. - Values are rounded to 2–4 decimal places depending on unit. ### Selecting elements - Click an element to select it; the selection is highlighted and the camera's orbit point moves to the selected element's center. - Press `Escape` to clear the selection. - Right-click a selected element (or long-press on touch) to open a context menu with: - **Isolate elements** — hides everything except the selected elements. - **Hide elements** — hides the selected elements. - **Section plane** — creates a cross-section plane. - **Properties** — opens the Properties panel. ### Properties panel - The Properties panel shows the selected element's attributes and property sets (psets). - The **Attributes** group lists the element's own attribute values. - Each property set is shown as its own group listing property names and their values. - If a new element is selected while the panel is open, the panel updates to the new element's properties. - If no properties are available, "No properties" is shown. - Close the panel with its close (×) button. ### Categories panel - Open the Categories panel with the categories button. - It lists each element category present in the model, with a checkbox and the number of elements (count) in that category. - Categories with no visible geometry are not listed. - Uncheck a category to hide all elements of that category; check it to show them. - Click a category name to select (highlight) all elements of that category. - **Hide all** hides every category; **Show all** shows every category. - Categories are sorted alphabetically. - By default, opening cutouts and spaces categories start hidden. - Hidden categories are stored in the URL as a `hidden=` parameter (a comma-separated list), so a view with specific categories hidden can be shared by copying the URL. - Close the panel with its close (×) button. ### Multi-file models and insertion points - When a project has multiple model files, they are positioned in the scene according to a per-file insertion point (x, y, z). - The project owner can edit these insertion points; see CAD file management below. ### CAD file management (project owner only) - The CAD management page is at `/projects/<url>/cads` and requires sign-in; only the project owner can access it. - The page lists all CAD files (IFC-derived fragments, OBJ, GLB) in a table showing: row number, **Name**, **Type**, **Size, MB**, and editable **x**, **y**, **z** insertion-point columns. - The Size column shows a summed total at the bottom. - The Name and Type column headers support text filtering; the Name filter supports `*` wildcards. - Each row has actions: - **Open** — opens the file in the appropriate viewer (in a new tab). - **Download** (download icon) — downloads the file. - **Delete** (trash icon) — deletes the file after a confirmation prompt. - Editing an x, y, z cell saves the new insertion-point value immediately. Invalid values are rejected with an error and the old value is restored. - Deleting a file removes the model and its associated derived files. When the last file of a type (OBJ, GLB, or IFC) is removed, that model type is cleared from the project. - If the project is still processing (status other than 100), the page auto-refreshes. - An **Add files to the project** button links to the project's file-upload page. ### Model–Cloud deviation analysis - If a project has both a point cloud and an IFC model, the CAD page shows a **Model-Cloud deviation analysis** section with a **Calculate deviations** button that starts the deviation calculation. ### Privacy - For projects that are not in private mode, a preview/social-share image (`logo.jpg`) is provided in page metadata. In private mode this image is not exposed. ## PDF Viewer with Annotations, Measurements, Calibration, and Flatten Export ### Overview The PDF viewer displays PDF files that have been added to a project. It shows the document on screen and lets users navigate pages, zoom, rotate, draw annotations, measure lengths and areas, calibrate a scale, and download the file with or without annotations baked in. The viewer is available at `/projects/<url>/pdf`. A specific file can be opened with `?filename=<name.pdf>`. If no filename is given, the first PDF (alphabetically) is shown. If the project has no PDF files, the page returns not found. If a requested filename does not exist in the project, the page returns not found. Add `?noUI` to the URL to display the document without the toolbar, page navigation, file selector, or calibration dialog (a clean, chrome-free view). ### Viewing and navigation The viewer interface provides: - **Previous page** and **Next page** buttons, with a page indicator showing the current page and total (e.g. `1 / 1`). - A **zoom indicator** showing the current zoom percentage (e.g. `100%`). - **Rotate left** and **Rotate right** buttons that rotate the current page view in 90° steps (0/90/180/270). - A **file selector** dropdown, shown only when the project contains more than one PDF. On narrow screens it collapses to a compact menu button. Selecting a file switches to that document. ### Measurement units The viewer uses either metric or imperial units, determined by the project's measurement-unit setting. Calibration and measurement dialogs offer these units: mm, cm, m, in (inches), ft (feet). ### Annotation and drawing tools The bottom toolbar provides these tools: - **Select** — select and manipulate existing objects. - **Calibrate scale** — set the drawing scale (see Calibration). The current scale is shown on the button (e.g. `1:1`). - **Measure length** — measure a distance on the sheet using the calibrated scale. - **Measure area** — measure an area on the sheet using the calibrated scale. - **Freehand draw** — draw freehand lines. - **Line** — draw a straight line. - **Arrow** — draw an arrow. - **Rectangle** — draw a rectangle. - **Ellipse** — draw an ellipse/circle. - **Text** — add a text label. - **Comment** — add a comment box (a text box with a rounded, highlighted background). - **Color** — a color picker that sets the color of new annotations (default red `#ef4444`). - **Save changes** — save annotations to the server. - **Clear all** — remove all annotations. - **Download** — opens a menu with **Download original** and **Download with annotations**. ### Calibration Calibration sets the real-world scale so that length and area measurements are meaningful. The **Set scale** dialog offers two methods: 1. **Enter the scale ratio directly** — enter a sheet value and unit, then a real-world value and unit, in the form "sheet value unit = real value unit" (e.g. `1 mm = 100 mm`). Units available: mm, cm, m, in, ft. 2. **Set scale using a known distance on the sheet** — pick two points on the sheet, then enter the real-world distance between them and choose its unit (m, cm, mm, ft, in). Confirm with **OK** or dismiss with **Cancel**. Calibration data is stored per page. Calibration helper lines and labels are not included when downloading with annotations. ### Saving annotations Annotations are stored per file as a sidecar record and saved when the user clicks **Save changes**. Saving requires being signed in and being the project owner, a project user, or a member of the project's group. Guests and users without those permissions can view and read annotations but cannot save them. Annotations are stored per page and include drawn objects and per-page view rotation. Reading annotations does not require sign-in. If a save is attempted with an invalid filename or invalid data, it is rejected. Saved annotation data counts toward the project's storage size. ### Downloading The download menu offers two options: - **Download original** — downloads the unmodified PDF from `/projects/<url>/pdf/<filename>`. - **Download with annotations** — downloads a flattened copy from `/projects/<url>/pdf/<filename>/download`, with annotations and any view rotation permanently baked into the PDF. Only files ending in `.pdf` can be downloaded. If the requested file does not exist, the download returns not found. When downloading with annotations: - If a page has no drawn objects and no view rotation, that page is served unchanged. - If no page needs baking, the original file is served. - Drawn shapes, freehand paths, text, and comment boxes are rendered into the page content. - The page's view rotation set in the viewer is applied to the downloaded file, so it opens in the same orientation shown on screen. - Existing PDF annotations already present in the file (form fields, sticky notes, markups, stamps) are flattened into the page so they do not hide the added annotations. - If a browser has unsaved changes, it prompts: "You have unsaved changes. Save them before download?" If the annotated version cannot be produced for any reason, the original file is downloaded instead. ### Flatten export limits When baking annotations into a downloaded PDF, the following limits apply: - Maximum **500 pages**; files with more pages are served as the original. - Maximum **10,000 objects per page**. - Maximum **50,000 vertices** per freehand path or polygon. - Maximum **5,000 characters** per text object. - Group nesting up to **5 levels** deep. - Annotation data larger than **20 MB** is ignored during download, and the original file is served. - If flattening takes too long, the original file is served instead. Supported annotation shape types when baking: line, rectangle, circle, ellipse, triangle, polygon, polyline, freehand path, text, comment box, and groups. Colors may be given as hex (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`), `rgb(...)`, `rgba(...)`, or `transparent`. Unknown or malformed objects are skipped. ### PDF settings (project owner only) The PDF settings page is at `/projects/<url>/pdf-settings` and is available only to the project owner. It lists all PDF files in the project in a table showing: - Row number - **Name** (filename), with a header filter - **Size, MB** (file size, rounded to one decimal), with a header filter and a summed total For each file, the actions available are: - **Open** — opens the file in the viewer (`/projects/<url>/pdf?filename=<name>`) in a new tab. - **Download** — downloads the file. - **Delete** — deletes the file after a confirmation prompt. Deleting a PDF also removes its associated annotations and updates the project's storage size. When the last PDF is deleted, the project's PDF feature is turned off and the `pdf` extension is removed from the project. The page also has an **Add files to the project** button linking to `/projects/<url>/add-files-to-the-project`. While PDF processing is still in progress (project status not yet complete), the settings page refreshes automatically. ### Adding PDF files PDF files added to a project are copied into the project's PDF storage, and the project's PDF feature is enabled once a PDF is present. ### Privacy If the project is not in private mode, a preview image is included in the page's social/share metadata. In private mode, no preview image is exposed. ## Point Cloud Viewer ### Opening the Viewer The point cloud viewer displays a project's 3D point clouds in the browser. Several URL paths open the viewer: - `/projects/<url>/pointcloud` — standard viewer. - `/projects/<url>/pointcloud-on-map` — "Globe Mode", which overlays the point cloud on a map globe. Available only when the project has a defined coordinate reference system (EPSG or proj4). - `/projects/<url>/pointcloud-on-satellite` — like Globe Mode but with satellite imagery selected by default. - `/projects/<url>/potree-1.8.2` — an alternate viewer version. Older links to `/projects/<url>/potree/pointcloud.html` (and the `pointcloud-<scene>.html` / `pointcloud-sitemap-<sitemap>.html` variants) are automatically redirected to the current viewer while preserving query parameters. Access requires the viewer to be permitted for that project (project owner, project user, group member, valid link, or a public project). ### Query Parameters The viewer URL accepts these parameters: - `scene=<id>` — show the point cloud for a single scene (setup). Opening a scene also opens the sidebar automatically. - `sitemap=<id>` — show the point clouds for all enabled scenes in a sitemap. - `cloud=<folder name>` — show one specific named point cloud folder. - `filename=<name>` — restrict the view to a single CAD model file (IFC, OBJ, or GLB) by filename. - `settings=<id>` — load a saved viewer settings/link (camera position, view state). When a saved settings file contains its own stored URL, the viewer redirects to reproduce that saved view. - `noUI` — hide the user interface (sidebar, buttons, description); the background is set to white and the navigation cube is hidden. - `x`, `y`, `z` — camera position coordinates. - `pitch`, `yaw` — camera orientation. - `fov` — field of view (in radians). A value of `NaN` switches the camera to orthographic (isometric) projection. If none of `scene`, `sitemap`, or `cloud` is given, the viewer loads all enabled scenes. It also automatically loads a merged point cloud if one exists, otherwise any available structured clouds. ### What Is Displayed The viewer can show, in one scene: - One or more point clouds. - 360° panorama spheres placed at scene positions (if enabled for the project). - CAD models in IFC, OBJ (with optional MTL materials), and GLB formats, grouped under a "CADs" node in the scene tree. If a project has no point cloud, no IFC, no OBJ, and no GLB content, the viewer returns "not found". ### 360° Spheres - Spheres appear when the project's interface has 360° spheres enabled. - Buttons let you enable or disable the 360° spheres, double the sphere size, and reduce the sphere size by half. - The number of spheres shown is limited by the project owner's tariff plan panorama limit. Plans with an unlimited allowance show all spheres. - Intensity panoramas are displayed using their intensity image variant. - For the project owner, disabled scenes' spheres are also loaded (hidden), so re-enabling a scene from the mini-map context menu shows its sphere without reloading the page. This applies only in the full-project view, not the per-scene or per-sitemap views. ### Viewer Controls and Buttons When the UI is shown, the viewer offers: - A sidebar (scene tree, tools, measurement, settings). - **FOV** slider to adjust field of view (default shown as 60/75). - A **Full screen** / **Window** toggle. - **Switch between RGB/Intensity** — toggles point coloring (shown when point clouds are present). - **Switch between Standard/High Splat Quality**. - **Switch between Perspective/Isometric** projection. - A **Frequently Asked Questions** link. This opens a project owner's custom FAQ link if configured, otherwise a built-in guide PDF (a German version for German language, otherwise the default guide). - In Globe Mode with a coordinate system defined, a **Globe Mode** button appears in the quick buttons to open the map-overlay view. Length units in the viewer follow the project's coordinate unit; measurement units follow the project's imperial/metric setting. Supported coordinate units include meters, centimeters, millimeters, feet, US survey feet, and inches. The viewer language matches the current site language. ### Avatar (Third-Person) Navigation A third-person avatar navigation mode can be activated from the sidebar. In this mode: - A humanoid avatar is placed in the scene, standing on the ground level of the point cloud's bounding box. - Movement uses the WASD keys, with Q/E/R/F for vertical movement; an on-screen joystick is also shown. - The avatar's walking animation reflects movement. - Its vertical position is linked to the map-offset slider. ### Globe Mode (Map/Satellite Overlay) When opened on the map, the point cloud is aligned to a 3D globe: - Layer options: **OpenStreetMap** and **Satellite (Esri)**. Satellite is selected by default; the satellite path pre-selects satellite imagery. - A **Map offset** control (slider with − and + buttons, step 0.1) vertically shifts the point cloud relative to the map. The current offset value is shown and adjustments are saved automatically for the project. - KML/KMZ overlays configured for the project are drawn on the globe. GeoTIFF raster overlays are shown only on the 2D mini-map, not on the globe. The **Map offset** value can also be set directly via `POST /projects/<url>/set-cesium-map-offset` with `cesium_map_offset` (setting saved by the project owner). ### AppMap Mini-Map The viewer includes a mini-map that can show the project's scenes, sitemaps, GeoTIFF layers, and KML layers. Links between scenes can be displayed, optionally colored, depending on project settings. The mini-map toggle replaces the built-in map. ### Saving and Sharing Views (Settings / Links) - The current view can be saved as a settings file via `POST /projects/<url>/potree/save-settings`. The request body holds the view data and is limited to 1 MB; larger uploads are rejected. This endpoint is rate-limited to 6 requests per minute. It returns an identifier that is used as the `settings` parameter to reopen that saved view. Saved settings count toward the project's storage size. - Saving is available to anyone allowed to view the project (owner, project user, group member, valid link, or public project). - Saved views are listed on the project's Point clouds page under **Created links**, each with its creation date and a link of the form `/projects/<url>/pointcloud?settings=<title>`. - The project owner can delete a saved view via `POST /projects/<url>/delete-point-cloud-settings` (from the **Created links** list). Deleting frees the corresponding storage. ### Point Clouds Management Page (Project Owner) At `/projects/<url>/clouds` the project owner sees and manages the project's point clouds. This page requires login and project ownership. The page shows: - A **Merged point cloud** table (if a merged cloud exists), listing its name, point count, and size in MB. - A **Structured point clouds** table listing each cloud's name, point count, and size in MB, with per-row totals. Each row has an **Open** action (opens `pointcloud?cloud=<name>`) and a **Delete** action. The Name and Points columns can be filtered; the name filter supports `*` wildcards. - An **Add files to the project** link. - A **Delete all point clouds** button (with confirmation) when clouds exist. - **Process the merged point cloud from structured clouds** — shown when there is more than one structured cloud. This builds a merged point cloud in the background. - **Model-Cloud deviation analysis** with a **Calculate deviations** button — shown when the project has both a point cloud and IFC content. This runs a deviation calculation in the background. - **Created links** listing saved views with delete buttons. While processing (merging, deleting all, or deviation), the project status is reset and the page auto-refreshes until processing completes. ### Owner Actions and Routes - `POST /projects/<url>/create-merged-point-cloud` — start merging structured clouds (owner only; redirects to the clouds page). - `POST /projects/<url>/delete-cloud` with `name` — delete a single named cloud (owner only). If no cloud folders remain afterward, point cloud status is cleared. - `POST /projects/<url>/delete-all-clouds` — delete all structured clouds in the background, keeping any merged cloud and saved settings (owner only). - `POST /projects/<url>/calculate-deviation` — run model-cloud deviation analysis (owner only). Deleting clouds updates the project's stored size. ### Performance Notes - The point budget (number of points drawn) is limited for VR headsets and reduced on touch devices; on standard devices it is higher. These limits are applied automatically. - Eye-Dome Lighting is enabled by default. - CAD files load sequentially with a loading progress percentage shown during loading. ## Virtual Tour Viewer (360° Panoramas) ### Overview The virtual tour viewer displays a project as a set of connected 360° panoramas (called scenes or setups). Each panorama is a station with a position and orientation. The viewer is reached at `/projects/<url>/` when the project contains panorama setups. Visiting `/projects/<url>/` also redirects to other viewers depending on the project type (point cloud, IFC, 3D Gaussian splatting, PDF, 360° video, or GeoTIFF/KML map). If the project is still processing (not yet ready), a processing page with an auto-refresh is shown instead of the tour. ### Access and viewing - The URL pattern is `/projects/<project-name>/`. Visiting `/projects/<project-name>` or `/projects/<project-name>/index.html` redirects to `/projects/<project-name>/`. - A view is counted each time the tour page is opened. - You can check your access level for a project via `/projects/<url>/check-access-level`, which returns your access level, your user id, and a CSRF token. If you are not logged in, the access level is 0. - Regular viewers only see active (enabled) panoramas. Project owners additionally see disabled panoramas, which are listed after the enabled ones, so they can re-enable them. - The number of panoramas shown is capped by the project owner's tariff plan panorama limit. If the plan allows unlimited panoramas, all are shown. Only the first N panoramas (up to the limit) are displayed. - If the project has no displayable panoramas, the tour does not render. ### Scene navigation - A scene list panel lists all panoramas. Clicking a row switches to that panorama. The panel can be toggled open/closed. On mobile, opening the scene list closes the info panel. - Link spheres inside the panorama point to connected panoramas. Clicking a sphere navigates to that panorama and orients the view in the direction of travel. - The current scene is reflected in the URL as `?scene=<id>`, together with `pitch`, `yaw`, and `fov` parameters. Browser back/forward navigation moves between visited scenes. - You can deep-link to a specific scene and view orientation using `?scene=...&pitch=...&yaw=...&fov=...`. - `?autorotate=1` (or any `autorotate` value) in the URL starts autorotation on load, even when the autorotate button is hidden. - The page title updates to show the current scene's name. ### View controls - Drag with the mouse to look around. - Horizontal scroll wheel (or shift+wheel) rotates the view left/right. Vertical wheel zooms. - On VR-capable devices, an immersive VR mode loads automatically when a headset is detected. - On mobile devices with a gyroscope, a device-orientation toggle lets you look around by moving the phone. On iOS-style devices, permission is requested first. - The field of view is limited (traditional rectilinear limits, up to 160° horizontal and vertical). ### Autorotate and slideshow - An autorotate toggle button (when shown) starts/stops automatic rotation. - While autorotating, the view idles into rotation after a few seconds of no interaction, and the tour advances to the next scene automatically about once a minute (slideshow). ### Panorama quality and types - Panoramas render as cube-map tiles. High-quality mode loads higher-resolution tiles (2048 px); otherwise a single lower-resolution level (256 px) is used. High quality is on by default and controlled by a project interface setting. - Panoramas have a type: RGB, Intensity, or both RGB and Intensity. - When a project includes intensity panoramas, a pano-type selector lets you choose: - **Auto** — shows intensity for intensity-only scenes, RGB otherwise. - **RGB only** — hides link spheres pointing to intensity-only scenes and shows a placeholder for scenes that have no RGB. - **Intensity only** — hides link spheres pointing to RGB-only scenes and shows a placeholder for scenes that have no intensity. - Intensity panoramas can be disabled entirely for a project via a project interface setting, in which case intensity-only scenes are excluded. ### Link spheres - Link spheres are sized adaptively: at the project's typical inter-station distance a sphere occupies a fixed fraction of the viewport, so tours at very different scales (a 1 m-step apartment vs a 1 km-step quarry) look consistent. Within a scene, closer links appear larger and farther links smaller. A single sphere's growth is capped at 5× the baseline size. - A +/- control adjusts the overall sphere size (a user-facing multiplier). - Each link sphere shows a tooltip with the target scene's name and the distance to it, formatted in the project's display units. - Sphere colour is either a height-based colour gradient (when "colored links" is enabled for the project) computed from each station's Z height, or the colour of the target station's sitemap. The default colour is `#84a98c`. - Distances and directions are computed from station coordinates. When the project has a coordinate reference system, distances use true great-circle distance and true-north bearings so the tour looks identical regardless of which CRS was used to store it. Without a CRS, raw local coordinate deltas are used. - When several link targets lie in nearly the same direction (within 10°), only the closest is shown, so distant links along the same sightline are not hidden behind nearer ones. ### Info hotspots - Info hotspots show a title and text. Clicking the header expands/collapses the text. On mobile, a full-screen modal version is used. ### Comments - Comments appear as coloured markers placed in the panorama at a specific yaw/pitch. Each comment has a type and a colour and may contain text. - URLs inside comment text are automatically turned into clickable links (links longer than 40 characters are shown truncated). - To add a comment, right-click (or long-press) in the panorama at the desired spot; a comment form opens. You choose a type and colour, optionally enter text, and optionally attach files. Empty comments (a bare marker with no text or files) are allowed. - The ability to add comments depends on your access level relative to the project's comment access level (`access_level_for_comments`). The comment button and the file-attach control appear only when your access level meets the requirement; the file-attach control also requires you to be logged in. - Comments are added via `comments/add` and the new marker appears immediately without reloading. - You can delete a comment if you are its author. Project owners can delete any comment. Deleting removes the marker immediately. - Attaching multiple files shows the first file's name plus a "+N" count. Closing the comment form without sending keeps typed text but clears the attachment. - A submission may be rejected as spam or with a server error, in which case an error message explains why. ### Sharing - A Share button opens a popup with the current page URL (including the current scene and view) for copying to the clipboard. - A second share option generates a QR code for the current URL, retrieved from `/service/qr?url=...`. ### Overview map (info map / mini-map) - An info panel can show a 2D overview map of station positions. - The map supports zoom in/out (with an adjustable zoom step), font-size increase/decrease, rotate left/right (with an adjustable rotate step), a center-on-current-station button, and a reset/fit button. - Pan by dragging (mouse) or one-finger touch; pinch to zoom on touch; scroll wheel to zoom. - The current station is highlighted; a view-direction sector shows where you are looking and the field of view. - A legend lets you filter stations by height band via checkboxes. - When multiple sitemaps exist, a "current sitemap only" option limits the map to the current sitemap, and a dropdown lets you switch between sitemaps. A "follow location changes" option re-centers the map as you move between stations. - Hovering a station on the map, in the scene list, or on a link sphere highlights the same station in all three places (cross-highlight). - The info panel can be resized (width and height) and opened full-screen. - A separate embedded outdoor map (AppMap) can be shown via a map button, controlled by a project interface setting. It can display GeoTIFF and KML overlays when the project has them. The map button is on by default. ### North arrow and setting north - If enabled for the project, a north arrow is shown in the panorama. - Project owners can set which direction is north: rotate the view to face north, then use "Set North". A confirmation warns the action cannot be undone. This updates the panorama orientation for that scene. - Owners can toggle the north arrow on/off, which is saved to the project. ### Point cloud access from the tour - If the project also has a point cloud, a bottom tray offers: - **Full point cloud** — opens `potree/pointcloud.html`. - **Point cloud for this setup** — opens `potree/pointcloud-<scene>.html` with the current scene, coordinates, and view parameters. ### Multi-project switching - If the project is linked to other projects (multiprojects), a switcher lets you jump to another project at `/projects/<name>/`. ### Owner editing tools These are available only to project owners (access level 3), from the panorama: - **Right-click a link sphere** opens a context menu offering, depending on the target's state: - "Add link to this setup" (for an unlinked target) - "Delete link to this setup" (for an already-linked target) - "Disable this setup" - "Enable this station" (for a disabled target) - Adding/deleting links is symmetric (both directions) and updates immediately without a page reload, via `links/add` and `links/delete`. Disabling a setup uses `links/disable`; enabling uses `setups/edit`. - **Show unlinked stations** — surfaces every other enabled station as a link sphere so links can be added. - **Show disabled setups** — surfaces disabled stations as faded, dashed outlines that can be re-enabled from the context menu. - A height-gradient toggle recolours link spheres by station height. ### Project settings and editing (owners) At `/projects/<url>/settings`, project owners can edit the project via `/projects/<url>/edit`: - **Project name** (title) — underscores are shown as spaces. - **Privacy mode** (`privacy_mode`). In non-private mode the tour exposes a preview thumbnail image; in the most private mode (privacy_mode 2) the preview thumbnail is not exposed. - **Project tag**. - **Linked projects (multiprojects)**. - **Redirects** — a list of short project codes (each truncated to 8 characters); `https://360-for-you.com/projects/` prefixes are stripped. - **Coordinate system** and **coordinate unit** (`coord_unit`; e.g. m, cm, mm, ft, ftUS, in). Changing the coordinate system may auto-set the unit; an explicit unit choice overrides it. - **Frame ancestors** — controls which sites may embed the tour in an iframe. - **Comment access level** (`access_level_for_comments`) — the minimum access level required to comment. Other owner actions from settings: - Delete the project (`/projects/<url>/delete`). - Delete the project's files (`/projects/<url>/delete-project-files`). - Send feedback/questions to support (`/projects/<url>/send-feedback`). ### Sharing access with other people (owners) - **Add owner** (`/projects/<url>/add-owner`) and **Add user** (`/projects/<url>/add-user`) by email. You can optionally notify the invitee by email and attach a free-text message (up to 1000 characters). - If the invited email has no account, one is created and a password-setup link is emailed (unless invitation-based signup is disabled platform-wide, in which case you are asked to have the person register first). - When adding a user, an option can also add that user to all linked projects. - These invitation actions are rate-limited. - **Remove owner** (`/projects/<url>/delete-owner`) and **Remove user** (`/projects/<url>/delete-user`). ### Blurring tool (owners) An editable panorama page lets an owner permanently blur regions of a panorama image. - Two tools: **Shift+click: blurring** and **Ctrl+click: recovery** (restore). Select a tool, then drag over the image to paint; tap the active tool again to turn it off. Holding Shift or Ctrl temporarily overrides the active tool. - **Brush size** slider, range 10–200 (default 60). - **Save result** saves the change. A warning notes that once saved, the blur is permanent and cannot be undone. Processing usually takes a few seconds. The result is sent to `update-pano`. ### Color correction tool (owners) An editable panorama page lets an owner adjust panorama colours. - Per-layer **brightness**, **contrast**, and **saturation** sliders/inputs, each ranging −1 to 1 in steps of 0.01. - The maximum supported image dimension is reported by the viewer; images larger than the maximum supported texture size (square, that size by that size pixels) are rejected with a message. - **Save result** bakes the effect into the image and sends it to `update-pano`. Processing usually takes a few seconds. ### Panorama tile images - Individual panorama face/preview tiles are served under `/projects/<name>/tiles/<image>/...` as JPEG. - A downscaled full panorama for a station can be requested at `/projects/<url1>/tiles/<url2>/pano.jpg` (or `pano<suffix>.jpg`), rendered at up to 2048 px wide. ### Live sensor values - If a tour embeds live sensor values (via a special element in a comment), the viewer subscribes to and displays those live values. Tours without any such embeds do not load the sensor machinery. ### Custom appearance - A project owner can apply custom CSS to their tours, which is injected into the tour page styling. ### Downloadable/served file types Files under a project may be served for these extensions: `.jpg`, `.jpeg`, `.png`, `.webp`, `.js`, `.json`, `.laz`, `.pnts`, `.ifc`, `.frag`, `.ply`, `.spz`, `.splat`, `.ksplat`, `.sog`, `.rad`, `.glb`, `.obj`, `.mtl`, `.pdf`, `.mp4`, `.kml`, plus comment file types. IFC, OBJ, and KML files are served with transparent compression; KML is served inline, IFC and OBJ as downloads. Range requests are supported for these files; a malformed Range request returns 416. ## 360° Video Viewer with GPS Track Minimap and Quality Switcher ### Overview The 360° video feature lets a project display equirectangular 360-degree videos in an interactive spherical viewer. Videos can carry a GPS track that is shown on a minimap synchronized with playback. Each video can be viewed at multiple quality levels, at different playback speeds, and — on supported headsets — in VR. ### Viewing 360° Videos - The list of a project's 360° videos is at `/projects/<url>/video360`. - An individual video is at `/projects/<url>/video360/<stem>`, where `<stem>` is the video's identifier (derived from the uploaded file name). - If a project has exactly one 360° video, opening the list page redirects straight to that video's player. - If a project has no 360° videos, the list page returns "not found". - Adding `?noUI` (the `noUI` parameter) to the URL hides the surrounding interface elements (welcome overlay, logo, VR button, and the track minimap). ### Video List Page - The header shows the project title and the number of 360° videos. - Videos are shown as a responsive grid of cards. - Each card shows: - A poster thumbnail (2:1 aspect ratio). - The duration, formatted as `M:SS` or `H:MM:SS`. - The resolution as `width×height`. - A blue "GPS" badge when the video has a GPS track. - The video title (or its stem if no title). ### The 360° Player - The video is rendered onto the inside of a sphere so you can look around in all directions. - **Drag** with the mouse or a finger to look around (change yaw and pitch). Pitch is limited to just under straight up and straight down. - **Mouse wheel** or **pinch** (two fingers) to zoom. The field of view ranges from 5° (most zoomed in) to 140° (most zoomed out). - A single click or tap on the sphere toggles play/pause. - The initial view is turned 90° to the left of the equirectangular "front" seam for better default framing. - A first-view onboarding hint reading "Drag to look around" / "Mouse wheel or pinch to zoom" appears on entry and fades out on the first interaction or after a few seconds. - Before playback starts, the poster image is shown on the sphere (so the view is not black while the play button is visible), then the live video replaces it once playback begins. - The player controls (play, seek, fullscreen, quality, speed) are visible even before first play. - Fullscreen includes the 360° sphere rendering, not just the flat video. ### Quality Switcher - Each video is available in multiple resolutions; each resolution is a separate file you switch between manually (there is no automatic adaptive switching). - A quality menu button in the control bar shows the current quality and lets you pick another. Available quality labels: - **5.7K** (height ≥ 2880) - **4K** (height ≥ 2160) - **2K** (height ≥ 1440) - **1080p** (height ≥ 1080) - **720p** (height ≥ 720) - Otherwise the height in pixels followed by "p". - Switching quality preserves the current playback position and play/pause state. - The initial quality is the highest resolution the device can actually display. On devices with limited graphics/video-decode capability (notably older iPhones, capped at a video width of 4096 px), the viewer automatically starts at a lower resolution that the device can render, to avoid a black sphere or black video. ### Playback Speed - A playback-speed menu button sits next to the quality button. - Available speeds: **0.25×, 0.5×, 1×, 1.5×, 2×**. The default is **1×**. - The chosen speed is retained when you switch quality. ### GPS Track Minimap - If a video has a GPS track, a minimap (picture-in-picture panel) is shown alongside the player. It is hidden when `?noUI` is used. - A map-toggle button appears at the bottom-left of the player, above the controls, to open and close the minimap. - On compact screens (viewport width ≤ 900 px or height ≤ 500 px) the map starts collapsed so it does not cover the player; on larger screens it opens immediately. When collapsed on entry, the toggle button pulses to draw attention. - The minimap opens in a compact 400×400 floating panel that can be dragged, resized, and collapsed. - The map shows the video's GPS path. As the video plays, a cursor follows the current position along the track. - **Clicking a point on the track** seeks the player to that moment and starts playback. - An information panel below the map shows, updating live during playback: - **Time** — the real date and time at the current position (shown only when the track has a start time), formatted `YYYY-MM-DD HH:MM:SS`. - **Position** — latitude and longitude (5 decimal places, in degrees). - **Speed** — current speed, in km/h (metric) or mph (imperial). - **Track length** — distance travelled so far / total track distance, in m/km (metric) or ft/mi (imperial). - A **warning** message may appear if the GPS track's duration differs from the video duration. - Metric vs. imperial units follow the viewer's own preference; for anonymous visitors, the project owner's unit setting is used. - KML overlays configured on the project are drawn on the minimap. ### Multiple Videos and Neighbor Tracks - Other videos in the same project that also have a GPS track are drawn on the minimap as dimmed lines. - Clicking a neighbor's track navigates to that video and jumps to the matching timestamp. - You can open a URL with a `#t=SECONDS` fragment (for example `#t=123.45`) to start a video at a specific second. - The minimap can be "popped out" to the project's full map (big-map), where this video's GPS path becomes the primary track and its playback cursor follows the map. Clicking a track or neighbor on the popped-out map seeks this player, or navigates to the corresponding video at the matching second. ### VR Viewing - On browsers/devices that support immersive VR (for example Quest headsets), an "Enter VR" button appears at the bottom-left of the player. It is hidden on devices without VR support. - Inside VR, you look around by moving your head. - Flicking the controller thumbstick left or right seeks the video by 10 seconds. One seek per flick. - The controller trigger or a hand pinch toggles play/pause. - An "Exit VR" button is shown in the headset; the headset's own system gesture also exits. ### Uploading and Processing Videos - 360° videos are added through the project's "Add files to the project" page. Supported inputs are `.mp4` video files and `.gpx` GPS track files. - Uploaded videos are equirectangular (2:1 aspect ratio) 360° videos. - Videos are transcoded into a ladder of resolutions (no upscaling — only resolutions at or below the source are produced): - **1080p** — 2160×1080 - **2K** — 2880×1440 - **4K** — 4320×2160 - **5.7K** — 5760×2880 - If the source is smaller than the smallest rendition, a single copy at the source resolution is produced. - If you request a resolution higher than the source, you still receive the highest available at-or-below-source copy. - A poster image (WebP) is extracted from the video (capped at 2048 px wide) and used as the thumbnail, social-preview image, and pre-play sphere texture. - Audio, if present, is preserved. - Processing shows a progress indicator; the settings page auto-refreshes while a project is still processing. #### Processing Options - **Renditions**: you can choose which of `1080p`, `2k`, `4k`, `5_7k` to produce; if none are chosen, the full at-or-below-source set is produced. - **Codec**: H.264 or H.265. H.265 produces roughly 40% smaller files at similar quality. The default is H.264. - **Preset** (encoding speed/efficiency): one of `ultrafast`, `superfast`, `veryfast`, `faster`, `fast`, `medium`, `slow`, `slower`, `veryslow`. The default is `fast`. ### GPS Track Sources - If a `.gpx` file with the same name as the video is uploaded alongside it, that GPX is used as the track. - If no GPX is present, GPS telemetry embedded in the MP4 is extracted and used if available. - The track records latitude, longitude, elevation, per-point speed, cumulative distance, and total distance. - You can upload a `.gpx` file on its own later; if its name matches an already-processed video, it attaches or replaces that video's track. - If a track's duration differs from the video duration by more than 5%, a warning is stored and shown on the minimap. ### Video Management (project owner only) - The 360° video settings page is at `/projects/<url>/video360-settings` and is available only to the project owner (sign-in required). - The settings page lists all 360° videos in a table with columns: number, Name, Duration, Resolution, Size (MB, with a total sum), Quality (the list of rendition names), and Track (a marker when a GPS track is present). - Table columns can be filtered; the Name, Resolution, and Quality filters support `*` wildcards. - Each row has an **Open** action (opens the video in a new tab) and a **Delete** action (asks for confirmation before deleting). - Deleting the last 360° video removes the `mp4` and `gpx` file types from the project and clears the project's 360° video status. ### Privacy - For projects in private mode (privacy_mode 2), the social-preview (Open Graph) poster image is not exposed.