0saas

Job ticket 679472 · SMB · gantt sheet · no subscription

Asana's free plan holds 2 users and a list. Here is the sheet that draws the timeline for nothing.

This page is a gantt sheet. You feed it a project, a week's facts, or a stream of incoming work, a free-tier model returns the dependency-ordered plan, the status report, or the intake form spec as strict JSON, and your browser prints it as spec tables you export as CSV. No project is hosted, no task is assigned, nothing is stored — the plan is what you load into Asana Free's two seats, or into any planner that reads a table. The prompts are printed at the bottom of this page so you keep them even if this site disappears.

Asana is a trademark of Asana, Inc. This is an independent, unaffiliated comparison built on Asana's own published pricing page, linked below. We are not Asana, and nothing here is endorsed by them.

Gantt sheet — rendered in this browser

Source: noneRendered: 0Uploaded to 0saas: nothing

Sample data is illustrative, not a claim about Asana. Every Asana figure on this page comes from the linked pricing page, read 2026-09-17.

The prompt pack

Three prompts, each mapped one-to-one onto a Asana feature you are currently rationed on. Run them from this page with a free key, or copy them into any free chat model — the text is identical either way, and it is printed in full at the bottom of this section so it survives this site.

Loading the pack from tools.json… If this fails, the full prompt text is still readable below.

What Asana's own pricing page says

Read from asana.com/pricing on 2026-09-17. Fields we could not read are marked unconfirmed rather than filled in with a plausible number.

Asana Personal vs Starter vs this page — verified 2026-09-17
The jobPersonal (2 users)Starter (US$10.99/person)This page + a free-tier model
PriceUS$0 — 2 users, list viewsUS$10.99 per person / month (billed annually)US$0 forever. A free-tier key costs nothing; the prompts are yours.
Timeline / GanttNot on FreeIncludedUnmetered by us — Prompt 01 returns the dependency-ordered plan with computed windows and the critical path. Your ally's free allowance is the only ceiling: the Gemini free tier's daily base covers many runs.
FormsNot on FreeIncludedPrompt 02 returns the intake spec any free form tool can build, with the routing rule that names the converter — the form is the queue, the queue is honest.
Status reportingPortfolio reports are paidPortfolio reportingPrompt 03 writes the weekly status from the plan and the facts, every state with its evidence — a report a 2-user workspace can actually produce.
Users2UnlimitedThe plan is a file, not a seat. Two users read the same CSV; the document is the third, fourth and fifth user.
Who sees your project planAsanaAsanaOnly the inference provider you choose for the plan — the tasks and the people, never the live task state.

What this replaces, and what it does not

A displacement claim you cannot substantiate is a lie with good typography. This is the whole scope, including the parts where Asana wins.

Replaced: the paid Timeline/Gantt for design

Prompt 01 returns the plan as a dependency-ordered table — windows computed from the chain, same-owner overlaps serialized, the critical path named.

Replaced: Asana Forms for capture

Prompt 02 returns the intake field spec with the routing rule — buildable in any free form tool, with the converter named for a 2-user workspace.

Replaced: the paid portfolio reporting for the weekly number

Prompt 03 returns the area × state × evidence × next grid, with the overall state reflecting the worst critical-path area.

Not replaced: the live project

No project is hosted, no task is assigned, no reminder fires. The plan is loaded into Asana Free's two seats — or any planner — and the tool does its own thing after.

Not replaced: automations and rules

No automation engine. The routing rule is a human rule, named as one, and the page says exactly that.

Not replaced: cross-project dashboards

The status document reports one project. Rollups, cross-project dependencies and the live dashboards are still computed by Asana — the document is what they would show, written down.

The prompts, in full, as text

Copy these into any model. They are the product; the page around them is convenience. Each block is the exact system prompt the interactive runner sends, plus the user-message template.

Prompt 01 — 1. Project planner · asana-project-planner v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: Asana's paid Timeline/Gantt (the plan view that costs US$10.99 per person) — the plan as a dependency-ordered table you can read in any spreadsheet.

Why this model: The plan's value is in the dependency order and the arithmetic; strict-JSON on the Gemini free tier makes the sum check visible in the answer. Fallback ally: OpenRouter — :free model variants.

System prompt (1786 chars):

You are the planner at a gantt sheet. You turn a project brief into a machine-readable, dependency-ordered project plan.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "project": string (max 8 words),
  "kicker": string (max 6 words),
  "columns": [ "task", "owner", "days", "depends_on", "window" ],
  "rows": [ [ string, string, integer, string, string ] ],
  "critical_path_days": integer,
  "total_tasks": integer,
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. 6 to 16 "rows", in start order. "depends_on" names the task(s) it cannot start before, or 'start' for no dependency. A task that depends on a task listed after it is a plan that cannot run — order the rows so every dependency points upward.
2. "days" is the task's duration in working days. "window" is 'start +N days' from the project start, computed by walking the dependency chain (a task starts when its latest dependency ends). Compute the windows; do not eyeball them.
3. "critical_path_days" is the length of the longest dependency chain — compute it. "total_tasks" equals the row count — count it.
4. "owner" names a person or role from the brief. Two tasks owned by the same person must not overlap in their computed windows — if they do, serialize them (add the dependency) and note the serialization in "notes". A person cannot be in two places is the rule the paid Gantt enforces and this plan must enforce too.
5. Every task from the brief appears exactly once. If the brief implies a task that is not stated (client approval, staging), add it — a plan without the approval task is a plan that misses the date. Flag added tasks in "notes" as 'added: not in brief'.
6. Banned: 'TBD' as an owner, 'ASAP' as a window, exclamation marks, emoji. Write in the language of the brief.

User message template:

The project (scope, the hard date, what 'done' means): {{project}} The people and their capacity (who can do what, full-time or partial): {{people}}

Variables:

  • {{project}} — The project (max 800 chars) sample data shipped with the tool
  • {{people}} — The people (max 250 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "project", "kicker", "columns", "rows", "critical_path_days", "total_tasks", "notes" ], "properties": { "project": { "type": "string" }, "kicker": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 6, "maxItems": 16 }, "critical_path_days": { "type": "integer" }, "total_tasks": { "type": "integer" }, "notes": { "type": "array" } } }

Decoding: temperature 0.35 · max 2200 output tokens · responseMimeType application/json · budget ~1,000 in / ~1,100 out per run · cost per run: 1 request per plan — a rounding error against the Gemini free tier's daily base.

Prompt 02 — 2. Intake form · asana-intake-form v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: Asana Forms (a paid-plan feature) — the intake form spec that a free form tool builds, so the form's answers still land in Asana Free by hand.

Why this model: An intake spec is a table of (field → type → why) with a routing rule; strict-JSON keeps the field count bounded and the routing explicit. Fallback ally: OpenRouter — :free model variants.

System prompt (1584 chars):

You are the intake clerk at a gantt sheet. You turn a team's work types into a machine-readable intake form spec.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "form": string (max 8 words),
  "kicker": string (max 6 words),
  "columns": [ "field", "type", "why" ],
  "rows": [ [ string, string, string ] (5-10 rows) ],
  "routing": string (max 30 words),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. 5 to 10 "rows". "type" is exactly one of: text, number, email, date, single choice, multiple choice, yes/no, file. A field the form tool cannot render is a spec that cannot be built.
2. "why" states the one decision the field makes possible ("budget band routes to the right partner", "deadline sets the due date"). A field whose "why" is 'it is good to know' is banned — cut it.
3. Every choice field's choices are named in "why" (3-6 choices, concrete, from the brief). A single-choice field with choices like 'other' as its second option is a field asking for free text in disguise.
4. "routing" states how a completed form becomes a task: who creates it, which project it lands in, and which field becomes the due date. If the team runs Asana Free (2 users), the routing says 'one person per week converts the form to a task — the form is the queue' and "notes" says the automation is the paid feature being displaced.
5. Field order: the requester's identity last (same rule as a paper intake — a name without a story is a record without a case). Banned: 'please tell us everything', exclamation marks, emoji. Write in the language of the brief.

User message template:

The work that arrives (what people request, what the team needs to know to accept it): {{work}}

Variables:

  • {{work}} — The work (max 800 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "form", "kicker", "columns", "rows", "routing", "notes" ], "properties": { "form": { "type": "string" }, "kicker": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 5, "maxItems": 10 }, "routing": { "type": "string" }, "notes": { "type": "array" } } }

Decoding: temperature 0.45 · max 1700 output tokens · responseMimeType application/json · budget ~900 in / ~800 out per run · cost per run: 1 request per spec — under 1% of the Gemini free tier's daily base.

Prompt 03 — 3. Status composer · asana-status-composer v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: Asana's paid portfolio reporting — the weekly status for a 2-user workspace, written from the plan and the week's facts instead of a dashboard the free plan does not show.

Why this model: A status is a small table of (area → state → evidence → next) where the evidence must come from the input; strict-JSON keeps the compression honest. Fallback ally: OpenRouter — :free model variants.

System prompt (1815 chars):

You are the status clerk at a gantt sheet. You turn a project plan and a week's facts into a machine-readable status report.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "project": string (max 8 words),
  "kicker": string (max 6 words),
  "columns": [ "area", "state", "evidence", "next" ],
  "rows": [ [ string, string, string, string ] (4-8 rows) ],
  "overall": "on track" | "at risk" | "off track",
  "risk": string (max 25 words),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "rows" covers the plan's live areas (from the plan in the input), one row each, in plan order. "state" is exactly one of: done, on track, at risk, blocked, not started.
2. "evidence" cites the fact from the input that justifies the state ('the design pass finished Tuesday', 'the data pull is 1 day late — vendor delay'). A state without evidence is an opinion and is banned; if the input has no fact for an area, the state is 'not started' or 'at risk' with the evidence 'no update this week' — the silence is the data.
3. "next" is the one concrete step with its owner from the input. 'Continue work' is banned; 'Jonas exports the final PDF Thursday' passes.
4. "overall" is the worst state that matters: if any critical-path area is blocked or at risk, the project is at risk or off track — a status that calls a blocked critical path 'on track' is a lie. State the rule you applied in "risk" ('overall is at risk because the client review is 1 day late and the 28th does not move').
5. "risk" names the single biggest threat with its one mitigating step from the input, or 'none identified' if the input shows none — 'none identified' is a valid answer and often the true one.
6. Banned: 'things are going well', 'smooth', 'momentum', exclamation marks, emoji. Write in the language of the plan.

User message template:

The plan (from prompt 1, or the live task list) and this week's facts: {{plan_and_facts}}

Variables:

  • {{plan_and_facts}} — Plan and week's facts (max 2500 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "project", "kicker", "columns", "rows", "overall", "risk", "notes" ], "properties": { "project": { "type": "string" }, "kicker": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 4, "maxItems": 8 }, "overall": { "type": "string" }, "risk": { "type": "string" }, "notes": { "type": "array" } } }

Decoding: temperature 0.4 · max 1700 output tokens · responseMimeType application/json · budget ~1,400 in / ~700 out per run · cost per run: 1 request per status — under 1% of the Gemini free tier's daily base.

Questions worth asking before you cancel

Is this actually free, or is there a subscription hiding?

There is no subscription and, right now, no paid tier at all. The whole tool is unmetered. A one-time unlock for plan diffing is planned, but no price is shown anywhere on this site until a real Stripe Payment Link exists and its price is read back from Stripe's API rather than typed by hand.

Do you need an API key?

No. Copy-Paste Relay works with any free chat model you already use: copy the prompt block, paste it in, paste the JSON answer back into the box. A key only removes the copy-paste step. If you do use one, it is stored in your browser's localStorage and sent only to that provider — 0saas has no endpoint that accepts a key.

Which free model is best for this?

The Gemini free tier — the plan's window arithmetic and the status's evidence discipline are the jobs that need the strict-JSON path. OpenRouter's :free variants are the second-model check on the critical path.

Will the windows actually line up when I load the plan?

They are computed from the dependency chain in the answer, not typed by hand — a task's window is its latest dependency's end. If you change a duration after loading, recompute in your planner; the table's rule is the same rule the Gantt view applies, minus the view.

Is 0saas affiliated with Asana?

No. Asana is a trademark of Asana, Inc. We name it because a comparison that will not name the thing it compares against is useless. Pricing figures come from Asana's own pricing page, linked above, with the date we read it and a per-field confidence marker.

Next on the ledger