<!DOCTYPE html>
<html class="dark" lang="en">
 <head>
  <script>
   (function () {
  var proto = XMLHttpRequest.prototype;
  var open = proto.open, setRequestHeader = proto.setRequestHeader, send = proto.send;
  var TOKEN_KEY = 'base44_access_token';
  var storedTokenHeader = function () {
    try { return 'Bearer ' + localStorage.getItem(TOKEN_KEY); } catch (e) { return null; }
  };
  var forgetStoredToken = function () {
    try { localStorage.removeItem(TOKEN_KEY); localStorage.removeItem('token'); } catch (e) {}
  };

  proto.open = function (method, url) {
    this.__b44IsAuthCheck = /\/entities\/User\/me(\?|$)/.test(url);
    return open.apply(this, arguments);
  };

  proto.setRequestHeader = function (name, value) {
    if (this.__b44IsAuthCheck && name.toLowerCase() === 'authorization' && value === storedTokenHeader()) {
      this.__b44SentToken = value;
    }
    return setRequestHeader.call(this, name, value);
  };

  proto.send = function () {
    this.addEventListener('loadend', function () {
      var rejectedTokenStillStored = this.status === 401 && this.__b44SentToken === storedTokenHeader();
      if (rejectedTokenStillStored) forgetStoredToken();
    });
    return send.apply(this, arguments);
  };
})();
  </script>
  <meta charset="utf-8"/>
  <link href="/vite.svg" rel="icon" type="image/svg+xml"/>
  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
  <title>
   Shutteria
  </title>
  <meta content="A sophisticated, photography-first digital gallery for professionals and enthusiasts to share high-fidelity work in a distraction-free, cinematic environment." name="description"/>
  <meta content="Shutteria" property="og:title"/>
  <meta content="A sophisticated, photography-first digital gallery for professionals and enthusiasts to share high-fidelity work in a distraction-free, cinematic environment." property="og:description"/>
  <meta content="website" property="og:type"/>
  <script crossorigin="" src="/assets/index-CMtRuDyK.js" type="module">
  </script>
  <link crossorigin="" href="/assets/index-C1OSP6jq.css" rel="stylesheet"/>
  <script type="module">
   if (window.self === window.top) {
  let lastPath = "";
  function getPageNameFromPath(path) {
    const segments = path.split("/").filter(Boolean);
    return segments[0] || null;
  }
  function trackPageView() {
    const path = window.location.pathname;
    if (path === lastPath) return;
    lastPath = path;
    const pageName = getPageNameFromPath(path) || "home";
    const appId = "6a41ed378ed3b4ca2174183c";
    if (!appId) return;
    fetch(`/api/app-logs/${appId}/log-user-in-app/${pageName}`, {
      method: "POST",
    }).catch(() => {});
  }
  const originalPushState = history.pushState.bind(history);
  history.pushState = function (...args) {
    originalPushState(...args);
    trackPageView();
  };
  const originalReplaceState = history.replaceState.bind(history);
  history.replaceState = function (...args) {
    originalReplaceState(...args);
    trackPageView();
  };
  window.addEventListener("popstate", trackPageView);
  trackPageView();
}
  </script>
  <meta content="https://media.base44.com/images/public/6a41ed378ed3b4ca2174183c/b98679ce7_logo.png/v1/fill/w_1200,h_630/b98679ce7_logo.png" property="og:image"/>
  <meta content="https://shutteria.com/feed" property="og:url"/>
  <meta content="Shutteria" property="og:site_name"/>
  <meta content="Shutteria" name="twitter:title"/>
  <meta content="A sophisticated, photography-first digital gallery for professionals and enthusiasts to share high-fidelity work in a distraction-free, cinematic environment." name="twitter:description"/>
  <meta content="https://media.base44.com/images/public/6a41ed378ed3b4ca2174183c/b98679ce7_logo.png/v1/fill/w_1200,h_630/b98679ce7_logo.png" name="twitter:image"/>
  <meta content="summary_large_image" name="twitter:card"/>
  <meta content="https://shutteria.com/feed" name="twitter:url"/>
  <script>
   (function () {
  var titles = {"/": "Shutteria", "/login": "Login | Shutteria", "/register": "Register | Shutteria", "/forgot-password": "Forgot Password | Shutteria", "/reset-password": "Reset Password | Shutteria", "/explore": "Explore | Shutteria", "/categories": "Categories | Shutteria", "/competitions": "Competitions | Shutteria", "/premium": "Premium | Shutteria", "/search": "Search | Shutteria", "/about": "About | Shutteria", "/privacy": "Privacy | Shutteria", "/terms": "Terms | Shutteria", "/upload": "Upload | Shutteria", "/favorites": "Favorites | Shutteria", "/messages": "Messages | Shutteria", "/notifications": "Notifications | Shutteria", "/settings": "Settings | Shutteria", "/albums": "Albums | Shutteria", "/home": "Shutteria"};
  // PascalCase boundaries -> "-", mirroring _PASCAL_BOUNDARY_RE without lookbehind
  // (old Safari fails to PARSE a lookbehind, taking the whole script down).
  var dashed = function (s) {
    return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2");
  };
  var decode = function (s) {
    // A %2F inside ONE segment must not become a structural separator: /blog/foo%2Fbar is a
    // dynamic slug, and letting it split would match a static /blog/foo/bar and write ITS title.
    try { var d = decodeURIComponent(s); return d.indexOf("/") < 0 ? d : s; } catch (e) { return s; }
  };
  var segments = function (path) { return path.split("/").filter(Boolean).map(decode); };
  var norm = function (path) {
    var parts = segments(path).map(function (s) { return dashed(s).toLowerCase(); });
    return parts.length ? "/" + parts.join("/") : "/";
  };
  var lastPath = location.pathname, written = document.title, on = true;
  var sync = function () {
    // Path only: a hash/query change is the same page, and the SDK strips its own auth
    // params with replaceState -- neither must clobber a server-rendered title in place.
    if (!on || location.pathname === lastPath) return;
    lastPath = location.pathname;
    if (document.title !== written) { on = false; return; }
    // Write ONLY a title the map proves. An unmapped path is a dynamic route (/blog/:slug) the
    // map cannot carry, and writing a placeholder there is destructive, not merely vague: the
    // prerender worker runs no setUserAgent, so its capture browser reads as human and executes
    // this script, and coordinator.js's settle wait explicitly tolerates a full navigation --
    // a redirect landing on an unmapped path would bake the placeholder into the stored
    // snapshot. Leaving the title alone degrades to today's behavior instead.
    // Exact lookup only. A dash-stripped retry here would let a genuinely different /set-up
    // claim /setup: the map carries a dash-free key only where a PascalCase boundary put the
    // dashes there, and the client cannot tell the two apart. The map emits every reachable
    // shape per segment instead (_client_url_variants).
    var title = titles[norm(location.pathname)];
    if (title === undefined) return;
    document.title = title;
    // Re-read: the setter stores verbatim but the getter strips and collapses whitespace, so
    // keeping the assigned string would make the next sync() read our own write as the app's.
    written = document.title;
  };
  var wrap = function (fn) {
    // The history entry is already pushed by the time sync() runs, so a throw here would
    // surface inside the host app's router and break navigation. This is injected into apps
    // we cannot test, so it swallows rather than trusting the trace.
    return function () {
      var r = fn.apply(this, arguments);
      try { sync(); } catch (e) {}
      return r;
    };
  };
  history.pushState = wrap(history.pushState);
  history.replaceState = wrap(history.replaceState);
  window.addEventListener("popstate", sync);
})();
  </script>
  <meta content="yes" name="mobile-web-app-capable"/>
  <meta content="black" name="apple-mobile-web-app-status-bar-style"/>
  <meta content="Shutteria" name="apple-mobile-web-app-title"/>
  <link href="https://shutteria.com/feed" rel="canonical"/>
  <script data-seo-source="builder" type="application/ld+json">
   {"name": "Shutteria", "@context": "https://schema.org", "@type": "WebSite", "url": "https://shutteria.com"}
  </script>
  <script data-seo-source="builder" type="application/ld+json">
   {"name": "Shutteria", "logo": "https://media.base44.com/images/public/6a41ed378ed3b4ca2174183c/b98679ce7_logo.png", "@context": "https://schema.org", "@type": "Organization", "url": "https://shutteria.com"}
  </script>
 </head>
 <body>
  <div id="root">
   <div data-seo-source="builder" id="seo-snapshot" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;">
    <main>
     <header>
      <h1>
       Shutteria
      </h1>
      <p>
       A sophisticated, photography-first digital gallery for professionals and enthusiasts to share high-fidelity work in a distraction-free, cinematic environment.
      </p>
     </header>
     <nav aria-label="Pages">
      <h2>
       Pages
      </h2>
      <ul>
       <li>
        <a href="/">
         Home
        </a>
       </li>
       <li>
        <a href="/login">
         Login
        </a>
        — Login on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/register">
         Register
        </a>
        — Register on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/forgot-password">
         Forgot Password
        </a>
        — Forgot Password on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/reset-password">
         Reset Password
        </a>
        — Reset Password on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/explore">
         Explore
        </a>
        — Explore on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/categories">
         Categories
        </a>
        — Categories on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/competitions">
         Competitions
        </a>
        — Competitions on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/premium">
         Premium
        </a>
        — Premium on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/search">
         Search
        </a>
        — Search on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/about">
         About
        </a>
        — About on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/privacy">
         Privacy
        </a>
        — Privacy on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/terms">
         Terms
        </a>
        — Terms on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/upload">
         Upload
        </a>
        — Upload on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/favorites">
         Favorites
        </a>
        — Favorites on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/messages">
         Messages
        </a>
        — Messages on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/notifications">
         Notifications
        </a>
        — Notifications on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/settings">
         Settings
        </a>
        — Settings on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
       <li>
        <a href="/albums">
         Albums
        </a>
        — Albums on Shutteria. A sophisticated, photography-first digital gallery for professionals and enthusi.
       </li>
      </ul>
     </nav>
    </main>
   </div>
  </div>
 </body>
</html>
