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
| Widget | What it shows |
|---|---|
| Favorite Accounts | Running balances for accounts starred as favorites. The favorite flag is shared across all users — starring or unstarring an account affects what everyone sees. |
| Recent Transactions | The last 10 transactions across all accounts. |
| Monthly Spending | Current month spending vs. prior month by category. |
| Budget | Budget progress bars for the current month. |
| Upcoming Bills | Bills and scheduled items due in the next 30 days. |
| All Accounts | Every account grouped by type with balances. |
| Key Indicators | Net worth, total assets, total liabilities, and liquid cash. |
| Savings Goals | Progress toward each active savings goal. |
| Loans | Outstanding loan balances and next payment dates. |
| Market Indexes | Live quotes for S&P 500, Dow, NASDAQ, and other indices. |
| Top Movers | Biggest daily price changes across your holdings. |
| Portfolio Snapshot | Holdings pie chart by market value. |
| Asset Allocation | Portfolio breakdown by asset class. |
| Favorite Reports | Quick links to reports saved as favorites. This list (and its order) is shared across all users, not personal to each login. |
| Bookmarks | Custom 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. |
| Notepad | Shared 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
- Reorder: Click Reorder to enter drag-and-drop mode. Drag any widget by its header to reposition it. Click Save to keep the new order or Reset to restore the default layout and show all widgets.
- Hide/show: Click the icon on any widget header to hide it or adjust its account filter. Hidden widgets can be restored from the same gear menu.
- Maximize: Click the icon on any widget header to open it in a full-size popup. Charts are captured as images in the popup.
- Each user's layout is saved independently.
Navigation
The top navigation bar provides access to all sections:
- Dashboard — home screen with widgets
- Accounts — list of all your accounts
- Loans — loan accounts and amortization schedules
- Categories — manage income and expense categories
- Payees — manage payee/merchant records
- Bills — scheduled recurring transactions
- Budget — budget management
- Goals — savings goal tracker
- Forecast — projected account balance over time
- Reports — pre-built and custom financial reports
- Portfolio — investment security management and pricing
- Watchlist — track securities of interest without holding them
- Search — full-text transaction search
- Gear menu — Settings, Preferences, Import, Users, Backup, and Migrations
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. |
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.
| Type | Use for |
|---|---|
| Checking | Everyday bank checking accounts. |
| Savings | Savings accounts and money market accounts. |
| Credit Card | Credit card accounts. Balances show as negative (amounts owed). |
| Investment | Brokerage accounts holding stocks, ETFs, mutual funds, or bonds. Optionally paired with a companion Cash sub-account for cash transactions. |
| Crypto | Cryptocurrency wallets and exchange accounts. |
| Asset | Non-liquid assets (e.g. real estate, vehicles, valuables). Tracked for net worth purposes. |
| Loan | Mortgages, auto loans, or any amortizing debt. Automatically generates a payment schedule. |
Creating an Account
- Click + New Account in the sidebar or go to Accounts → New Account.
- Choose Enter Manually to fill in the form, or Import from File to create the account and load transactions simultaneously.
- 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.
- For Investment accounts, check Create companion cash account if your brokerage keeps cash and holdings in the same account.
- For Loan accounts, enter the original amount, annual interest rate, term, and start date — the monthly payment is calculated automatically.
- 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.
- Transactions are sorted by date, newest first by default. Click Date to toggle sort order.
- The Balance column shows the running total after each transaction.
- The C column shows cleared status: blank = uncleared,
c= cleared,R= reconciled. - Check Show Txn # above the register to reveal each transaction's internal ID — the same number shown by the Duplicate Transactions integrity check, useful for cross-referencing.
- Click any transaction row to expand and edit it inline.
- Use the filter bar (search box above the register) to search within the account by payee, memo, or amount.
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
| Type | Description |
|---|---|
| Withdrawal / Payment | Money leaving the account (expense, bill payment, purchase). |
| Deposit | Money entering the account (paycheck, refund, income). |
| Transfer | Move money between two of your accounts. Both sides are created automatically. |
| Investment | Buy, 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
| Activity | Description |
|---|---|
| Buy | Purchase shares. Reduces the linked cash account by the total cost (qty × price + commission). |
| Sell | Sell shares. Increases the linked cash account by the proceeds (qty × price − commission). |
| Add | Add shares to a position with no cash movement — used for share transfers in, grants, or manual adjustments. Optionally enter a total cost basis. |
| Remove | Remove shares from a position with no cash movement — used for share transfers out or expirations. |
| Split | Record a stock split. Enter the new share quantity after the split. |
| Reinvest Dividend | Dividend or interest automatically reinvested into additional shares. Both sides (investment + shares) stay in the investment account. |
| Reinvest Cap Gain | Capital 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). |
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:
- Blank — transaction has not yet appeared on a statement.
- Cleared (c) — transaction appeared on your bank statement but the account has not been fully reconciled yet.
- Reconciled (R) — transaction is confirmed and locked after a successful reconciliation.
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.
- Enter the Statement Ending Balance and Statement Date from your paper or online statement.
- Check off each transaction that appears on the statement. Cleared transactions are pre-checked automatically.
- The Difference in the footer must reach $0.00 before you can finish.
- 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:
- Opening Balance = account opening balance + sum of all previously reconciled transactions. Previously reconciled transactions do not appear in the list — their totals are already folded into this number, so each reconciliation picks up exactly where the last one left off.
- Cleared Balance = Opening Balance + sum of all currently checked transactions.
- Difference = Statement Ending Balance − Cleared Balance.
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.
Cleared vs. Reconciled Transactions
Every transaction has one of three statuses, visible in the C column of the register:
| Status | Meaning | Behavior 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.
- Upload a CSV exported from your brokerage.
- Review the comparison report — discrepancies in share count, average cost, and price are flagged.
- Optionally check Update prices from statement and select a date to record the statement prices.
- Click Apply Adjustments to post correcting add/remove transactions and update prices.
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.
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.
- Categories have a type: Income, Expense, or Transfer.
- Categories can be nested: create a parent category (e.g. Food) and subcategories beneath it (e.g. Groceries, Restaurants).
- Deactivated categories are hidden from entry forms but preserved in historical transactions.
- A default Banking Income category (with Bank Interests and Cash Rewards subcategories) is created automatically, for interest and rewards from checking, savings, and CDs. Securities income (dividends, capital gains, interest on a holding) is not category-driven — see Investment Activity Types.
- Check Tax-related on a category to include it in the Tax Summary report. This can be set on a parent category (covers all its subcategories at once) or on an individual subcategory.
Payees
The Payees section stores a directory of merchants, billers, and people you transact with. Payees are optional but enable useful features:
- Default category — assign a default category to a payee so it pre-fills when you enter a transaction with that payee name.
- Contact info — store address, phone number, and website for reference.
- Account number — store your account number with a biller.
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
- Click New Bill / Deposit.
- Choose the type: Bill (money out), Deposit (money in), or Transfer (between accounts).
- Select the account, category, amount, frequency, and next due date.
- 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.
- 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.
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:
- Previous Month — last complete calendar month's actuals.
- 3-Month Average — average of the last 3 complete months.
- 6-Month Average — average of the last 6 complete months.
- 12-Month Average — average of the last 12 complete months.
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
- Click New Budget and give it a name (e.g. Household 2025).
- 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.
- 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.
- 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.
- For variable categories (irregular spending), choose Variable entry type and enter a per-month amount for each month.
- 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:
- This Month — actual spending/income so far this month vs. the monthly target.
- This Year — year-to-date actual vs. the full annual budget (all 12 months summed), with a dark pace marker showing how far through the year we are. Compare the filled bar to the marker to see if you're on pace: filled portion past the marker means spending is ahead of pace (or, for income, earning is behind pace).
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.
- Set a target amount and optional target date.
- Link a goal to an account to automatically track the balance as progress.
- Or manually update Current Amount as you save.
- The Goals dashboard widget shows progress bars for all active goals.
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.
- Each security is listed with symbol, type, current price, total shares, market value, cost basis, and gain/loss.
- Click any security name to open its Security Page — a dedicated page showing a price history chart, cost basis and average cost per share, and a complete transaction history across all accounts. Use the Export CSV button on the Security Page to download the full transaction history (Date, Account, Activity, Shares, Price/Share, Commission, Total, Cleared, Memo).
- Click Fetch Prices to retrieve current quotes from a financial data source for all securities that have a valid ticker symbol.
- Use Merge Securities to combine duplicate security records (e.g. the same ETF imported under slightly different names).
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.
- Securities are grouped by type (Equities, ETFs, Mutual Funds, etc.), matching the Portfolio layout.
- Each row shows the security name, symbol, CUSIP, current price with day change and percentage, country, and memo.
- Click any price to open the Price History panel — enter manual quotes or fetch the current price.
- Click Fetch Prices to retrieve current quotes for all watchlisted securities with a valid ticker.
- To add a security to the Watchlist, open it via Portfolio or the investment transaction form and check Add to Watchlist.
- To remove a security, click the button on its row. The security record is kept; only the watchlist flag is cleared.
Investment Account Holdings
Each investment account has a dedicated Holdings page (click the icon in the account register header). It shows:
- Securities are grouped by type: Securities (stocks, ETFs, bonds, mutual funds) and Money Market. Each group has its own header row and subtotals, and columns within each group can be sorted independently by clicking a column header.
- Per-security share count, last price, market value, cost basis, and gain/loss.
- A totals row for the entire account.
- Export CSV — downloads the current holdings table as a CSV file (Name, Symbol, Type, Shares, Last Price, Market Value, Cost Basis, Gain/Loss, Gain/Loss %).
- Adjust Holdings — manually add or remove shares (posts an adjustment transaction with no dollar value).
- Reconcile with Statement — compare holdings against a brokerage CSV export (see Reconciliation).
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:
- View Register — jump to the full account register filtered to this security.
- Security Page — open the security's detail page showing its price history chart and cross-account transaction history. Useful for seeing all purchases of a security across multiple brokerage accounts.
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.
Reports
The Reports section contains pre-built reports and a custom report builder. Access it from the top nav.
Investment Reports
| Report | Description |
|---|---|
| Portfolio Performance | Unrealized gains, cost basis, and return % for all current holdings. |
| Asset Allocation | Portfolio breakdown by asset type and account with donut charts. |
| Portfolio Snapshot | Top holdings by market value as a donut chart. |
| Capital Gains | Realized gains and losses from sold securities using the average cost method. |
| Portfolio Value History | Portfolio value vs. amount invested over time. |
| Investment Performance | Normalized % return chart comparing selected securities and indexes over a chosen date range, with quick date presets and a summary table. |
| Stock Exposure | True 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 Exposure | GICS 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 Income | Dividends, 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:
- Vanguard funds only (automatic). Holdings for Vanguard ETFs and mutual funds (VTI, VOO, VFIAX, VTSAX, VGT, etc.) are fetched automatically from Vanguard's public API at no cost and cached for 7 days. Coverage is typically 89–100% of each fund's weight.
- Non-Vanguard ETFs require an AlphaVantage API key. ETFs from other providers (SPY, QQQ, IVV, etc.) are looked up via the AlphaVantage ETF_PROFILE endpoint. The free tier allows 25 requests per day. Holdings are cached for 7 days so the limit is rarely hit after initial setup. Use the Refresh button in the Fund Coverage table to re-fetch stale data.
- Fidelity mutual funds are not covered. Fidelity actively-managed funds (FDIVX, FTHRX, FMAGX, etc.) are not available through either data source. Their holdings are shown as 0% coverage — the full market value of these funds is excluded from both reports' identified totals.
- Bond, money market, and similar funds show 0% equity coverage. This is expected — these funds hold bonds or cash instruments, not individual stocks, so no equity constituents exist to display.
- Internal brokerage codes are excluded. Non-standard tickers (e.g. internal sweep codes) cannot be resolved to fund constituents and are excluded from coverage.
- The "% of Portfolio" figures are understated. Because some funds have no constituent data, the identified exposure is always less than the full portfolio value. The tiles show what percentage of the portfolio has been successfully analyzed.
For Sector Exposure specifically:
- Sector classification uses a built-in static map covering ~600 common US stocks, Canadian and European large-caps, and common ADRs and local-exchange tickers (Samsung, Nestlé, Siemens, etc.). No API call is made on page load — classification is instant for these symbols.
- Non-equity instruments are automatically routed to appropriate categories rather than "Unknown": money market funds → Cash & Equivalents; CDs, bonds, and treasuries → Fixed Income; cryptocurrencies → Crypto; broad market ETFs held as constituents of other ETFs (SPY, QQQ, etc.) → Diversified ETF; named fund instruments such as 529 plans → Other Funds.
- Newly added securities classify automatically if the symbol is in the built-in map or matches a non-equity pattern. For other new positions, the sector appears as Unknown on first load and can be resolved with the Classify More button.
- Smaller-cap and foreign stocks outside the built-in map show as "Unknown" sector. Use the Classify More button to fetch up to 20 symbols at a time from AlphaVantage OVERVIEW (subject to the 25 req/day free-tier limit).
- Sector data is cached for 90 days. GICS sector assignments rarely change, so the long cache is intentional.
Net Worth & Banking Reports
| Report | Description |
|---|---|
| Account Balances | All account balances grouped by type. |
| Net Worth Over Time | Month-by-month net worth chart — assets minus liabilities. |
| Account Balances History | Historical balance trends for selected accounts. Supports filtering by account type, and a chart-type toggle between Line and Stacked Bar. |
Debt Reports
| Report | Description |
|---|---|
| Credit Card Debt | Outstanding balances on all credit card accounts with a monthly trend chart. |
| Loan Amortization | Full 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
| Report | Description |
|---|---|
| Tax Summary | Income and deductible expenses for a selected tax year, totaled by category. Only includes categories marked Tax-related in Categories — see below. |
Goals & Planning Reports
| Report | Description |
|---|---|
| Savings Goals | Progress 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 Forecast | Projects 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
| Report | Description |
|---|---|
| Income vs. Expense | Monthly 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 Analysis | Income 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 Income | Interest 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 Category | Spending breakdown by category for a date range. Quick-select presets: This Month, Last Month, Last 90 Days, This Year, Last Year. |
| Spending History | Category spending over time — pivot table by month, quarter, or year with a stacked bar chart. |
| Spending Trends | Category × 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 Flow | Net cash flow by month. |
| Budget vs. Actual | Budgeted amounts compared to actual spending by category. |
| Payee Summary | Total spending per payee for a date range. |
| Account Flow | Revenue, expenses, and transfers for a single account. |
Account Reports
| Report | Description |
|---|---|
| Reconciliation Status | Reconciliation 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:
- Choose row and column dimensions (e.g. Category by Month).
- Choose a metric (sum of amounts, count, average).
- Apply filters: date range, account, category type, and more. Use the account-type quick-filter buttons above the account list to select or deselect all accounts of a given type at once.
- Add a chart (bar, line, pie, area).
- Export to CSV or XLSX.
- Save the configuration as a Favorite for one-click access from the dashboard.
Transaction Search
Click Search in the top nav to search across all accounts simultaneously.
- Search by payee, memo, amount, category, or any combination.
- Filter by account, date range, transaction type, and cleared status.
- Results show the transaction number, account, date, payee, category, and amount. Click any row — or just the transaction number — to jump straight to that exact entry in its register, highlighted and ready to edit.
Importing Data
Import transactions from files exported by your bank or financial software. Go to Gear → Import Transactions.
Supported Formats
| Format | Notes |
|---|---|
| QIF | Quicken 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 / QFX | Open Financial Exchange. Downloaded directly from banks and brokerages. Best format — includes transaction IDs for accurate duplicate detection. |
| CSV | Comma-separated values from banks and spreadsheets. Requires column mapping after upload. |
| Steward CSV | Steward's own export format. Skips column mapping and goes straight to preview. Use the Fast Import path. |
Importing into an Existing Account
- Go to Gear → Import Transactions and select Existing Account.
- Choose the account from the dropdown.
- For Investment accounts, select whether this is a Transaction History or Positions / Holdings file.
- Select your file and click Upload & Preview.
- For CSV files, map your columns to Steward fields and click Continue.
- 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
- Fidelity — transaction history and holdings/positions
- Merrill Edge — transaction history and holdings/positions
How to Use
- Export a CSV from your brokerage (transaction history or positions).
- Open the Statement Converter at
/steward/converter/. - Upload the file. The converter auto-detects the broker and statement type.
- Review the parsed transactions in the preview table.
- 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:
| Setting | Description |
|---|---|
| Instance Name | The name shown in the navigation bar below "Steward". |
| Enforce HTTPS | Redirect all HTTP requests to HTTPS. Enable once an SSL certificate is installed. |
| Currency Symbol | Symbol prepended to all monetary amounts (e.g. $, €, £). Set under Preferences → General. |
| Date Format | How dates are displayed (MM/DD/YYYY, DD/MM/YYYY, etc.). |
| Login Background | Upload a custom image for the login page. |
| Hide Loans / Goals | Remove the Loans or Goals nav items if you don't use those features. |
| Users Can Delete Transactions | Allow non-admin users to delete transactions. |
Preferences
Application-wide display preferences are under Gear → Preferences (administrator only). Options include:
- Currency Symbol — symbol prepended to all monetary amounts (e.g. $, €, £). Applies globally; per-account currency selection is reserved for future multi-currency support.
- Sidebar Account Balance — show ending balance or current (today's) balance in the sidebar.
- Negative Number Format — choose color-only, minus sign, or accounting parentheses.
- Transaction Form Position — when enabled, the new transaction entry form appears above the transaction list in the account register instead of below it.
Users
Manage user accounts under Gear → Users (administrator only).
- Add User — enter username, full name, email, role, and initial password.
- Edit — change any user's details or reset their password.
- Deactivate — prevents a user from logging in without deleting their record.
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
- Go to Gear → Backup / Restore → Restore.
- Upload a previously downloaded
.sqlbackup file. - Confirm the restore. This will overwrite all current data.
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.
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
| Table | Purpose |
|---|---|
accounts | Bank, credit card, investment, loan, and asset accounts. |
transactions | Every financial transaction. The central table — most bulk operations target this table. |
transaction_splits | Line items for split transactions. Each split row holds one category and its portion of the total. |
transfers | Links the two transaction rows that form a transfer between accounts. |
categories | Two-level category tree (parent → subcategory). Type is income, expense, or transfer. |
payees | Payee directory with optional default category and contact info. |
investments | Securities and market indices (ticker, type, CUSIP). |
investment_transactions | Investment 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_prices | Historical daily price records per security. |
scheduled_bills | Recurring bill and deposit templates. |
budgets / budget_categories | Budget definitions and per-category targets. |
savings_goals | Savings goal targets and progress. |
loan_details | Amortization parameters for Loan-type accounts. |
paycheck_templates | Saved paycheck entry templates with split lines. |
favorite_reports | Dashboard widgets and saved custom reports. |
settings | Application-wide key/value settings. |
user_prefs | Per-user display preferences. |
activity_log | Audit trail of login and data-change events. |
accounts
| Column | Type | Notes |
|---|---|---|
| id | INT PK | Referenced by transactions.account_id. |
| name | VARCHAR(100) | Display name shown in the sidebar and dropdowns. |
| type | ENUM | Checking, Savings, Credit Card, Investment, Asset, Loan, Crypto. |
| opening_balance | DECIMAL(15,2) | Starting balance at account creation. Not a transaction; factored into running balance. |
| is_active | TINYINT(1) | 0 = closed/archived. Closed accounts are hidden from most UI views but their transactions remain. |
| is_closed | TINYINT(1) | Explicitly closed via the UI. Prevents new transactions from being entered. |
| exclude_from_net_worth | TINYINT(1) | 1 = omit this account's balance from the net worth calculation. |
| linked_account_id | INT FK | For Investment accounts: points to the companion cash sub-account. |
| is_investment_cash | TINYINT(1) | 1 = this is an auto-created cash sub-account of an Investment account. |
| is_retirement | TINYINT(1) | 1 = tax-advantaged retirement account (IRA, 401k, etc.). |
| sort_order | INT | Display order within the sidebar. Lower numbers appear first. |
transactions
| Column | Type | Notes |
|---|---|---|
| id | INT PK | Auto-increment primary key. |
| account_id | INT FK | The account this transaction belongs to. |
| transaction_date | DATE | Date of the transaction (YYYY-MM-DD). |
| payee | VARCHAR(200) | Free-text payee name. Not a foreign key — the payees table is a directory, not enforced. |
| type | ENUM | withdrawal, deposit, transfer, investment. |
| amount | DECIMAL(15,2) | Positive = deposit/credit; negative = withdrawal/debit. |
| cleared_status | ENUM | '' = uncleared, 'cleared' = cleared (✓), 'reconciled' = reconciled (R). Reconciled rows are locked in the UI. |
| memo | TEXT | Optional free-text note. |
| num | VARCHAR(20) | Check number or reference number. |
| fitid | VARCHAR(255) | Financial institution transaction ID from OFX/QFX imports. Used for duplicate detection. |
| is_split | TINYINT(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_id | INT FK | For 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.
| Column | Type | Notes |
|---|---|---|
| transaction_id | INT FK | Parent transaction. Cascades on delete. |
| category_id | INT FK → categories | Top-level category (or the only category if no subcategory). |
| subcategory_id | INT FK → categories | Subcategory. NULL if the split uses a top-level category only. |
| amount | DECIMAL(15,2) | Portion of the transaction assigned to this category. Same sign convention as the parent. |
| memo | VARCHAR(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.
| Column | Type | Notes |
|---|---|---|
| from_transaction_id | INT FK | The debit leg (amount is negative). |
| to_transaction_id | INT FK | The credit leg (amount is positive). |
categories
| Column | Type | Notes |
|---|---|---|
| id | INT PK | Referenced by splits and payees. |
| name | VARCHAR(100) | Display name. Top-level categories have parent_id = NULL. |
| parent_id | INT FK → self | NULL for top-level categories; points to the parent for subcategories. Only two levels are supported. |
| type | ENUM | income, expense, or transfer. |
| is_active | TINYINT(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.
| Column | Type | Notes |
|---|---|---|
| name | VARCHAR(200) UNIQUE | Must be unique. Matches the free-text payee field on transactions. |
| category_id | INT FK → categories | Default top-level category pre-filled when this payee is selected. |
| subcategory_id | INT FK → categories | Default 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
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;
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 PayPalLicense
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.