rtfx.pro

Documentation

Set it up once, then ask Claude to publish.

Pick the Claude you already use, connect it in a couple of minutes, and send the link. Everything below the quickstart is detail you only need when you want it.

Choose your setup

Two ways to connect, and the difference that matters is where the connector runs. Both of these run on your own machine, so Claude can publish a file or folder you point it at.

Claude Desktop

  1. Download rtfx.dxt.
  2. Open the file. Claude Desktop installs the rtfx connector — there is no claude_desktop_config.json to edit.
  3. Leave rtfx endpoint as https://rtfx.pro, and leave Expose access-management tool off unless you want Claude changing who can open an artifact.
  4. Sign in once. A browser sign-in on this machine is enough — the credential is stored in your home directory and shared with the Claude Code plugin below, so /rtfx:login there also connects Claude Desktop. If you never use a terminal, paste a scoped token from dashboard → Integrations into the extension's API token field instead.
  5. Ask Claude to publish. doctor reports which credential it found if anything looks wrong.

Claude Code, in the terminal

Two commands to install, one browser sign-in to connect. Nothing to clone and no package to install — the plugin brings its own dependency-free publisher.

/plugin marketplace add yogevgab/artifacts-server
/plugin install rtfx@rtfx

/rtfx:login       # browser OAuth sign-in; stores a local renewing credential
/rtfx:setup       # confirm your credential reaches your instance
/rtfx:publish     # publish what the session just built
/rtfx:versions    # history · /rtfx:rollback to go back

What to ask Claude

Once either one is connected, publishing is a sentence rather than a command:

  • “Publish this page as a private link.”
  • “Publish the folder ./out to rtfx as client-demo.”
  • “Publish this PDF to rtfx and give me the link.”
  • “Publish the updated version to the same link.”
  • “Roll client-demo back to version 2.”

Every link starts restricted to you. Deciding who else may open it is a deliberate step you take yourself — see Access & privacy.

No install at all? rtfx.pro also runs a hosted MCP endpoint you authorize in the browser. It publishes content sent inside the tool call — an HTML page, a PDF, a small file list — and cannot reach your filesystem, so local folders still belong to the two setups above. Details under Connectors.

What rtfx.pro is

An artifact is one publishable thing: a single HTML page, a PDF, or a folder/zip with its own assets. Publishing gives it a slug, a version and an owner. From then on the artifact has a stable link, a history, and an access list — the three things an unlisted URL on a static host never gives you.

  • Private by default. A new artifact is restricted to its owner until they share it.
  • Owned. The person who published it manages it; nobody else can, however they were shared with.
  • Versioned. Re-publishing creates the next version at the same address.
  • Observable. The owner sees every view — person, time, country, version — and is emailed the first time each named recipient opens it.
  • Shareable beyond your account list. A link that expires when you say and revokes the moment you want it to, for a recipient who will never sign in.

Who uses it, and for what

Made for the work that comes out of an AI session: a finished page, a dashboard, a prototype, a report — something real, that needs a link today and shouldn't be on the open web.

Developers

Ship an agent's output without a pipeline

Claude Code just produced a working page. Publish it straight from the session — no repo, no build, no CDN config — and send the link before you lose the context.

Consultants & agencies

Client-ready links that stay off the open web

Send the proposal or the report to exactly the people on the account, get an email when each of them opens it, and roll back the moment a revision lands badly. For a recipient who will never have an account, an expiring share link.

Product & data teams

An internal home for dashboards and prototypes

Stop mailing HTML attachments and unlisted URLs. Publish the research dashboard or the prototype once, grant the team, and let the version history be the changelog.

Publishing

Three ways in, one behaviour. A file, a directory or a zip all work; a bundle keeps its relative paths, so ./assets/app.js resolves the way it did locally.

From the terminal

The CLI ships in the project repository — there is no npm package yet, so you run it from a checkout (or from the Claude Code plugin below, which needs no checkout at all).

$ git clone https://github.com/yogevgab/artifacts-server
$ cd artifacts-server && npm install

$ export ARTIFACTS_URL=https://rtfx.pro
$ export RTFX_API_TOKEN=rtfx_…    # dashboard → Integrations

$ node cli/artifacts.mjs publish ./index.html --slug q3-report --title "Q3 Report"
$ node cli/artifacts.mjs publish ./site --slug q3-report --note "revised charts"   # next version
$ node cli/artifacts.mjs grant q3-report alex@example.com
$ node cli/artifacts.mjs views q3-report
$ node cli/artifacts.mjs list

From the dashboard

Drop a file or zip into the publish panel under Artifacts, set a title, and it's live at its slug. Each artifact then has its own page, holding version history, sharing and the view log.

Over HTTP

The upload field decides how the file is read, not its extension: a zip goes in bundle, a single HTML or PDF document in file. A bundle needs index.html at its root.

$ export RTFX_API_TOKEN=rtfx_…              # dashboard → Integrations

# a zip — zip the folder first over HTTP → bundle
$ curl -X POST https://rtfx.pro/api/machine/artifacts \
    -H "Authorization: Bearer $RTFX_API_TOKEN" \
    -F slug=q3-report -F title="Q3 Report" -F bundle=@./dist.zip

# one HTML document or PDF → file
$ curl -X POST https://rtfx.pro/api/machine/artifacts     -H "Authorization: Bearer ***"     -F slug=q3-report -F title="Q3 Report" -F file=@./index.html

# PDF works through the same file= field
$ curl -X POST https://rtfx.pro/api/machine/artifacts     -H "Authorization: Bearer ***"     -F slug=board-pack -F title="Board Pack" -F file=@./board-pack.pdf

One credential. /api/machine is the machine surface: it authenticates the bearer token and nothing else, so the API token you minted in the dashboard is all a script, an agent or a CI job needs. It carries the same rules as the rest of the product — your scopes, your artifacts — and it deliberately does not answer for user management or token issuance, which need a real sign-in. The browser dashboard keeps using /api, where a session identifies you instead.

Self-hosting? An instance that gates every path at the edge with Cloudflare Access can pass a service token through as well, by adding CF-Access-Client-Id and CF-Access-Client-Secret headers; the CLI and the MCP server send them automatically when CF_ACCESS_CLIENT_ID and CF_ACCESS_CLIENT_SECRET are set. They get a request past Access and grant nothing inside the app. On rtfx.pro they are not needed.

Connectors: Claude Code, MCP & Hermes

Four ways to connect an agent, and they are not interchangeable: the local surfaces can publish by reading paths beside the client, while the hosted MCP surface publishes only content sent inside the tool call. This is the whole table before the detail:

ConnectorHow you connectPublishes?Best for
Claude Code plugin /rtfx:login — a browser sign-in, no token to copy Yes Publishing what the session just built.
Local MCP server Ships inside the plugin; installing the plugin registers it Yes — it runs beside your files An MCP client with no shell, such as Claude Desktop.
Remote MCP — mcp.rtfx.pro claude mcp login rtfx — OAuth, authorization code with PKCE Yes — content sent in the tool call, not filesystem paths Publishing an HTML page, PDF or small explicit file list from a hosted MCP client.
API, CLI and Hermes A scoped RTFX_API_TOKEN minted in the dashboard Yes CI, scripts and automation you own.

Agents publish through exactly the same CLI and API a human uses — there is no separate, weaker agent path. The plugin's browser sign-in is the short path; for CI, mint an API token in the dashboard with the read and publish scopes and hand it to the session:

# in a Claude Code session, with the plugin installed
/rtfx:publish ./out client-demo

# or from any shell — Claude Code, Hermes, CI — in a checkout of the project
$ node cli/artifacts.mjs publish ./out --slug client-demo --title "Checkout prototype"

Sharing is deliberately not part of the agent surface: grant needs the manage scope and lives with the rest of access control under Access & privacy. An agent publishes; a person decides who may read.

The Claude Code plugin

The two install commands are in Choose your setup. The plugin ships a skill, seven slash commands and a dependency-free publisher, so after /rtfx:login publish this is an ordinary sentence: the session picks the build output, versions it under a slug and hands back the link.

The plugin's browser login stores a local credential with owner-only permissions and prints only a token id, never the token. For CI and advanced scripts, a scoped RTFX_API_TOKEN from Integrations still works and takes priority over the browser sign-in.

The Claude Desktop extension and local MCP server

For Claude Desktop, the easiest local install is rtfx.dxt: open the Desktop Extension package and Claude Desktop registers the rtfx MCP server for you. The same plugin also ships the native MCP server directly, for manual setup or any other client that speaks MCP. This local server publishes, lists versions and rolls back as tool calls, holding the same scoped token and applying the same credential filters as the CLI. Because it runs on your machine, it can publish local paths and folders. To wire it up by hand instead, point a client at the server file inside the installed plugin (or inside a checkout) — it needs Node and nothing else:

{ "mcpServers": { "rtfx": {
    "command": "node",
    "args": ["/path/to/plugins/rtfx/scripts/rtfx-mcp.mjs"],
    "env": { "RTFX_API_TOKEN": "rtfx_…" } } } }

tools: publish · list_artifacts · get_versions · rollback · doctor

Remote MCP, authorized in the browser

rtfx.pro also runs a hosted MCP endpoint at https://mcp.rtfx.pro/mcp. A compliant client discovers the authorization server from the endpoint's own challenge and takes you through an ordinary browser sign-in and consent screen — authorization code with PKCE, refresh and revocation, and no bearer token to paste anywhere:

$ claude mcp add --transport http rtfx https://mcp.rtfx.pro/mcp
$ claude mcp login rtfx

tools: publish · list_artifacts · artifact_details · artifact_statistics · share_artifact · rollback_artifact · delete_artifact · doctor

It publishes content; it does not read paths. The hosted endpoint exposes publish for bytes sent inside the MCP call — an HTML page as text, a PDF as base64, or a small explicit file list — plus read tools for listing/details/statistics and manage-scoped tools for sharing, rollback and deletion. It deliberately refuses path, folder and similar arguments: a server-side endpoint asked for a path could only ever read the server's disk, not the client's. Large build outputs and local directories still belong to the plugin and the local MCP server.

Why a token, not your login. An API token is bound to its owner, carries only the scopes you give it (read, publish, manage), and can be revoked on its own. An agent holding one can publish as you — it can never become you, manage other people, or reach anyone else's artifacts.

Access & privacy model

There are two normal identity layers, plus a separate share-link path for recipients who will not sign in.

  1. Who may sign in at all. rtfx.pro owns the identity layer. Signup and sign-in are passwordless — a one-time code or magic link by email — and every new workspace starts on the Free plan.
  2. Who may open a given artifact. Either restricted (the owner plus the people they name) or everyone signed in. Sharing one artifact never widens who can sign in, and never exposes anything else you own.

An unauthorized request and a request for something that doesn't exist get the identical 404, so a link can't be used to confirm that a page exists. Artifact content is served from a dedicated origin that hosts files only — never the dashboard or the API — so uploaded HTML can't reach the app it was published from.

Share links, for recipients with no account

Naming a person is the default and the stronger option: they sign in as themselves, the view log names them, and revoking them is one action. But some recipients will never have an account — a client's legal team, a reviewer you met once — and for those there is a share link: a capability URL that opens exactly one artifact for whoever holds it, with no sign-in.

  • It expires, if you want it to. Never, in 7 days, in 30 days, or any number of days up to 365. Expiry is enforced when the link is redeemed, not by a cleanup job.
  • It revokes immediately. One action in the share panel, and the next request with that link — including one already inside the artifact — gets the same 404 as a stranger.
  • Only a hash of it is stored. The URL is shown once, when it is created, and cannot be redisplayed. A database dump does not contain a working link.
  • It is scoped to one artifact. Holding a link for one thing never opens another, and it grants no management rights.
  • It carries no password. The URL is the whole credential — that is what makes expiry and revocation the controls that matter, and why a link you can't take back would be the wrong design.

The trade is attribution. A share-link visitor holds no identity, so their view is not attributed to anybody in the view log — the link records when it was last used, and that is all. If you need to know exactly who read something, grant access by email instead.

Worth being precise about what the content origin does and doesn't do: it separates published content from rtfx.pro, and all artifacts share it. It is not a per-artifact browser sandbox, so two pages published by people who don't trust each other are kept apart by the access list — who may open what — rather than by the browser's origin boundary. Publish only what you're willing to run in the same origin as your other artifacts.

None of it is crawlable: artifacts, the dashboard and the API are excluded in robots.txt, marked noindex, and served with an X-Robots-Tag: noindex header. The only indexable pages are this one, the landing page, the sign-in page and the two legal pages.

What rtfx.pro itself stores about you — and the fact that it runs no analytics, advertising or third-party tracking — is set out in the privacy policy. What you agree to by publishing here is in the terms of use.

Versions & view logs

Every publish to a slug creates the next immutable version. The public link always points at the current one; each older version keeps its own preview URL for whoever manages the artifact, and rollback is a single action. Nothing is overwritten, so a bad revision is a click to undo rather than a re-run of whatever produced it.

The view log answers the question client work always ends with: who opened it, when, from where, and which version they saw. Views are recorded for signed-in people opening a page — not for asset requests or machine tokens.

The artifact's page in the dashboard reads that log three ways, because "has the client seen it?" and "can I safely roll back?" are different questions: Views is the raw event list, Viewers is one row per person with how often they came back and which version they last saw, and Views by version shows which versions people are still opening.

Read receipts. You do not have to go and look. The first time each person you granted access to opens an artifact, rtfx.pro emails you — once per person, never for your own views, and never for a share-link visitor, who has no identity to name. It is on by default; switching it off for one artifact is an API call today (PUT /api/artifacts/:slug/receipts) rather than a control in the dashboard.

Why rtfx.pro

Several tools now host the page an AI session just produced, and they mostly agree on the basics. So the useful question is not "does it host HTML" — it is what happens on the second day, when the link is out, the client asks who has seen it, and a revision lands badly. Here is the split, written so you can decide in one screen.

Table stakes

Present here, and expected of anything in this category. Nobody should pick a tool for these.

  • Publishing with no build step. A single HTML file, a PDF, a folder or a zip goes up as it is; relative paths keep working.
  • A stable link. One slug, one URL, for as long as the artifact exists.
  • Re-publishing to the same address. The link you already sent keeps working after an update.
  • A dashboard. Drag-and-drop publishing, an inventory, and the state of each artifact in one place.
  • Some idea of who looked. Counts at minimum.

What actually makes it different

These are the reasons to choose rtfx.pro over a general "share your AI output" tool.

  • Agent-native publishing, not an upload form with an API bolted on. Claude Code, a native MCP server, a Hermes run, the CLI and the HTTP API all take the same path a human takes — there is no separate, weaker agent route. Connecting Claude Code is a browser sign-in rather than a token you copy between two windows, and what it leaves behind is still a scoped, owner-bound, revocable credential: an agent can publish as you and can never become you.
  • Identity-first access, with bounded share links for exceptions. Every artifact is restricted until you name someone, or create a share link for somebody who will not sign in. Unauthorized and non-existent requests return the identical 404, so a random link can't even confirm the page is real. Named sharing is revocable per artifact and never widens who can sign in.
  • Immutable versions with one-click rollback. Every publish is a new version with its own preview URL. Nothing you have already shared is overwritten, so a bad revision is an undo rather than a re-run of whatever produced it.
  • A view log that names a person and a version. Not a hit counter: who opened it, when, from which country, and which version they saw — the question every client project ends with. And you are emailed the first time each named recipient opens it, so the answer arrives without you asking for it.
  • Share links that expire and revoke, for people with no account. When the recipient will never sign in, a capability URL opens exactly one artifact — with an expiry you choose (never, 7 days, 30 days, up to 365) and immediate revocation. Only a hash of it is stored, so it cannot be redisplayed or dumped. It is deliberately not a password: the URL is the whole credential, which is exactly why being able to expire and revoke it is the control that matters.
  • Workspace governance. Artifacts belong to a workspace, not to one shared login. Members carry a role — owner, admin, member or viewer — and instance privilege is re-derived from configuration on every request, so no database write can escalate anyone.
  • A branded address for the workspace, on a URL you can read out loud. A paid workspace can claim an address — yogev, maya, your company — and every artifact in it answers at rtfx.pro/yogev/q3-board-report and rtfx.pro/maya/client-proposal as well as at its original URL. Both keep working, forever: the branded link is a second way in, never a move. It is a path on rtfx.pro, not a custom domain of your own — those are still not built, and are listed below.
  • Uploaded HTML runs somewhere it can't reach us. Artifact files are served from a dedicated content origin that hosts files and nothing else — no dashboard, no API, no admin — so a page you publish can never touch the app that published it. Artifacts share that one content origin, so it isolates published content from rtfx.pro rather than artifacts from each other.
  • Nothing watches the visitor. No analytics, advertising or third-party tracking anywhere on this site, and none injected into what you publish. The view log is ours to show you, not a product we resell.

Not here yet

Listed so you know they are deliberate gaps rather than things you failed to find. If a project needs one of these today, this is the honest place to find that out.

  • Per-link secrets. Not built A shared password on the link itself, separate from the recipient's email identity. What exists instead is an identity-backed access list, and a share link you can give an expiry date and revoke at any moment — see Access & privacy. Neither of those is a password, and this page will not call them one.
  • Custom domains. Not built Serving artifacts from your own hostname — docs.yourcompany.com. What is built is the branded workspace address above, which is a path on rtfx.pro; the two are not the same thing and this page will not blur them. Content already runs on its own origin, which is the hard part.
  • Editing a published page in place. Not built Fixing a number or a sentence from the dashboard without going back to the session that made it. Today a change is a re-publish, which is a new version at the same link — cheap when Claude is still open, and a detour when it isn't.
  • Approvals, polls and review workflows. Not built rtfx.pro can show view evidence and access requests, but it is not a review workflow system around the artifact — there are no comments or annotations on a page you published.

Why not a generic static host?

You could put this on any bucket or edge host. Here's what you'd then have to build yourself.

What you needGeneric static hostingrtfx.pro
PrivacyPublic by default; an unlisted URL is the whole defence — anyone with the link is in.Private by default. Access is per artifact, per person, and revocable.
IdentityBring your own auth, or bolt on a password everyone shares.Passwordless rtfx.pro email sign-in, workspace members and per-artifact guests.
VersionsA deploy overwrites the last one; rollback means a rebuild.Every publish is an immutable version with its own preview and one-click rollback.
AuditRaw request logs, if you wire up analytics.A per-artifact view log: person, time, country, version.
Agent workflowGit push, build, wait, configure.One command, or one API call, from inside the session that made the page.

API

Authenticate with Authorization: Bearer <token> and nothing else. Every endpoint is scoped to what the token's owner may see; an admin sees everything they administer. See Publishing for a runnable call.

  • GET /api/machine/artifacts — list artifacts you can manage.
  • POST /api/machine/artifacts — publish (multipart: title, slug, and either file for one .html document or bundle for a .zip).
  • GET /api/machine/artifacts/:slug/versions — version history.
  • POST /api/machine/artifacts/:slug/current — make an earlier version live again (JSON: {"version": 1}).
  • GET /api/machine/artifacts/:slug/views — the view log.
  • PUT /api/machine/artifacts/:slug/access — set visibility and the share list (JSON: visibility, emails).
  • DELETE /api/machine/artifacts/:slug — delete an artifact and its versions.

The dashboard share panel uses the same authenticated API surface with the same scope rules as the rest of artifact management: GET /api/artifacts/:slug/links lists links for callers with read, POST /api/artifacts/:slug/links and DELETE /api/artifacts/:slug/links/:id create and revoke links for callers with manage ({"expires_in_days": 30}, 1–365, omit for a link that never expires — the URL comes back once and is never stored), and GET/PUT /api/artifacts/:slug/receipts reads and sets the read-receipt switch for one artifact.

read covers the listings, publish covers publishing and rollback, manage covers sharing and deletion — a token holds only the scopes you gave it. Managing people or minting tokens is not on this surface at all: those need a signed-in session, so a leaked token can never widen its own reach.

The artifacts themselves live behind sign-in; these paths are documented here but the data is not public. Full request/response detail ships with the CLI (node cli/artifacts.mjs --help in a checkout) and in the dashboard once you have access.

Frequently asked

Is anything I publish visible to the public web?

No. Every artifact is access-controlled: a visitor without a valid identity gets a 404, and so does a signed-in person who hasn't been granted access. Artifact origins send X-Robots-Tag: noindex and are excluded in robots.txt, so nothing you publish is crawled or indexed. Only the product pages — the landing page, these docs and the sign-in page — are public.

How do I publish from Claude Code, an MCP client or a Hermes run?

Give the agent a scoped API token and let it call the same CLI or HTTP API you use. The Claude Code plugin is the shortest path: install it from the project's marketplace and 'publish this' becomes the last step of an ordinary session. The same plugin ships a native MCP server, so a client with no shell — Claude Desktop, for instance — publishes as a tool call over the same path. From a terminal, run the CLI out of a checkout of the project: `node cli/artifacts.mjs publish ./out --slug client-demo` handles a single file, a folder or a zip. There is no npm package to install yet, and nothing here pretends there is. A token is bound to its owner and can be revoked at any time, so the agent never gains your account.

Can the remote MCP endpoint at mcp.rtfx.pro publish for me?

Yes, when the content is sent inside the tool call. The hosted endpoint is authorized in the browser over OAuth and exposes publish, read tools and manage-scoped artifact lifecycle tools. Remote publish accepts an HTML page as text, a PDF as base64, or a small explicit file list; it rejects path, folder and zip-path arguments because a server-side endpoint cannot read the client's local filesystem. Use the Claude Code plugin or local MCP server for large folders and build outputs that already exist on disk.

Do I still have to copy an API token to use Claude Code?

Not for ordinary use. Install the plugin and run /rtfx:login: it opens a browser sign-in and stores a renewing local credential with owner-only permissions, printing only a token id and never the token itself. A scoped RTFX_API_TOKEN from Integrations still works and takes priority over the browser sign-in, which is what CI and scripted automation should use.

What happens when I publish the same slug twice?

You get a new immutable version at the same URL. On the free plan the five most recent versions are kept and older ones expire; paid plans keep every version. Retained versions stay addressable for preview, and rollback is one click — nothing you have already shared is overwritten or lost.

Who can sign in to rtfx.pro?

Signup is self-serve. rtfx.pro is the identity provider and sign-in is passwordless — create an account or sign in with a one-time code or magic link by email. Every workspace starts on Free; paid plans are optional upgrades from Settings.

Can someone I share an artifact with see my other artifacts?

No. A grant applies to exactly one artifact. It never confers management rights, never reveals your other work, and never widens who can sign in.

Can I put a password on a share link?

Not today, and nothing here pretends otherwise. Access is by identity instead: you name the people who may open an artifact; anyone else gets a 404. For somebody who will never sign in, create a revocable share link instead. Sign-in itself is passwordless — a one-time code or magic link by email — so there is no shared secret to leak, rotate or forget. What a share link does have is an optional expiry date and immediate revocation, which is the control most people are reaching for when they ask about a password. Per-link secrets and custom domains are listed as not built on this page.

Can I send something to a client who will never have an account?

Yes — create a share link. It is a capability URL: whoever holds it can open that one artifact with no sign-in, and it can open nothing else you have published. You choose whether it never expires or expires in 7 days, 30 days, or any number of days up to 365, and you can revoke it immediately from the same panel. Only a hash of the link is stored, so it cannot be re-displayed after it is created and it cannot leak from our database. It carries no password. The trade is attribution: a share-link visitor holds no identity, so their view is not attributed to anybody in the view log — if you need to know exactly who read it, grant access by email instead.

Will I know when somebody opens what I sent?

Yes. The first time each person you granted access to opens an artifact, rtfx.pro emails you — you do not have to go and look. That is on by default; switching it off for one artifact is an API call today (PUT /api/artifacts/:slug/receipts) rather than a control in the dashboard. Everything else lives on the artifact's own page in the dashboard: every view with its person, time, country and version; one row per viewer with how often they came back and which version they last saw; and which versions are still being opened, so a rollback does not quietly break somebody's link.

How is this different from the other tools for sharing what Claude built?

Most of them start from a public link and add controls on top of it. rtfx.pro starts locked, and sharing is a deliberate act you can see and undo. The differences that survive a real project: publishing is agent-native — Claude Code, Hermes, a CLI and the HTTP API all take the same path — access is an identity-backed list rather than a secret URL, every publish is an immutable version you can roll back, the view log names the person and the version they saw, and a workspace has roles so a team is not one shared login.

Where does the uploaded HTML actually run?

On a separate content origin (a.rtfx.pro) that serves artifact files and nothing else — no dashboard, no API, no admin. Uploaded HTML therefore can never run in the same origin as the app that manages it. That boundary sits between your artifacts and rtfx.pro, not between one artifact and the next: every artifact is served from the same content origin today, so what keeps one publisher's page away from another's is the access list, not the browser. If you need two mutually distrusting publishers isolated by the browser itself, that is not what this origin split gives you.

Get an account

Create a workspace on the Free plan, or sign in if you already have one.