You are offline. GoopNet is serving cached content.
GoopNet — the offline web layer

ALWAYSON.

Any web app. Works offline. Instantly. Paste a URL and GoopNet adds a full offline layer — no code changes, no installation.

No account required. No code changes. Free.
Your offline app is ready

Pick the level of control your app needs.

All three run on the same offline engine underneath — caching, queuing, sync, and conflict resolution behave identically no matter which tier you start with.

TIER 1 · ZERO EFFORT
URL Wrap

Paste your app's URL. GoopNet proxies it, injects the offline layer, and hands back a working link in seconds. No code access needed.

goopnet.pages.dev/wrap ?url=https://yourapp.com
TIER 2 · ONE LINE
Script Tag

Add one line to your HTML. GoopNet registers a service worker and handles caching, queuing, and sync automatically.

<script src="goopnet.pages.dev/sw.js" data-app="myapp"></script>
TIER 3 · FULL CONTROL
JavaScript API

Import the package for fine-grained control over what's cached, what's queued, and how conflicts resolve.

const gn = new GoopNet({app:'myapp'}) gn.queue('POST', '/api/records', payload)

From URL to offline-ready in three steps.

1
Paste URL
Drop your app's address into the field above. GoopNet checks it's reachable and mints a unique offline endpoint.
2
GoopNet wraps it
Every response is proxied through Cloudflare's edge, with the offline layer injected automatically — no origin changes.
3
Works offline forever
Static assets are cached, writes are queued when the connection drops, and everything syncs back the moment it returns.
Dashboard
Your wrapped apps, sync activity, and pending conflicts.
Sync log
Conflict queue

Tier 1 — URL Wrap

The fastest path to an offline-ready app. GoopNet proxies your app through Cloudflare's edge and injects the offline layer automatically — no code access required.

POST https://goopnet.pages.dev/wrap
Content-Type: application/json

{ "url": "https://yourapp.com" }

// → { "wrappedUrl": "https://goopnet.pages.dev/app/abc123", "appId": "abc123" }

The wrapped URL works immediately. Static assets are cached on first load; API responses get offline metadata headers; if your origin goes down, visitors see a cached copy with a small notice instead of an error page.

Tier 2 — Script Tag

For developers who want the offline layer running on their own domain. Add one line before </head>.

<script src="https://goopnet.pages.dev/sw.js"
        data-app="myapp"
        data-sync="https://goopnet.pages.dev/sync"
        data-mode="auto">
</script>

This registers a service worker scoped to your site, handling caching, offline write queuing, and background sync without any further setup.

Tier 3 — JavaScript API

Full control for complex or enterprise apps — the same engine, exposed directly.

import GoopNet from 'goopnet'

const gn = new GoopNet({ app: 'myapp' })

gn.cache('/api/posts')
gn.queue('POST', '/api/records', payload)
gn.onConflict((local, remote) => gn.resolvers.fieldLevel(local, remote))
gn.sync()

Every method maps directly onto the same worker endpoints used by Tiers 1 and 2, so behavior stays consistent as your integration grows.

Configuration reference

All script-tag attributes, in one place.

AttributeValuesDefaultDescription
data-appstringUnique app identifier. Required.
data-syncURLgoopnet.pages.dev/syncEndpoint queued actions are replayed against.
data-modeauto · guided · hybrid · headlessautoHow much GoopNet automates. See modes below.
data-conflictsfield · auto · surfacefieldConflict resolution tier. See security & conflicts.

Mode comparison

ModeBehavior
autoHandles caching, queuing, and sync automatically with secure defaults. No further setup.
guidedDeveloper specifies exact cache and network patterns; GoopNet enforces them.
hybridDesigned for apps mixing WebSockets and REST — REST calls are queued/cached as usual, WebSocket traffic passes through untouched.
headlessNo automatic interception. Exposes the JS API only, for full manual control.

Security defaults

GoopNet is opt-in, not opt-out: anything that looks sensitive is excluded from caching and queuing unless a developer explicitly whitelists it.

RuleApplies to
Never cachedResponses with Authorization, Set-Cookie, or X-Auth-Token headers
Never cachedURLs matching /auth/, /payment, /admin/, /api/auth/, /api/pay/*
Never queued in plaintextForm data matching SSN, card number, or medical record patterns
Auto-detected as sensitive<meta name="sensitive" content="medical|financial|legal">, and URL paths like /health, /medical, /bank, /legal, /finance
Encrypted at restAll queued actions in IndexedDB (AES-GCM, key derived from session token)
Verified before replayAuth token validity, HMAC signature, and 72-hour freshness window