Small-business accounting, in preview

Where the numbers grow.

Trellis keeps a double-entry ledger, posts invoices and payments to it as you work, and reads it back as a balance sheet, a profit and loss, and an aging report.

Illustration: a small walled courtyard garden with a tall wooden trellis of orderly climbing vines and a row of sea-green lanterns along a gravel path.
Features

A ledger first, everything else posting into it

Trellis is built around a double-entry journal. Invoices and the payments against them post to it on their own, you can post to it by hand, and the reports read it back. Bills and expenses are recorded and show up in the A/P aging and the tax summary.

A ledger that has to balance

01

Chart of accounts

Six account types: asset, liability, equity, income, expense, and cost of goods sold. Accounts can sit under a parent account, and you build the chart to fit your business.

02

Journal entries that balance

A manual entry is rejected unless its debits equal its credits and it is not zero. Voiding an entry marks it voided and keeps every line, so history stays in the ledger and the reports stop counting it.

03

Invoices post themselves

Sending an invoice debits Accounts Receivable and credits the income accounts named on its lines, with the first income account taking whatever is left, and sending it again changes nothing. A payment against it debits cash and credits Accounts Receivable. Voiding a sent invoice takes its entry out of the books.

04

Money is integer cents

Every amount in the API is a whole number of cents, never a float. Each table carries an organization id, and every request is checked against the caller's membership before it touches a tenant's rows.

From estimate to paid invoice

05

Invoices

Draft, send, take a partial or full payment, or void. An invoice past its due date is marked overdue. Line items, discounts, and tax codes and rates, including compound tax and tax-exempt customers. Numbers are generated for you.

06

A branded PDF

Every invoice renders to a PDF with the organization's name, address, logo, and accent color, made on the server.

07

A hosted link

Create a signed link to a read-only page for one invoice, with a PDF download and no login. It expires, you can revoke it, and it works in light and dark. See the security properties on the Agents and API page.

08

Estimates

Create an estimate, mark it sent, accept it, and convert it to an invoice.

09

Customers and contacts

A directory of customers with their contacts and payment terms, plus products and services with a price, a SKU, and a quantity on hand.

10

Payments

Record a payment received or sent. Applying a payment to an invoice, through the API or an agent tool, updates what is owed and posts to the ledger.

Bills, expenses, and bank rows

11

Bills and A/P aging

Enter a vendor bill as a draft, edit it, record a payment, and watch it move through open, partial, and paid. Accounts payable aging reports on the open ones.

12

Expenses

Record spending by hand under an expense category, with a link to a project.

13

Bank rules

A rule matches on the payee, an amount range, or both, and assigns a category. The first match wins, and Auto-categorize applies the rules to rows that need review.

14

Optional AI categorization

A language model can suggest a category when no rule fits. It is off by default, it needs a key to be set, and rules always run first. You accept or ignore each suggestion.

15

Reconciliation

Start a reconciliation with a statement date, a statement balance, and the bank rows already categorized or matched, through the API or an agent tool.

Read the ledger back

16

Five reports in the app

Balance sheet, profit and loss, accounts receivable aging, accounts payable aging, and a tax summary. A cash flow report is available through the API and agent tools.

17

A dashboard

Summary cards and an income against expenses chart on the page you land on.

18

Projects

A project has tasks, members, and a budget, and an expense can point at one.

19

Several organizations

One Trellis holds many organizations. A caller reaches only the ones it belongs to, and named service tokens reach only the organizations they are scoped to.

Screens

See it in light and dark

Real captures of the running tool, with fictional StrataForge Robotics data. They follow your theme.

How it works

From a chart of accounts to a balance sheet

  1. Set up the chart

    Create your accounts: the bank, Accounts Receivable, an income account, the expenses you track. Invoices need an Accounts Receivable and an income account to post to.

  2. Invoice and get paid

    Build an invoice and send it; sending posts the entry. Apply a payment to it, through the API or an agent tool, and cash is debited against receivables. Give the customer the PDF or the hosted link.

  3. Categorize bank rows

    Write rules for the payees you see every month, run Auto-categorize, and review what is left.

  4. Report

    Open the balance sheet, the profit and loss, or the aging reports. They read the ledger, so what is posted is what you see.

Accessibility

Built so everyone can use Trellis.

Trellis is a web app, and this is what its code and tests show today. It has a skip link, visible keyboard focus, labeled icon buttons, table headers with column scope, and an automated axe scan of the app and ten pages that passes. It has not been tested with a screen reader, its sidebar icons are not hidden from assistive technology, and one page scrolls sideways on a phone. We do not claim a conformance level for the app.

  • Partly supported

    Keyboard operation

    Every control is a native link or button, so Tab reaches it and Enter or Space works it. A "Skip to main content" link is the first stop on every page, appears on focus, and jumps to the main region. Focus shows a 2 pixel outline in the accent color. Trellis has no keyboard shortcuts of its own. The profile menu in the header closes only when you click elsewhere, not when you press Escape, and the phone menu closes only by clicking its backdrop or a link. Nobody has walked every flow with only a keyboard.

  • Partly supported

    Screen reader landmarks and labels

    The page has a header, a sidebar, a navigation, and a main region. The header's icon buttons carry text labels (Toggle menu, the theme switch, User menu), the logo has alt text, the dashboard chart has a visually hidden table as its text alternative, and table headers declare column scope in 41 places. An automated axe-core scan of the whole app and ten routes finds no violations. But the sidebar's icons are plain symbol characters that are not hidden from assistive technology, so they are likely to be read aloud before each label, the navigation has no label of its own, and Trellis has not been tested with VoiceOver, NVDA, or any other screen reader.

  • Partly supported

    Contrast in light and dark

    Trellis's emerald accent measures 6.33 to 1 against white in light mode and 6.48 to 1 against the dark card color in dark mode, both above 4.5 to 1. On 10/29/2026 an axe-core scan in a real browser found 84 serious color-contrast violations (accent buttons, the active sidebar link, status badges, and empty states); they were fixed the same day and a re-scan of 25 routes at 375 and 1440 pixels in both themes found no violation of any severity. Axe checks the text it can compute, so text over images, hover and focus states, and the Increase Contrast setting are unmeasured.

  • Partly supported

    Reduced motion

    The design system's global stylesheet, which the app loads, shortens every animation and transition to almost nothing when the system asks for reduced motion. The app's own stylesheet adds no rule of its own and leans on that one. This was read from the stylesheet and not checked in a browser with the setting turned on.

  • Not yet tested

    Text resize and zoom

    Nobody has tested Trellis at larger text sizes or browser zoom. The page does not block zoom: its viewport tag sets no maximum scale. The sidebar is a fixed width and the tables are wide, so large text may crowd or scroll them.

  • Partly supported

    Mobile and touch

    Below a tablet width the sidebar slides out of view, a menu button opens it over the page, and tapping the backdrop closes it. The tables have no mobile layout of their own, so how each page fits a phone has only been checked by an automated scan, and that scan found the Bank Transactions page wider than a 375 pixel screen, so it scrolls sideways.

Tech specs

Under the hood

Trellis technical specification
Backend
  • FastAPI on Python 3.12, with async SQLAlchemy 2 over asyncpg
  • PostgreSQL, with one Alembic revision that builds all 43 tables
  • REST under /api/v1: 119 operations in the committed OpenAPI file
  • Money held as integer cents; every table carries an organization id
  • Per-address rate limits and standard security headers on every response
  • Invoice PDFs rendered on the server with fpdf2
Frontend
  • React 19, Vite, and TypeScript
  • Tailwind and the Renkara design system, with Recharts for the dashboard chart
  • Light and dark themes, a collapsing sidebar, and a phone menu
  • 15 sections in the sidebar, from the dashboard to settings
Auth and tenancy
  • Accepts a client certificate, a scoped service token, a signed-in session token, or an API key, plus a local-development bypass setting
  • An organization header is authorized on every request: membership, an admin, or a scoped service token
  • Hosted invoice links are signed, expire, and can be revoked
Agents and API
  • 119 agent tools over stdio, relayed through Roost
  • A hosted invoice page with no script and a PDF download
  • Organizations can be created and updated through the API by admins and named services
Quality
  • Over 360 backend test functions, counted by search on 10/29/2026
  • An automated axe-core scan of the whole app and ten pages (see Accessibility)
Stands in for

QuickBooks, FreshBooks

MCP tools

Built for agents as well as people

Trellis ships an MCP server so a coding or planning agent can keep the books: create customers and invoices, send one, record a payment, make a hosted link, categorize bank rows, and read the balance sheet.

Chart of accounts and journal

  • list_accounts
  • create_account
  • create_journal_entry
  • list_journal_entries
  • get_account
  • update_account
  • delete_account
  • get_journal_entry
  • void_journal_entry

Customers and vendors

  • list_customers
  • create_customer
  • get_customer
  • list_vendors
  • create_vendor
  • update_customer
  • delete_customer
  • list_customer_contacts
  • create_customer_contact
  • update_customer_contact
  • delete_customer_contact
  • get_vendor
  • update_vendor
  • delete_vendor

Invoices, estimates, and hosted links

  • list_invoices
  • create_invoice
  • get_invoice
  • send_invoice
  • list_estimates
  • create_estimate
  • convert_estimate
  • update_invoice
  • void_invoice
  • get_invoice_pdf
  • create_invoice_share_link
  • list_invoice_share_links
  • revoke_invoice_share_link
  • revoke_all_invoice_share_links
  • get_estimate
  • update_estimate
  • send_estimate
  • accept_estimate

Bills, expenses, and payments

  • record_invoice_payment
  • list_bills
  • create_bill
  • list_expenses
  • create_expense
  • list_payments
  • create_payment
  • get_bill
  • update_bill
  • delete_bill
  • record_bill_payment
  • list_expense_categories
  • create_expense_category
  • get_expense
  • update_expense
  • delete_expense
  • get_payment

Banking

  • list_bank_connections
  • list_bank_accounts
  • list_bank_transactions
  • categorize_transaction
  • auto_categorize_transactions
  • suggest_transaction_category
  • accept_transaction_suggestion
  • list_bank_rules
  • create_bank_rule
  • update_bank_rule
  • delete_bank_rule
  • list_reconciliations
  • create_reconciliation
  • complete_reconciliation

Reports

  • balance_sheet
  • profit_loss
  • ar_aging
  • ap_aging
  • tax_summary
  • cash_flow

Tax

  • list_tax_codes
  • create_tax_code
  • update_tax_code
  • list_tax_rates
  • create_tax_rate
  • list_tax_periods

Products, projects, and recurring profiles

  • list_projects
  • create_project
  • list_products
  • create_product
  • get_product
  • update_product
  • delete_product
  • get_project
  • update_project
  • delete_project
  • list_project_tasks
  • create_project_task
  • update_project_task
  • delete_project_task
  • list_project_members
  • add_project_member
  • list_recurring_profiles
  • create_recurring_profile
  • get_recurring_profile
  • update_recurring_profile
  • delete_recurring_profile

Classes, locations, organizations, and settings

  • get_settings
  • update_settings
  • create_organization
  • get_organization
  • update_organization
  • list_classes
  • create_class
  • update_class
  • list_locations
  • create_location
  • update_location

Health and identity

  • get_my_identity
  • check_service_health
  • get_diagnostics
FAQ

Questions people ask

Can I use Trellis today?

Trellis is in preview. This site shows it running locally on a fictional company's books. To ask about access, write to contact@renkara.com.

Whose books are these?

Every screenshot shows the books of StrataForge Robotics, the fictional company from the novel The Deferral. The customers, vendors, invoices, and bank rows are made up. No real company's books appear anywhere on this site.

What does it do with bank transactions?

It lists your bank accounts and their rows. You write rules that match a payee, an amount range, or both and assign a category, run Auto-categorize, and review what is left. Reconciliation compares a statement to the rows you have categorized. The Banking page walks through it.

How does an invoice reach my customer?

Sending an invoice marks it sent and posts it to the books. You give your customer the PDF, or a hosted link: a signed, expiring page with a PDF download that you can revoke.

How do I record a payment?

Apply it to the invoice, in part or in full, through the API or an agent tool. The invoice becomes partial or paid, and the payment posts to the ledger.

What do the balance sheet and profit and loss show?

They read the journal: invoices, the payments applied to them, and the entries you post by hand. Bills and expenses are recorded and appear in the A/P aging and the tax summary.

What does it replace?

It does the invoice-to-balance-sheet job a small business gives to QuickBooks or FreshBooks: invoices, bills, expenses, a ledger, and the reports that come from it.

How does Trellis store money?

As whole numbers of cents everywhere in the API, never as floating-point numbers, so a total cannot drift by a fraction of a cent.

Can an agent use it?

Yes. A 119-tool MCP server covers nearly everything the API does, including the hosted link and the invoice PDF. The Agents and API page lists the groups.

Does it work on a phone?

Yes. Trellis is a web app with a phone layout: the sidebar becomes a menu button that opens it over the page.

Contact

Questions about this tool?

Write to Renkara Media Group and a person will answer.