mirror of
https://github.com/simonmichael/hledger.git
synced 2025-01-06 02:23:46 +03:00
70e85d8e4b
[ci skip]
439 lines
14 KiB
Groff
439 lines
14 KiB
Groff
|
|
.TH "hledger-web" "1" "March 2020" "hledger-web 1.17.99" "hledger User Manuals"
|
|
|
|
|
|
|
|
.SH NAME
|
|
.PP
|
|
hledger-web - web interface for the hledger accounting tool
|
|
.SH SYNOPSIS
|
|
.PP
|
|
\f[C]hledger-web [OPTIONS]\f[R]
|
|
.PD 0
|
|
.P
|
|
.PD
|
|
\f[C]hledger web -- [OPTIONS]\f[R]
|
|
.SH DESCRIPTION
|
|
.PP
|
|
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).
|
|
.PP
|
|
hledger-web is hledger\[aq]s web interface.
|
|
It starts a simple web application for browsing and adding transactions,
|
|
and optionally opens it in a web browser window if possible.
|
|
It provides a more user-friendly UI than the hledger CLI or hledger-ui
|
|
interface, showing more at once (accounts, the current account register,
|
|
balance charts) and allowing history-aware data entry, interactive
|
|
searching, and bookmarking.
|
|
.PP
|
|
hledger-web also lets you share a ledger 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.
|
|
.PP
|
|
Like hledger, it reads data from one or more files in hledger journal,
|
|
timeclock, timedot, or CSV format specified with \f[C]-f\f[R], or
|
|
\f[C]$LEDGER_FILE\f[R], or \f[C]$HOME/.hledger.journal\f[R] (on windows,
|
|
perhaps \f[C]C:/Users/USER/.hledger.journal\f[R]).
|
|
For more about this see hledger(1), hledger_journal(5) etc.
|
|
.SH OPTIONS
|
|
.PP
|
|
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.
|
|
.PP
|
|
Note: if invoking hledger-web as a hledger subcommand, write
|
|
\f[C]--\f[R] before options, as shown in the synopsis above.
|
|
.TP
|
|
\f[B]\f[CB]--serve\f[B]\f[R]
|
|
serve and log requests, don\[aq]t browse or auto-exit
|
|
.TP
|
|
\f[B]\f[CB]--serve-api\f[B]\f[R]
|
|
like --serve, but serve only the JSON web API, without the server-side
|
|
web UI
|
|
.TP
|
|
\f[B]\f[CB]--host=IPADDR\f[B]\f[R]
|
|
listen on this IP address (default: 127.0.0.1)
|
|
.TP
|
|
\f[B]\f[CB]--port=PORT\f[B]\f[R]
|
|
listen on this TCP port (default: 5000)
|
|
.TP
|
|
\f[B]\f[CB]--socket=SOCKETFILE\f[B]\f[R]
|
|
use a unix domain socket file to listen for requests instead of a TCP
|
|
socket.
|
|
Implies \f[C]--serve\f[R].
|
|
It can only be used if the operating system can provide this type of
|
|
socket.
|
|
.TP
|
|
\f[B]\f[CB]--base-url=URL\f[B]\f[R]
|
|
set the base url (default: http://IPADDR:PORT).
|
|
You would change this when sharing over the network, or integrating
|
|
within a larger website.
|
|
.TP
|
|
\f[B]\f[CB]--file-url=URL\f[B]\f[R]
|
|
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.
|
|
.TP
|
|
\f[B]\f[CB]--capabilities=CAP[,CAP..]\f[B]\f[R]
|
|
enable the view, add, and/or manage capabilities (default: view,add)
|
|
.TP
|
|
\f[B]\f[CB]--capabilities-header=HTTPHEADER\f[B]\f[R]
|
|
read capabilities to enable from a HTTP header, like
|
|
X-Sandstorm-Permissions (default: disabled)
|
|
.PP
|
|
hledger input options:
|
|
.TP
|
|
\f[B]\f[CB]-f FILE --file=FILE\f[B]\f[R]
|
|
use a different input file.
|
|
For stdin, use - (default: \f[C]$LEDGER_FILE\f[R] or
|
|
\f[C]$HOME/.hledger.journal\f[R])
|
|
.TP
|
|
\f[B]\f[CB]--rules-file=RULESFILE\f[B]\f[R]
|
|
Conversion rules file to use when reading CSV (default: FILE.rules)
|
|
.TP
|
|
\f[B]\f[CB]--separator=CHAR\f[B]\f[R]
|
|
Field separator to expect when reading CSV (default: \[aq],\[aq])
|
|
.TP
|
|
\f[B]\f[CB]--alias=OLD=NEW\f[B]\f[R]
|
|
rename accounts named OLD to NEW
|
|
.TP
|
|
\f[B]\f[CB]--anon\f[B]\f[R]
|
|
anonymize accounts and payees
|
|
.TP
|
|
\f[B]\f[CB]--pivot FIELDNAME\f[B]\f[R]
|
|
use some other field or tag for the account name
|
|
.TP
|
|
\f[B]\f[CB]-I --ignore-assertions\f[B]\f[R]
|
|
disable balance assertion checks (note: does not disable balance
|
|
assignments)
|
|
.PP
|
|
hledger reporting options:
|
|
.TP
|
|
\f[B]\f[CB]-b --begin=DATE\f[B]\f[R]
|
|
include postings/txns on or after this date
|
|
.TP
|
|
\f[B]\f[CB]-e --end=DATE\f[B]\f[R]
|
|
include postings/txns before this date
|
|
.TP
|
|
\f[B]\f[CB]-D --daily\f[B]\f[R]
|
|
multiperiod/multicolumn report by day
|
|
.TP
|
|
\f[B]\f[CB]-W --weekly\f[B]\f[R]
|
|
multiperiod/multicolumn report by week
|
|
.TP
|
|
\f[B]\f[CB]-M --monthly\f[B]\f[R]
|
|
multiperiod/multicolumn report by month
|
|
.TP
|
|
\f[B]\f[CB]-Q --quarterly\f[B]\f[R]
|
|
multiperiod/multicolumn report by quarter
|
|
.TP
|
|
\f[B]\f[CB]-Y --yearly\f[B]\f[R]
|
|
multiperiod/multicolumn report by year
|
|
.TP
|
|
\f[B]\f[CB]-p --period=PERIODEXP\f[B]\f[R]
|
|
set start date, end date, and/or reporting interval all at once using
|
|
period expressions syntax
|
|
.TP
|
|
\f[B]\f[CB]--date2\f[B]\f[R]
|
|
match the secondary date instead (see command help for other effects)
|
|
.TP
|
|
\f[B]\f[CB]-U --unmarked\f[B]\f[R]
|
|
include only unmarked postings/txns (can combine with -P or -C)
|
|
.TP
|
|
\f[B]\f[CB]-P --pending\f[B]\f[R]
|
|
include only pending postings/txns
|
|
.TP
|
|
\f[B]\f[CB]-C --cleared\f[B]\f[R]
|
|
include only cleared postings/txns
|
|
.TP
|
|
\f[B]\f[CB]-R --real\f[B]\f[R]
|
|
include only non-virtual postings
|
|
.TP
|
|
\f[B]\f[CB]-NUM --depth=NUM\f[B]\f[R]
|
|
hide/aggregate accounts or postings more than NUM levels deep
|
|
.TP
|
|
\f[B]\f[CB]-E --empty\f[B]\f[R]
|
|
show items with zero amount, normally hidden (and vice-versa in
|
|
hledger-ui/hledger-web)
|
|
.TP
|
|
\f[B]\f[CB]-B --cost\f[B]\f[R]
|
|
convert amounts to their cost at transaction time (using the transaction
|
|
price, if any)
|
|
.TP
|
|
\f[B]\f[CB]-V --value\f[B]\f[R]
|
|
convert amounts to their market value on the report end date (using the
|
|
most recent applicable market price, if any)
|
|
.TP
|
|
\f[B]\f[CB]--auto\f[B]\f[R]
|
|
apply automated posting rules to modify transactions.
|
|
.TP
|
|
\f[B]\f[CB]--forecast\f[B]\f[R]
|
|
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.
|
|
.PP
|
|
When a reporting option appears more than once in the command line, the
|
|
last one takes precedence.
|
|
.PP
|
|
Some reporting options can also be written as query arguments.
|
|
.PP
|
|
hledger help options:
|
|
.TP
|
|
\f[B]\f[CB]-h --help\f[B]\f[R]
|
|
show general usage (or after COMMAND, command usage)
|
|
.TP
|
|
\f[B]\f[CB]--version\f[B]\f[R]
|
|
show version
|
|
.TP
|
|
\f[B]\f[CB]--debug[=N]\f[B]\f[R]
|
|
show debug output (levels 1-9, default: 1)
|
|
.PP
|
|
A \[at]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 \f[C]--\f[R] argument before.)
|
|
.PP
|
|
By default, hledger-web starts the web app in \[dq]transient mode\[dq]
|
|
and also opens it in your default web browser if possible.
|
|
In this mode the web app will keep running for as long as you have it
|
|
open in a browser window, and will exit after two minutes of inactivity
|
|
(no requests and no browser windows viewing it).
|
|
With \f[C]--serve\f[R], it just runs the web app without exiting, and
|
|
logs requests to the console.
|
|
With \f[C]--serve-api\f[R], only the JSON web api (see below) is served,
|
|
with the usual HTML server-side web UI disabled.
|
|
.PP
|
|
By default the server listens on IP address 127.0.0.1, accessible only
|
|
to local requests.
|
|
You can use \f[C]--host\f[R] to change this, eg \f[C]--host 0.0.0.0\f[R]
|
|
to listen on all configured addresses.
|
|
.PP
|
|
Similarly, use \f[C]--port\f[R] to set a TCP port other than 5000, eg if
|
|
you are running multiple hledger-web instances.
|
|
.PP
|
|
Both of these options are ignored when \f[C]--socket\f[R] is used.
|
|
In this case, it creates an \f[C]AF_UNIX\f[R] 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 authentication for different users.
|
|
The path can be derived in a predictable way, eg by using the username
|
|
within the path.
|
|
As an example, \f[C]nginx\f[R] as reverse proxy can use the variabel
|
|
\f[C]$remote_user\f[R] to derive a path from the username used in a HTTP
|
|
basic authentication.
|
|
The following \f[C]proxy_pass\f[R] directive allows access to all
|
|
\f[C]hledger-web\f[R] instances that created a socket in
|
|
\f[C]/tmp/hledger/\f[R]:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
proxy_pass http://unix:/tmp/hledger/${remote_user}.socket;
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
You can use \f[C]--base-url\f[R] 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 \f[C]http://HOST:PORT/\f[R] using the server\[aq]s
|
|
configured host address and TCP port (or \f[C]http://HOST\f[R] if PORT
|
|
is 80).
|
|
.PP
|
|
With \f[C]--file-url\f[R] you can set a different base url for static
|
|
files, eg for better caching or cookie-less serving on high performance
|
|
websites.
|
|
.SH PERMISSIONS
|
|
.PP
|
|
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.
|
|
.PP
|
|
You can restrict who can reach it by
|
|
.IP \[bu] 2
|
|
setting the IP address it listens on (see \f[C]--host\f[R] above).
|
|
By default it listens on 127.0.0.1, accessible to all users on the local
|
|
machine.
|
|
.IP \[bu] 2
|
|
putting it behind an authenticating proxy, using eg apache or nginx
|
|
.IP \[bu] 2
|
|
custom firewall rules
|
|
.PP
|
|
You can restrict what the users who reach it can do, by
|
|
.IP \[bu] 2
|
|
using the \f[C]--capabilities=CAP[,CAP..]\f[R] flag when you start it,
|
|
enabling one or more of the following capabilities.
|
|
The default value is \f[C]view,add\f[R]:
|
|
.RS 2
|
|
.IP \[bu] 2
|
|
\f[C]view\f[R] - allows viewing the journal file and all included files
|
|
.IP \[bu] 2
|
|
\f[C]add\f[R] - allows adding new transactions to the main journal file
|
|
.IP \[bu] 2
|
|
\f[C]manage\f[R] - allows editing, uploading or downloading the main or
|
|
included files
|
|
.RE
|
|
.IP \[bu] 2
|
|
using the \f[C]--capabilities-header=HTTPHEADER\f[R] 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\[aq]s permissions.
|
|
This is disabled by default.
|
|
.SH EDITING, UPLOADING, DOWNLOADING
|
|
.PP
|
|
If you enable the \f[C]manage\f[R] capability mentioned above,
|
|
you\[aq]ll see a new \[dq]spanner\[dq] 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.
|
|
.PP
|
|
Note, unlike any other hledger command, in this mode you (or any
|
|
visitor) can alter or wipe the data files.
|
|
.PP
|
|
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,
|
|
currently; if you use one, you\[aq]ll have to arrange to commit the
|
|
changes yourself (eg with a cron job or a file watcher like entr).
|
|
.PP
|
|
Changes which would leave the journal file(s) unparseable or non-valid
|
|
(eg with failing balance assertions) are prevented.
|
|
(Probably.
|
|
This needs re-testing.)
|
|
.SH RELOADING
|
|
.PP
|
|
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.
|
|
.PP
|
|
(Note: if you are viewing files mounted from another machine, make sure
|
|
that both machine clocks are roughly in step.)
|
|
.SH JSON API
|
|
.PP
|
|
In addition to the web UI, hledger-web provides some API routes that
|
|
serve JSON in response to GET requests.
|
|
(And when started with \f[C]--serve-api\f[R], it provides only these
|
|
routes.):
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
/accountnames
|
|
/transactions
|
|
/prices
|
|
/commodities
|
|
/accounts
|
|
/accounttransactions/#AccountName
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
Also, you can append a new transaction to the journal by sending a PUT
|
|
request to \f[C]/add\f[R] (hledger-web only).
|
|
As with the web UI\[aq]s add form, hledger-web must be started with the
|
|
\f[C]add\f[R] capability for this (enabled by default).
|
|
.PP
|
|
The payload should be a valid hledger transaction as JSON, similar to
|
|
what you get from \f[C]/transactions\f[R] or
|
|
\f[C]/accounttransactions\f[R].
|
|
.PP
|
|
Another way to generate test data is with the
|
|
\f[C]readJsonFile\f[R]/\f[C]writeJsonFile\f[R] helpers in
|
|
Hledger.Web.Json, which can write or read most of hledger\[aq]s data
|
|
types to or from a file.
|
|
Eg here we write the first transaction of a sample journal:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
$ make ghci-web
|
|
>>> :m +*Hledger.Web.Json
|
|
>>> writeJsonFile \[dq]txn.json\[dq] (head $ jtxns samplejournal)
|
|
>>> :q
|
|
$ python -m json.tool <txn.json >txn.pretty.json # optional: make human-readable
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
(sample output & discussion)
|
|
.PP
|
|
And here\[aq]s how to test adding that with curl:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
$ curl -s http://127.0.0.1:5000/add -X PUT -H \[aq]Content-Type: application/json\[aq] --data-binary \[at]txn.pretty.json; echo
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
By default, both the server-side HTML UI and the JSON API are served.
|
|
Running with \f[C]--serve-api\f[R] disables the former, useful if you
|
|
only want to serve the API.
|
|
.SH ENVIRONMENT
|
|
.PP
|
|
\f[B]LEDGER_FILE\f[R] The journal file path when not specified with
|
|
\f[C]-f\f[R].
|
|
Default: \f[C]\[ti]/.hledger.journal\f[R] (on windows, perhaps
|
|
\f[C]C:/Users/USER/.hledger.journal\f[R]).
|
|
.PP
|
|
A typical value is \f[C]\[ti]/DIR/YYYY.journal\f[R], where DIR is a
|
|
version-controlled finance directory and YYYY is the current year.
|
|
Or \f[C]\[ti]/DIR/current.journal\f[R], where current.journal is a
|
|
symbolic link to YYYY.journal.
|
|
.PP
|
|
On Mac computers, you can set this and other environment variables in a
|
|
more thorough way that also affects applications started from the GUI
|
|
(say, an Emacs dock icon).
|
|
Eg on MacOS Catalina I have a \f[C]\[ti]/.MacOSX/environment.plist\f[R]
|
|
file containing
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
{
|
|
\[dq]LEDGER_FILE\[dq] : \[dq]\[ti]/finance/current.journal\[dq]
|
|
}
|
|
\f[R]
|
|
.fi
|
|
.PP
|
|
To see the effect you may need to \f[C]killall Dock\f[R], or reboot.
|
|
.SH FILES
|
|
.PP
|
|
Reads data from one or more files in hledger journal, timeclock,
|
|
timedot, or CSV format specified with \f[C]-f\f[R], or
|
|
\f[C]$LEDGER_FILE\f[R], or \f[C]$HOME/.hledger.journal\f[R] (on windows,
|
|
perhaps \f[C]C:/Users/USER/.hledger.journal\f[R]).
|
|
.SH BUGS
|
|
.PP
|
|
The need to precede options with \f[C]--\f[R] when invoked from hledger
|
|
is awkward.
|
|
.PP
|
|
\f[C]-f-\f[R] doesn\[aq]t work (hledger-web can\[aq]t read from stdin).
|
|
.PP
|
|
Query arguments and some hledger options are ignored.
|
|
.PP
|
|
Does not work in text-mode browsers.
|
|
.PP
|
|
Does not work well on small screens.
|
|
|
|
|
|
.SH "REPORTING BUGS"
|
|
Report bugs at http://bugs.hledger.org
|
|
(or on the #hledger IRC channel or hledger mail list)
|
|
|
|
.SH AUTHORS
|
|
Simon Michael <simon@joyful.com> and contributors
|
|
|
|
.SH COPYRIGHT
|
|
|
|
Copyright (C) 2007-2019 Simon Michael.
|
|
.br
|
|
Released under GNU GPL v3 or later.
|
|
|
|
.SH SEE ALSO
|
|
hledger(1), hledger\-ui(1), hledger\-web(1), hledger\-api(1),
|
|
hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_timedot(5),
|
|
ledger(1)
|
|
|
|
http://hledger.org
|