Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions apps/logicsrc-web/contract/logicsrc-web.contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ describe("POST /api/hire-us/coinpay-checkout", () => {
payment_method: "both",
currency: "usdc_pol",
blockchain: "USDC_POL",
description: "LogicSRC Hire Us - 10h @ $400/hour",
description: "LogicSRC Hire Us - 10 agent-hours @ $400/agent-hour",
success_url: "https://logicsrc.test/hire-us?payment=success",
cancel_url: "https://logicsrc.test/hire-us?payment=cancelled",
redirect_url: "https://logicsrc.test/hire-us?payment=coinpay",
Expand Down Expand Up @@ -277,7 +277,7 @@ describe("POST /api/hire-us/coinpay-checkout", () => {

expect(response.status).toBe(201);
expect(createBody.amount_usd).toBe(10100);
expect(createBody.description).toBe("LogicSRC Hire Us - 25.25h @ $400/hour");
expect(createBody.description).toBe("LogicSRC Hire Us - 25.25 agent-hours @ $400/agent-hour");
expect(createBody.metadata).toMatchObject({ billing: "metered_hours", hours: 25.25, rate_usd_per_hour: 400 });
expect(body.payment).toMatchObject({ amount_usd: 10100, hours: 25.25, rate_usd_per_hour: 400 });
});
Expand All @@ -303,7 +303,7 @@ describe("POST /api/hire-us/coinpay-checkout", () => {
expect(response.status).toBe(422);
expect(body).toEqual({
success: false,
error: "Approved hours must be a quarter-hour increment of at least 10"
error: "Approved agent-hours must be a quarter-hour increment of at least 10"
});
}

Expand Down
4 changes: 2 additions & 2 deletions apps/logicsrc-web/e2e/logicsrc.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ test.describe("LogicSRC PWA", () => {

await expect(page.getByRole("heading", { name: "Hire Us", exact: true })).toBeVisible();
await expect(page.locator(".price-row strong", { hasText: "$400" })).toBeVisible();
await expect(page.getByText("per hour")).toBeVisible();
await expect(page.getByText("Ten-hour minimum engagement")).toBeVisible();
await expect(page.getByText("per agent-hour", { exact: true })).toBeVisible();
await expect(page.getByText("Ten-agent-hour minimum engagement")).toBeVisible();
await expect(page.getByText("open infrastructure and open specs for AI agent systems")).toBeVisible();
await expect(page.getByRole("button", { name: "Request review" })).toBeVisible();
await expect(page.getByPlaceholder("you@example.com")).toBeVisible();
Expand Down
2 changes: 1 addition & 1 deletion apps/logicsrc-web/src/app/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const ROUTE_META: Record<string, { title: string; description: string }> = {
},
"hire-us": {
title: "Hire Us · LogicSRC",
description: "Implementation help for LogicSRC, AgentSwarm, and Credential Sharing at $400/hour for accepted work, paid via CoinPay.",
description: "Implementation help for LogicSRC, AgentSwarm, and Credential Sharing at $400/hour/agent for accepted work, paid via CoinPay.",
},
// /agent-swarm was the AgentSwarm placeholder band. It is now the OpenFleet
// spec at app/openfleet; next.config.ts redirects the old path there.
Expand Down
2 changes: 1 addition & 1 deletion apps/logicsrc-web/src/app/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export default function AboutPage(): ReactNode {

<h3>Work with us</h3>
<p>
Profullstack implements LogicSRC-based systems at $400/hour for
Profullstack implements LogicSRC-based systems at $400/hour/agent for
accepted work, paid via CoinPay. See <a href="/hire-us">Hire Us</a>.
</p>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import { choosePaymentRail, fetchMerchantEligibility, parseJson } from "@/lib/co
export const dynamic = "force-dynamic";

// POST /api/hire-us/coinpay-checkout — create a CoinPay checkout for approved
// Hire Us hours at $400/hour, choosing card/crypto/both based on merchant
// Hire Us hours at $400/hour/agent, choosing card/crypto/both based on merchant
// eligibility. Billing is metered: the caller supplies the approved hours and the
// amount is derived from them, never a fixed recurring figure.
const RATE_USD_PER_HOUR = 400;
const MINIMUM_HOURS = 10;

// Hours represent total approved agent-hours, not wall-clock duration.
// Hours are quoted in quarter-hour increments; anything finer is a rounding
// artifact rather than a real billing unit.
function parseHours(value: unknown): number | null {
Expand Down Expand Up @@ -43,7 +44,7 @@ export async function POST(request: NextRequest) {
return json(
{
success: false,
error: `Approved hours must be a quarter-hour increment of at least ${MINIMUM_HOURS}`
error: `Approved agent-hours must be a quarter-hour increment of at least ${MINIMUM_HOURS}`
},
422
);
Expand All @@ -69,14 +70,15 @@ export async function POST(request: NextRequest) {
payment_method: paymentRail.method,
currency: paymentRail.currency,
...(paymentRail.blockchain ? { blockchain: paymentRail.blockchain } : {}),
description: `LogicSRC Hire Us - ${hours}h @ $${RATE_USD_PER_HOUR}/hour`,
description: `LogicSRC Hire Us - ${hours} agent-hours @ $${RATE_USD_PER_HOUR}/agent-hour`,
success_url: `${publicUrl}/hire-us?payment=success`,
cancel_url: `${publicUrl}/hire-us?payment=cancelled`,
redirect_url: `${publicUrl}/hire-us?payment=coinpay`,
webhook_url: `${publicUrl}/api/webhooks/coinpay`,
metadata: {
product: "logicsrc-hire-us",
billing: "metered_hours",
unit: "agent_hour",
hours,
rate_usd_per_hour: RATE_USD_PER_HOUR,
source: "logicsrc.com/hire-us",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { json } from "@/lib/http";
export const dynamic = "force-dynamic";

// POST /api/hire-us/project-request — accept a Hire Us project request before any
// CoinPay invoice is created. Hire Us bills metered hours at $400/hour, so there is
// CoinPay invoice is created. Hire Us bills metered hours at $400/hour/agent, so there is
// no amount until we accept the project and hours are approved.
const RATE_USD_PER_HOUR = 400;
const MINIMUM_HOURS = 10;
Expand Down
2 changes: 1 addition & 1 deletion apps/logicsrc-web/src/app/llms.txt/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ ${guides}
## Company & legal

- [About](${SITE_URL}/about): What LogicSRC is and who maintains it (Profullstack, Inc.).
- [Hire Us](${SITE_URL}/hire-us): Implementation help at $400/hour for accepted LogicSRC work.
- [Hire Us](${SITE_URL}/hire-us): Implementation help at $400/hour/agent for accepted LogicSRC work.
- [Pricing](${SITE_URL}/pricing)
- [Terms](${SITE_URL}/terms)
- [Privacy](${SITE_URL}/privacy)
Expand Down
8 changes: 4 additions & 4 deletions apps/logicsrc-web/src/app/pricing/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { SiteShell } from "@/components/site-shell";
export const metadata: Metadata = {
title: "Pricing · LogicSRC",
description:
"LogicSRC the open specification, schemas, SDKs, and CLI are free and open source. Implementation help is $400/hour for accepted work, paid via CoinPay.",
"LogicSRC the open specification, schemas, SDKs, and CLI are free and open source. Implementation help is $400/hour/agent for accepted work, paid via CoinPay.",
alternates: { canonical: "/pricing" },
};

Expand All @@ -16,7 +16,7 @@ const FAQ: Array<{ q: string; a: string }> = [
},
{
q: "How does pricing work?",
a: "The standard is free. If you want Profullstack to build a LogicSRC-based system for you, implementation work is billed at $400/hour against actual hours worked, invoiced through CoinPay after you approve them. The minimum engagement is 10 hours.",
a: "The standard is free. If you want Profullstack to build a LogicSRC-based system for you, implementation work is billed at $400/hour/agent against actual agent-hours worked, invoiced through CoinPay after you approve them. The minimum engagement is 10 agent-hours.",
},
{
q: "Who is LogicSRC for?",
Expand Down Expand Up @@ -61,10 +61,10 @@ export default function PricingPage(): ReactNode {
CLI, TUI, and reference plugins are open source.
</li>
<li>
<strong>Implementation — $400/hour.</strong> Profullstack builds
<strong>Implementation — $400/hour/agent.</strong> Profullstack builds
LogicSRC-based systems for accepted projects, billed against actual
hours worked and invoiced via CoinPay once you approve them.
Ten-hour minimum engagement. See <a href="/hire-us">Hire Us</a> and{" "}
Ten-agent-hour minimum engagement. See <a href="/hire-us">Hire Us</a> and{" "}
<a href="/terms">Terms</a>.
</li>
</ul>
Expand Down
2 changes: 1 addition & 1 deletion apps/logicsrc-web/src/app/skill.md/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Base URL: ${SITE_URL}
- Read the LogicSRC coordination schemas and conventions.
- Compare LogicSRC with OpenSpec.dev.
- Request paid implementation help via the Hire Us flow (${SITE_URL}/hire-us),
billed at $400/hour for accepted work and paid through CoinPay.
billed at $400/hour/agent for accepted work and paid through CoinPay.

## Notes

Expand Down
11 changes: 6 additions & 5 deletions apps/logicsrc-web/src/app/terms/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { SiteShell } from "@/components/site-shell";
export const metadata: Metadata = {
title: "Terms · LogicSRC",
description:
"Terms of engagement for LogicSRC: the specification and tooling are open source and free; Profullstack implementation work is billed at $400/hour against approved hours, with a 10-hour minimum.",
"Terms of engagement for LogicSRC: the specification and tooling are open source and free; Profullstack implementation work is billed at $400/hour/agent against approved hours, with a 10-agent-hour minimum.",
alternates: { canonical: "/terms" },
};

Expand Down Expand Up @@ -35,7 +35,7 @@ export default function TermsPage(): ReactNode {
<h3>Rate</h3>
<p>
Profullstack implementation work is billed at{" "}
<strong>$400 per hour</strong>. One rate applies to all
<strong>$400 per agent-hour</strong>. One rate applies to all
implementation work — specs, CLIs, SDKs, MCP resources, APIs, PWAs,
and provider-neutral plugin surfaces. There are no tiers, role-based
rates, or volume discounts.
Expand All @@ -56,10 +56,11 @@ export default function TermsPage(): ReactNode {

<h3>How you are invoiced</h3>
<p>
Billing is metered against actual hours worked, not a subscription.
Billing is metered against actual agent-hours worked. Two agents working
five hours use ten agent-hours and cost $4,000.
After we accept a project, we send you a record of hours worked. Once
you approve those hours, we issue a CoinPay invoice for exactly that
amount at $400/hour. You are never charged for hours you have not
amount at $400/hour/agent. You are never charged for hours you have not
seen and approved.
</p>
<p>
Expand All @@ -69,7 +70,7 @@ export default function TermsPage(): ReactNode {

<h3>Minimum engagement</h3>
<p>
The minimum engagement is <strong>10 hours</strong>. Engagements
The minimum engagement is <strong>10 agent-hours</strong>. Engagements
smaller than this do not cover the cost of scoping and context, so we
will decline them rather than quote them.
</p>
Expand Down
2 changes: 1 addition & 1 deletion apps/logicsrc-web/src/components/home-interactivity.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export function HomeInteractivity(): null {
}

result.replaceChildren(
buildParagraph("Request received. If it is a fit, we will scope the work and invoice approved hours at $400/hour via CoinPay.")
buildParagraph("Request received. If it is a fit, we will scope the work and invoice approved hours at $400/hour/agent via CoinPay.")
);
} catch (error) {
result.replaceChildren(
Expand Down
12 changes: 6 additions & 6 deletions apps/logicsrc-web/src/lib/page-markup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ const pages = [
{ id: "blog", title: "Blog", detail: "Project notes for LogicSRC, AgentSwarm, AgentByte, OpenSpec workflows, and reference implementations." },
{ id: "openspec", title: "OpenSpec", detail: "Comparison and compatibility notes for OpenSpec.dev-style repo-local specs, proposals, tasks, and deltas." },
{ id: "credential-sharing", title: "Credential Sharing", detail: "Open replacement architecture for portable secret sync across end-to-end-encrypted team vaults, .env, Doppler, Railway variables, GitHub Secrets, and sh1pt." },
{ id: "hire-us", title: "Hire Us", detail: "$400/hour LogicSRC work on open infrastructure, specs, AI agent workflows, and reference implementations paid through CoinPay after project acceptance." },
{ id: "hire-us", title: "Hire Us", detail: "$400/hour/agent LogicSRC work on open infrastructure, specs, AI agent workflows, and reference implementations paid through CoinPay after project acceptance." },
{ id: "about", title: "About", detail: "LogicSRC is the Profullstack open specification project for human and AI agent coordination." },
{ id: "terms", title: "Terms", detail: "Terms of engagement: the $400/hour rate, what is billable, how approved hours are invoiced, the 10-hour minimum, cancellation, acceptable use, and reference implementation boundaries." },
{ id: "terms", title: "Terms", detail: "Terms of engagement: the $400/hour/agent rate, what is billable, how approved hours are invoiced, the 10-agent-hour minimum, cancellation, acceptable use, and reference implementation boundaries." },
{ id: "privacy", title: "Privacy", detail: "What this site collects and what it does not: analytics, the Hire Us form, the CoinPay sign-in cookie, and where credential data does and does not go." }
];

Expand Down Expand Up @@ -363,7 +363,7 @@ logicsrc secrets ssh agent profullstack # load into ssh-agent, never onto disk<
<section id="hire-us" class="band hire-us">
<div class="section-head">
<h2>Hire Us</h2>
<p>$400/hour for accepted LogicSRC work using open infrastructure and open specs for AI agent systems.</p>
<p>$400/hour/agent for accepted LogicSRC work using open infrastructure and open specs for AI agent systems.</p>
</div>
<div class="hire-layout">
<article class="hire-panel">
Expand All @@ -372,9 +372,9 @@ logicsrc secrets ssh agent profullstack # load into ssh-agent, never onto disk<
<p>Hire us to turn agent ideas into portable LogicSRC specs, CLIs, SDKs, MCP resources, PWAs, APIs, and provider-neutral plugin workflows. We prioritize auditable contracts, repo-local artifacts, and integrations that can move between model providers and infrastructure.</p>
<div class="price-row">
<strong>$400</strong>
<span>per hour</span>
<span>per agent-hour</span>
</div>
<p class="price-terms">Billed against actual hours worked, invoiced after you approve them. Ten-hour minimum engagement; cancel any time with one week&rsquo;s notice and pay only for hours already approved. See <a href="/terms">Terms</a>.</p>
<p class="price-terms">Billed against actual agent-hours worked, invoiced after you approve them. Ten-agent-hour minimum engagement; cancel any time with one week&rsquo;s notice and pay only for hours already approved. See <a href="/terms">Terms</a>.</p>
<form id="project-request-form" class="project-request-form">
<label>
<span>Contact</span>
Expand Down Expand Up @@ -402,7 +402,7 @@ logicsrc secrets ssh agent profullstack # load into ssh-agent, never onto disk<
</div>
<article id="coinpay-setup" class="coinpay-panel">
<h3>CoinPay hourly invoice</h3>
<p>After we accept the project, we invoice approved hours at $400/hour through CoinPay without exposing merchant credentials to the browser.</p>
<p>After we accept the project, we invoice approved hours at $400/hour/agent through CoinPay without exposing merchant credentials to the browser.</p>
<pre><code>COINPAY_ORG=profullstack
COINPAY_PRODUCT=logicsrc-hire-us
COINPAY_RATE_USD_PER_HOUR=400
Expand Down
Loading