Here are some changes introduced by recent versions of edbrowse.

3.8.17

Fix some makefile issues, and warnings across different compilers.

Support custom Elements and the CustomElementRegistry.

Make html parsing more efficient, so it isn't quadratic in a file
containing thousands of hyperlinks, which is not unusual.

Customize the text decorationmarkup symbols in your config file.
tdmarks = **+@__~~

Support aria heading attributes:
role=heading aria-level=1 presents like h1

replace the earlier deminimizer, which has become out of date, with
https://github.com/beautifier/js-beautify

Basic support for javascript modules.

3.8.16

Use strict js in shared.js and startwindow.js

Append .html or .txt after running a rendering plugin.

Put standard plugins in the plugins directory, for the user.

Optimize the performance of the http cache.

the a:text c:text and i:text commands.

Expand variables in the prompt string.

Support placing the edbrowse config file at $XDG_CONFIG_HOME/edbrowse/ebrc.
We still fall back to $HOME/.ebrc if it's not there and use $HOME/.ebrc to
create the initial file.

include = relative-path now taken relative to the invoking config file,
like cpp and m4 and everything else in unix.
include = directory, include all files in that directory.

Download css files in parallel. Like the javascript files.
Subject to the jsbg flag.

More secure handling of temp files; there's no need to manually add the sticky
bit to a custom directory any more.

Mutation observers call their functions as microtasks.

Run html scripts (not deferred or async) when you see them, not after browse.

Implement some of the css shorthand properties, such as margin.

Transliterate <em>, and other tags, into concise punctuation
that indicates the meaning of the tag.

Implement <details> open and close.

3.8.15

The lsr (imap) and lsc (irc) commands.

Migrate from quickjs to quickjs-ng.
The latter is preferred by most distributions, but we support both.
Use flags at build time to switch between the two. See README.

Rerender quickly after browse then throttle back to the rr_interval.

3.8.14

ls commands in envelope mode, or when reading an email.

Fix bug in imap download of large emails.

Support for the icloud imap server,
which implements a stricter adherence to the standard syntax.

Indicate an incoming private irc message with *, so you can respond in kind.

3.8.13

in imap standalone, n does not run off the end of the folder,
just as p does not back up off the end of the folder.

Support for gophers://

Support for .netrc through curl.

IRC actions.   /me

Mail forwarding.

mass global delete move copy in imap.
Send one command with the list of uids to the imap server instead of many.

Fix core dump due to a change in quickjs implementation of Promise jobs,
that took place on 06/28/2025.
This version of edbrowse now requires quickjs at or beyond this date.

Suppress many gcc warnings.

3.8.12

Make adjustments as quickjs evolves. Resolve build issues.

3.8.11

uc lc mc are internationalized, up to unicode 0xff.

Put explanatory files in the history directory.

    i? shows the url of the submit button.

Fix extremely rare race condition in caching.

$EB_SESSION, and set these whenever $(:X) is expanded.

Fix gopher search

commands: sss, test, p stuff.

3.8.10

toString shows the correct object classes.

Simplistic simulation of IntersectionObserver and ResizeObserver.

document is an instance of Document, as it should be.

e !command

Intl: just English and just date and numbers.

Use third party software for Headers, Request, Response, fetch.

EBCIPHERS passed to the ssl engine.

edbrowse variables and/or variables in the environment.

Print strerror values when certain system calls fail.

l and L link commands in directory mode.

3.8.9

dx to specify hard delete in imap folders.

Integrate imap into edbrowse. Emails and envelopes are held in the buffers.

g.suffix,  much like b.suffix, indicate a plugin as you go.

Improved JOIN, PART, and QUIT messages in irc.

Complete the Polish and Russian messages.

irc autolog.

3.8.8

Read and write blocks of text amongst the buffers on the current stack.
.w+1@'c     r-1@'a,'b

Allow mail client noninteractive, i.e. from a batch job.

bflist/ and bflist?
hist/ and hist?
up/ and down/
bw/ bw? and bw#

dld= command to preset the download filename, for scripting purposes

imask= to restrict imap folders presented.
isub= to lop off a substring from imap folders.

P to toggle and set prompt, like ed.

emoji combos in the config file

b.pdf renders the current buffer by the pdf converter.
%p in a plugin is an interactive parameter.

3.8.7

W !shell_command   reads the data back into the buffer

local command reads pages from cache.

Recover from an imap disconect and reconnect.

<7 to run the commands in session 7. at syntax is supported.

The [erwq<][/?] commands.
The read write and < commands support the at syntax.

Resurrect the apostrophe macros, but in a safe way.

3.8.6

Support tls sockets, and the lst command for irc.

html template element.

Go up and down in the history of the current edbrowse session.
Move / copy files to other directories in the history.

Automatically parse xml files received through xhr. Slight differences from html.

Messages in Spanish.

clean up download threads before we free the tags that own them.

move delete and expunge in a manner that should work with all imap servers.

3.8.5

s/x/y/$ command, and s$ shorthand.
s/x/y/3g, from 3 on, like sed.

J: command to inject other separators between joined lines.

flow command to use format=flowed in outgoing mail.

FormData, from a third party.
TextDecoder, from a third party.

Read files in chunks, saves memory while reading, and could support
large files, although those are rather impractical in a text editor.
That's why they invented sed, awk, perl, etc.

Edbrowse as an irc client.

a c or i commands in scripts.

<audio>, and the Audio object with the play method.

img command to download images.

+commands on the arg list, to run edbrowse commands from the shell command line.
Other editors do this.

3.8.4

dno (names only) command.

Manage merged cells via colspan and rowspan in data tables.

Search for the quickjs pending jobs queue ourselves,
so we don't have to patch the quickjs source.
We could link to a distributed quickjs shared library if one was available.

3.8.3

Offer the plain text version of an email via the t command.
It is often unhelpful, and sometimes not there at all.

The unfold row (ur) command in database mode. Use this to update individual fields.

Write our own html tag scanner, and divest from tidy, which use to do this work for us.

The ebre, edbrowse modified regular expressions, command.  (toggle)

format=flowed, and content-disposition, in emails.

mass delete, join, and read, more efficient versions of global commands.
Mass substitute across a range of lines when s injects newline into the string.
Mass delete in directory mode.

e+ and e- and enum commands.

<a href=data:blah> protocol.

scp and ftp uploads via the w command, and other uploads when curl supports the transfer protocol.

Textarea can be treated like a text input field if you can keep all the text on one line.

js = website (in config file)
This is the inverse of nojs = website

3.8.2.1

Make the makefile process more portable and more flexible for packagers and individuals.

3.8.2

Support for emojis.

Changes to edbrowse settings are restored when a function returns.

Environment variables in .ebrc pathnames.

frames as a live array of window objects.

"include" directive in the config file.

Replace the apostrophe macros with shell environment variables.
EB_DOT instead of '. etc.

f suffix to forget the entered search and replacement strings.

3.8.1

Make several changes so that edbrowse is more like ed,
allowing more commands under g/re/,
and 'a,'bw !shellcommand, etc.

'a,'bw7@21  to inject text from one buffer into another.
r7@'a,'b to  pull text from one buffer into another.
Known as the at syntax.

/xyz/! search for line that doesn't contain xyz, like sed.

Undo command in browse or directory mode if substituting on a single line.

Go to a file by its filename, in text mode.  Just as you can go to an inline url.

Use the proper HTML*Element classes in js.

Allow for to, cc, bcc, or attach in a mail descriptor.

User can change the format of the imap envelope, which fields to print and in what order.

Support email>name in the addressbook, wherein name is sent in the outgoing email.

A partial implementation of cross origin resource sharing.

Poll for pending jobs and run them. These usually come from Promise.

Implementation of MessagePort and MessageChannel, third party,
though considerably modified for our purposes.

Implementation of postMessage.

Allow the user to set the separator between selected options.

enctype=text/plain, <svg>, <optgroup>, upload multiple files,  div.onclick,
required fields, <input type=submit formattributes>, <datalist>

Move blob code and a lot of our DOM functions into shared space.

URLSearchParams, third party.

speed= and tmlist commands, for debugging timers.

upgrade from pcre1 to pcre2

3.8.0

Experiment with Spider Monkey js, make edbrowsesm
I have no idea how to do cross compartment access, as in frames,
so this didn't get very far.

Switch from duktape js to quick js.

Create subordinate objects like the style object on-demand,
instead of making them part of every node automatically.
This should cut down on object proliferation.

Extend show columns (shc) command to html tables in browse mode.
This was originally a database command, and still is.

unfold row (ur) command for a row in a table in html.
This should be extended to database mode, it's actually more valuable there,
since tables can be arbitrarily wide and do not wrap.

Previous (p) command in imap.
Go (g) command in imap, go to an email, same as space.

3.7.7

Fix a potential security hole, where one website can bleed into another. Worth making a release just for this.

Move or copy files from one directory to another.

imap can fetch the earliest emails, rather than the most recent.

3.7.6

colors command to show the colors of the web page.

^C for 45 seconds causes a hard interrupt,
spawn a new interactive thread and kill the current thread,
kinda drastic but better than being locked out completely.

If a timer runs an async script after browse,
it loads the js file in the background so you can keep working,
then when the script is loaded it runs on a future timer.
Under the control of the jsbg command.

Asynchronous xhr, also controled by jsbg.
Like the above, it loads the file in background and resumes
execution on a future timer when the file is loaded.

agentsite in .ebrc to use different agents on different websites.

input.validity object.
Only valueMissing is implemented.

fu command prints the file's url.

Internationalized help command.

3.7.5.1

Search function on gopher.

Use threads to download files in the background and in parallel, instead of processes.

Get the windows port working again; it hasn't worked for a while.
It didn't work because of fork; now that we are threaded it can comne back to life.
That by itself seems worth releasing a mini-version.

3.7.5:

ib command to allocate input buffers for textareas.

fll command to set the format line length. fll 80+ to allow a little overflow past 80 columns.

Convert dos \r\n newlines to simple \n.
This always happened in the dos world, now it happens in unix too.
Writing the same file back out converts newlines back.
It can be controlled by the iu command.
This follows the model of iso8859-1 to and from utf8.

Download javascript files in parallel and in background, experimental. Toggle with jsbg command. Works with openssl but not gnutls.

trace and breakpoints in the deminimized local javascript files.

snapshot() function to build a local copy of a website for debugging.

Don't include the (substantial) deminimization code unless EBDEMIN is set.

3.7.4:

Install man page and other documentation.

Search for regular expressions with or without wrap.

A uniform and consistent approach to toggle commands:
foo (toggle), foo+ (enable), foo- (disable).

Show or hide all the messages that are produced by hovering over things,
or injected by css :before {content:foo}

The g- command, go but don't browse.

The & command backs up through intrapage jumps, just as they ^ command backs up through pages on the stack.

Imap client uses copy and delete if the server does not support the MOVE command.
Bulk move or delete from one imap folder to another.
Create, delete, and rename imap folders.

Start using the acid tests to exercise edbrowse.

3.7.3:

Show heading information h1 through h6.

Specify a different config file on the command line.

Rewrite the css parser and querySelectorAll machinery in C for efficiency and flexibility.

Support for gopher.

A more flexible plugin system that supports arbitrary protocols,
not just the ones known to edbrowse.
This can be used to access zip archives and many other structures.

Edbrowse messages in Italian.

-b option causes command line arguments to browse or play.

A better diff algorithm to report which lines have changed.

3.7.2:

Keep third party open source javascript routines in a separate file third.js.
Licenses are included in that file.

Deminimize javascript, so line numbers in error messages
actually convey useful information. The demin command toggles this feature.
Third party software, in third.js, performs the deminimization.

Disable javascript timers via the timers command, only for debugging.

Compile some js functions once in the master window,
and reference them from all the other windows.
This saves time and space.

If an argument is <func then edbrowse runs that function, rather than reading in a file or url.

Sort directory entries by file size or mod time or locale alphabetical (the default).

Run some edbrowse commands in the javascript debugger, particularly e number to switch to another session.

Write our own cssGather and querySelectorAll routines,
since the jotform routines don't seem to meet our needs.

Convert javascript or css files from utf16 or utf32 into utf8 before processing.

3.7.1:

Automatically expand a frame when javascript tries to access its objects.
Otherwise it won't expand until you expand it explicitly.
This saves resources; don't fetch and expand a frame unless it is needed.

^c interrupts javascript, if that javascript calls our native methods. It also interrupts http fetch.
Hit ^c if the browsing is taking too darn long - however - the page may not render properly or completely.
Don't do this if you are using this page for ecommerce or something vital.

Keep edbrowse in 1 process. Don't fork a javascript process to make all the js calls.
There are many technical reasons why 1 process is a better design.

The keyword jspool is no longer used in the .ebrc config file.  This
was needed for Mozilla JS, but it is not needed for Duktape.

Gather keyword value pairs from <style> tags and css files and apply them to the corresponding javascript objects.
Implement getComputedStyle().

3.7.0:

Switch from Mozilla js to Duktape js.

Mask password fields on input forms with stars, as other browsers do.
Issue the ipass command to enter a password without echo.

Curl authorization negotiations enabled or disabled via the can toggle command.
This is a workaround for problems with NTLM.

Parallel instances of edbrowse don't clobber each other's cookies when they exit and write the common cookie jar.
See mergeCookies() in cookies.c.
curl does not become active until you need it.

Environment variable JSGC forces duktape garbage collection after every script.
Environment variable JS1 keeps edbrowse and js in one process.
These are for development and testing, and could go away.

Clean up compiler warnings so we can use the -Wall flag.

3.6.3:

Maintain a cache of http files.
Provides faster access to websites that are visited often.
Cache directory and size can be set in the config file, but the defaults are reasonable.

Use a substring of the url to determine a mime type, not just the suffix.
This is primarily for youtube videos, which can play as a stream, but have no obvious protocol or suffix to key on.
urlmatch = youtube.com/watch?|youtube.com/embed/
Currently a substring, may become a regexp later.

g? prints the url for the link instead of going to it. You can look before you leap.
Also g2? g$? etc.

i* on a textarea <buffer 7> goes to that editing session, in this case equivalent to e7.
This is convenient for scripting, since you don't know ahead of time which buffer will be allocated for this purpose.

The M (move) command does not require a destination session; edbrowse finds an empty session for you.

Represent multiple frames in one edbrowse window. Each has its own javascript world.
At this point the worlds do not interact.
You can expand and contract frames by the exp and ctr commands.

3.6.2:

Read and convert utf16 and utf32 as per the byte order mark.
convert such files to utf8 or iso8859-1 as per the console setting,
though the latter is deprecated.
Convert back only if writing back out to the same file.

Enter high unicodes by the string ~u....;
where the dots are hex digits and the semi is optional.

New "buffer list" command (bflist)  to get a list of buffers and filenames.

Read the attachment filename from the http content-disposition header and set the current filename accordingly.
The url could be replaced with foobar.zip, but that's what the web designer wanted.

If a file has a recognized suffix, with a stream plugin,
then typing g on a link within that file invokes the same plugin.
This is primarily used for .pls files, which are playlists,
and each URL therein is intended for a music player.
Other browsers seem to work this way.

3.6.1:

Merge edbrowse and edbrowse-js back into one executable image.
More convenient for distribution.
The --mode argument determines the action of the process.
Example edbrowse --mode js to run as the js engine.

Simple implementation of xhr under javascript, synchronous only.

Don't encode urls that have already been encoded via <A href=url>.
The second encoding is mostly harmless, except for + becoming %2b.

Turn on or off the progress dots during an http or ftp download,
or receive progress counts by megabyte.

Create the edbrowse temp dir at the outset, and user directories
beneath this directory, mod 700, for added security in a multiuser system.
Temp files for plugins are created beneath the user directories.

Reload the config file on command. No need to exit and restart.

~0 in an edbrowse function is the whole line, even if more than 9 arguments.

db>filename to redirect debugging output to a file.

3.6.0.1:

Bug fixes.
Most importantly, fixed a buffer overflow in sprintf.

3.6.0:

Edbrowse is an imap client. Scan and search through folders,
delete move or download emails, pull down attachments.

Use the tidy5 library to parse html and create a tree of nodes.
Render the text buffer based on this tree of nodes,
rather than the original html text.
Rerender the tree after it has been changed by javascript,
or via the rr command,
and report any differences, i.e. what has javascript changed?

Implement javascript timers and intervals.
These run asynchronously in the background.

Various ls commands in directory mode print the size,
mod time, and permissions of the file on the current line.
Set ls=lt to list the length and time of all the files in subsequent
directory scans. See documentation for more.

Port edbrowse to windows, with small modifications.

Set up cmake scripts so that cmake can be used to build edbrowse
on windows or on linux.
Traditional make is still available from the src directory.

Use cmake to build edbrowse under MacPorts, thus available under OSX.

Enhance the DOM sufficient to compile a jQuery object <= 1.9.1.
This is the first step along the path to full jQuery support.

Add an interactive javascript / DOM debugger.
Type jdb to enter this debugging mode, and period to exit.

Create a default .ebrc file if none is found.
This is just a template, the user is encouraged to personalize the file.
The default .ebrc file is in the user's language for supported languages.

Move all the language files, (ebrc files and message strings),
to per-language files in the lang directory.
perl programs map these into strings in the C source.

Support http only cookies.

3.5.4.2:

Limited and preliminary imap access. Envelopes only.
Messages can be moved or deleted, but not read or downloaded.

We no longer downgrade to SSL v3 on failure to use newer versions of SSL.

Edbrowse now warns if you try to quit with a modified buffer that has
no associated filename.  This is consistent with ed and most other editors.

3.5.4.1:

Fix a couple of bugs related to downloading files from the internet.

3.5.4:

Messages in German, thanks to Sebastian Humenda.
Autoplay of audio files found on websites, using content-type,
and autoplay of audio files from directory mode.
Use a plugin to convert pdf to html, or any other conversion you wish.
Autoconvert such files as you encounter them via the g command.
directory listing sorted by locale, like/bin/ls.
Automatically include references when replying to an email, re or rea commands,
so it threads properly.

3.5.3:

Write a separate process, edbrowse-js, to handle all the javascript objects.
This process and only this process interacts with the js library,
be it mozilla or v8 or whatever.
Edbrowse implements the document object model at a higher level,
and communicates with edbrowse-js for the corresponding javascript objects.

Allow users to download large binary files in the background, and straight to disk.
Useful for computers with limited memory but plenty of disk.

3.5.2:

The blacklist feature is now gone.
It wasn't really used,
as there are more effective ways to fight spam these days.
Also, there was the possibility that reading an empty blacklist file could
lead to a crash.

This release contains a few additional minor bugfixes, the most significant
of which involved the rendering preformatted sections when browsing html.

3.5.1:

Mozilla javascript version 2.4 and above supports only a C++ interface,
so if we want to keep using moz js, then we must follow along.
Edbrowse 3.5.1 converts the javascript layer from C to C++.
These are the files jsdom.cpp, jsloc.cpp, and html.cpp (use to be .c).
Other files may convert to C++ in the future.
Use the curl library to send and receive mail.
This replaces home-grown pop3 and smtp software.

3.4.10:

Polish translations, courtesy of Wojciech Gac.

3.4.9:

Various bug fixes.

3.4.8:

* Edbrowse now requires version 1.8.5 (or higher) of Spidermonkey.
* When completing filenames with readline, a trailing space is no longer added.
* Updated French translation of the User's Guide, thanks to Erwin Bliesenick.
* Edbrowse now supports localized HTTP responses; see the User's Guide.
* In the Edbrowse scripting language, function names are now
  case-insensitive.

3.4.7:

memcpy and strcpy are no longer called on overlapping regions.
Files with unknown length, such as those under /proc, are now readable.
Miscellaneous fixes.

3.4.6:

Fix file corruption bug for large files with more than a million lines.

3.4.5:

Dot stuffing in emails.
Support for readline() on input.
Support for proxies through .ebrc or the environment.

3.4.4:

Fixed a cookie bug; tail matching never took place.
Thus a cookie would never propagate to a subdomain.  Bad news.

3.4.3:

Hotmail smtp protocol.    outport = ^587
Minor tweaks for compilation under OS X.

3.4.1:

Access to databases through odbc.
Modify rows in a table by using the edit commands you already know.
Be careful; delete means delete!

3.3.4:

Convert between iso8859-1 and utf8 on the fly, according to the contents
of the file and the value of $LANG.
This takes place automatically as files are read and written;
the user shouldn't notice a thing.

3.3.3:

New reply feature, maintains the thread for discussion lists.
Move docs to a doc directory, and source to an src directory.
Fix some utf8 bugs.

3.3.2:

Supports reading of pdf files by calling the utility pdftohtml.
http://rpmfind.net/linux/RPM/suse/updates/10.0/i386/rpm/i586/pdftohtml-0.36-130.9.i586.html
Also brings in email over ssl.
Secure smtp implies auth login;
no other authentication method is implemented at this time.

3.3.1:

The error and output messages of edbrowse have been internationalized.
Set LANG= to specify the language.
At present, LANG=en and LANG=fr are supported.  (English and French)

3.2.1:

This version introduces sql database access,
through Informix esql (tested) and odbc (not tested).
Access a table in the database just as you would access a file.
Inserts, updates, and deletes are applied to the database,
as they take place in your local buffer.
It's almost wysiwyg.
And it's dangerous.
If you delete a row, there is no undo, so be careful.

3.1.3:

Edbrowse can now fetch and execute a local javascript file,
as in  <script src=LocalFileName.js>
from within a local html file that you are browsing.
This is primarily used by people who build and debug websites, like me.
It is also handy if you have downloaded your own private copy
of a website, and it uses javascript.

3.1.2:

Files (other than text or html) are processed according
to their mime type, which is fancy internet jargon for their file extension.
It's not rocket science - file.mp3 is sent to an mp3 player,
file.wav is sent to a wave player, and so on.
See the docs for more details.

3.1.1:

Version 2 used my own, home-grown javascript engine.
This version, version 3 and beyond, uses an open source js engine,
known as Spider Monkey Javascript, or smjs.
Needless to say, theirs is better than mine.
It's something I should not try to reinvent.
As you might imagine,
many websites will run properly on version 3, but not on version 2.
This is a substantial change to the program,
hence the jump in major version number.

2.2.10:

This is the latest version with my home-grown javascript engine.
If you don't have access to smjs, or you just want to get it up and running
quickly, to see if you like it, you can use 2.2.10.

1.5.17:

This is the latest perl version.
It has no javascript support, nor does it handle edbrowse scripts,
but it is completely portable, and runs on Windows, Mac, etc.
This is the easiest way to take edbrowse out for a spin, to see if you like it.

