Angular & AngularJS

    Angular SEO without Angular Universal.

    Make Angular and AngularJS apps fully readable by Google, Bing, AI crawlers, and social bots — with no SSR migration, no platform-server config, and no third-party library breakage.

    −380K€ avg universal migration cost avoided<2 wks from signup to clean indexation6+ sub-frameworks
    Angular framework codebase on screen
    Angular
    Make Angular and AngularJS fully crawlable — without Universal.
    Avg Universal migration cost avoided
    −380K€
    From signup to clean indexation
    <2 wks
    Lazy route coverage
    100%
    Library compatibility issues
    0

    Angular Universal works. It also costs a quarter of engineering time, fights with every library that touches `window` or `document`, and gives you a long-term maintenance bill. For most teams that just want their Angular site indexed, that trade is too expensive. UpRender is the way out.

    01 / The problem

    Why Angular and AngularJS struggle in search.

    Angular bootstraps from <app-root></app-root>. Everything — content, meta tags, structured data — is composed by the runtime in the browser. For users that's fine. For crawlers that don't execute JavaScript or have strict render timeouts, the page is functionally empty.

    Googlebot can render Angular, but the second-pass renderer often misses lazy-loaded routes, route-resolver content, and anything behind RxJS observables that complete after Googlebot's render budget. New Angular routes can take weeks to enter the index. Bingbot is significantly worse with Angular, and AI crawlers don't try at all.

    AngularJS (1.x) sites have a harder problem. Hash-based routing (/#!/path), ng-cloak flashes, and outdated prerender solutions like the now-deprecated _escaped_fragment_ protocol leave AngularJS apps with a fraction of the indexation they should have. Most teams have inherited an AngularJS app and don't have the budget to rewrite it — UpRender makes them indexable as-is.

    • <app-root> returns an empty shell to non-JS bots — Bingbot, GPTBot, ClaudeBot, social crawlers
    • Route Resolvers and HTTP interceptors don't run for crawlers without JS
    • RxJS observables that emit after render budget timeout are dropped
    • AngularJS hash routing (#!) is invisible to most modern crawlers
    • Angular Meta service updates meta tags client-side — too late for social bots
    • @angular/platform-server config breaks libraries that touch window, document, or localStorage
    02 / The solution

    How UpRender fixes Angular discoverability.

    UpRender deploys in front of Angular and AngularJS apps via an edge worker or a server-side middleware. Bot User-Agents are routed through UpRender's headless rendering layer, which runs your full Angular app in a real browser environment and returns a settled, fully-hydrated HTML snapshot. Meta tags from @angular/platform-browser's Meta service are captured. Structured data is preserved. Lazy-loaded routes render.

    Real users never touch UpRender. They get your Angular app, your zone.js, your animations, your service workers — untouched. Bots get the snapshot. The two paths never cross.

    03 / Benefits

    What changes the day you ship.

    Skip Angular Universal entirely

    No platform-server config. No `isPlatformBrowser` checks scattered across your codebase. No fights with libraries that assume a browser environment.

    AngularJS legacy support

    Inherited an AngularJS 1.x app you can't afford to rewrite? UpRender renders it cleanly to every modern crawler — hash routing, ng-cloak, the lot.

    TransferState alternative

    Skip the manual TransferState dance to avoid double-fetching on hydration. UpRender's path doesn't intersect with your client app.

    Lazy routes always crawled

    Route-level code splitting hides routes from crawlers with strict timeouts. UpRender resolves them all before returning HTML.

    Works with Nx & monorepos

    Multi-app Nx workspaces, Ionic hybrid apps, Scully-prerendered hybrids — all supported behind one edge integration.

    Schema & meta in initial HTML

    Schema.org JSON-LD and `Meta` service updates appear in the bot snapshot, unlocking rich results and clean social previews.

    AI search visibility

    GPTBot, OAI-SearchBot, ClaudeBot, and Claude-SearchBot all get fully-rendered Angular HTML. Your content becomes citable in AI-generated answers and search summaries.

    Zero impact on Angular performance

    Real users never go through UpRender — they hit your origin directly. Your Lighthouse scores, Core Web Vitals, and user experience metrics stay exactly the same.

    No library compatibility audits

    Angular Universal breaks when third-party libraries access `window`, `document`, or `localStorage` server-side. UpRender runs your app in a real browser — every library works.

    Survives Angular major upgrades

    Angular Universal config breaks on major version upgrades (14→15→16→17→18). UpRender is framework-external — Angular upgrades don't touch it.

    04 / Real-world scenarios

    Sound familiar?

    01

    Your Angular Universal migration just got deprioritized

    The team estimated 3 months for Universal integration, but the product roadmap won. Meanwhile, your Angular routes aren't indexing and the SEO team is escalating. Deploy UpRender in an afternoon — indexation starts while the Universal decision can wait for next quarter.

    02

    You inherited an AngularJS 1.x application

    The app was built in 2015, uses hash routing, and predates any SSR option. Rewriting it isn't on the roadmap. UpRender makes the AngularJS app indexable without changing a single line of its code — hash routing, ng-cloak directives, and all.

    03

    Third-party libraries keep breaking your Universal build

    Every time you add a new Angular library, the Universal build fails because the library accesses `window` or `document`. You've added isPlatformBrowser checks everywhere but the maintenance is unsustainable. UpRender eliminates the SSR build entirely — your app runs client-side only, and bots get pre-rendered HTML.

    04

    Your Angular app runs on SAP Spartacus

    Spartacus storefronts on Angular have complex SSR requirements. UpRender sits in front of the storefront and serves rendered HTML to crawlers without interfering with Spartacus's internal routing or CMS-driven pages.

    05 / Before & after

    What crawlers actually see.

    What crawlers see without UpRender
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <title>My Angular App</title>
      <base href="https://uprender.io/">
    </head>
    <body>
      <app-root></app-root>
      <script src="https://uprender.io/runtime.js"></script>
      <script src="https://uprender.io/polyfills.js"></script>
      <script src="https://uprender.io/main.js"></script>
    </body>
    </html>
    What crawlers see with UpRender
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <title>Enterprise CRM Dashboard | Acme Corp</title>
      <meta name="description" content="Manage customer relationships..." />
      <meta property="og:title" content="Enterprise CRM Dashboard" />
      <link rel="canonical" href="https://acme.com/products/crm" />
      <script type="application/ld+json">
        {"@type":"SoftwareApplication","name":"Acme CRM","price":"0"}
      </script>
    </head>
    <body>
      <app-root>
        <app-header><nav>Home | Products | Pricing</nav></app-header>
        <app-product-page>
          <h1>Enterprise CRM Dashboard</h1>
          <p>Streamline your sales pipeline with real-time analytics...</p>
          <app-pricing-table>...</app-pricing-table>
        </app-product-page>
        <app-footer>...</app-footer>
      </app-root>
    </body>
    </html>

    Angular components render into complete HTML. Meta tags, structured data, and component content all appear in the bot snapshot.

    06 / Integration

    Edge worker or Express middleware — your pick.

    Most Angular teams deploy UpRender via a Cloudflare Worker or Express middleware in front of their Angular app. Both detect bot User-Agents and proxy them through UpRender's render layer.

    express-middleware.js — works for Angular apps served from Node.
    import express from 'express';
    import { uprenderMiddleware } from '@uprender/express';
    
    const app = express();
    
    // Bots get rendered HTML. Humans get your Angular app.
    app.use(
      uprenderMiddleware({
        token: process.env.UPRENDER_TOKEN,
        crawlerTimeout: 8000, // ms — Angular apps with RxJS streams
      }),
    );
    
    // Your existing static handler for the Angular dist/
    app.use(express.static('dist/my-angular-app'));
    app.get('*', (req, res) => {
      res.sendFile('dist/my-angular-app/index.html', { root: '.' });
    });
    
    app.listen(3000);
    1. 1Install @uprender/express (or deploy the Cloudflare Worker if you prefer edge)
    2. 2Add the middleware before your Angular static handler
    3. 3Set UPRENDER_TOKEN in your environment
    4. 4For AngularJS apps with hash routing, enable rewriteHashbang: true in middleware options
    5. 5Validate with curl -A 'Googlebot' https://yoursite.com/some-route — you'll see complete HTML
    07 / Works with

    One Angular integration. Every meta-framework.

    Angular (current)

    Angular 14 → 18+, standalone components, signals

    AngularJS 1.x

    Legacy apps with hash routing or HTML5 mode

    Ionic

    Angular-flavored Ionic hybrid apps

    Nx workspaces

    Multi-app monorepos with shared libs

    Scully

    Hybrid prerendered + dynamic route stacks

    Spartacus / Storefront

    SAP Commerce headless storefronts

    "The fastest fix we've ever shipped to production. Angular stayed Angular. Crawlers finally got HTML."
    Engineering Lead · UpRender customer · Angular & AngularJS team
    09 / Frequently asked

    The questions teams actually ask.

    Angular Universal works, but it's a substantial project: platform-server configuration, `isPlatformBrowser` guards everywhere, library compatibility audits (anything touching `window`/`document` breaks), TransferState plumbing to avoid double-fetching, and ongoing maintenance through every Angular major version. For most teams, UpRender delivers the same SEO outcome in days instead of quarters, with no code in the Angular project itself.

    Yes — AngularJS support is a core use case for UpRender. Hash-bang routing (`#!`), legacy directives, and old prerender escape-fragment configurations are all handled. If you've inherited an AngularJS app you can't afford to rewrite, this is the cleanest way to make it indexable.

    Scully prerenders static routes at build time, which works for marketing pages but not for dynamic routes. UpRender complements Scully for hybrid setups — Scully handles static, UpRender handles dynamic, and crawlers don't see a difference.

    No. Service workers and zone.js only execute for real user requests. Bot requests are proxied to UpRender before they touch your Angular bundle, so there's no possibility of conflict.

    UpRender runs your Angular app in a real browser environment, so any `Meta` or `Title` service updates that happen during component initialization or route resolution are captured in the final HTML snapshot. That's what enables correct Open Graph tags, Twitter Cards, and canonical URLs in the bot's view.

    Yes. Standalone components, signal-based reactivity, deferred views, and the new control flow syntax all render correctly. UpRender stays current with Angular major versions.

    Zero. Real users never go through UpRender — they hit your origin directly. Only bot User-Agents are proxied. Your human-user performance metrics don't change.

    Yes. Angular 16+ introduced non-destructive hydration and Angular 17+ added incremental hydration. UpRender operates at the edge before hydration occurs — it serves bots a fully-rendered snapshot while users get the normal hydrated experience. The two paths are independent.

    UpRender renders the public-facing version of your Angular routes. Authenticated content behind login walls isn't rendered for bots (since crawlers shouldn't access it anyway). For public pages that load different content based on auth state, UpRender captures the unauthenticated view.

    Your turn

    Ship Angular that bots can read.

    Free trial. No credit card. Most Angular teams see their first indexation lift inside 48 hours.

    Other frameworks we support