mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
606 lines
24 KiB
Plaintext
606 lines
24 KiB
Plaintext
|
|
HLEDGER-WEB(1) hledger User Manuals HLEDGER-WEB(1)
|
|
|
|
|
|
|
|
NAME
|
|
hledger-web is a web interface (WUI) for the hledger accounting tool.
|
|
This manual is for hledger-web 1.27.99.
|
|
|
|
SYNOPSIS
|
|
hledger-web [OPTIONS] # run temporarily & browse
|
|
hledger-web --serve [OPTIONS] # run without stopping
|
|
hledger-web --serve-api [OPTIONS] # run JSON server only
|
|
|
|
DESCRIPTION
|
|
hledger is a reliable, cross-platform set of programs for tracking
|
|
money, time, or any other commodity, using double-entry accounting and
|
|
a simple, editable file format. hledger is inspired by and largely
|
|
compatible with ledger(1).
|
|
|
|
hledger-web is a simple web application for browsing and adding trans-
|
|
actions. It provides a more user-friendly UI than the hledger CLI or
|
|
hledger-ui TUI, showing more at once (accounts, the current account
|
|
register, balance charts) and allowing history-aware data entry, inter-
|
|
active searching, and bookmarking.
|
|
|
|
hledger-web also lets you share a journal with multiple users, or even
|
|
the public web. There is no access control, so if you need that you
|
|
should put it behind a suitable web proxy. As a small protection
|
|
against data loss when running an unprotected instance, it writes a
|
|
numbered backup of the main journal file (only) on every edit.
|
|
|
|
Like hledger, it reads data from one or more files in hledger journal,
|
|
timeclock, timedot, or CSV format specified with -f, or $LEDGER_FILE,
|
|
or $HOME/.hledger.journal (on windows, perhaps
|
|
C:/Users/USER/.hledger.journal). For more about this see hledger(1).
|
|
|
|
hledger-web can be run in three modes:
|
|
|
|
o Transient mode (the default): your default web browser will be opened
|
|
to show the app if possible, and the app exits automatically after
|
|
two minutes of inactivity (no requests received and no open browser
|
|
windows viewing it).
|
|
|
|
o With --serve: the app runs without stopping, and without opening a
|
|
browser.
|
|
|
|
o With --serve-api: only the JSON API is served.
|
|
|
|
In all cases hledger-web runs as a foreground process, logging requests
|
|
to stdout.
|
|
|
|
OPTIONS
|
|
Command-line options and arguments may be used to set an initial filter
|
|
on the data. These filter options are not shown in the web UI, but it
|
|
will be applied in addition to any search query entered there.
|
|
|
|
Note: if invoking hledger-web as a hledger subcommand, write -- before
|
|
options, as shown in the synopsis above.
|
|
|
|
--serve
|
|
serve and log requests, don't browse or auto-exit after timeout
|
|
|
|
--serve-api
|
|
like --serve, but serve only the JSON web API, without the
|
|
server-side web UI
|
|
|
|
--host=IPADDR
|
|
listen on this IP address (default: 127.0.0.1)
|
|
|
|
--port=PORT
|
|
listen on this TCP port (default: 5000)
|
|
|
|
--socket=SOCKETFILE
|
|
use a unix domain socket file to listen for requests instead of
|
|
a TCP socket. Implies --serve. It can only be used if the
|
|
operating system can provide this type of socket.
|
|
|
|
--base-url=URL
|
|
set the base url (default: http://IPADDR:PORT). You would
|
|
change this when sharing over the network, or integrating within
|
|
a larger website.
|
|
|
|
--file-url=URL
|
|
set the static files url (default: BASEURL/static). hledger-web
|
|
normally serves static files itself, but if you wanted to serve
|
|
them from another server for efficiency, you would set the url
|
|
with this.
|
|
|
|
--capabilities=CAP[,CAP..]
|
|
enable the view, add, and/or manage capabilities (default:
|
|
view,add)
|
|
|
|
--capabilities-header=HTTPHEADER
|
|
read capabilities to enable from a HTTP header, like X-Sand-
|
|
storm-Permissions (default: disabled)
|
|
|
|
--test run hledger-web's tests and exit. hspec test runner args may
|
|
follow a --, eg: hledger-web --test -- --help
|
|
|
|
hledger input options:
|
|
|
|
-f FILE --file=FILE
|
|
use a different input file. For stdin, use - (default:
|
|
$LEDGER_FILE or $HOME/.hledger.journal)
|
|
|
|
--rules-file=RULESFILE
|
|
Conversion rules file to use when reading CSV (default:
|
|
FILE.rules)
|
|
|
|
--separator=CHAR
|
|
Field separator to expect when reading CSV (default: ',')
|
|
|
|
--alias=OLD=NEW
|
|
rename accounts named OLD to NEW
|
|
|
|
--anon anonymize accounts and payees
|
|
|
|
--pivot FIELDNAME
|
|
use some other field or tag for the account name
|
|
|
|
-I --ignore-assertions
|
|
disable balance assertion checks (note: does not disable balance
|
|
assignments)
|
|
|
|
-s --strict
|
|
do extra error checking (check that all posted accounts are
|
|
declared)
|
|
|
|
hledger reporting options:
|
|
|
|
-b --begin=DATE
|
|
include postings/txns on or after this date (will be adjusted to
|
|
preceding subperiod start when using a report interval)
|
|
|
|
-e --end=DATE
|
|
include postings/txns before this date (will be adjusted to fol-
|
|
lowing subperiod end when using a report interval)
|
|
|
|
-D --daily
|
|
multiperiod/multicolumn report by day
|
|
|
|
-W --weekly
|
|
multiperiod/multicolumn report by week
|
|
|
|
-M --monthly
|
|
multiperiod/multicolumn report by month
|
|
|
|
-Q --quarterly
|
|
multiperiod/multicolumn report by quarter
|
|
|
|
-Y --yearly
|
|
multiperiod/multicolumn report by year
|
|
|
|
-p --period=PERIODEXP
|
|
set start date, end date, and/or reporting interval all at once
|
|
using period expressions syntax
|
|
|
|
--date2
|
|
match the secondary date instead (see command help for other
|
|
effects)
|
|
|
|
--today=DATE
|
|
override today's date (affects relative smart dates, for
|
|
tests/examples)
|
|
|
|
-U --unmarked
|
|
include only unmarked postings/txns (can combine with -P or -C)
|
|
|
|
-P --pending
|
|
include only pending postings/txns
|
|
|
|
-C --cleared
|
|
include only cleared postings/txns
|
|
|
|
-R --real
|
|
include only non-virtual postings
|
|
|
|
-NUM --depth=NUM
|
|
hide/aggregate accounts or postings more than NUM levels deep
|
|
|
|
-E --empty
|
|
show items with zero amount, normally hidden (and vice-versa in
|
|
hledger-ui/hledger-web)
|
|
|
|
-B --cost
|
|
convert amounts to their cost/selling amount at transaction time
|
|
|
|
-V --market
|
|
convert amounts to their market value in default valuation com-
|
|
modities
|
|
|
|
-X --exchange=COMM
|
|
convert amounts to their market value in commodity COMM
|
|
|
|
--value
|
|
convert amounts to cost or market value, more flexibly than
|
|
-B/-V/-X
|
|
|
|
--infer-market-prices
|
|
use transaction prices (recorded with @ or @@) as additional
|
|
market prices, as if they were P directives
|
|
|
|
--auto apply automated posting rules to modify transactions.
|
|
|
|
--forecast
|
|
generate future transactions from periodic transaction rules,
|
|
for the next 6 months or till report end date. In hledger-ui,
|
|
also make ordinary future transactions visible.
|
|
|
|
--commodity-style
|
|
Override the commodity style in the output for the specified
|
|
commodity. For example 'EUR1.000,00'.
|
|
|
|
--color=WHEN (or --colour=WHEN)
|
|
Should color-supporting commands use ANSI color codes in text
|
|
output. 'auto' (default): whenever stdout seems to be a color-
|
|
supporting terminal. 'always' or 'yes': always, useful eg when
|
|
piping output into 'less -R'. 'never' or 'no': never. A
|
|
NO_COLOR environment variable overrides this.
|
|
|
|
--pretty[=WHEN]
|
|
Show prettier output, e.g. using unicode box-drawing charac-
|
|
ters. Accepts 'yes' (the default) or 'no' ('y', 'n', 'always',
|
|
'never' also work). If you provide an argument you must use
|
|
'=', e.g. '--pretty=yes'.
|
|
|
|
When a reporting option appears more than once in the command line, the
|
|
last one takes precedence.
|
|
|
|
Some reporting options can also be written as query arguments.
|
|
|
|
hledger help options:
|
|
|
|
-h --help
|
|
show general or COMMAND help
|
|
|
|
--man show general or COMMAND user manual with man
|
|
|
|
--info show general or COMMAND user manual with info
|
|
|
|
--version
|
|
show general or ADDONCMD version
|
|
|
|
--debug[=N]
|
|
show debug output (levels 1-9, default: 1)
|
|
|
|
A @FILE argument will be expanded to the contents of FILE, which should
|
|
contain one command line option/argument per line. (To prevent this,
|
|
insert a -- argument before.)
|
|
|
|
By default the server listens on IP address 127.0.0.1, accessible only
|
|
to local requests. You can use --host to change this, eg --host
|
|
0.0.0.0 to listen on all configured addresses.
|
|
|
|
Similarly, use --port to set a TCP port other than 5000, eg if you are
|
|
running multiple hledger-web instances.
|
|
|
|
Both of these options are ignored when --socket is used. In this case,
|
|
it creates an AF_UNIX socket file at the supplied path and uses that
|
|
for communication. This is an alternative way of running multiple
|
|
hledger-web instances behind a reverse proxy that handles authentica-
|
|
tion for different users. The path can be derived in a predictable
|
|
way, eg by using the username within the path. As an example, nginx as
|
|
reverse proxy can use the variable $remote_user to derive a path from
|
|
the username used in a HTTP basic authentication. The following
|
|
proxy_pass directive allows access to all hledger-web instances that
|
|
created a socket in /tmp/hledger/:
|
|
|
|
proxy_pass http://unix:/tmp/hledger/${remote_user}.socket;
|
|
|
|
You can use --base-url to change the protocol, hostname, port and path
|
|
that appear in hyperlinks, useful eg for integrating hledger-web within
|
|
a larger website. The default is http://HOST:PORT/ using the server's
|
|
configured host address and TCP port (or http://HOST if PORT is 80).
|
|
|
|
With --file-url you can set a different base url for static files, eg
|
|
for better caching or cookie-less serving on high performance websites.
|
|
|
|
PERMISSIONS
|
|
By default, hledger-web allows anyone who can reach it to view the
|
|
journal and to add new transactions, but not to change existing data.
|
|
|
|
You can restrict who can reach it by
|
|
|
|
o setting the IP address it listens on (see --host above). By default
|
|
it listens on 127.0.0.1, accessible to all users on the local
|
|
machine.
|
|
|
|
o putting it behind an authenticating proxy, using eg apache or nginx
|
|
|
|
o custom firewall rules
|
|
|
|
You can restrict what the users who reach it can do, by
|
|
|
|
o using the --capabilities=CAP[,CAP..] flag when you start it, enabling
|
|
one or more of the following capabilities. The default value is
|
|
view,add:
|
|
|
|
o view - allows viewing the journal file and all included files
|
|
|
|
o add - allows adding new transactions to the main journal file
|
|
|
|
o manage - allows editing, uploading or downloading the main or
|
|
included files
|
|
|
|
o using the --capabilities-header=HTTPHEADER flag to specify a HTTP
|
|
header from which it will read capabilities to enable. hledger-web
|
|
on Sandstorm uses the X-Sandstorm-Permissions header to integrate
|
|
with Sandstorm's permissions. This is disabled by default.
|
|
|
|
EDITING, UPLOADING, DOWNLOADING
|
|
If you enable the manage capability mentioned above, you'll see a new
|
|
"spanner" button to the right of the search form. Clicking this will
|
|
let you edit, upload, or download the journal file or any files it
|
|
includes.
|
|
|
|
Note, unlike any other hledger command, in this mode you (or any visi-
|
|
tor) can alter or wipe the data files.
|
|
|
|
Normally whenever a file is changed in this way, hledger-web saves a
|
|
numbered backup (assuming file permissions allow it, the disk is not
|
|
full, etc.) hledger-web is not aware of version control systems, cur-
|
|
rently; if you use one, you'll have to arrange to commit the changes
|
|
yourself (eg with a cron job or a file watcher like entr).
|
|
|
|
Changes which would leave the journal file(s) unparseable or non-valid
|
|
(eg with failing balance assertions) are prevented. (Probably. This
|
|
needs re-testing.)
|
|
|
|
RELOADING
|
|
hledger-web detects changes made to the files by other means (eg if you
|
|
edit it directly, outside of hledger-web), and it will show the new
|
|
data when you reload the page or navigate to a new page. If a change
|
|
makes a file unparseable, hledger-web will display an error message
|
|
until the file has been fixed.
|
|
|
|
(Note: if you are viewing files mounted from another machine, make sure
|
|
that both machine clocks are roughly in step.)
|
|
|
|
JSON API
|
|
In addition to the web UI, hledger-web also serves a JSON API that can
|
|
be used to get data or add new transactions. If you want the JSON API
|
|
only, you can use the --serve-api flag. Eg:
|
|
|
|
$ hledger-web -f examples/sample.journal --serve-api
|
|
...
|
|
|
|
You can get JSON data from these routes:
|
|
|
|
/version
|
|
/accountnames
|
|
/transactions
|
|
/prices
|
|
/commodities
|
|
/accounts
|
|
/accounttransactions/ACCOUNTNAME
|
|
|
|
Eg, all account names in the journal (similar to the accounts command).
|
|
(hledger-web's JSON does not include newlines, here we use python to
|
|
prettify it):
|
|
|
|
$ curl -s http://127.0.0.1:5000/accountnames | python -m json.tool
|
|
[
|
|
"assets",
|
|
"assets:bank",
|
|
"assets:bank:checking",
|
|
"assets:bank:saving",
|
|
"assets:cash",
|
|
"expenses",
|
|
"expenses:food",
|
|
"expenses:supplies",
|
|
"income",
|
|
"income:gifts",
|
|
"income:salary",
|
|
"liabilities",
|
|
"liabilities:debts"
|
|
]
|
|
|
|
Or all transactions:
|
|
|
|
$ curl -s http://127.0.0.1:5000/transactions | python -m json.tool
|
|
[
|
|
{
|
|
"tcode": "",
|
|
"tcomment": "",
|
|
"tdate": "2008-01-01",
|
|
"tdate2": null,
|
|
"tdescription": "income",
|
|
"tindex": 1,
|
|
"tpostings": [
|
|
{
|
|
"paccount": "assets:bank:checking",
|
|
"pamount": [
|
|
{
|
|
"acommodity": "$",
|
|
"aismultiplier": false,
|
|
"aprice": null,
|
|
...
|
|
|
|
Most of the JSON corresponds to hledger's data types; for details of
|
|
what the fields mean, see the Hledger.Data.Json haddock docs and click
|
|
on the various data types, eg Transaction. And for a higher level
|
|
understanding, see the journal manual.
|
|
|
|
In some cases there is outer JSON corresponding to a "Report" type. To
|
|
understand that, go to the Hledger.Web.Handler.MiscR haddock and look
|
|
at the source for the appropriate handler to see what it returns. Eg
|
|
for /accounttransactions it's getAccounttransactionsR, returning a
|
|
"accountTransactionsReport ...". Looking up the haddock for that we
|
|
can see that /accounttransactions returns an AccountTransactionsReport,
|
|
which consists of a report title and a list of AccountTransactionsRe-
|
|
portItem (etc).
|
|
|
|
You can add a new transaction to the journal with a PUT request to
|
|
/add, if hledger-web was started with the add capability (enabled by
|
|
default). The payload must be the full, exact JSON representation of a
|
|
hledger transaction (partial data won't do). You can get sample JSON
|
|
from hledger-web's /transactions or /accounttransactions, or you can
|
|
export it with hledger-lib, eg like so:
|
|
|
|
.../hledger$ stack ghci hledger-lib
|
|
>>> writeJsonFile "txn.json" (head $ jtxns samplejournal)
|
|
>>> :q
|
|
|
|
Here's how it looks as of hledger-1.17 (remember, this JSON corresponds
|
|
to hledger's Transaction and related data types):
|
|
|
|
{
|
|
"tcomment": "",
|
|
"tpostings": [
|
|
{
|
|
"pbalanceassertion": null,
|
|
"pstatus": "Unmarked",
|
|
"pamount": [
|
|
{
|
|
"aprice": null,
|
|
"acommodity": "$",
|
|
"aquantity": {
|
|
"floatingPoint": 1,
|
|
"decimalPlaces": 10,
|
|
"decimalMantissa": 10000000000
|
|
},
|
|
"aismultiplier": false,
|
|
"astyle": {
|
|
"ascommodityside": "L",
|
|
"asdigitgroups": null,
|
|
"ascommodityspaced": false,
|
|
"asprecision": 2,
|
|
"asdecimalpoint": "."
|
|
}
|
|
}
|
|
],
|
|
"ptransaction_": "1",
|
|
"paccount": "assets:bank:checking",
|
|
"pdate": null,
|
|
"ptype": "RegularPosting",
|
|
"pcomment": "",
|
|
"pdate2": null,
|
|
"ptags": [],
|
|
"poriginal": null
|
|
},
|
|
{
|
|
"pbalanceassertion": null,
|
|
"pstatus": "Unmarked",
|
|
"pamount": [
|
|
{
|
|
"aprice": null,
|
|
"acommodity": "$",
|
|
"aquantity": {
|
|
"floatingPoint": -1,
|
|
"decimalPlaces": 10,
|
|
"decimalMantissa": -10000000000
|
|
},
|
|
"aismultiplier": false,
|
|
"astyle": {
|
|
"ascommodityside": "L",
|
|
"asdigitgroups": null,
|
|
"ascommodityspaced": false,
|
|
"asprecision": 2,
|
|
"asdecimalpoint": "."
|
|
}
|
|
}
|
|
],
|
|
"ptransaction_": "1",
|
|
"paccount": "income:salary",
|
|
"pdate": null,
|
|
"ptype": "RegularPosting",
|
|
"pcomment": "",
|
|
"pdate2": null,
|
|
"ptags": [],
|
|
"poriginal": null
|
|
}
|
|
],
|
|
"ttags": [],
|
|
"tsourcepos": {
|
|
"tag": "JournalSourcePos",
|
|
"contents": [
|
|
"",
|
|
[
|
|
1,
|
|
1
|
|
]
|
|
]
|
|
},
|
|
"tdate": "2008-01-01",
|
|
"tcode": "",
|
|
"tindex": 1,
|
|
"tprecedingcomment": "",
|
|
"tdate2": null,
|
|
"tdescription": "income",
|
|
"tstatus": "Unmarked"
|
|
}
|
|
|
|
And here's how to test adding it with curl. This should add a new
|
|
entry to your journal:
|
|
|
|
$ curl http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.json
|
|
|
|
DEBUG OUTPUT
|
|
Debug output
|
|
You can add --debug[=N] to the command line to log debug output. N
|
|
ranges from 1 (least output, the default) to 9 (maximum output). Typi-
|
|
cally you would start with 1 and increase until you are seeing enough.
|
|
Debug output goes to stderr, interleaved with the requests logged on
|
|
stdout. To capture debug output in a log file instead, you can usually
|
|
redirect stderr, eg:
|
|
hledger-web --debug=3 2>hledger-web.log.
|
|
|
|
ENVIRONMENT
|
|
LEDGER_FILE The journal file path when not specified with -f.
|
|
|
|
On unix computers, the default value is: ~/.hledger.journal.
|
|
|
|
A more typical value is something like ~/finance/YYYY.journal, where
|
|
~/finance is a version-controlled finance directory and YYYY is the
|
|
current year. Or, ~/finance/current.journal, where current.journal is
|
|
a symbolic link to YYYY.journal.
|
|
|
|
The usual way to set this permanently is to add a command to one of
|
|
your shell's startup files (eg ~/.profile):
|
|
|
|
export LEDGER_FILE=~/finance/current.journal`
|
|
|
|
On some Mac computers, there is a more thorough way to set environment
|
|
variables, that will also affect applications started from the GUI (eg,
|
|
Emacs started from a dock icon): In ~/.MacOSX/environment.plist, add an
|
|
entry like:
|
|
|
|
{
|
|
"LEDGER_FILE" : "~/finance/current.journal"
|
|
}
|
|
|
|
For this to take effect you might need to killall Dock, or reboot.
|
|
|
|
On Windows computers, the default value is probably C:\Users\YOUR-
|
|
NAME\.hledger.journal. You can change this by running a command like
|
|
this in a powershell window (let us know if you need to be an Adminis-
|
|
trator, and if this persists across a reboot):
|
|
|
|
> setx LEDGER_FILE "C:\Users\MyUserName\finance\2021.journal"
|
|
|
|
Or, change it in settings: see https://www.java.com/en/down-
|
|
load/help/path.html.
|
|
|
|
FILES
|
|
Reads data from one or more files in hledger journal, timeclock, time-
|
|
dot, or CSV format specified with -f, or $LEDGER_FILE, or
|
|
$HOME/.hledger.journal (on windows, perhaps
|
|
C:/Users/USER/.hledger.journal).
|
|
|
|
BUGS
|
|
The need to precede options with -- when invoked from hledger is awk-
|
|
ward.
|
|
|
|
-f- doesn't work (hledger-web can't read from stdin).
|
|
|
|
Query arguments and some hledger options are ignored.
|
|
|
|
Does not work in text-mode browsers.
|
|
|
|
Does not work well on small screens.
|
|
|
|
|
|
|
|
REPORTING BUGS
|
|
Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel
|
|
or hledger mail list)
|
|
|
|
|
|
AUTHORS
|
|
Simon Michael <simon@joyful.com> and contributors
|
|
|
|
|
|
COPYRIGHT
|
|
Copyright (C) 2007-2020 Simon Michael.
|
|
Released under GNU GPL v3 or later.
|
|
|
|
|
|
SEE ALSO
|
|
hledger(1), hledger-ui(1), hledger-web(1), ledger(1)
|
|
|
|
|
|
|
|
hledger-web-1.27.99 November 2022 HLEDGER-WEB(1)
|