Steward User Guide Back to App

Steward User Guide

Steward is a self-hosted personal finance application for tracking bank accounts, credit cards, investments, loans, and budgets. This guide covers every major feature.

Dashboard

The Dashboard is the home screen. It displays a collection of widgets that give you an at-a-glance view of your finances.

Next to today's date in the Dashboard header, Steward shows market-data status: Online services not configured (provider not set up), No quotes updated (provider configured but no successful fetch yet), or Last updated: ... after quotes are fetched. Administrators can click the setup link in the warning to open Gear → Online Services.

Available Widgets

WidgetWhat it shows
Favorite AccountsRunning balances for accounts starred as favorites. The favorite flag is shared across all users — starring or unstarring an account affects what everyone sees.
Recent TransactionsThe last 10 transactions across all accounts.
Monthly SpendingCurrent month spending vs. prior month by category.
BudgetBudget progress bars for the current month.
Upcoming BillsBills and scheduled items due in the next 30 days.
All AccountsEvery account grouped by type with balances.
Key IndicatorsNet worth, total assets, total liabilities, and liquid cash.
Savings GoalsProgress toward each active savings goal.
LoansOutstanding loan balances and next payment dates.
Market IndexesLive quotes for S&P 500, Dow, NASDAQ, and other indices.
Top MoversBiggest daily price changes across your holdings.
Portfolio SnapshotHoldings pie chart by market value.
Asset AllocationPortfolio breakdown by asset class.
Favorite ReportsQuick links to reports saved as favorites. This list (and its order) is shared across all users, not personal to each login.
BookmarksCustom links you've added for quick access. Unlike Favorite Accounts/Reports, bookmarks are private to your own login — use this widget if you want a personal shortcut list instead of a shared one.
NotepadShared free-text note pad visible to all logged-in users. Edits auto-save after a short pause and show who last made changes.

Customizing the Dashboard

Navigation

The top navigation bar provides access to all sections:

The left sidebar lists all your accounts grouped by type. Click any account to jump directly to its register. Click + New Account at the top of the sidebar to add one. Within each group, accounts can be reordered by drag-and-drop — grab the handle that appears on hover and drag to your preferred position.

User Roles

Every user is assigned one of three roles:

Role Permissions
Viewer Read-only access. Can view all accounts, transactions, reports, and the portfolio. Cannot add, edit, or delete anything.
User Full read-write access. Can create and edit transactions, accounts, categories, budgets, bills, goals, and import data. Cannot manage other users or access admin settings.
Administrator All user permissions plus: manage users, change application settings, run database maintenance, restore backups, and delete reconciled transactions.
The default admin account created during installation is admin with password Admin123!. Change the password immediately after your first login via Gear → Users.

Account Types

Accounts are the foundation of Steward. Every transaction belongs to an account. Navigate to Accounts in the top nav to see all your accounts and their current balances.

TypeUse for
CheckingEveryday bank checking accounts.
SavingsSavings accounts and money market accounts.
Credit CardCredit card accounts. Balances show as negative (amounts owed).
InvestmentBrokerage accounts holding stocks, ETFs, mutual funds, or bonds. Optionally paired with a companion Cash sub-account for cash transactions.
CryptoCryptocurrency wallets and exchange accounts.
AssetNon-liquid assets (e.g. real estate, vehicles, valuables). Tracked for net worth purposes.
LoanMortgages, auto loans, or any amortizing debt. Automatically generates a payment schedule.

Creating an Account

  1. Click + New Account in the sidebar or go to Accounts → New Account.
  2. Choose Enter Manually to fill in the form, or Import from File to create the account and load transactions simultaneously.
  3. Fill in the account name, type, institution, and opening balance. A Currency field is present but is reserved for future multi-currency support — all amounts are currently displayed using the application-wide currency symbol set under Preferences → General, regardless of this per-account setting.
  4. For Investment accounts, check Create companion cash account if your brokerage keeps cash and holdings in the same account.
  5. For Loan accounts, enter the original amount, annual interest rate, term, and start date — the monthly payment is calculated automatically.
  6. Click Create Account.

Editing & Deleting

From the Accounts list, use the Edit icon to change account details. Accounts can be deactivated (hidden from the sidebar) rather than deleted to preserve historical transactions.

Transaction Register

Click any account name to open its register — a chronological list of all transactions with a running balance.

Reconciled transactions (R) are locked and cannot be deleted by regular users — only administrators can remove them.

Entering Transactions

Click the + New Transaction area at the top of any register to expand the entry form.

Transaction Types

TypeDescription
Withdrawal / PaymentMoney leaving the account (expense, bill payment, purchase).
DepositMoney entering the account (paycheck, refund, income).
TransferMove money between two of your accounts. Both sides are created automatically.
InvestmentBuy, sell, add shares, remove shares, stock splits, reinvested dividends/capital gains, and cash income. Available only on Investment and Crypto accounts. See activity types below.

Investment Activity Types

ActivityDescription
BuyPurchase shares. Reduces the linked cash account by the total cost (qty × price + commission).
SellSell shares. Increases the linked cash account by the proceeds (qty × price − commission).
AddAdd shares to a position with no cash movement — used for share transfers in, grants, or manual adjustments. Optionally enter a total cost basis.
RemoveRemove shares from a position with no cash movement — used for share transfers out or expirations.
SplitRecord a stock split. Enter the new share quantity after the split.
Reinvest DividendDividend or interest automatically reinvested into additional shares. Both sides (investment + shares) stay in the investment account.
Reinvest Cap GainCapital gain distribution automatically reinvested into additional shares.
Dividend (Cash)Cash dividend or capital gain distribution deposited into the linked cash account. Select the security name as the payee and enter the dollar amount. A matching deposit is created automatically in the cash account.
Interest (Cash)Interest income deposited into the linked cash account. Works the same way as Dividend (Cash).
Securities income never needs a category. The linked cash-account deposit created by Dividend (Cash), Interest (Cash), Reinvest Dividend, or Reinvest Cap Gain shows its activity (e.g. "Dividend") in the register's category column instead of a category — this is expected and is how the Investment Income report picks it up automatically.

Split Transactions

A single transaction can be split across multiple categories. In the entry form, check Split and add a line for each category portion. The amounts must sum to the total transaction amount.

Transfers

Select Transfer as the type and choose the destination account. Money Manager creates matching entries in both accounts automatically. Transfers appear in each account's register with an arrow icon and the paired account name as the category.

Cleared Status

Use the status field on each transaction to track reconciliation progress:

Paycheck Templates

For paychecks with consistent gross-to-net breakdowns (gross pay, taxes, benefits deductions), set up a Paycheck Template once and use it each pay period. Templates are created and managed from the account register (Paycheck button in the transaction entry toolbar).

Reconciliation

Banking Accounts (Checking, Savings, Credit Card, Investment Cash)

Reconciliation matches your register against a bank or credit card statement to confirm accuracy. From the account register, click Reconcile.

  1. Enter the Statement Ending Balance and Statement Date from your paper or online statement.
  2. Check off each transaction that appears on the statement. Cleared transactions are pre-checked automatically.
  3. The Difference in the footer must reach $0.00 before you can finish.
  4. Click Finish Reconciliation. All checked transactions are marked R (Reconciled) and locked.

How the Math Works

The reconcile page computes a Cleared Balance in real time as you check or uncheck transactions:

The Finish button enables only when Difference = $0.00. Work through the list until every transaction on your statement is checked and the difference reaches zero.

Credit card accounts show balances as the amount owed (a positive number). Enter the amount owed from your statement as a positive number — the sign conversion is handled automatically.

Cleared vs. Reconciled Transactions

Every transaction has one of three statuses, visible in the C column of the register:

StatusMeaningBehavior in Reconcile
Blank — uncleared Transaction has not yet appeared on a statement. Shown in the reconcile list, not pre-checked. Check it manually if it appears on this statement.
c — cleared Transaction appeared on a prior statement but the account hasn't been fully reconciled yet. Shown in the reconcile list and pre-checked automatically.
R — reconciled Transaction was confirmed during a completed reconciliation. Not shown — already counted in the Opening Balance. Locked against deletion by non-admins.

First-Time Reconciliation (Large Backlog of Cleared Transactions)

If an account has never been reconciled, the Opening Balance will be the account's opening balance (typically $0 for imported accounts), and all existing cleared transactions will appear in the list, pre-checked. The sum of those pre-checked transactions plus any unchecked uncleared transactions must equal your statement ending balance.

If your statement balance matches the current account balance but the Difference is not zero, check whether any uncleared transactions (shown but not pre-checked) need to be included. For example, if your register balance is $0.32 and includes a pending −$0.14 transaction, the pre-checked cleared transactions will sum to $0.46 — you must also check the −$0.14 uncleared item for the Difference to reach $0.00.

Investment Cash Accounts

Investment cash sub-accounts (the companion cash account paired with a brokerage account) are reconciled exactly like a checking account — use the standard Reconcile button in the register. The holdings-level reconciliation described below applies only to the investment positions, not to the cash balance.

Investment Accounts — Reconcile Holdings with Statement

Investment accounts don't use the checkbook-style Reconcile page above — instead, a separate holdings-level reconciliation compares each security's share count (and optionally price) against a brokerage statement. From the account's Holdings page, click Reconcile with Statement.

  1. Upload a CSV exported from your brokerage.
  2. Review the comparison report — discrepancies in share count, average cost, and price are flagged.
  3. Optionally check Update prices from statement and select a date to record the statement prices.
  4. Click Apply Adjustments to post correcting add/remove transactions and update prices.
Supported brokerage formats include Fidelity, Merrill Edge, Schwab, and any CSV with standard Symbol / Description / Quantity / Price columns.

A clean reconciliation is a real check on your data — a genuine duplicate buy or sell would inflate or deflate the computed share count and get caught (and corrected) here, the same way a bank reconciliation would surface a duplicate deposit. Because of that, applying a reconciliation marks the account's investment transactions dated on or before the statement date as c (Cleared) unless they're already R (Reconciled). This is why investment accounts can show c transactions that were never checked off in a Reconcile page — for investment accounts, holdings reconciliation is that check-off process.

Cleared or reconciled transactions in a true investment account are excluded from the Duplicate Transactions integrity check (see Integrity / Maintenance Checks), since a successful holdings reconciliation already confirms they're real. This exclusion is scoped to investment accounts only — imported bank/credit-card transactions are marked c automatically with no verification, so they still need to be checked for duplicates even after being cleared.

Categories

Categories organize your transactions for reporting and budgeting. Go to Categories in the nav to manage them.

Keep your category list manageable. Too many fine-grained categories make reporting harder to read. Aim for 20–40 categories covering your actual spending patterns.

Payees

The Payees section stores a directory of merchants, billers, and people you transact with. Payees are optional but enable useful features:

Payees are created automatically from transaction imports. You can also add them manually or merge duplicates.

Bills & Scheduled Items

The Bills section tracks recurring transactions — monthly bills, subscriptions, paycheck deposits, and scheduled transfers. Go to Bills in the nav.

Adding a Scheduled Item

  1. Click New Bill / Deposit.
  2. Choose the type: Bill (money out), Deposit (money in), or Transfer (between accounts).
  3. Select the account, category, amount, frequency, and next due date.
  4. If the amount varies (e.g. a utility bill), check Estimated beneath the amount field. Estimated items show a ~est badge in the bills list and dashboard widget as a reminder that the actual charge may differ.
  5. Click Save.

Frequencies

Supported schedules: Once, Weekly, Bi-weekly, Twice a Month (15th & last), Monthly, Bimonthly (every 2 months), Quarterly, Yearly.

Posting a Payment

When a bill is due, click Post on the Bills summary page. A dialog appears pre-filled with the scheduled amount and due date — adjust either value if the actual charge differs before confirming. A transaction is created in the linked account and the next due date advances automatically.

Auto-Detection When Entering Transactions

When you manually enter a transaction in the account register, Steward checks whether the payee matches a scheduled bill in that account with a due date within the past 14 days or the next 30 days. If a match is found, a confirmation dialog appears showing the bill name, account, scheduled amount, and next due date. Choose Yes, mark as paid to record the transaction and automatically advance the bill's next due date, or No, keep scheduled to save the transaction without affecting the schedule.

The Upcoming Bills dashboard widget shows everything due in the next 30 days so you never miss a payment.

Budgets

Budgets let you set monthly spending targets by category and track actual spending against them. Navigate to Budget in the top nav.

Auto-Generate a Budget

Click Auto-Generate on the Budgets page to let Steward build a budget from your actual transaction history. A dialog asks which period to use as the baseline:

Click Generate Budget. Steward computes the average monthly spend per category, creates a new budget named "Auto Budget", attaches all active accounts, and opens the budget editor pre-filled with the computed amounts. Rename the budget and adjust any line items before saving.

Creating a Budget Manually

  1. Click New Budget and give it a name (e.g. Household 2025).
  2. Check Use this budget for the dashboard widget if you want this budget's categories to appear on the dashboard's Budget tile. Only one budget can feed the dashboard at a time — turning this on for a budget automatically turns it off for every other budget.
  3. Optionally link specific accounts — only transactions in those accounts count toward this budget. Use the Select all link in each account-type group to quickly check or uncheck all accounts of that type.
  4. Add budget lines: pick a category and enter the monthly or annual target amount. The equivalent amount in the other period is shown as a hint.
  5. For variable categories (irregular spending), choose Variable entry type and enter a per-month amount for each month.
  6. Check Dashboard on any category line to include it on the dashboard widget (only takes effect if this budget's own dashboard toggle above is on). Turning that toggle on defaults every category currently in the budget to shown-on-dashboard; you can uncheck individual ones afterward.

Managing Budgets

Each budget on the Budgets page has View, Edit, Copy, and (administrators only) Delete actions. Copy duplicates the budget's accounts, categories, amounts, and per-category dashboard selections into a new budget named "<name> (Copy)" and opens it in the editor — a quick way to start next year's budget from this year's. The copy always starts with its own dashboard toggle off, even if the original had it on, so copying never changes what the dashboard currently shows by itself.

If you then edit the copy and turn its dashboard toggle on — for example, to promote a freshly-adjusted copy into the budget the dashboard should now follow — it becomes the new active dashboard budget and the previous one is automatically turned off for you. This is the normal, expected way to hand the dashboard off from one budget to another; no warning appears for it.

A budget can still end up flagged outside this normal edit flow — for example, restoring an older database backup — since that bypasses the save process that enforces the single-budget rule. If more than one budget is ever left marked to feed the dashboard widget, the Budgets page shows a warning banner naming which budget actually wins — the oldest one, matching the same tie-break the dashboard widget itself uses — so you can turn the toggle off on the others.

Viewing Progress

Open a budget to see each category's progress toward its target, with two bars per row:

Each row also shows a pace status (On Track, Slightly Over/Behind, or Over/Behind Pace) and an Annual Remaining column — how much budget is left to spend (expenses) or how much more is needed to reach the target (income) for the rest of the year.

The Budget vs. Actual report (under Reports) shows a simpler month-by-month comparison across any date range.

Click CSV in the filter bar to export the current budget/month view — Income and Expense categories with this-month and annual budget, actual, % used, pace status, and remaining figures.

Savings Goals

Savings Goals track progress toward a specific financial target — a vacation fund, emergency fund, down payment, etc. Go to Goals in the nav.

Forecast

The Forecast page projects your account balance forward in time based on your scheduled bills and deposits. Select an account and a look-ahead period to see a day-by-day projection of what your balance will be.

The forecast uses your Bills schedule as the source of future cash flows. Keep your Bills list current for accurate projections.

Portfolio

The Portfolio page provides a consolidated view of all your investment holdings across every investment account, with market values, cost basis, and gain/loss.

Watchlist

The Watchlist lets you track securities you're interested in without holding them in a brokerage account. Navigate to Watchlist in the top nav.

Investment Account Holdings

Each investment account has a dedicated Holdings page (click the icon in the account register header). It shows:

Transaction History

Click a security name to open a Transaction History panel showing every buy, sell, reinvestment, split, and adjustment recorded for that security in the current account. The panel includes date, activity type, share count, price per share, commission, and total cost, with a net summary row at the bottom. Two action buttons appear in the panel footer:

To view price history or edit prices for a security, click the last quote (the price value in the Last Quote column) rather than the security name.

Security Prices

Accurate pricing is required for market values and gain/loss calculations. Prices are stored as a dated series (one close price per security per date).

Entering Prices Manually

Click any price in the Portfolio, Watchlist, or Holdings table to open the Price History panel for that security. Add or edit individual date/price pairs, or upload a CSV of historical prices. To remove all recorded prices for a security, click the Clear History button in the panel footer.

Fetching Prices Automatically

Go to Portfolio → Fetch Prices. Steward retrieves today's closing price for every active security with a recognized ticker symbol. Securities with Disable Quotes checked are skipped.

Scheduled Daily Price Refresh

Under Gear → Preferences → General, enable Automatically refresh prices each weekday to have Steward fetch closing prices automatically on a schedule. Choose a fetch time between 4:15 PM and 6:00 PM Eastern — prices are retrieved Monday through Friday at the selected time. The last fetch timestamp is shown on the Preferences page. Disable the toggle at any time to cancel the schedule.

Prices for index symbols (^GSPC, ^DJI, etc.) are informational only and not used in portfolio value calculations unless you hold them as investments.

Reports

The Reports section contains pre-built reports and a custom report builder. Access it from the top nav.

Investment Reports

ReportDescription
Portfolio PerformanceUnrealized gains, cost basis, and return % for all current holdings.
Asset AllocationPortfolio breakdown by asset type and account with donut charts.
Portfolio SnapshotTop holdings by market value as a donut chart.
Capital GainsRealized gains and losses from sold securities using the average cost method.
Portfolio Value HistoryPortfolio value vs. amount invested over time.
Investment PerformanceNormalized % return chart comparing selected securities and indexes over a chosen date range, with quick date presets and a summary table.
Stock ExposureTrue effective exposure per stock — combines the market value of direct stock holdings with each stock's weighted share of any ETF or mutual fund positions. Ranks all identified securities by effective dollar exposure. See limitations below.
Sector ExposureGICS sector breakdown of effective stock exposure — the same combined direct + fund-weighted exposure as Stock Exposure, grouped by sector (Information Technology, Financials, Energy, etc.) with a donut chart and per-sector security drill-down. See limitations below.
Investment IncomeDividends, interest, and capital gain distributions for a date range, read directly from investment activity — no category needed. Captures cash income recorded as Dividend (Cash) or Interest (Cash) activity, and amounts automatically reinvested into more shares (Reinvest Dividend / Reinvest Cap Gain). Shows totals by type, a monthly stacked chart, and a by-security breakdown. Supports CSV export. See Banking Income for interest earned on cash accounts that isn't tied to a security.

Stock Exposure & Sector Exposure — Limitations

Both reports depend on knowing the constituent holdings of each ETF and mutual fund you hold. Coverage is subject to the following constraints:

For Sector Exposure specifically:

Net Worth & Banking Reports

ReportDescription
Account BalancesAll account balances grouped by type.
Net Worth Over TimeMonth-by-month net worth chart — assets minus liabilities.
Account Balances HistoryHistorical balance trends for selected accounts. Supports filtering by account type, and a chart-type toggle between Line and Stacked Bar.

Debt Reports

ReportDescription
Credit Card DebtOutstanding balances on all credit card accounts with a monthly trend chart.
Loan AmortizationFull payment schedule for any loan account — monthly principal vs. interest breakdown, cumulative interest chart, payoff date, and matched payment history. Requires loan details to be configured on the account.

Tax Reports

ReportDescription
Tax SummaryIncome and deductible expenses for a selected tax year, totaled by category. Only includes categories marked Tax-related in Categories — see below.
Tax Summary starts empty until you flag categories. Open a category in Categories, check Tax-related, and save — common candidates are tax payments, mortgage interest, property tax, charitable donations, and tax refunds.

Goals & Planning Reports

ReportDescription
Savings GoalsProgress toward each active savings goal — progress bars, on-track status, days remaining, and monthly contribution needed to hit the target date. For goals linked to an account, the current balance is pulled live.
Cash Flow ForecastProjects selected account balances forward 30–365 days using your scheduled bills, deposits, and transfers. Highlights dates when an account would go negative. Includes a per-account balance trend chart.

Spending & Cash Flow Reports

ReportDescription
Income vs. ExpenseMonthly income and expense totals side by side with net cash flow. Supports separate Income Category and Expense Category filters (handy for excluding catch-all categories like "Special" from the totals), in addition to the account filter. Click any Income or Expense amount — including the Total row — to open a modal listing the underlying transactions for that period; columns are sortable by date, account, payee, category, or amount, and each row links to the transaction in its account register.
Income AnalysisIncome broken down by category and month — stacked bar chart, subcategory pivot table, monthly averages, and top payees by income. Defaults to year-to-date; supports CSV export.
Banking IncomeInterest and cash rewards from checking, savings, and CDs, driven by the Banking Income category. Shows totals by type (Bank Interest / Cash Rewards), a monthly stacked chart, a by-account breakdown, and a by-payee breakdown. Supports CSV export. Complements the Investment Income report, which covers dividends and interest earned on securities instead.
Spending by CategorySpending breakdown by category for a date range. Quick-select presets: This Month, Last Month, Last 90 Days, This Year, Last Year.
Spending HistoryCategory spending over time — pivot table by month, quarter, or year with a stacked bar chart.
Spending TrendsCategory × month heatmap. Each cell is colored by spending intensity relative to that category's peak month, making seasonal patterns and spending spikes immediately visible.
Cash FlowNet cash flow by month.
Budget vs. ActualBudgeted amounts compared to actual spending by category.
Payee SummaryTotal spending per payee for a date range.
Account FlowRevenue, expenses, and transfers for a single account.

Account Reports

ReportDescription
Reconciliation StatusReconciliation health for all accounts — last reconciled date, days since last reconciliation, uncleared transaction count and net amount, and a status badge (Current / Due Soon / Overdue / Never). Overdue and never-reconciled accounts sort to the top.

Custom Report

The Custom Report builder lets you construct any tabular report:

Transaction Search

Click Search in the top nav to search across all accounts simultaneously.

Importing Data

Import transactions from files exported by your bank or financial software. Go to Gear → Import Transactions.

Supported Formats

FormatNotes
QIFQuicken Interchange Format. Exported from Quicken, Microsoft Money, and most personal finance apps. Supports banking and investment transactions. Multi-account QIF files are handled automatically.
OFX / QFXOpen Financial Exchange. Downloaded directly from banks and brokerages. Best format — includes transaction IDs for accurate duplicate detection.
CSVComma-separated values from banks and spreadsheets. Requires column mapping after upload.
Steward CSVSteward's own export format. Skips column mapping and goes straight to preview. Use the Fast Import path.

Importing into an Existing Account

  1. Go to Gear → Import Transactions and select Existing Account.
  2. Choose the account from the dropdown.
  3. For Investment accounts, select whether this is a Transaction History or Positions / Holdings file.
  4. Select your file and click Upload & Preview.
  5. For CSV files, map your columns to Steward fields and click Continue.
  6. Review the preview, resolve any flagged duplicates or unmapped payees/categories, and click Import.

Creating a New Account During Import

Select Create New Account on the Import page. The account is created and populated with transactions in a single step.

Alternatively, when creating an account manually via Accounts → New Account, choose Import from File — this redirects to the same Import page with "Create New Account" pre-selected.

Fast Import (Steward CSV)

If you have a file in Steward CSV format (e.g. produced by the Statement Converter), use Fast Import from the Import page. Account matching is automatic when the account column matches a known account name. No column mapping step is needed.

Duplicate Detection

OFX/QFX imports use transaction IDs (FITID) for exact duplicate detection. QIF and CSV imports match on date + amount + payee and flag probable duplicates for review before committing.

Dividend Reinvestment (DRIP) Handling

Some institutions report a dividend reinvestment as two separate lines — a Dividend line and a Reinvestment Share(s) line — instead of one combined entry. Steward automatically merges an unambiguous 1-to-1 pair (same account, security, and date) into the single Reinvest Dividend/Reinvest Cap Gain record it uses everywhere else: the dividend amount is folded in as the reinvestment's price (so cost basis is correct) and the separate dividend line is dropped, so income isn't counted twice. Merged lines are listed in the import report with the reason "Merged into reinvestment (DRIP)".

Statement Converter

The Statement Converter (/steward/converter/) converts brokerage-specific CSV exports into the Steward CSV format, which can then be imported using Fast Import.

Supported Brokerages

How to Use

  1. Export a CSV from your brokerage (transaction history or positions).
  2. Open the Statement Converter at /steward/converter/.
  3. Upload the file. The converter auto-detects the broker and statement type.
  4. Review the parsed transactions in the preview table.
  5. Click Download Steward CSV to download the converted file, or Send to Steward to hand it directly to Fast Import.

Settings

Application-wide settings are under Gear → Settings (administrator only). Key options include:

SettingDescription
Instance NameThe name shown in the navigation bar below "Steward".
Enforce HTTPSRedirect all HTTP requests to HTTPS. Enable once an SSL certificate is installed.
Currency SymbolSymbol prepended to all monetary amounts (e.g. $, €, £). Set under Preferences → General.
Date FormatHow dates are displayed (MM/DD/YYYY, DD/MM/YYYY, etc.).
Login BackgroundUpload a custom image for the login page.
Hide Loans / GoalsRemove the Loans or Goals nav items if you don't use those features.
Users Can Delete TransactionsAllow non-admin users to delete transactions.

Preferences

Application-wide display preferences are under Gear → Preferences (administrator only). Options include:

Users

Manage user accounts under Gear → Users (administrator only).

Always change the default admin / Admin123! password immediately after installation. There is no "forgot password" flow — an administrator must reset passwords manually.

Backup & Restore

Database backups are managed under Gear → Backup / Restore (administrator only).

Creating a Backup

Click Download Backup to download a complete SQL dump of your database. Store backups in a safe location outside the server. Schedule regular backups — Steward does not create backups automatically.

For server-side backups (Back Up Now and automated safety backups before table optimization), configure a backup location first in Gear → Backup / Restore. If the backup location has not been configured, Steward shows a dedicated warning notification and (for permitted users) a direct link to backup settings.

Restoring a Backup

  1. Go to Gear → Backup / Restore → Restore.
  2. Upload a previously downloaded .sql backup file.
  3. Confirm the restore. This will overwrite all current data.
Restoring a backup is irreversible. Download a fresh backup of the current data before restoring an older one.

Integrity / Maintenance Checks

Gear → Integrity / Maintenance (administrator only) runs a set of data integrity checks — duplicate categories/investments/transactions, uncategorized transactions, split-amount mismatches, unmatched transfers, orphaned investment transactions, and more — each with a Run button and, where applicable, a one-click fix. Duplicate Transactions flags same account/date/payee/amount groups; reconciled transactions are always excluded, and cleared transactions are also excluded for true investment accounts, since holdings reconciliation verifies those (see Reconciliation). Categorized Income in Investment-Cash Accounts flags cash-sweep deposits whose payee matches a known security but were entered as a plain categorized transaction instead of a Buy/Sell/Dividend/Interest activity, bypassing per-security tracking (crypto-linked cash accounts are excluded, since crypto doesn't use the same activity model). Security-related checks (default passwords, exposed setup directory, debug files, session timeout) live in their own section on the same page.

Database Maintenance

Gear → Settings → Database Maintenance provides tools to optimize tables and repair any corruption. Run this periodically on large databases. Optimize Tables always creates a safety backup first; if backup settings are incomplete, Optimize is aborted and Steward shows a warning with a link to configure backup settings (when your role is allowed).

Database Schema Reference

This appendix documents the underlying MySQL database for advanced users who want to perform bulk edits, write custom queries, or integrate external tools. All user-facing operations are available through the application UI — direct database access is provided as a power-user escape hatch, not a required workflow.

Always take a backup before running any UPDATE or DELETE statement. The application does not validate changes made outside the UI. Modifying rows incorrectly can corrupt balances, break transfer links, or orphan split records. Use Gear → Backup / Restore to download a snapshot first.

Amount Sign Convention

Throughout the schema, monetary amounts follow a single rule: positive = money coming in, negative = money going out. A $50 grocery withdrawal is stored as -50.00; a $1,200 paycheck deposit is stored as 1200.00. This applies to transactions.amount, transaction_splits.amount, and investment_transactions values.

Table Overview

TablePurpose
accountsBank, credit card, investment, loan, and asset accounts.
transactionsEvery financial transaction. The central table — most bulk operations target this table.
transaction_splitsLine items for split transactions. Each split row holds one category and its portion of the total.
transfersLinks the two transaction rows that form a transfer between accounts.
categoriesTwo-level category tree (parent → subcategory). Type is income, expense, or transfer.
payeesPayee directory with optional default category and contact info.
investmentsSecurities and market indices (ticker, type, CUSIP).
investment_transactionsInvestment activity detail linked to a parent transaction row. Activity types: buy, sell, add, remove, split, reinvest_div, reinvest_cap, div (dividend/cap-gain to cash), int (interest to cash).
investment_pricesHistorical daily price records per security.
scheduled_billsRecurring bill and deposit templates.
budgets / budget_categoriesBudget definitions and per-category targets.
savings_goalsSavings goal targets and progress.
loan_detailsAmortization parameters for Loan-type accounts.
paycheck_templatesSaved paycheck entry templates with split lines.
favorite_reportsDashboard widgets and saved custom reports.
settingsApplication-wide key/value settings.
user_prefsPer-user display preferences.
activity_logAudit trail of login and data-change events.

accounts

ColumnTypeNotes
idINT PKReferenced by transactions.account_id.
nameVARCHAR(100)Display name shown in the sidebar and dropdowns.
typeENUMChecking, Savings, Credit Card, Investment, Asset, Loan, Crypto.
opening_balanceDECIMAL(15,2)Starting balance at account creation. Not a transaction; factored into running balance.
is_activeTINYINT(1)0 = closed/archived. Closed accounts are hidden from most UI views but their transactions remain.
is_closedTINYINT(1)Explicitly closed via the UI. Prevents new transactions from being entered.
exclude_from_net_worthTINYINT(1)1 = omit this account's balance from the net worth calculation.
linked_account_idINT FKFor Investment accounts: points to the companion cash sub-account.
is_investment_cashTINYINT(1)1 = this is an auto-created cash sub-account of an Investment account.
is_retirementTINYINT(1)1 = tax-advantaged retirement account (IRA, 401k, etc.).
sort_orderINTDisplay order within the sidebar. Lower numbers appear first.

transactions

ColumnTypeNotes
idINT PKAuto-increment primary key.
account_idINT FKThe account this transaction belongs to.
transaction_dateDATEDate of the transaction (YYYY-MM-DD).
payeeVARCHAR(200)Free-text payee name. Not a foreign key — the payees table is a directory, not enforced.
typeENUMwithdrawal, deposit, transfer, investment.
amountDECIMAL(15,2)Positive = deposit/credit; negative = withdrawal/debit.
cleared_statusENUM'' = uncleared, 'cleared' = cleared (✓), 'reconciled' = reconciled (R). Reconciled rows are locked in the UI.
memoTEXTOptional free-text note.
numVARCHAR(20)Check number or reference number.
fitidVARCHAR(255)Financial institution transaction ID from OFX/QFX imports. Used for duplicate detection.
is_splitTINYINT(1)1 = this transaction has rows in transaction_splits. When is_split = 1, the category is stored in the splits table, not on the transaction row itself.
transfer_pair_idINT FKFor transfer transactions: the id of the matching transaction in the other account. Also linked via the transfers table.

transaction_splits

When a transaction is split across multiple categories, one row is written here per line item. The split amounts must sum to the parent transaction's amount. Non-split transactions have no rows in this table.

ColumnTypeNotes
transaction_idINT FKParent transaction. Cascades on delete.
category_idINT FK → categoriesTop-level category (or the only category if no subcategory).
subcategory_idINT FK → categoriesSubcategory. NULL if the split uses a top-level category only.
amountDECIMAL(15,2)Portion of the transaction assigned to this category. Same sign convention as the parent.
memoVARCHAR(255)Per-line memo.

transfers

A transfer creates two transaction rows (one debit, one credit) and one row in this table linking them. When editing transfers via SQL, always update both transaction rows and keep the transfers row consistent.

ColumnTypeNotes
from_transaction_idINT FKThe debit leg (amount is negative).
to_transaction_idINT FKThe credit leg (amount is positive).

categories

ColumnTypeNotes
idINT PKReferenced by splits and payees.
nameVARCHAR(100)Display name. Top-level categories have parent_id = NULL.
parent_idINT FK → selfNULL for top-level categories; points to the parent for subcategories. Only two levels are supported.
typeENUMincome, expense, or transfer.
is_activeTINYINT(1)0 = hidden from category pickers. Existing transactions that reference an inactive category are unaffected.

payees

The payees table is a directory — it stores contact info and a default category but is not enforced as a foreign key on transactions. The transactions.payee column is free text. Bulk-renaming a payee therefore requires updating transactions.payee directly.

ColumnTypeNotes
nameVARCHAR(200) UNIQUEMust be unique. Matches the free-text payee field on transactions.
category_idINT FK → categoriesDefault top-level category pre-filled when this payee is selected.
subcategory_idINT FK → categoriesDefault subcategory.

Common Bulk Operations

These examples use standard MySQL syntax. Run them through a MySQL client or the Gear → Backup / Restore SQL interface. Test with a SELECT first, then re-run as an UPDATE or DELETE.

Find all transactions without a category (non-split)

SELECT t.id, t.transaction_date, t.payee, t.amount
FROM   transactions t
LEFT JOIN transaction_splits s ON s.transaction_id = t.id
WHERE  t.is_split = 0
  AND  s.id IS NULL
  AND  t.type NOT IN ('transfer', 'investment')
ORDER BY t.transaction_date DESC;

Bulk re-categorize: move all "Dining Out" splits to a different subcategory

-- Step 1: find the IDs you need
SELECT id, name, parent_id FROM categories WHERE name LIKE '%Dining%';

-- Step 2: update (replace 42 and 7 with your actual IDs)
UPDATE transaction_splits
SET    subcategory_id = 42   -- new subcategory
WHERE  subcategory_id = 7;   -- old subcategory

Rename a payee across all transactions

-- Update the directory entry
UPDATE payees
SET    name = 'Whole Foods Market'
WHERE  name = 'WFM';

-- Update the free-text field on every transaction
UPDATE transactions
SET    payee = 'Whole Foods Market'
WHERE  payee = 'WFM';

Mark a date range as cleared

UPDATE transactions
SET    cleared_status = 'cleared'
WHERE  account_id     = 3          -- replace with your account id
  AND  transaction_date BETWEEN '2024-01-01' AND '2024-01-31'
  AND  cleared_status = '';        -- only touch uncleared rows
Do not change cleared_status to 'reconciled' for transactions that were not part of a formal reconciliation. The reconcile feature computes running balances against a cleared ending balance; manually reconciling rows outside that process will cause the reconcile page to show incorrect differences.

Find duplicate transactions (same date, payee, and amount in one account)

SELECT   account_id, transaction_date, payee, amount,
         COUNT(*) AS cnt
FROM     transactions
GROUP BY account_id, transaction_date, payee, amount
HAVING   cnt > 1
ORDER BY cnt DESC;

Summarize spending by top-level category for a year

SELECT   c.name                        AS category,
         SUM(s.amount) * -1           AS total_spent
FROM     transaction_splits  s
JOIN     transactions         t  ON t.id        = s.transaction_id
JOIN     categories           c  ON c.id        = s.category_id
WHERE    t.transaction_date BETWEEN '2024-01-01' AND '2024-12-31'
  AND    c.parent_id IS NULL          -- top-level only
  AND    c.type = 'expense'
GROUP BY c.id, c.name
ORDER BY total_spent DESC;

Show current holdings (shares) for one investment account

SELECT   i.symbol,
         i.name,
         SUM(it.quantity)  AS shares
FROM     investment_transactions it
JOIN     transactions             t  ON t.id  = it.transaction_id
JOIN     investments              i  ON i.id  = it.investment_id
WHERE    t.account_id = 5           -- replace with your investment account id
GROUP BY i.id, i.symbol, i.name
HAVING   SUM(it.quantity) <> 0
ORDER BY i.symbol;
The full DDL (CREATE TABLE statements) is in install/schema.sql inside the application directory. Use that file as the authoritative reference for column types, constraints, and indexes. The sql/migrations/ directory contains incremental ALTER statements applied to existing installations.

Support

Found a bug, or have an idea for an enhancement? Email steward@7312.us with a description of the issue or request.

Donate

If Steward has been useful to you, consider supporting its continued development with a donation via PayPal.

Donate with PayPal

License

Steward is licensed for personal, non-commercial use only. Commercial use, rebranding, or redistribution as a competing product is not permitted without prior written permission. See license.txt in the application directory for the full terms.

For commercial licensing or other inquiries, contact steward@7312.us.