Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ADJUSTER(1)		     General Commands Manual		     ADJUSTER(1)

Web Adjuster is a Tornado-based, domain-rewriting proxy for applying custom pro-
cessing  to  Web pages. It is particularly meant for users of smartphones etc as
these might not support browser extensions. Web Adjuster can:

     O	 Add a custom stylesheet to change size, layout and colours

     O	 Add custom Javascript to all pages, allowing many desktop  browser  ex-
	 tensions to work as-is on a smartphone or tablet

     O	 Run  a  custom  program  to change the markup, or to change or annotate
	 text for language tools (see for example Annotator Generator)

     O	 Render images for a language or text size not supported by the  browser
	 (this function requires the Python Imaging Library and suitable fonts)

     O	 Down-sample MP3 audio to save bandwidth, and add plain text versions of
	 PDF and EPUB files (helper programs are required for these functions)

     O	 Remove problematic markup from pages, etc.

     Domain  rewriting	means  you do not need to be able to change the device's
     proxy settings--you simply go to a different address. However, only the do-
     main part is different, so most in-site scripting should work as-is,  with-
     out  needing  delicate alterations to its URI handling. For example, if you
     have a server called adjuster.example.org and you	want  to  see  www.exam-
     ple.com,  simply  go  to  www.example.com.adjuster.example.org. Your server
     ideally needs a wildcard domain, but you can manage  without  one	in  some
     cases,  and Web Adjuster can also be a "real" HTTP proxy for local use on a
     desktop etc.

     Because it is based on a single-threaded event-driven Tornado  server,  Web
     Adjuster  can  efficiently  handle  connections even on a low-power machine
     like the original Raspberry Pi. (Add-on programs run in other threads,  but
     this  is  seldom  a slow-down in practice.) Tornado also makes Web Adjuster
     easier to set up: it is a separate, self-contained server that doesn't need
     to be worked into the configuration of another one--it can listen on an al-
     ternate port (and can be password protected)--but if  you	prefer	you  can
     configure it to share port 80 with another server.

General options
     --config
	    Name  of the configuration file to read, if any. The process's work-
	    ing directory will be set to that of the configuration file so  that
	    relative pathnames can be used inside it. Any option that would oth-
	    erwise have to be set on the command line may be placed in this file
	    as	an option="value" or option='value' line (without any double-hy-
	    phen prefix). Multi-line values are possible if you  quote	them  in
	    """...""", and you can use standard \ escapes. You can also set con-
	    fig=  in  the configuration file itself to import another configura-
	    tion file (for example if you have per-machine settings  and  global
	    settings).	If  you  want  there  to be a default configuration file
	    without having to set it on the command line every time, an alterna-
	    tive option is to set the ADJUSTER_CFG environment variable.

     --version
	    Just print program version and exit

Network listening and security settings
     --port (default 28080)
	    The port to listen on. Setting this to 80 will make it the main  Web
	    server  on	the  machine  (which  will likely require root access on
	    Unix); setting it to 0 disables request-processing entirely (for  if
	    you  want  to use only the Dynamic DNS option); setting it to -1 se-
	    lects a local port in the ephemeral port range, in	which  case  ad-
	    dress  and	port will be written in plain form to standard output if
	    it's not a terminal and --background is set (see also --just-me).

     --publicPort (default 0)
	    The port to advertise in URLs etc, if different from 'port' (the de-
	    fault of 0 means no difference). Used for example if a firewall pre-
	    vents direct access to our port but a server like nginx  is  config-
	    ured to forward incoming connections.

     --address
	    The  address to listen on. If unset, will listen on all IP addresses
	    of the machine. You could for example set this to localhost  if  you
	    want  only	connections from the local machine to be received, which
	    might be useful in conjunction with --real_proxy.

     --password
	    The password. If this is set, nobody can connect without  specifying
	    ?p=  followed  by  this  password. It will then be sent to them as a
	    cookie so they don't have to enter it  every  time.  Notes:  (1)  If
	    wildcard_dns  is False and you have multiple domains in host_suffix,
	    then the password cookie will have to be set on a per-domain  basis.
	    (2)  On  a	shared server you probably don't want to specify this on
	    the command line where it can be seen by process-viewing tools;  use
	    a  configuration  file  instead.  (3)  When  not  in HTML-only mode,
	    browsers that send AJAX requests without cookies might have problems
	    when password is set.

     --password-domain
	    The domain entry in host_suffix to which the password  applies.  For
	    use  when  wildcard_dns  is  False	and  you have several domains in
	    host_suffix, and only one of them (perhaps the one with an empty de-
	    fault_site) is to be password-protected, with the others public.  If
	    this  option is used then prominentNotice (if set) will not apply to
	    the passworded domain. You may put the password on two or  more  do-
	    mains by separating them with slash (/).

     --auth-error (default Authentication error)
	    What  to  say when password protection is in use and a correct pass-
	    word has not been entered. HTML markup is allowed in  this	message.
	    As	a  special case, if this begins with http:// or https:// then it
	    is assumed to be the address of a Web  site  to  which  the  browser
	    should be redirected. If the markup begins with a * then this is re-
	    moved  and	the  page  is returned with code 200 (OK) instead of 401
	    (authorisation required).

     --open-proxy (default False)
	    Whether or not to allow running with no password. Off by default  as
	    a safeguard against accidentally starting an open proxy.

     --prohibit (default wiki.*action=edit)
	    Comma-separated list of regular expressions specifying URLs that are
	    not allowed to be fetched unless --real_proxy is in effect. Browsers
	    requesting	a  URL	that contains any of these will be redirected to
	    the original site. Use for example if you want people to  go  direct
	    when posting their own content to a particular site (this is of only
	    limited  use  if your server also offers access to any other site on
	    the Web, but it might be useful when that's not the  case).  Include
	    ^https in the list to prevent Web Adjuster from fetching HTTPS pages
	    for  adjustment  and return over normal HTTP. This access is enabled
	    by default now that many sites use HTTPS for public pages that don't
	    really need to be secure, just  to	get  better  placement	on  some
	    search  engines, but if sending confidential information to the site
	    then beware you are trusting the Web Adjuster machine and your  con-
	    nection  to  it,  plus  its certificate verification might not be as
	    thorough as your browser's.

     --prohibitUA (default TwitterBot)
	    Comma-separated list of regular expressions which, if they occur  in
	    browser strings, result in the browser being redirected to the orig-
	    inal  site.  Use  for example if you want certain robots that ignore
	    robots.txt to go direct.

     --real-proxy (default False)
	    Whether or not to accept  requests	with  original	domains  like  a
	    "real"  HTTP  proxy. Warning: this bypasses the password and implies
	    open_proxy. Off by default.

     --via (default True)
	    Whether or not to update the Via: and X-Forwarded-For: HTTP  headers
	    when forwarding requests

     --uavia (default True)
	    Whether  or not to add to the User-Agent HTTP header when forwarding
	    requests, as a courtesy to site  administrators  who  wonder  what's
	    happening in their logs (and don't log Via: etc)

     --robots (default False)
	    Whether or not to pass on requests for /robots.txt. If this is False
	    then  all  robots  will be asked not to crawl the site; if True then
	    the original site's robots settings will be mirrored. The default of
	    False is recommended.

     --just-me (default False)
	    Listen on localhost only, and check  incoming  connections	with  an
	    ident  server (which must be running on port 113) to ensure they are
	    coming from the same user. This is for experimental setups on shared
	    Unix machines; might be useful in conjuction with  --real_proxy.  If
	    an ident server is not available, an attempt is made to authenticate
	    connections via Linux netstat and /proc.

     --one-request-only (default False)
	    Shut down after handling one request. This is for use in inefficient
	    CGI-like environments where you cannot leave a server running perma-
	    nently, but still want to start one for something that's unsupported
	    in WSGI mode (e.g. js_reproxy): run with --one_request_only and for-
	    ward  the request to its port. You may also wish to set --seconds if
	    using this.

     --seconds (default 0)
	    The maximum number of seconds for which to run the server (0 for un-
	    limited). If a time limit is set, the server will shut  itself  down
	    after the specified length of time.

     --stdio (default False)
	    Forward  standard  input and output to our open port, in addition to
	    being open to normal TCP connections. This might be useful	in  con-
	    juction with --one-request-only and --port=-1.

     --upstream-proxy
	    address:port  of  a  proxy to send our requests through. This can be
	    used to adapt existing proxy-only mediators to domain rewriting,  or
	    for   a   caching  proxy.  Not  used  for  ip_query_url  options  or
	    fasterServer. If address is left blank (just :port)  then  localhost
	    is	assumed  and https URLs will be rewritten into http with altered
	    domains; you'll then need to set the upstream proxy to send its  re-
	    quests  back  through  the	adjuster  (which  will	listen on local-
	    host:port+1 for this purpose) to undo that rewrite. This can be used
	    to make an existing HTTP-only proxy process HTTPS pages.

     --ip-messages
	    Messages or blocks for specific IP address ranges (IPv4 only).  For-
	    mat is ranges|message|ranges|message etc, where ranges are separated
	    by commas; can be individual IPs, or ranges in either 'network/mask'
	    or	'min-max' format; the first matching range-set is selected. If a
	    message starts with * then its ranges are blocked  completely  (rest
	    of	message, if any, is sent as the only reply to any request), oth-
	    erwise  message  is  shown	on  a  'click-through'	page   (requires
	    Javascript	and  cookies).	If  the message starts with a hyphen (-)
	    then it is considered a minor edit of earlier messages  and  is  not
	    shown  to  people  who selected `do not show again' even if they did
	    this on a different version of the	message.  Messages  may  include
	    HTML.

DNS and website settings
     --host-suffix (default is the machine's domain name)
	    The last part of the domain name. For example, if the user wishes to
	    change  www.example.com  and  should  do  so  by  visiting www.exam-
	    ple.com.adjuster.example.org,  then  host_suffix  is  adjuster.exam-
	    ple.org. If you do not have a wildcard domain then you can still ad-
	    just  one site by setting wildcard_dns to False, host_suffix to your
	    non-wildcard domain, and default_site to the site you  wish  to  ad-
	    just.  If  you  have  more than one non-wildcard domain, you can set
	    wildcard_dns to False, host_suffix to all your domains separated  by
	    slash  (/), and default_site to the sites these correspond to, again
	    separated by slash (/); if two or more domains share  the  same  de-
	    fault_site	then  the first is preferred in links and the others are
	    assumed to be for backward compatibility. If wildcard_dns  is  False
	    and  default_site is empty (or if it's a /-separated list and one of
	    its items is empty), then the corresponding host_suffix gives a  URL
	    box  and  sets its domain in a cookie (and adds a link at the bottom
	    of pages to clear this and return to the URL box), but  this  should
	    be	done  only as a last resort: you can browse only one domain at a
	    time at that host_suffix, and unless you use  HTML-only  mode,  most
	    links  and	HTTP  redirects to other domains will leave the adjuster
	    (which can negatively affect sites that use  auxiliary  domains  for
	    scripts etc and check Referer, unless you ensure these auxiliary do-
	    mains are listed elsewhere in default_site), and browsers that don't
	    include cookies in their AJAX requests will have problems. Also, the
	    sites  you	visit  at  that host_suffix might be able to see some of
	    each other's cookies etc (leaking privacy) although the URL box page
	    will try to clear site cookies.

     --default-site
	    The site to fetch from if nothing is specified  before  host_suffix,
	    e.g.  example.org (add .0 at the end to specify an HTTPS connection,
	    but see the 'prohibit' option). If default_site is omitted then  the
	    user  is given a URL box when no site is specified; if it is 'error'
	    then an error is shown in place of the URL box (the text of the  er-
	    ror depends on the settings of wildcard_dns and real_proxy).

     --search-sites
	    Comma-separated  list  of search sites to be made available when the
	    URL box is displayed (if default_site is empty). Each  item  in  the
	    list  should be a URL (which will be prepended to the search query),
	    then a space, then a short description of the site. The  first  item
	    on	the list is used by default; the user can specify other items by
	    making the first word of their query equal to the first word of  the
	    short  description.  Additionally,	if  some  of the letters of that
	    first word are in parentheses, the user may specify just those  let-
	    ters.  So  for  example  if  you  have  an entry http://search.exam-
	    ple.com/?q= (e)xample, and the  user  types  'example  test'  or  'e
	    test', it will use http://search.example.com/?q=test

     --urlbox-extra-html
	    Any  extra	HTML  you  want to place after the URL box (when shown),
	    such as a paragraph explaining what your filters do etc.

     --urlboxPath (default /)
	    The path of the URL box for use in links to it. This might be useful
	    for wrapper configurations, but a URL box can  be  served  from  any
	    path  on  the  default domain. If however urlboxPath is set to some-
	    thing other than / then efforts are made to rewrite links to use  it
	    more often when in HTML-only mode with cookie domain, which might be
	    useful  for  limited-server situations. You can force HTML-only mode
	    to always be on by prefixing urlboxPath with *

     --wildcard-dns (default True)
	    Set this to False if you do not have a wildcard domain and	want  to
	    process  only  default_site. Setting this to False does not actually
	    prevent other sites from being processed (for example, a user  could
	    override  their local DNS resolver to make up for your lack of wild-
	    card domain); if you want to really prevent other sites  from  being
	    processed then you should get nginx or similar to block incoming re-
	    quests for the wrong domain. Setting wildcard_dns to False does stop
	    the  automatic re-writing of links to sites other than default_site.
	    Leave it set to True to have all sites' links rewritten on	the  as-
	    sumption that you have a wildcard domain.

     --urlscheme (default http://)
	    Default  URL  scheme  to use when referring to our other subdomains.
	    Setting this to // or https:// means you will need	a  wildcard  TLS
	    certificate  (or a multi-subdomain one with wildcard-limit set), but
	    leaving it at http:// means you may have only an unencrypted connec-
	    tion to at least some of the adjuster session.

     --alt-dot
	    String to place before host_suffix if the adjuster is run behind  an
	    SSL/TLS  terminator  that  lacks  certificates for subdomains beyond
	    host_suffix but can still route such subdomains to the  adjuster  if
	    separated  by  this string instead of a dot. Beware this leads to an
	    undesirable situation with subdomain-shared cookies: either  they'll
	    be	set  on  only  one  domain  instead of its subdomains (default),
	    breaking some websites (and breaking the password option if you  use
	    it),  or if you add a * before the value of alt-dot they can be sent
	    not only to all adjusted domains but also to all  other  domains  at
	    the same level as the adjuster i.e. other users of the provider (use
	    this  only	for  temporary	experimental  accounts	if you know what
	    you're doing, and it won't work on modern browsers if  the	provider
	    has  listed  their	upper  levels  in Mozilla's top-level domains on
	    which not even Javascript can set cookies). If possible, it's better
	    to avoid this option and instead use a  load  balancer  providing  a
	    shorter  host_suffix,  although if that doesn't have a wildcard cer-
	    tificate you'll be	on  unencrypted  HTTP,	unless	you  can  set  a
	    multi-subdomain certificate with wildcard-limit set.

     --wildcard-limit
	    Comma  separated list of domains to process via wildcard-dns, if not
	    unlimited. Use this if you have a wildcard DNS entry but not a wild-
	    card TLS certificate, but your TLS certificate  can  cover	specific
	    subdomains	of  the  form www-example-net-0.adjuster.example.org and
	    you wish to adjust these domains  (in  this  example  wildcard-limit
	    should   include   www.example.net).   Unlike   slash-separated  de-
	    fault-site, this allows cookie sharing between subdomains.	Any  do-
	    mains not listed will be sent out of the adjuster.

General adjustment options
     --default-cookies
	    Semicolon-separated list of name=value cookies to send to all remote
	    sites,  for example to set preferences. Any cookies that the browser
	    itself sends will take priority over cookies in this list. Note that
	    these cookies are sent to all sites. You can set a cookie only on  a
	    specific browser by putting (browser-string) before the cookie name,
	    e.g.  (iPad)x=y  will  set	x=y only if 'iPad' occurs in the browser
	    string (to match more than one browser-string keyword, you	have  to
	    specify the cookie multiple times).

     --headAppend
	    Code to append to the HEAD section of every HTML document that has a
	    BODY.  Use for example to add your own stylesheet links and scripts.
	    Not added to documents that lack a BODY such as framesets.

     --headAppendCSS
	    URL of a stylesheet to add to the HEAD section of every  HTML  docu-
	    ment  that	has a BODY. This option automatically generates the LINK
	    REL=... markup for it, and also tries to delete the string	'!impor-
	    tant'  from other stylesheets, to emulate setting this stylesheet as
	    a user CSS. Additionally, it is not  affected  by  --js-upstream  as
	    headAppend is. You can also include one or more 'fields' in the URL,
	    by	marking  them  with  %s  and following the URL with options e.g.
	    http://example.org/style%s-%s.css;1,2,3;A,B will allow  combinations
	    like  style1-A.css	or style3-B.css; in this case appropriate selec-
	    tors are provided with the URL box (values may  optionally	be  fol-
	    lowed  by  =  and  a description), and any visitors who have not set
	    their options will be redirected to the URL box to do so.

     --protectedCSS
	    A regular expression matching URLs of  stylesheets	with  are  "pro-
	    tected"  from  having  their '!important' strings deleted by headAp-
	    pendCSS's logic. This can be used for  example  if	you  are  adding
	    scripts  to allow the user to choose alternate CSS files in place of
	    headAppendCSS, and you wish the alternate CSS files to have the same
	    status as the one supplied in headAppendCSS.

     --cssName
	    A name for the stylesheet specified in headAppendCSS, such as  "High
	    Contrast". If cssName is set, then the headAppendCSS stylesheet will
	    be marked as "alternate", with Javascript links at the bottom of the
	    page for browsers that lack their own CSS switching options. If css-
	    Name  begins with a * then the stylesheet is switched on by default;
	    if cssName begins with a # then the stylesheet is switched on by de-
	    fault only if the browser reports system dark mode;  if  cssName  is
	    not set then the stylesheet (if any) is always on.

     --cssNameReload (default IEMobile 6, IEMobile 7, IEMobile 8, Opera Mini,
     Opera Mobi, rekonq, MSIE 5, MSIE 6, MSIE 7, MSIE 9, MSIE 10)
	    List  of  (old) browsers that require alternate code for the cssName
	    option, which is slower as it involves reloading  the  page  on  CSS
	    switches.  Use  this  if  the  CSS switcher provided by cssName does
	    nothing on your browser.

     --cssHtmlAttrs
	    Attributes to add to the BODY element of an HTML document when  css-
	    NameReload	is  in	effect (or when it would be in effect if cssName
	    were set). This is for old browsers that try to render the	document
	    first  and apply CSS later. Example: 'text="yellow" bgcolor="black"'
	    (not as flexible as CSS but can still  make  the  rendering  process
	    less  annoying). If headAppendCSS has "fields" then cssHtmlAttrs can
	    list multiple sets of attributes separated by ; and each set  corre-
	    sponds with an option in the last field of headAppendCSS.

     --headAppendRuby (default False)
	    Convenience  option  which	adds CSS and Javascript code to the HTML
	    body that tries to ensure simple RUBY markup displays legibly across
	    all modern browsers; this might be useful if you used Annotator Gen-
	    erator to make the htmlFilter program. (The option is  named  'head'
	    because  it  used  to  add markup to the HEAD; this was moved to the
	    BODY to work around browser bugs.)

     --highlighting
	    Convenience option which adds CSS  and  Javascript	code  to  add  a
	    text-highlighting  option  to  some  browsers.  If	set, this option
	    should be set to a comma-separated list of available colours (please
	    ensure there's at least one for each stylesheet colour scheme likely
	    to be in use); won't work well with --render because images are  not
	    highlighted. Highlights are saved in the browser, but might load in-
	    correctly if the page's text changes between sessions.

     --bodyAppend
	    Code  to  append to the BODY section of every HTML document that has
	    one. Use for example to add a script that needs to be run after  the
	    rest  of  the  body has been read, or to add a footer explaining how
	    the page has been modified. See also prominentNotice.

     --bodyAppendGoesAfter
	    If this is set to a regular expression matching some  text	or  HTML
	    code  that appears verbatim in the body section, the code in bodyAp-
	    pend will be inserted after the last instance of  this  regular  ex-
	    pression (case sensitive) instead of at the end of the body. Use for
	    example  if a site styles its pages such that the end of the body is
	    not a legible place for a footer.

     --bodyPrepend
	    Code to place at the start of the BODY section of every  HTML  docu-
	    ment that has one.

     --prominentNotice
	    Text  to  add  as a prominent notice to processed sites (may include
	    HTML). If the browser has sufficient Javascript support,  this  will
	    float  relative  to the browser window and will contain an 'acknowl-
	    edge' button to hide it (for the current site in the current  brows-
	    ing  session).  Use prominentNotice if you need to add important in-
	    formation about how the page has been modified. If	you  set  promi-
	    nentNotice to the special value "htmlFilter", then the output of the
	    htmlFilter	option	(if  any)  will be placed as a prominent notice;
	    this can be used if you want to provide extra information  or  links
	    derived  from  the	content  of  the  page.  Note:	if  you  include
	    Javascript document.write() code in prominentNotice, check that doc-
	    ument.readyState is not 'complete' or you might find the document is
	    erased on some website/browser combinations when a site script some-
	    how causes your script to be re-run after  the  document  stream  is
	    closed.  In some rare cases you might also need to verify that docu-
	    ment.cookie does not contain _WA_warnOK=1

     --staticDocs
	    url#path of static documents to add to every website, e.g.	/_mySta-
	    tic/#/var/www  (make  sure the first part is something not likely to
	    be used by the websites you visit). This can be used to supply extra
	    Javascript (e.g. for bodyPrepend to load) if it needs to  be  served
	    from  the same domain. The password option does not apply to static-
	    Docs.

     --delete
	    Comma-separated list of regular expressions to delete from HTML doc-
	    uments. Can be used to delete selected items of Javascript and other
	    code if it is causing trouble for your  browser.  Will  also  delete
	    from the text of pages; use with caution.

     --delete-css
	    Comma-separated list of regular expressions to delete from CSS docu-
	    ments (but not inline CSS in HTML); can be used to remove, for exam-
	    ple,  dimension limits that conflict with annotations you add, as an
	    alternative to inserting CSS overrides. In rare cases you might want
	    to replace the deleted regexp with another, in which  case	you  can
	    use @@ to separate the two, and a second @@ can be used to specify a
	    string in the CSS URL that must be present for the operation to take
	    effect (this could be combined with a codeChanges to add query para-
	    meters  to the URL if you want the change to occur only when the CSS
	    is loaded from specific HTML pages).

     --delete-doctype (default False)
	    Delete the DOCTYPE declarations from  HTML	pages.	This  option  is
	    needed  to	get some old Webkit browsers to apply multiple CSS files
	    consistently.

     --deleteOmit (default iPhone, iPad, Android, Macintosh)
	    A list of browsers that do not need the  delete  and  delete-doctype
	    options  to  be  applied.  If  any	of  these  strings  occur in the
	    user-agent then these options are disabled for that request, on  the
	    assumption	that  these browsers are capable enough to cope with the
	    "problem" code. Any delete-css option is still applied however.

     --cacheOmit (default IEMobile)
	    A list of  browsers  that  cannot  be  trusted  to	provide  correct
	    Cache-Control  headers. Use this if your browser fails to renew data
	    when you press Reload.

     --zeroWidthDelete (default IEMobile, MSIE 6)
	    A list of (old) browsers that cannot be relied on to process Unicode
	    zero-width space (U+200b) correctly and need it  removed  from  web-
	    sites

     --codeChanges
	    Several  lines of text specifying changes that are to be made to all
	    HTML and Javascript code files on certain sites; use as a  last  re-
	    sort  for  fixing  a  site's scripts. This option is best set in the
	    configuration file and surrounded by r"""...""". The first line is a
	    URL prefix (just "http" matches all); append a # to match  an  exact
	    URL  instead  of  a prefix, and #+number (e.g. #1 or #2) to match an
	    exact URL and perform the change only that number of  times  in  the
	    page.  The	second	line  is a string of code to search for, and the
	    third  is  a  string  to  replace  it  with.   Further   groups   of
	    URL/search/replace	lines may follow; blank lines and lines starting
	    with # are ignored. If the 'URL prefix' starts with a * then  it  is
	    instead a string to search for within the code of the document body;
	    any documents containing this code will match; thus it's possible to
	    write rules of the form 'if the code contains A, then replace B with
	    C'. This processing takes place before any 'delete' option takes ef-
	    fect so it's possible to pick up on things that will be deleted, and
	    it	occurs	after  the  domain  rewriting so it's possible to change
	    rewritten domains in the search/replace strings (but the URL  prefix
	    above should use the non-adjusted version).

     --boxPrompt (default Website to adjust)
	    What  to  say before the URL box (when shown); may include HTML; for
	    example if you've configured Web Adjuster to perform a  single  spe-
	    cialist  change  that can be described more precisely with some word
	    other than 'adjust', you might want to set this.

     --viewsource (default False)
	    Provide a "view source" option. If set, you can see a page's pre-ad-
	    justment source code, plus client  and  server  headers,  by  adding
	    ".viewsource" to the end of a URL (after any query parameters etc)

     --htmlonly-mode (default True)
	    Provide  a	checkbox  allowing  the  user to see pages in "HTML-only
	    mode", stripping out images, scripts and CSS; this might be a useful
	    fallback for very slow connections if a site's pages bring	in  many
	    external  files  and  the  browser cannot pipeline its requests. The
	    checkbox is displayed by the URL box, not at  the  bottom  of  every
	    page.

     --htmlonly-css (default False)
	    Leave  images and CSS in the page when in "HTML-only mode", removing
	    only scripts

     --mailtoPath (default /@mail@to@__)
	    A location on every adjusted website to put  a  special  redirection
	    page  to  handle mailto: links, showing the user the contents of the
	    link first (in case a mail client is not set up). This must be  made
	    up	of  URL-safe  characters  starting with a / and should be a path
	    that is unlikely to occur on normal websites and that does not  con-
	    flict  with  renderPath.  If this option is empty, mailto: links are
	    not changed. (Currently, only plain HTML mailto: links  are  changed
	    by this function; Javascript-computed ones are not.)

     --mailtoSMS (default Opera Mini, Opera Mobi, Android, Phone, Mobile)
	    When  using  mailtoPath, you can set a comma-separated list of plat-
	    forms that understand sms: links. If any of these strings  occur  in
	    the user-agent then an SMS link will be provided on the mailto redi-
	    rection  page,  to	place  the  suggested subject and/or body into a
	    draft SMS message instead of an email.

External processing options
     --htmlFilter
	    External program(s) to run to filter every HTML  document.	If  more
	    than  one  program is specified separated by # then the user will be
	    given a choice (see htmlFilterName option). Any shell command can be
	    used; its standard input will get the HTML (or  the  plain	text  if
	    htmlText  is  set),  and  it should send the new version to standard
	    output. Multiple copies of each program might be  run  at  the  same
	    time to serve concurrent requests. UTF-8 character encoding is used.
	    If	you  are  not able to run external programs then you could use a
	    back-end server (specify an http:// or https://  URL  and  input  is
	    POSTed  in	the request body; if this back-end server is another Web
	    Adjuster with submitPath and submitBookmarklet  set  then  give  its
	    submitPath	plus uA for its 1st filter, uB for its 2nd, etc), or use
	    a Python function: specify * followed by the function name, and  in-
	    ject  the  function  into  the adjuster module from a wrapper script
	    (which imports adjuster, sets adjuster.options.htmlFilter  etc,  in-
	    jects  the	function  and  calls adjuster.main). The function should
	    take a byte-string and return its modified version, and  is  run  in
	    the  serving  thread.  See also htmlUrl and htmlonly_tell_filter op-
	    tions.

     --htmlFilterName
	    A name for the task performed by htmlFilter. If  this  is  set,  the
	    user  will	be  able  to switch it on and off from the browser via a
	    cookie and some Javascript links at the bottom  of	HTML  pages.  If
	    htmlFilter lists two or more options, htmlFilterName should list the
	    same  number  plus one (again separated by #); the first is the name
	    of the entire category (for example "filters"),  and  the  user  can
	    choose  between  any one of them or none at all, hence the number of
	    options is one more than the number of filters

     --htmlFilterCollapse (default 3)
	    The maximum number of htmlFilterName options beyond  which	all  but
	    the first N-1 are hidden behind a "More" option on some browsers.

     --htmlJson (default False)
	    Try  to detect HTML strings in JSON responses and feed them to html-
	    Filter. This can help when using htmlFilter  with  some  AJAX-driven
	    sites.  Important:	Unless	you also set the 'separator' option, the
	    external program must preserve all newline characters, because  mul-
	    tiple  HTML  strings  in  the same JSON response will be given to it
	    separated by newlines, and the  newlines  of  the  output  determine
	    which  fragment  to  put  back  where. (If you combine htmlJson with
	    htmlText, the external program will see text in HTML in JSON as well
	    as text in HTML, but it won't see text in HTML in JSON in HTML.)

     --htmlText (default False)
	    Causes the HTML to be parsed, and  only  the  text	parts  (not  the
	    markup)  will be sent to htmlFilter. Useful to save doing HTML pars-
	    ing in the external program. The external program is  still  allowed
	    to include HTML markup in its output. Important: Unless you also set
	    the  'separator' option, the external program must preserve all new-
	    line characters, because multiple text strings will be given  to  it
	    separated  by  newlines,  and  the	newlines of the output determine
	    which modified string to put back where.

     --separator
	    If you are using htmlFilter with htmlJson and/or htmlText,	you  can
	    set  separator  to any text string to be used as a separator between
	    multiple items of data when passing them to the external program. By
	    default, newlines are used for this, but you can set it to any other
	    character or sequence of characters that cannot be added or  removed
	    by	the  program. (It does not matter if a website's text happens to
	    use the separator characters.) If separator is set, not only will it
	    be used as a separator between items of data but  also  it	will  be
	    added before the first and after the last item, thus allowing you to
	    use an external program that outputs extra text before the first and
	    after  the	last  item. The extra text will be discarded. If however
	    you do not set separator then the external program	should	not  add
	    anything extra before/after the document.

     --leaveTags (default script, style, title, textarea, option)
	    When  using  htmlFilter with htmlText, you can set a comma-separated
	    list of HTML tag names whose enclosed text should not be sent to the
	    external program for modification. For this  to  work,  the  website
	    must properly close these tags and must not nest them. (This list is
	    also used for character-set rendering.)

     --stripTags (default wbr)
	    When  using  htmlFilter with htmlText, you can set a comma-separated
	    list of HTML tag names which should be deleted if they occur in  any
	    section of running text. For example, "wbr" (word-break opportunity)
	    tags  (listed by default) might cause problems with phrase-based an-
	    notators.

     --htmlUrl (default False)
	    Add a line containing the document's URL to the start of  what  gets
	    sent  to  htmlFilter (useful for writing filters that behave differ-
	    ently for some sites; not  yet  implemented  for  submitBookmarklet,
	    which will show a generic URL). The URL line must not be included in
	    the filter's response.

     --htmlonly-tell-filter (default False)
	    Add  a line showing the current status of "HTML-only mode" (see htm-
	    lonly_mode option) to the start of what gets sent to htmlFilter (be-
	    fore any htmlUrl if present), as "True" or "False" (must not be  in-
	    cluded  in	the  filter's  response). This may be useful for filters
	    that need to do extra processing if client-side scripts are removed.

     --submitPath
	    If set, accessing this path (on any domain) will give a form  allow-
	    ing the user to enter their own text for processing with htmlFilter.
	    The  path should be one that websites are not likely to use (even as
	    a prefix), and must begin with a slash (/). If you prefix this  with
	    a * then the * is removed and any password set in the 'password' op-
	    tion  does	not  apply to submitPath. Details of the text entered on
	    this form is not logged by Web Adjuster, but short	texts  are  con-
	    verted  to	compressed GET requests which might be logged by proxies
	    etc.

     --submitPrompt (default Type or paste in some text to adjust)
	    What to say before the form allowing users to enter their  own  text
	    when submitPath is set (compare boxPrompt)

     --submitPromptTitle (default Upload Text)
	    The  title	of  the form allowing users to enter their own text when
	    submitPath is set

     --submitPromptAction (default Upload)
	    The button label for the form allowing users to enter their own text
	    when submitPath is set

     --identifyAdjusterOnUploadedText (default True)
	    Identify the Web Adjuster version at the bottom of the Uploaded Text
	    result (you might want to set this to False if you're publicly  run-
	    ning only a submitPath)

     --submitBookmarklet (default True)
	    If	submitPath and htmlFilter is set, and if browser Javascript sup-
	    port seems sufficient, then add one or more  'bookmarklets'  to  the
	    submitPath	page  (named after htmlFilterName if provided), allowing
	    the user to quickly upload text from other sites. This might be use-
	    ful if for some reason those sites cannot be made to go through  Web
	    Adjuster  directly.  The  bookmarklets should work on modern desktop
	    browsers and on iOS and Android; they should cope  with  frames  and
	    with  Javascript-driven  changes  to a page, and on some browsers an
	    option is provided to additionally place the page into a frameset so
	    that links to other pages on the same site can be  followed  without
	    explicitly	reactivating  the bookmarklet (but this does have disad-
	    vantages--page must be reloaded + URL display gets 'stuck'--so  it's
	    left to the user to choose).

     --submitBookmarkletFilterJS (default !c.nodeValue.match(/^[ -~\s]*$/))
	    A  Javascript  expression that evaluates true if a DOM text node 'c'
	    should be processed by the 'bookmarklet' Javascript when  submitPath
	    and  submitBookmarklet are set. To process all text, set this option
	    to c.nodeValue.length, but if your htmlFilter will not  change  cer-
	    tain  kinds  of text then you can make the Javascript run more effi-
	    ciently by not processing these (quote  the  expression  carefully).
	    The default setting will not process text that is all ASCII.

     --submitBookmarkletChunkSize (default 1024)
	    Specifies  the  approximate  number of characters at a time that the
	    'bookmarklet' Javascript will send to the server if  submitPath  and
	    submitBookmarklet  are  set.  Setting  this  too  high  could impair
	    browser responsiveness, but too low will be inefficient  with  band-
	    width and pages will take longer to finish.

     --submitBookmarkletDomain
	    If	set,  specifies  a  domain to which the 'bookmarklet' Javascript
	    should send its XMLHttpRequests, and ensures that they are sent over
	    HTTPS if the 'bookmarklet' is activated from an HTTPS page (this  is
	    needed  by	some  browsers	to prevent blocking the XMLHttpRequest).
	    submitBookmarkletDomain should be a domain for  which  the	adjuster
	    (or  an  identically-configured  copy)  can receive requests on both
	    HTTP and HTTPS, and which has a correctly-configured HTTPS front-end
	    with valid certificate.

     --letsEncryptWarning (default False)
	    Indicates that submitBookmarkletDomain (if set) has an HTTPS  server
	    that  uses	a certificate from LetsEncrypt, and we should warn users
	    of certain old browsers that they won't accept  it	by  default  now
	    LetsEncrypt's X3 expired at the end of September 2021

     --submitBookmarkletRemoveExistingRuby (default True)
	    Specifies  that  'bookmarklets'  added to the submitPath page should
	    remove all existing ruby on a page before running. Use this for  ex-
	    ample  if  you  expect  to replace the text with ruby of a different
	    kind of annotation.

Javascript execution options
     --js-interpreter
	    Execute Javascript on the server for  users  who  choose  "HTML-only
	    mode".  You  can  set  js_interpreter  to PhantomJS, HeadlessChrome,
	    HeadlessFirefox, Chrome, Firefox, or  edbrowse  (experimental),  and
	    must  have	the appropriate one installed, along with an appropriate
	    version of Selenium (and ChromeDriver or GeckoDriver if appropriate)
	    if not using edbrowse. Non-headless Chrome	or  Firefox  requires  a
	    display  (and might not respond to manual window close) but may help
	    work around bugs in some headless versions.  If  you  have	multiple
	    users,  beware logins etc may be shared! If a URL box cannot be dis-
	    played (no wildcard_dns and default_site is full,  or  processing  a
	    "real"  proxy request) then htmlonly_mode auto-activates when js_in-
	    terpreter is set, thus providing a way to  partially  Javascript-en-
	    able  browsers  like Lynx. If --viewsource is enabled then js_inter-
	    preter URLs may also be followed by .screenshot

     --js-upstream (default False)
	    Handle --headAppend, --bodyPrepend, --bodyAppend  and  --codeChanges
	    upstream  of  our  Javascript  interpreter	instead  of making these
	    changes as code is sent to the client, and make --staticDocs  avail-
	    able  to  our interpreter as well as to the client. This is for run-
	    ning experimental 'bookmarklets' etc with browsers like Lynx.

     --js-frames (default False)
	    When using js_interpreter, append the  content  of	all  frames  and
	    iframes  to the main document. This might help with bandwidth reduc-
	    tion and with sites that have complex cross-frame dependencies  that
	    can be broken by sending separate requests through the adjuster.

     --js-instances (default 1)
	    The  number  of  virtual  browsers to load when js_interpreter is in
	    use. Increasing it will take more RAM but may aid responsiveness  if
	    you're loading multiple sites at once.

     --js-429 (default True)
	    Return HTTP error 429 (too many requests) if js_interpreter queue is
	    too  long  at  page-prefetch time. When used with --multicore, addi-
	    tionally close to new requests any core that's currently  processing
	    its full share of js_instances.

     --js-restartAfter (default 10)
	    When js_interpreter is in use, restart each virtual browser after it
	    has  been used this many times (0=unlimited); might help work around
	    excessive RAM usage in PhantomJS v2.1.1. If you have  many	--js-in-
	    stances    (and    hardware   to   match)	you   could   also   try
	    --js-restartAfter=1 (restart after every  request)	to  work  around
	    runaway or unresponsive PhantomJS processes.

     --js-restartMins (default 10)
	    Restart  an  idle js_interpreter instance after about this number of
	    minutes (0=unlimited); use this to stop the  last-loaded  page  from
	    consuming  CPU  etc  indefinitely if no more requests arrive at that
	    instance. Not applicable when --js-restartAfter=1.

     --js-timeout1 (default 30)
	    When js_interpreter is in use, tell it to allow this number of  sec-
	    onds  for initial page load. More time is allowed for XMLHttpRequest
	    etc to finish (unless our client cuts the connection  in  the  mean-
	    time).

     --js-timeout2 (default 100)
	    When js_interpreter is in use, this value in seconds is treated as a
	    'hard  timeout':  if  a  webdriver	process  does not respond at all
	    within this time, it is assumed hung and emergency restarted.

     --js-retry (default True)
	    If a js_interpreter fails, restart it and try the same  fetch  again
	    while the remote client is still waiting

     --js-fallback (default X-Js-Fallback)
	    If	this  is  set  to  a non-empty string and a js_interpreter fails
	    (even after js_retry if set), serve the page without Javascript pro-
	    cessing instead of serving an error. The HTTP  header  specified  by
	    this  option  can  tell  the  client  whether  or not Javascript was
	    processed when a page is served.

     --js-reproxy (default True)
	    When js_interpreter is in use, have it send  its  upstream	requests
	    back through the adjuster on a different port. This allows js_inter-
	    preter to be used for POST forms, fixes its Referer headers when not
	    using real_proxy, monitors AJAX for early completion, prevents prob-
	    lems with file downloads, and enables the js_prefetch option.

     --js-prefetch (default True)
	    When  running  with js_reproxy, prefetch main pages to avoid holding
	    up a js_interpreter instance if the remote server is down. Turn this
	    off if you expect most remote servers to be up and you want  to  de-
	    tect js_429 issues earlier.

     --js-UA
	    Custom  user-agent	string	for js_interpreter requests, if for some
	    reason you don't want to  use  the	JS  browser's  default	(or  the
	    client's  if  js_reproxy  is  on and js_prefetch off). If you prefix
	    js_UA with a * then the * is removed and the  user-agent  string  is
	    set  by  the upstream proxy (--js_reproxy) so scripts running in the
	    JS browser itself will see its original user-agent.

     --js-images (default True)
	    When js_interpreter is in use, instruct it to fetch images just  for
	    the  benefit  of  Javascript  execution. Setting this to False saves
	    bandwidth but misses out image onload events.

     --js-size (default 1024x768)
	    The virtual screen dimensions of the browser when js_interpreter  is
	    in use (changing it might be useful for screenshots)

     --js-links (default True)
	    When js_interpreter is in use, handle some Javascript links via spe-
	    cial  suffixes  on	href  URLs. Turn this off if you don't mind such
	    links not working and you want to ensure URLs are  unchanged  modulo
	    domain-rewriting.

     --js-multiprocess (default True)
	    When  js_interpreter  is  in  use, handle the webdriver instances in
	    completely separate processes (not just separate threads)  when  the
	    multiprocessing  module  is available and working. Recommended: if a
	    webdriver instance gets 'stuck' in a way that somehow hangs its con-
	    trolling process, we can detect and restart it.

     --ssl-fork (default False)
	    (Unix only) Run SSL-helper proxies as separate processes to stop the
	    main event loop from being stalled by buggy SSL/TLS libraries.  This
	    costs  RAM,  but  adding  --multicore  too	will limit the number of
	    helpers to one per core instead  of  one  per  port,  so  --ssl-fork
	    --multicore is recommended if you want more js_interpreter instances
	    than cores.

Server control options
     --background (default False)
	    (Unix  only)  Fork	to  the  background  as  soon  as the server has
	    started. You might want to enable this if you  will  be  running  it
	    from crontab, to avoid long-running cron processes.

     --restart (default False)
	    (Unix only) Try to terminate any other process listening on our port
	    number  before  we	start.	Useful if Web Adjuster is running in the
	    background and you want to quickly restart it with new options. Note
	    that no check is made to make sure the other process is  a	copy  of
	    Web  Adjuster;  whatever it is, if it has our port open, it is asked
	    to stop.

     --stop (default False)
	    (Unix only) Like 'restart', but don't replace the other process  af-
	    ter stopping it. This option can be used to stop a background server
	    (if  it's  configured  with the same port number) without starting a
	    new one.

     --install (default False)
	    Try to install the program in the current user's Unix crontab as  an
	    @reboot  entry, unless it's already there. The arguments of the cron
	    entry will be the same  as	the  command  line,  with  no  directory
	    changes,  so  make	sure  you are in the home directory before doing
	    this. The program will continue to run normally after the  installa-
	    tion  attempt.  (If  you  are  on  Cygwin then you might need to run
	    cron-config also.)

     --pidfile
	    Write our process ID to this file when running in the background, so
	    you can set up a systemd service with Type=forking and  PIDFile=this
	    instead  of using crontab. (Alternatively use 'pip install sdnotify'
	    and run in the foreground with Type=notify.)

     --browser
	    The Web browser command to run. If this is set,  Web  Adjuster  will
	    run  the  specified  command (which is assumed to be a web browser),
	    and will exit when this browser exits. This is useful in conjunction
	    with --real_proxy to have a personal proxy run with the browser. You
	    still need to set the browser to use the proxy; this  can  sometimes
	    be done via browser command line or environment variables.

     --run  A  command	to  run that is not a browser. If set, Web Adjuster will
	    run the specified command and will restart it if it stops. The  com-
	    mand  will	be stopped when Web Adjuster is shut down. This could be
	    useful, for example, to run an upstream proxy.

     --runWait (default 1)
	    The number of seconds to wait before restarting the 'run' command if
	    it fails

Media conversion options
     --bitrate (default 0)
	    Audio bitrate for MP3 files, or 0 to leave them unchanged.	If  this
	    is	set  to  anything  other  than 0 then the 'lame' program must be
	    present. Bitrate is normally a multiple of 8. If your mobile  device
	    has a slow link, try 16 for speech.

     --askBitrate (default False)
	    If	True,  instead of recoding MP3 files unconditionally, try to add
	    links to "lo-fi" versions immediately after each  original	link  so
	    you have a choice.

     --pdftotext (default False)
	    If	True, add links to run PDF files through the 'pdftotext' program
	    (which must be present if this is set). A text link  will  be  added
	    just  after any PDF link that is found, so that you have a choice of
	    downloading PDF or text; note that pdftotext does not always  manage
	    to	extract  all text (you can use --pdfomit to specify URL patterns
	    that should not get text links). The htmlJson setting will	also  be
	    applied to the PDF link finder, and see also the guessCMS option.

     --pdfomit
	    A  comma-separated	list  of  regular  expressions which, if any are
	    found in a PDF link's URL, will result in a text link not being gen-
	    erated for that PDF link (although a conversion  can  still  be  at-
	    tempted  if  a  user  manually enters the modified URL). Use this to
	    avoid confusion for PDF files you know cannot be converted.

     --epubtotext (default False)
	    If True, add links to run EPUB files through  Calibre's  'ebook-con-
	    vert' program (which must be present), to produce a text-only option
	    (or  a MOBI option if a Kindle is in use). A text link will be added
	    just after any EPUB link that is found, so that you have a choice of
	    downloading EPUB or text. The htmlJson setting will also be  applied
	    to the EPUB link finder, and see also the guessCMS option.

     --epubtozip (default False)
	    If	True, add links to download EPUB files renamed to ZIP, as a con-
	    venience for platforms that don't have EPUB  readers  but  can  open
	    them  as  ZIP archives and display the XHTML files they contain. The
	    htmlJson setting will also be applied to the EPUB link  finder,  and
	    see also the guessCMS option.

     --guessCMS (default False)
	    If	True,  then  the pdftotext, epubtotext and epubtozip options at-
	    tempt to guess if a link is pointing to a PDF or  EPUB  file  via  a
	    Content  Management  System  (i.e.	the  URL does not end in .pdf or
	    .epub, but contains something like ?format=PDF)

     --pdfepubkeep (default 200)
	    Number of seconds to keep any generated  text  files  from	PDF  and
	    EPUB.  If this is 0, the files will be deleted immediately, but that
	    might be undesirable: if a mobile phone browser has a  timeout  that
	    takes  effect  before ebook-convert has finished (this can sometimes
	    be the case with Opera Mini for example), it might be best to  allow
	    the  user  to wait a short time and re-submit the request, this time
	    getting a cached response.

     --waitpage (default True)
	    If the browser seems to be an interactive one,  generate  a  'please
	    wait' page while converting PDF or EPUB files to text. Not effective
	    if pdfepubkeep is set too low.

Character rendering options
     --render (default False)
	    Whether to enable the character-set renderer. This functionality re-
	    quires  the  Python Imaging Library and suitable fonts. The settings
	    of htmlJson and leaveTags will also be applied to the renderer. Text
	    from computed Javascript writes might not be rendered as images.

     --renderFont
	    The font file to use for the character-set	renderer  (if  enabled).
	    This should be a font containing all the characters you want to ren-
	    der, and it should be in .TTF, .OTF or other Freetype-supported for-
	    mat (.PCF is sometimes possible if renderSize is set correctly, e.g.
	    16 for wenquanyi_12pt.pcf)

     --renderInvert (default False)
	    If	True,  the  character-set renderer (if enabled) will use a black
	    background. Useful when you are also adding a stylesheet with a dark
	    background.

     --renderSize (default 20)
	    The height (in pixels) to use for the character-set renderer  if  it
	    is enabled.

     --renderPath (default /@_)
	    The location on every adjusted website to put the character-set ren-
	    derer's images, if enabled. This must be made up of URL-safe charac-
	    ters  starting  with a / and should be a short path that is unlikely
	    to occur on normal websites.

     --renderFormat (default png)
	    The file format of the images to be  created  by  the  character-set
	    renderer if it is enabled, for example 'png' or 'jpeg'.

     --renderRange
	    The  lowest  and  highest  Unicode values to be given to the charac-
	    ter-set renderer if it is enabled. For example  3000:A6FF  for  most
	    Chinese  characters. Multiple ranges are allowed. Any characters not
	    in one of the ranges will be passed to the browser to render. If the
	    character-set renderer is enabled  without	renderRange  being  set,
	    then all text will be rendered to images.

     --renderOmit (default iPhone, iPad, Android, CrOS, Macintosh, Windows NT 6,
     Windows NT 10, Windows Phone OS, Lynx/2)
	    A  list of platforms that do not need the character-set renderer. If
	    any of these strings occur in the user-agent then the character  set
	    renderer  is  turned off even if it is otherwise enabled, on the as-
	    sumption that these platforms either have enough fonts  already,  or
	    wouldn't show the rendered images anyway.

     --renderOmitGoAway (default False)
	    If	set,  any  browsers that match renderOmit will not be allowed to
	    use the adjuster. This is for servers that are set to  do  character
	    rendering only and do not have enough bandwidth for people who don't
	    need this function and just want a proxy.

     --renderCheck
	    If	renderOmit does not apply to the browser, it might still be pos-
	    sible to check for native character-set support via Javascript. ren-
	    derCheck can be set to the	Unicode  value	of  a  character  to  be
	    checked  (try 802F for complete Chinese support); if the browser re-
	    ports its width differently from known  unprintable  characters,  we
	    assume it won't need our renderer.

     --renderNChar (default 1)
	    The  maximum number of characters per image to be given to the char-
	    acter-set renderer if it is enabled.  Keeping  this  low  means  the
	    browser  cache  is more likely to be able to re-use images, but some
	    browsers might struggle if there are too many separate images. Don't
	    worry about Unicode "combining diacritic" codes: any found	after  a
	    character  that  is  to be rendered will be included with it without
	    counting toward the renderNChar limit and without needing to  be  in
	    renderRange.

     --renderWidth (default 0)
	    The  maximum  pixel  width	of a 'word' when using the character-set
	    renderer. If you are rendering a language that uses space  to  sepa-
	    rate words, but are using only one or two characters per image, then
	    the  browser  might  split some words in the middle. Setting render-
	    Width to some value other than 0 can help to prevent this: any  word
	    narrower  than renderWidth will be enclosed in a nobr element. (This
	    will however be ineffective if your stylesheet overrides the  behav-
	    iour of nobr.) You should probably not set renderWidth if you intend
	    to render languages that do not separate words with spaces.

     --renderDebug (default False)
	    If the character-set renderer is having problems, try to insert com-
	    ments  in the HTML source to indicate why. The resulting HTML is not
	    guaranteed to be well-formed, but it might help you debug  a  misbe-
	    having  htmlFilter. This option may also insert comments in bad HTML
	    before the htmlFilter stage even when the renderer is turned off.

     --renderName (default Fonts)
	    A name for a switch that allows the user  to  toggle  character  set
	    rendering  on  and off from the browser (via a cookie and Javascript
	    links at the bottom of HTML pages); if set to the empty string  then
	    no	switch	is  displayed.	At  any rate none is displayed when ren-
	    derOmit applies.

Dynamic DNS options
     --ip-change-command
	    An optional script or other shell command  to  launch  whenever  the
	    public IP address changes. The new IP address will be added as a pa-
	    rameter;  ip_query_url must be set to make this work. The script can
	    for example update any  Dynamic  DNS  services  that  point  to  the
	    server.

     --ip-change-tries (default 1)
	    Number  of	times  to run ip_change_command if it returns failure (0
	    means unlimited, which is not recommended).  For  example,	you  can
	    have the script return failure if it doesn't get either an "Updated"
	    or	an  expected  "not  changed" response from a Dynamic DNS service
	    (but it is not advisable to expect a  host	lookup	to  reflect  the
	    change immediately)

     --ip-change-delay (default 5)
	    Number  of seconds to delay between tries of ip_change_command if it
	    fails

     --ip-query-url
	    URL that will return your current public IP address, as  a	line  of
	    text  with	no  markup added. Used for the ip_change_command option.
	    You can set up a URL by placing a CGI script  on  a  server  outside
	    your  network and having it do: echo Content-type: text/plain ; echo
	    ; echo $REMOTE_ADDR (but if you want your IPv4 address,  ensure  the
	    adjuster  machine and the outside server are not both configured for
	    IPv6). If you have a known static IP address but still want  to  run
	    an	ip_change_command for it, you can set ip_query_url to the static
	    IP address instead of a URL.

     --ip-query-url2
	    Optional additional URL that might sometimes return your  public  IP
	    address along with other information. This can for example be a sta-
	    tus  page  served by a local router (http://user:password@192.168...
	    is accepted, and if the password is the name  of  an  existing  file
	    then its contents are read instead). If set, the following behaviour
	    occurs:   Once   ip_check_interval	 has   passed	since  the  last
	    ip_query_url check, ip_query_url2 will be queried at an interval  of
	    ip_check_interval2	(which can be short), to check that the known IP
	    is still present in its response. Once the known  IP  is  no  longer
	    present,  ip_query_url  will  be queried again. This arrangement can
	    reduce  the  load  on  ip_query_url   while   allowing   a	 reduced
	    ip_check_interval  for faster response to IP changes, while not com-
	    pletely trusting the local router to report the correct  IP  at  all
	    times.  (If it's notoriously unleriable then it might be best not to
	    reduce ip_check_interval, in which case at least you'll get a faster
	    response once the initial ip_check_interval wait  has  passed  after
	    the previous IP change; this however might not be suitable if you're
	    behind a router that is frequently rebooting.) See also ip_query_ag-
	    gressive if the router might report an IP change before connectivity
	    is	restored.  You	may  also set ip_query_url2 to the special value
	    'upnp' if you want it to query a router via UPnP (miniupnpc  package
	    required).

     --ip-check-interval (default 8000)
	    Number   of   seconds   between   checks  of  ip_query_url	for  the
	    ip_change_command option

     --ip-check-interval2 (default 60)
	    Number of seconds between checks of ip_query_url2 (if set), for  the
	    ip_change_command option

     --ip-query-aggressive (default False)
	    If a query to ip_query_url fails with a connection error or similar,
	    keep  trying  again  until	we get a response. This is useful if the
	    most likely reason for the error is that our ISP is down: we want to
	    get the new IP just as soon as we're back online.  However,  if  the
	    error  is caused by a problem with ip_query_url itself then this op-
	    tion can lead to excessive traffic, so use with  caution.  (Log  en-
	    tries  are	written  when this option takes effect, and checking the
	    logs is advisable.)

     --ip-force-interval (default 604800)
	    Number of seconds before ip_change_command (if set) is run	even  if
	    there  was	no  IP	change. This is to let Dynamic DNS services know
	    that we are still around. Set to 0	to  disable  forced  updates  (a
	    forced update will occur on server startup anyway), otherwise an up-
	    date  will	occur  on  the next IP check after ip_force_interval has
	    elapsed.

     --pimote
	    Use an Energenie Pi-mote home  control  system  to	power-cycle  the
	    router  when  its  Internet  connection appears to be stuck in a bad
	    state. This option works only if Web  Adjuster  is	running  on  the
	    Raspberry  Pi  and	as a user in the "gpio" group. It must be set to
	    R,S,I,D where R is the internal IP address of your router, S is  the
	    domain  of	your  Internet	service provider (assumed to be quick to
	    look up), I is the IP provided by your router's  built-in  DNS  when
	    it's  having  trouble  (e.g. Post Office Broadband's AMG1302-derived
	    router responds with 219.87.158.116 which is presumably Zyxel's  of-
	    fice in Taiwan), and D is the Pi-mote device ID (1 to 4 or all) used
	    to	switch	it  off and on again. Power-cycling will be initiated if
	    two queries to the router's DNS for its ISP domain	either	fail  or
	    return internalResponse, and it's assumed router caching will let us
	    check status frequently without causing traffic.

Speedup options
     --useLXML (default False)
	    Use  the  LXML  library  for parsing HTML documents. This is usually
	    faster, but it can fail if your system does not have a good  instal-
	    lation  of LXML and its dependencies. Use of LXML libraries may also
	    result in more changes to all HTML markup: this should  be	harmless
	    for browsers, but beware when using options like bodyAppendGoesAfter
	    then  you  might  or might not be dealing with the original HTML de-
	    pending on which filters are switched on.

     --usepycurl (default True)
	    Use the pycurl library if a suitable version is  available	(setting
	    this  to  False  might  save  a  little  RAM  at  the expense of re-
	    mote-server tolerance)

     --renderBlocks (default False)
	    Treat all characters  rendered  by	the  character-set  renderer  as
	    "blocks"  that  are guaranteed to have the same dimensions (true for
	    example if you are using the renderer for Chinese characters  only).
	    This  is faster than checking words individually, but it may produce
	    misprints if given a range of characters whose dimensions do differ.

     --fasterServer
	    Address:port of another instance of Web Adjuster to which we forward
	    all traffic whenever it is available. When the other instance is not
	    available, traffic will be handled by this one. Use for  example  if
	    you  have  a slower always-on machine and a faster not-always-on ma-
	    chine and you want the slower machine to delegate to the faster  ma-
	    chine when available. See also ipTrustReal.

     --ipTrustReal
	    IP address of a machine that we trust, for example a machine that is
	    using  us as fasterServer. Any traffic coming from this machine with
	    an X-Real-Ip header will be logged as though it  originated  at  the
	    value  of  its  X-Real-Ip  header.	Setting  this  to  *  will cause
	    X-Real-Ip to be trusted from any connection.

     --trust-XForwardedFor (default False)
	    Like ipTrustReal but trusts X-Forwarded-For header from  any  IP  if
	    set  to  True  (use this in an environment where the adjuster can be
	    reached only via a load balancer etc)

     --fasterServerNew (default True)
	    If fasterServer is set, assume it is running Web Adjuster  v0.17  or
	    later  and	use a more lightweight method of checking its availabil-
	    ity. You might need to set this to False  if  for  some  reason  you
	    can't upgrade the fasterServer first.

     --machineName
	    A  name  for  the  current	machine to insert into the "Server" HTTP
	    header for adjusted requests, for example to let users know if  it's
	    your  faster  or  your  slower machine that's currently serving them
	    (although they'd need to inspect the headers to find out)

     --redirectFiles (default False)
	    If, when not functioning as a "real" HTTP proxy, a URL  is	received
	    that looks like it requires no processing on our part (e.g. an image
	    or	downloadable file that the user does not want converted), and if
	    this is confirmed via a HEAD request  to  the  remote  server,  then
	    redirect  the browser to fetch it directly and not via Web Adjuster.
	    This takes bandwidth off the adjuster server, and should mean faster
	    downloads, especially from sites that are better connected than  the
	    adjuster machine. However it might not work with sites that restrict
	    "deep  linking".  (As a precaution, the confirmatory HEAD request is
	    sent with a non-adjusted Referer header to simulate what the browser
	    would send if fetching directly. If this results in an HTML "Referer
	    denied" message then Web Adjuster will proxy the request in the nor-
	    mal way. This precaution might not detect all means of  deep-linking
	    denial though.)

     --upstream-guard (default True)
	    Modify scripts and cookies sent by upstream sites so they do not re-
	    fer  to the cookie names that our own scripts use. This is useful if
	    you chain together multiple instances of Web Adjuster, such  as  for
	    testing another installation without coming out of your usual proxy.
	    If	however  you  know that this instance will not be pointed to an-
	    other, you can set upstream_guard to False to save some processing.

     --skipLinkCheck
	    Comma-separated list of regular expressions specifying URLs to which
	    we won't try to add or modify links for the  pdftotext,  epubtotext,
	    epubtozip,	askBitrate  or	mailtoPath  options. This processing can
	    take some time on large index pages with thousands of links; if  you
	    know  that none of them are PDF, EPUB, MP3 or email links, or if you
	    don't mind not processing any that are, then it saves time	to  skip
	    this step for those pages.

     --extensions
	    Name  of  a custom Python module to load to handle certain requests;
	    this might be  more  efficient  than  setting  up  a  separate  Tor-
	    nado-based	server.  The  module's	handle() function will be called
	    with the URL and RequestHandler instance as  arguments,  and  should
	    return True if it processed the request, but anyway it should return
	    as	fast  as  possible. This module does not take priority over for-
	    warding the request to fasterServer.

     --loadBalancer (default False)
	    Set this to True if you have a default_site set and you  are  behind
	    any  kind  of  "load balancer" that works by issuing a GET / with no
	    browser string. This option will  detect  such  requests  and  avoid
	    passing them to the remote site.

     --multicore (default False)
	    (Linux  and  BSD)  On multi-core CPUs, fork enough processes for all
	    cores to participate in handling incoming requests.  This  increases
	    RAM  usage,  but can help with high-load situations. Disabled on Mac
	    due to unreliability (other cores can still be used  for  htmlFilter
	    etc)

     --num-cores (default 0)
	    Set the number of CPU cores for the multicore option (0 for auto-de-
	    tect)

     --internalPort (default 0)
	    The  first port number to use for internal purposes when ssl_fork is
	    in effect. Internal ports needed by  real_proxy  (for  SSL/TLS)  and
	    js_reproxy are normally allocated from the ephemeral port range, but
	    if	ssl_fork  delegates  to  independent processes then some of them
	    need to be at known numbers. The default of 0 means one higher  than
	    'port';  several unused ports may be needed starting at this number.
	    If your Tornado is modern enough to support reuse_port then you  can
	    have  multiple  Adjuster  instances listening on the same port (e.g.
	    for one_request_only) provided they have different internalPort set-
	    tings when run with ssl_fork.  Note  however  that	the  --stop  and
	    --restart  options	will not distinguish between different internal-
	    Port settings, only 'port'.

     --fixed-ports (default False)
	    Do not allocate ports (even internal ports) from the ephemeral  port
	    range  even  when this is otherwise possible. This option might help
	    if you are firewalling your loopback interface  and  want  to  write
	    specific  exceptions (although that still won't work if you're using
	    js_interpreter=HeadlessChrome  or  similar	which  opens   its   own
	    ephemeral  ports as well: use containers if you're concerned). Fixed
	    ports may result in failures if internal ports are already taken.

     --compress-responses (default True)
	    Use gzip to compress responses for clients that  indicate  they  are
	    compatible	with  it. You may want to turn this off if your server's
	    CPU is more important than your network bandwidth (e.g.  browser  on
	    same machine).

Logging options
     --profile (default 0)
	    Log timing statistics every N seconds (only when not idle)

     --profile-lines (default 5)
	    Number of lines to log when profile option is in use (not applicable
	    if using --multicore)

     --renderLog (default False)
	    Whether  or  not  to log requests for character-set renderer images.
	    Note that this can generate a lot of log entries on some pages.

     --logUnsupported (default False)
	    Whether or not to log attempts at requests	using  unsupported  HTTP
	    methods.  Note  that  this can sometimes generate nearly as many log
	    entries as renderLog if some browser (or malware) tries to do WebDAV
	    PROPFIND requests on each of the images.

     --logRedirectFiles (default True)
	    Whether or not to log requests that result in the browser being sim-
	    ply redirected to the original site when the redirectFiles option is
	    on.

     --ipNoLog
	    A comma-separated list of IP addresses which can  use  the	adjuster
	    without  being logged. If your network has a "friendly probing" ser-
	    vice then you might want to use this to stop it filling up the logs.
	    (Any tracebacks it causes will still be logged however.)

     --squashLogs (default True)
	    Try to remove some duplicate information from  consecutive	log  en-
	    tries,  to	make logs easier to check. You might want to set this to
	    False if you plan to use automatic search tools on	the  logs.  Cur-
	    rently  not  supported with multicore, and will automatically be set
	    to False if multicore is enabled.

     --errorHTML (default Adjuster error has been logged)
	    What to say when an uncaught exception (due to a misconfiguration or
	    programming error) has been logged. HTML markup is allowed	in  this
	    message.  If  for  some  reason  you  have trouble accessing the log
	    files, the traceback can usually be included in the page  itself  by
	    placing {traceback} in the message.

     --logDebug (default False)
	    Write debugging messages (to standard error if in the foreground, or
	    to	the  logs if in the background). Use as an alternative to --log-
	    ging=debug if you don't also want debug messages from other  Tornado
	    modules.  On Unix you may also toggle this at runtime by sending SI-
	    GUSR1 to the process(es).

     Tornado-provided logging options are not listed above  because  they  might
     vary  across  Tornado versions; run python adjuster.py --help to see a full
     list  of  the  ones  available  on  your  setup.  They  typically	 include
     log_file_max_size, log_file_num_backups, log_file_prefix and log_to_stderr.

Silas S. Brown			   April 2026			     ADJUSTER(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=adjuster&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help