What each AtlasEye version changed, newest first. This is the changelog the in-app Settings → Updates panel links to.
1.2.362
security
latest
2026-10-21 15:28
A reminder mail before your licence ends. The licence server now emails you 30 days and again 7 days before your licence ends, with the licence key, the end date and what to do next: choose a plan at the end of a trial, check the payment method of a yearly subscription, or contact us to renew. Monthly subscriptions renew themselves and get no reminder. This comes with an update of the licence portal, not with a release of AtlasEye.
Signing out forgets what your account had loaded. When someone signed in on the same browser tab after you signed out, AtlasEye could show them pages with your account's data, such as the user list, devices or settings, for up to five minutes. Signing out now empties that memory, even when the sign-out request itself fails.
NIS2 deadlines reach you wherever you get alerts. Each report a NIS2-reportable incident owes its CSIRT now raises an alert on the Alerts page and the bell, and on every active email, Telegram and webhook channel, in that channel's language: 6 hours before the early warning is due, 12 hours before the incident notification and 7 days before the final report, and again once a deadline passes unfiled. Marking the stage as filed closes its alert. The alerts go to your own channels, never to a CSIRT.
You choose which other Member States get a copy. While cross-border impact is on, Email to CSIRT offers each affected Member State for a copy, none ticked: the CSIRT of your own country always gets the report, and the directive has it inform the other states. The email is easier to check: it names the stage in words, the incident's title and the other affected states, carries a severity badge that follows the incident, and gives the SHA-256 of the attached file. A copy keeps the file name of your country's report.
Security update for a bundled library. AtlasEye now ships certifi 2026.10.19, the list of root certificate authorities its Python services trust for HTTPS connections. It removes one of them, eMudhra's emSign ECC Root CA - G3: the private keys of eight certificate authorities under it were compromised, so anyone holding one could issue a certificate for any website (advisory GHSA-6q48-6c7w-9gw2). A server whose certificate depends on that authority now fails the certificate check; every other connection works as before.
Alerts about the AtlasEye host arrive while no licence is active. Without an active licence, alerts about AtlasEye's own host, such as a disk filling up or the API not answering, never reached your email, Telegram or webhook channels, while alerts about your devices did. Both now arrive.
1.2.361
minor
2026-10-20 10:14
1.2.360
minor
2026-10-19 21:45
1.2.359
minor
2026-10-19 04:41
sudo atlaseye web-port. AtlasEye then puts the old ports back by
itself unless someone opens the new address and presses Keep these ports
within 5 minutes. The card says when the address users open needs
sudo atlaseye url set https://NAME:PORT, with the name already in it. It
also says what else the move changes: before it, the single sign-on
callback to allow at your identity provider, and that Service Manager
agents need setting up again; after it, the Public App URL to change in
Settings β General, because links in notifications use it.sudo atlaseye web-port --https 8443, single sign-on now gives your
identity provider the callback address with that port,
https://NAME:8443/api/v1/auth/oidc/callback, and brings users back to
the same address and port after they sign in. Allow that callback in your
identity provider. An install on 443 sends the same callback as before,
so nothing changes in its identity provider. The server name in the
callback no longer comes from a header that a client can add. If a proxy
in front of AtlasEye replaces the server name and passes the original one
only in its own X-Forwarded-Host header, set OIDC_REDIRECT_URI in
.env to the public callback address, then run
sudo atlaseye compose up -d --no-deps --force-recreate api.sudo atlaseye web-port --https 8443 --http 8080, a Service
Manager agent you set up is given the address with that port:
https://NAME:8443, or http://NAME:8080 while AtlasEye still uses its
self-signed certificate. Before, it was given port 443 or 80, where
another web server may answer, and the agent sent its credential there.
The links in the status page's Atom feed keep the port too. Agents set
up earlier keep the address they were given: where it no longer reaches
AtlasEye, set them up again. An install on ports 80 and 443 gives the
same addresses and links as before. A cache in front of AtlasEye must
key its copies on the Host header.sudo atlaseye web-port --https 8443, the setup
checks now show a warning, because links in notifications would still
lead to the old port. Change the Public App URL in Settings β General to
the new address. When users reach AtlasEye on the port it names, through
NAT or a proxy, select Acknowledge instead. sudo atlaseye web-port and
sudo atlaseye url set now end with what still names the previous
address: the Public App URL, the single sign-on callback to allow in your
identity provider, Web Analytics snippets already pasted into websites,
and Service Manager agents to set up again. When .env sets
OIDC_REDIRECT_URI or AGENT_CALLBACK_BASE_URL, they name that address
too. Behind a proxy that replaces the server name, set
OIDC_REDIRECT_URI to the public callback address and
AGENT_CALLBACK_BASE_URL to the public address, then run
sudo atlaseye compose up -d --no-deps --force-recreate api. On an
install set up without an address, web-port no longer tells users to
open https://localhost:8443/.1.2.358
minor
2026-10-18 23:08
AtlasEye's web ports can move. sudo atlaseye web-port --https PORT
moves HTTPS off 443 and --http PORT moves plain http off 80, for example
when another web server on the host already uses them;
sudo atlaseye web-port alone shows the ports in use. The command checks
the new ports first and changes nothing when another program or container
uses one, and it puts the old ports back when AtlasEye does not answer on
the new ones. No page in the web interface changes them. The redirect to
HTTPS, atlaseye status and the update checks follow the new ports. After
a move, give the address users open its port with
sudo atlaseye url set https://NAME:PORT, and open the new ports in your
firewalls. Setting GATEWAY_HTTP_PORT and GATEWAY_HTTPS_PORT in .env
and recreating the gateway still works, without the checks. An install
that moves neither keeps 80 and 443, and a rollback to an older release
publishes 80 and 443 again.
Make the World Map taller or shorter. A bar under the World Map changes its height: drag it, or select it and use the arrow keys. Home and End go to the smallest and the largest size, and Enter puts the map back to filling the window. Your browser remembers the height. A map taller than the window scrolls with the page, and its IP details open over the screen. In full screen the map fills the screen and the bar is hidden. On the globe, the mouse wheel no longer scrolls the page while it zooms; at the smallest or largest zoom it scrolls the page.
The capacity advice gives the command. When the measured load is above
your sizing profile, the Capacity card (About page, and the Dashboard's
System Overview) now names the command that switches to the next profile,
sudo atlaseye profile set <profile>, and says what it does, instead of
telling you to edit .env by hand.
Failed changes explained in your language. When a change of the Syslog listening port or of the HTTPS certificate fails or is refused, the card now says why in the page's language instead of in English.
full, read_write or read_only or the
English name. Configuration snapshots have one Persian name and one Arabic
name everywhere. The Profile page and the role filter of the Access Matrix
show the role's name in every language, not its internal id.full, read_write or read_only. The
Access Matrix cards name the roles the same way, and the explicit grants
card says "write" and "read" in your language instead of "w" and "r", on
a small line under the number. On a narrow phone the timezone field of the Profile page no longer makes the
details table scroll sideways: a long placeholder ends in "..." instead.1.2.357
minor
2026-10-17 19:56
1.2.356
minor
2026-10-17 09:31
DNS shows a zone's status in your language. Drift details name the record fields as the Records table does, and in Persian and Arabic those fields no longer run into each other. Add domain with an empty domain shows the field error.
File names and paths read the right way in Persian and Arabic. In Help, Syslog, Settings and other pages, a file name such as .env read env., a path such as /metrics read metrics/, and a negative number such as -90 read 90-. They now read left to right, and so do ports such as :80, prices such as $0.00, Telegram handles such as @BotFather and web addresses such as https://, which read 80:, 0.00$, BotFather@ and //:https.
The World Map uses the whole window. The map now grows with the window, and the tools you use less often (colour mode, the legend, projection, export, the share link, saved views, the IP filters and AI analysis) sit behind a Map tools button. They start shown on wide screens and hidden on smaller ones, and your browser remembers your choice. A point's details are no longer hidden under Top Countries: the list folds to its title while they are open and opens again when you close them. Top Countries rows also answer to Enter and Space, and in Persian and Arabic the map's panels sit on the mirrored side and a point's coordinates keep their minus sign in front.
The log list says when it cannot search. When the log store was down, slow or out of memory, the Log Explorer showed an empty list, as if no logs matched. It now says which of these happened and offers a Retry button. On the Dashboard, the same failure raises the loading-error banner instead of showing zero events.
The Process filter finds every process. The Process list in the Log Explorer offered only the five busiest processes of all time. It now lists up to 500 processes that logged in the chosen time range, busiest first. When there are more, a note under the list says how many, and typing searches all of them. If the list cannot be loaded, it says so.
Export CSV holds what the table finds, and opens cleanly in Excel. Export CSV now always downloads the file the server builds from the table's own search and filters: every matching row, up to 50,000, with its times in UTC. Persian, Arabic and accented text stays readable in Excel, the message after the download gives the number of rows in the file, and an export the log store cuts short fails instead of producing an incomplete file.
Time ranges such as Last 15 min move with the clock. With auto-refresh on, a time preset kept showing the window it was picked in. It now always covers the chosen span up to the latest refresh, and the time controls show the range in use.
Auto-refresh no longer piles up searches. On a slow log store, auto-refresh started a new search every 10 seconds even while the last one was still running. It now waits for the last one, updates the list without dimming it, and updates the counters every minute. With auto-refresh off, coming back to the browser tab no longer reloads the list you are reading.
Paging stops at 10,000 results and says so. The Log Explorer can page through only the first 10,000 results, and pages past them could come back empty. The pager now stops there, a line under the table suggests a narrower time range or fewer filters, and the footer still gives the exact total.
The counters above the log list say what they count. A line above them now says they cover every stored event and that the filters change only the table. A host's count no longer stops at 99+.
Excluding a word no longer empties the log list. A word typed to exclude made the whole search fail, so the list looked empty. It now hides only the lines that contain the word.
The Host filter ignores case. Typing Router-1 now also finds router-1.
Facilities 12 to 15 show their names. The Log Explorer now shows ntp, audit, alert and clock instead of the numbers 12 to 15.
The Log Explorer reads right in Persian and Arabic. The Persian footer shows the number of entries again, the total uses your language's number format, and the arrow in the time filter tag points the reading way.
Log messages keep their own direction. A message in English reads left to right and a message in Persian or Arabic right to left, in the log table and in the log detail, whatever language the page is in. A long message wraps between words, so an IP address or a port number is no longer split across two lines; after two lines it ends with "β¦", and a click on the row shows all of it. The severity tag stays on one line in every language, and the log table fits a 1440 px screen without scrolling sideways. On a phone the time in the log detail no longer breaks in the middle.
Help for the Log Explorer covers these changes. It explains the Process search, the export file, the 10,000-result paging limit and what the list shows when the log store cannot answer, in every language.
A Cloudflare, GoDaddy or firewall that does not answer no longer stalls other pages. While a DNS page waited for Cloudflare or GoDaddy, or Block on device waited for a firewall, other pages such as Settings could stop loading and show a 504 error. Now only the page that needs that service waits for it.
Small wording fixes. The World Map says "1 event" instead of "1 events", a Process list that cannot be loaded no longer mentions hosts, and German texts on the World Map, in Syslog Settings and in the WHOIS notices use Γ€, ΓΆ, ΓΌ and Γ.
Arabic notice about excluded addresses. In Arabic, the Syslog notice that counts the excluded IP addresses read in English for 2 to 99 addresses. It now reads in Arabic for every count. In French, Spanish and Portuguese, counts of exactly one million, two million and so on also read in English, and now read in their own language.
The notice about excluded addresses fits a phone. On a narrow screen the notice above the Syslog pages squeezed its words to a letter or two per line and, with many excluded addresses, could be taller than the screen. It now wraps like normal text, shows at most three lines of addresses, and keeps Manage in Settings next to the close button, also in Persian and Arabic.
Process names in the Log Explorer stay on one line. A long process name such as systemd-networkd-wait-online wrapped a few letters per line and made its row tall. It now ends in an ellipsis and shows the full name when you point at it. In Persian and Arabic the Process filter no longer cuts off the beginning of a Latin process name.
The GeoIP age warning fits an air-gapped install. When the GeoIP database is old, the Dashboard warning told every install to allow HTTPS to download.db-ip.com. An air-gapped install, or one not activated yet, never downloads, so it now says to update AtlasEye, and points to the Server runbook in Help & Features for copying in your own GeoLite2 City file instead.
The World Map fits a phone. On a phone the time ranges above the World Map ran off the screen; they are now a menu. The Top Countries list starts folded there, so the map stays visible, and opens with one tap. The countries button in the map toolbar now shows whether the list is open.
World Map on narrow screens. The open Top Countries list no longer covers the notes beside the map's status badge, the severity filter shows its whole label, and the Arabic 30-day range reads correctly.
1.2.355
minor
2026-10-15 16:16
Dates read in order in Persian and Arabic. After Persian or Arabic text, dates such as 2026-10-13 in the licence notice, the public status page, backups, record retention, rollback, DNS, Services and other messages read 13-10-2026, and some showed the time before the date. They now read in order.
The AI assistant no longer reports made-up settings. Without an AI model, asking it to summarize a Settings page used to say that two-factor sign-in and Turnstile were off, whatever they were set to. It now says that no AI model is configured.
Charts read correctly in Persian and Arabic. The labels beside a chart's axes no longer run into the chart: names, IP addresses and values sit next to their axis, IP addresses read in order, and a shortened Persian or Arabic name ends in "β¦" where it should, in every language.
Top Talkers fits a phone. On a phone the source names take less room, so the bars have space; an IP address shows in full and no name breaks onto two lines. The tip over a bar labels the count in your language.
AI Usage speaks your language. The cost chart, the By feature and Calls
tables and the filters name each AI feature and call result in your language,
such as "Alert triage" or "Timed out", where they showed an internal tag such
as triage or timeout. The Dashboard's AI feedback panel names its sources
the same way.
AI Usage fits every screen. The feature and status filters show long names in full. On a phone, the cost chart's tooltip stays on screen and shows every line. In Persian and Arabic, the tooltip keeps a name such as "DNS traffic insight" in one piece and shows amounts as "$0.05".
The Dashboard's AI cards read correctly in Persian and Arabic. Each card keeps its buttons at the far end of its title, each AI prediction keeps its buttons at the end of its line, and icons and status dots no longer touch their text.
The topology map shows each role only what it can do. With Read Only access the map is for viewing: nodes stay where they are, no links can be drawn, and the "Failed to save node position" and "Access denied" messages no longer appear. Read/Write users move, link and edit nodes as before; removing a node or a link takes Full Access, which the server already required.
Network is now IP Management. The sidebar group with IP Addresses, IP Ranges, Conflicts, NAT Rules and Port Forwards has a name that says what it holds, in every language, and Help uses the same name.
The topology map fits a phone. On a phone or a narrow window the Shapes and Inventory panel no longer takes half the screen: press Shapes and inventory above the map to open it over the map, and find the other map actions under More actions. The map gets the room instead, and nothing scrolls sideways, in any language.
Spot a sender nobody named. The World Map's Live Feed and the Dashboard's live list have a filter button that shows only the events whose sender has no name, so a device nobody knows stands out. On the World Map the live dots and lines follow the filter; on the Dashboard it changes only the list, not the globe. The Live Feed's title and buttons stay on one line in every language, and in Persian and Arabic the buttons line up with the panel's edge. While the feed is paused, the Paused label sits on its own line below them.
Give a sender a name. In Syslog Settings, under World Map locations, the table now called Sender names and locations gives a sender a name you recognise, a location, or both. Syslog then shows that name instead of the hostname or IP address its logs carry: in the log list and its details, the top hosts, Syslog Analytics, the World Map and the Dashboard. A dotted underline marks the name: point at it to see what the logs carry, which the log details also show. Filters and searches still use the logged value, and the exports add the name in a column of their own. An entry can now be edited in place. On a phone, the log details show their fields under the message.
Show an IP address by its hostname in Syslog. In IP Addresses, a record's form has a new box under Hostname: Show this name in Syslog and on the World Map. Tick it, and logs sent from that address show the record's hostname in place of the address, within about 30 seconds. A name given under Sender names and locations in Syslog Settings still comes first. This needs a licence that includes IP Management.
Monitored devices name their logs. A sender with no name of its own now shows the name of the monitored device it matches, by the device's hostname or IP address, wherever Syslog and the Dashboard show a sender's name. A user limited to some devices sees only those devices' names. A name given under Sender names and locations, or an IP Addresses hostname shown in Syslog, still comes first.
Help says who can name a sender by its hostname. Anyone who may edit IP Addresses, a Read/Write or Full Access user, can tick Show this name in Syslog and on the World Map. Only a Full Access admin can change Sender names and locations, and a name given there always comes first. The Activity Log records each change to the box or the Hostname.
The Persian DNS page reads in Persian. Backups, snapshots, restore and zones on the DNS page were partly in English. They now read in Persian, and the help text names the buttons, tabs, columns and tags as they appear on screen.
Persian writes Cloudflare in Latin letters. The Persian interface spelled Cloudflare three ways: Cloudflare, Ϊ©ΩΨ§Ψ―ΩΩΨ± and Ϊ©ΩΩΨ―ΩΩΨ±. It now writes Cloudflare everywhere: on the DNS page, in Settings, in Help and in Web Analytics.
Problem reports list only real errors. A form sent with a required field empty was listed among the recent errors in Report a problem as "[object Object]", and enough of those pushed real errors out of the report. A form check that fails is no longer recorded there; the form still shows which fields need a value.
The AI Assistant button stays out of the way of dialogs. On a phone, the round AI Assistant button could cover the buttons at the bottom of an open dialog, such as Review report in Report a problem. An open dialog or panel now covers the button instead, and the button is back when the dialog closes.
The Dashboard full-screen view hides the page behind it. In the light theme, in a browser that cannot switch to full screen, such as Safari on an iPhone, the page used to show faintly through the empty parts of the full-screen view. The view is now fully opaque.
The Dashboard full-screen view reads right to left in Persian and Arabic. The line between the event list and the globe was drawn at the edge of the screen; it now runs between the two. The note on the globe about missing arcs sits in the right-hand corner, and in every language it keeps clear of the far edge of the globe.
Date pickers fit on a phone. The calendar that opens from a date field was wider than a phone screen, so some days and the OK button were out of reach, and in Persian and Arabic a range could not always be picked. On a narrow screen the calendar's parts now sit one above the other. The calendar takes at most half the screen and scrolls inside itself, so it no longer opens above the top of the page.
Date ranges fit the screen. In Notification history both dates of the range field were cut off, and on a phone the Syslog viewer's range field ran past the edge of the screen. Both fields now fit their card. Notification history shows both dates in full except on the narrowest phones; on a phone the Syslog viewer still hides the end of each time.
Arabic day names fit the calendar. In Arabic, the calendar that opens from a date field showed each day's whole name above its column, and the names ran into one another. It now shows one letter a day, as in Persian. In Portuguese, screen readers now name the keys of the calendar's year buttons in Portuguese.
1.2.354
minor
2026-10-14 23:48
1.2.353
minor
2026-10-14 18:19
More of the interface speaks your language. In German, Spanish, French, Portuguese, Persian and Arabic, the buttons, labels, messages and Help texts that still showed English are translated, and the Help pages name the controls the way the screen shows them. Product, protocol and file names stay as they are. The plan descriptions on the pricing page are translated too. A page your licence does not include names the feature in your language instead of a code.
The user menu is always within reach. On a laptop or a tablet the top bar could run past the edge of the screen and hide the user menu. The top bar now fits from 768 px up, in every language. On a screen narrower than 1200 px, phones included, the language choice sits in the user menu.
Persian and Arabic mirror the menu arrows. The arrows that open and close the sidebar, the AI chat history and the full-screen event list point the way the text reads.
Build dates read in order in Persian and Arabic. The build date on the About page, in the GeoIP settings and on the Dashboard no longer shows its parts in reverse order, and the Dashboard gives the GeoIP database's age in your language.
The Dashboard fits the smallest phones. On a 320 px screen the figures at the top of the Dashboard and the AI findings stay inside their boxes, with the Ask AI button on the screen, and the AI summary reads in full lines under its score.
AtlasEye fits a phone better. Pages use more of a phone's width. The AI chat opens on the conversation, and the list of conversations opens over it with one tap. On NAT Rules, Port Forwards and IP Ranges the Create button is back on the screen. Toolbars, card buttons and settings values wrap or stack under their labels instead of squeezing, cutting their text or running past the edge.
Card titles and session lists read in full on a laptop. The Backups and Syslog Archive cards on Operations show their whole titles and descriptions, and the browser column of the session lists no longer runs into Last seen. Your Profile shows the sign-in method of each session in your language.
1.2.352
minor
2026-10-14 09:49
The IP geolocation credit no longer takes lines of its own. On pages that show locations, "IP Geolocation by DB-IP" now sits at the end of the footer line, after "Powered by cdnCore". While your own MaxMind GeoLite2 database is in use, "GeoLite2 data by MaxMind" follows on the same line, linked to MaxMind, in place of a long sentence with its web address on a line below. On a phone, the footer text no longer runs under the round AI assistant button.
Persian and Arabic read right to left as soon as a page opens. After opening or reloading a page in Persian or Arabic, the AI assistant button sat at the bottom right, its panel opened from the right, and the menu, tables, forms and dialogs kept their left-to-right layout until you picked the language again. Now the button sits at the bottom left, its panel opens from the left, the phone menu opens from the right, and every page, the sign-in page and the public status page included, lays out right to left from the start.
The licence agreement and the privacy policy show only their own text. In English, a note meant for whoever publishes these texts appeared above the licence agreement, the privacy policy and the licence box you accept before activating. It no longer appears.
The licence, privacy and pricing pages fit a phone, and Persian and Arabic mirror the whole layout. On a phone, the title of these pages no longer breaks inside words: the back link moves under it. A wide table in the privacy policy scrolls inside its box instead of making the page scroll sideways. On the pricing page in Persian or Arabic, the English plan descriptions read in the right order. In Persian and Arabic the back buttons and the menu button point the right way, and the spacing around the header buttons, the language picker, your user name and the footer links mirrors the English layout.
The date boxes on the Activity Log and Access Events pages show in your language. They read "Start Date" and "End Date" in English whatever language you picked; now they use the words of your language, and the help guide for Access Events names them the same way.
The filters of the Activity Log and Access Events pages fit a phone. The search box and the date boxes no longer run past the edge of the page, and the Verify Chain button is no longer cut off: the buttons move to a new line when they need the room.
Arrows in Persian and Arabic point the way the text reads. In many Persian and Arabic hints and help texts, an arrow meaning "then" or "goes to" pointed right, back at the step before; it now points left. Where a hint names English menus in a row, such as Cloudflare β My Profile β API Tokens, they now read in the right order too. The arrows on the pages follow as well: the redirect target and upstream on Service Manager, the time range of a maintenance window, the History panel, Inventory conflicts, the DNS Change watchdog and snapshot diff, the arrow on NAT Rules and Port Forwards, the Quick Insights links on the Dashboard and the "Full guide for this page" link in help tips. An IP range, a field change on the Users page and the Status (24h) line of a device page now always read left to right, start first. On Service Manager, a web address or file path no longer loses its first or last "/" to the other end of the line.
AI findings in your language. The AI Security Insights card on the Dashboard, the AI insights on Syslog Analytics, the AI analysis panel of the log viewer and the top threats of the weekly report now show the finding type, the trend, the last scan and the finding counts in the language you chose, and lay out right to left in Persian and Arabic. The English text the AI writes keeps reading left to right there, and a scan time keeps its date in one piece. On a phone, the Dashboard findings, the AI insights on Syslog Analytics, the AI analysis panel and the weekly reports fit the screen. Repeat addresses say "1 scan ago" instead of "1 scans ago".
Port Forwards and NAT Rules in your language. Adding or editing a port forward showed its fields, choices and port range errors in English; they now use the language you picked. In Arabic, the dialog titles, the Name, Type, Protocol, External IP and Internal IP columns and the Deprecated and Planned statuses on Port Forwards, NAT Rules, IP Ranges and IP Management are no longer in English, and in Portuguese the Name label is translated. The Source and Destination column titles of NAT Rules are translated in every language, and so is the status of an IP in a deprecated or planned range on Inventory conflicts. The Help for these pages names their buttons and fields as you see them, in Arabic, Persian, German and Spanish.
NAT rules and port forwards on a phone. On a narrow screen, the public and internal sides of a NAT rule or port forward now sit one above the other, so IP addresses and ports are no longer cut off.
Inventory conflicts on any screen. The six counters sit in one even row on a wide screen instead of leaving one alone on a second row, and a long counter name is no longer cut off. On a phone the page title stays on one line with its icon.
DNS snapshot diff in plain words. Diff vs previous now shows a record's proxy setting as Proxied or DNS only, and a TTL of 1 as Auto, as the records table does, instead of true, false and 1.
The Dashboard's live event list keeps up with a busy network, and holds still while you read it. New events now enter the list one after another instead of landing all at once (in a large burst, the oldest enter together), and the page redraws only the rows that changed rather than the whole list. When your system asks for reduced motion, new events appear at once. While your mouse pointer or the keyboard focus is on the list, it holds still and a tag such as "3 new" counts the events waiting. It moves again when you leave it, or after 10 seconds without a mouse move or key press, so a mouse left resting on a wall screen cannot freeze it. The Pause button still holds the list until you resume it. The severity chip on each row now shows the syslog level number, from 0 (Emergency, the most serious) to 7 (Debug), in the World Map's colours; hover it for the level's name. The Help centre lists all eight. The source address column is wider, a long IPv6 address keeps its last part in view, and selecting an address to copy it no longer opens the Syslog viewer.
On a tablet or a narrow window, the Dashboard's globe and live event list fit the page. Below 1100 pixels wide, where the two stack, they ran past the edge of the page and cut off the list's host column, with a grey bar between them. Both now fit, and the bar is gone.
In Arabic and Persian, the live event list shows the start of a long host or process name. It used to cut off the start and show the end.
Screen readers hear more of the Dashboard's live event list. A row that AI analysis flagged now says so when it is read out, and the dot beside the Live event stream title explains itself when you reach it with the Tab key, not only under the mouse.
1.2.351
minor
2026-10-13 21:04
AtlasEye now comes with the DB-IP Lite IP geolocation database and keeps
it up to date by itself. It no longer ships MaxMind GeoLite2, and the
separate GeoIP updater is gone. DB-IP Lite (CC BY 4.0) is built into
every release: each release carries the newest monthly copy that existed
when it was published, or an earlier one if DB-IP could not provide it
then. Pages with locations credit it. An install that reaches the internet
also fetches each new monthly DB-IP Lite database on its own, so the World
Map no longer waits for the next AtlasEye update. Once it has checked for
a newer one, the Dashboard shows "Auto-update: DB-IP monthly". With your
own free MaxMind key (GEOIPUPDATE_ACCOUNT_ID and
GEOIPUPDATE_LICENSE_KEY in .env), AtlasEye downloads GeoLite2 itself
and the Dashboard shows "Auto-update: your MaxMind key": it asks MaxMind
every 12 hours and downloads only a newer file. GeoLite2 is used while it
is at most 30 days old, and the Dashboard tags it "GeoLite2 (your MaxMind
licence)". Air-gapped and offline installs download nothing and keep the
copy that came with their last update. The GeoLite2 copy that earlier
releases installed is no longer used, and the geoipupdate container is
no longer needed: the update empties that copy (a copy you replaced
yourself is kept) and removes the container. It keeps the container's
image, so after going back to the previous version the old updater can
start again without a download. Going back to 1.2.349 or 1.2.350 also
keeps country lookups working: this version copies its DB-IP database to
where those versions look for it. When the updater on your server
predates this cleanup, the next update does it, and this one prints a
harmless warning that geoipupdate failed to start. On a server that was
on 1.2.348 or older before this update, the old atlaseye-geoipupdate
container stays until that next update. To remove it now, run
docker rm -f atlaseye-geoipupdate. If you set GEOIPUPDATE_PROXY for
the old updater, set ATLASEYE_OUTBOUND_PROXY in .env instead: the GeoIP
downloads now use it, like every other request AtlasEye sends to the
internet. The alert for an old GeoIP database now waits until the DB-IP
copy is 60 days old and says what to check.
Add your free MaxMind account in Settings β System to use GeoLite2;
DB-IP Lite refreshes monthly on its own. The new GeoIP database card
shows the database in use, its age, where the MaxMind key comes from and
the last check. Type your account ID and licence key, press Test key, then
Save: AtlasEye uses the key within the hour, with no restart, and never
shows it again. A key saved there takes the place of
GEOIPUPDATE_ACCOUNT_ID and GEOIPUPDATE_LICENSE_KEY in .env, which
stay the fallback. An air-gapped install downloads nothing; the Server
runbook in Help & Features shows how to copy a GeoLite2 file in by hand.
The licence agreement now names the IP-location data AtlasEye includes. Version 1.4 of the licence agreement (EULA) changes only section 3.4, in all seven languages: it says that AtlasEye includes the DB-IP IP to City Lite database (CC BY 4.0), and it names GeoLite2 only as data you download with your own MaxMind account, under your own agreement with MaxMind. The installer bundle carries the new text. A licence that is already activated keeps the version accepted then, and nobody is asked to accept again; the next activation shows version 1.4.
The IP geolocation credit appears only on pages that show locations. The database credit (IP Geolocation by DB-IP) is no longer under every page. It appears on the pages that show where traffic and sign-ins come from: the Dashboard, the syslog viewer, analytics and World Map, sign-in history and sessions, your active sessions on the Profile page, Web Analytics, the AI chat, and the AI assistant while it is open. The World Map and Dashboard full-screen views keep their credit as before. While your own MaxMind key is in use, MaxMind's GeoLite sentence appears below the DB-IP link, which stays: locations stored before the key came from DB-IP.
1.2.350
minor
2026-10-13 09:49
Set the World Map server location in Syslog Settings. A new World Map locations card under Syslog & Security β Syslog Settings sets where the World Map traffic lines and the Dashboard globe arcs end. Enter latitude and longitude in decimal degrees and press Save location: there is no container to recreate. A location saved there wins over the one in the server's .env, and Remove saved location brings the .env location back. A tag says where the location in use comes from: Saved here, From the server's .env, or Not set. Only a Full Access admin can change it, and AtlasEye never looks the location up online. The World Map and the Dashboard show a change the next time they are opened.
Place individual log sources on the World Map, and see why the globe is empty. The World Map locations card now has a Sender locations table where a Full Access admin gives one sender β an IP address, a CIDR range or a hostname β its own point on the map. Each traffic line and each Dashboard globe arc now ends at the source that sent the log: at its own saved point, else where its public IP is, else the default location. The map shows one pin per place, naming who logged there. When the Dashboard globe has live events but no source has a point yet, a note explains why it shows no arcs and points an admin to Syslog Settings.
1.2.349
minor
2026-10-12 22:21
Updates are ready to retire the GeoIP database copy that came with
AtlasEye. Nothing changes with this release. Once a later release stops
using that copy, an update empties the file, leaving it in place at 0
bytes, but only if it is still the copy AtlasEye installed: a copy you
replaced yourself is kept. When that release also drops the weekly GeoIP
update (geoipupdate), the update removes its container, and its image if
nothing else uses it. Neither step can make an update fail.
The Dashboard names the IP geolocation database in use, and every page credits it. The System overview shows which database turns addresses into countries, its build date and age, and whether your MaxMind key keeps it up to date or it came with this release. When your own GeoLite2 download is over 30 days old or cannot be read, AtlasEye no longer uses it: the World Map, sign-in locations and Web Analytics use the copy that came with AtlasEye, and the Dashboard says why. The warning about an old database now gives its age. The page footer credits the database in use, with a link to its maker, and so do the World Map and Dashboard full-screen views.
With "require 2FA" on, an account that has not enrolled can only
enrol. When the two-factor policy is Required, or Force 2FA for Admins
is on for an admin, the web UI already sent such an account to its 2FA
setup, but the server still answered it everywhere else. Now a password or
SSO sign-in of an account that has not enrolled reaches only the 2FA
enrollment steps, on a page of their own, and every other request from that
session is refused with 403 TWO_FACTOR_SETUP_REQUIRED until it enrols;
the API documentation, the live syslog view and the SSH terminal stay
closed to it too. A session that was already signed in is held from its
next token refresh. API tokens keep working: an integration that uses an
API token is not affected, but a script that signs in with the username
and password of such an account is refused until the account enrols.
The atlaseye command works right after a new install. A new install
now puts it on the PATH. Installs made with 1.2.345 to 1.2.348 did not: the
installer showed "could not link the atlaseye command", and sudo atlaseye
answers "command not found" there. On such an install, run
sudo bash /opt/atlaseye/scripts/atlaseye link once (air-gapped: the same
file in the bundle directory the stack runs from). Applying an update does
not add the command, so run it once even after updating.
Alert credentials no longer appear in the monitoring log. Each alert sent to Telegram or to a webhook wrote its full address to the log of the monitoring service, and that address holds the Telegram bot token or the webhook's secret. The log now leaves those lines out. A failed send is still logged. If you have shared that log with anyone, create a new bot token or webhook secret.
"Security Settings" under Syslog & Security is now called "Syslog Settings". It is the same page at the same address, with the same settings: only the name changed, in all seven languages, so it no longer reads like the Security tab of Settings. The help, the alert messages and the installer's closing notes that send you to this page use the new name.
The World Map no longer asks an outside service where your server is.
When no location was set, AtlasEye asked a free online service where your
server is. That service is licensed for non-commercial use only, and every
request told it your server's public address. The lookup is gone. The
World Map traffic lines and the Dashboard globe arcs now end only at the
location set in .env with SYSLOG_SERVER_LAT and SYSLOG_SERVER_LON, in
decimal degrees; an empty value counts as not set. Recreate the api
container after setting them, because a restart does not read .env
again. An install that relied on the automatic estimate shows no traffic
lines until the location is set, and the traffic lines button in the World
Map toolbar says how to set it.
The medium size is supported. Load tests in October 2026 confirmed
medium: up to 1,000 devices and 1,000 syslog events per second on
average, with peaks of 4,000, ran for 24 hours without losing a message.
Plan for 4,000 per second at most: a test at 5,000 lost messages. The
minimum host for medium is now the size that was tested, 16 vCPU and
32 GB of RAM (it was 8 vCPU and 24 GB), and a new medium install probes
up to 40 devices at a time instead of 20. A host below that minimum, new
or already installed, can still run medium: the host check, the
installer and sudo atlaseye doctor warn about its CPU and memory, the
Capacity card on the About page advises adding vCPU or RAM, and
sudo atlaseye profile set medium asks you to confirm. Only a host below
the floor AtlasEye needs to run at all is refused. When you give the
installer no size, such a host now gets small. For such a host, choose
small, or give it 16 vCPU and 32 GB of RAM. An existing medium install
keeps probing 20 devices at a time after the update: run
sudo atlaseye profile set medium to raise it to 40, and
sudo atlaseye profile to see what differs.
1.2.348
minor
2026-10-11 18:39
An update that stops before it restarts the services now puts the
service definitions back. An update installs the release's service
definitions (the compose/ folder) shortly before it restarts the
services. If the update stopped in between, the services kept running
their old version under the new definitions, and the next attempt could
keep the new definitions as the ones to go back to. The update now puts
the previous definitions back when it stops before the restart. If it
cannot, the update log shows the command to run.
Going back to the previous version from a shell on the host now keeps
a copy of the current data, and your current security and retention
settings. Right before it restores the backup, the rollback command
saves the current database to a file of its own in
backups/pre-update/, so what going back discards stays on the host.
Each try saves its own copy and nothing deletes them: delete one yourself
once you have decided how to go forward (section 6 of INSTALL.md). The
command needs more free disk space than before. --no-safety-dump skips
the copy when there is no room, after a warning that nothing can then
bring back what going back discards. After an update that finished,
going back now keeps the stricter value of each sign-in security setting,
each retention period at the value that deletes less, and Turnstile,
syslog firewall blocking and the status mirror as they are now. Service
Manager redirects set to end at a given time no longer end on their own,
changes to managed servers stay off until an admin turns them on again,
and the audit log records the rollback with the old end times. When it
cannot keep these settings, it says so before it asks. It also warns when Service Manager tasks are still
pending or running, because going back cuts them off. If going back is
cut off, run the same command again: it shows whether the database was
restored, and either finishes going back or, when it was not restored,
can start the newer version again.
The monitoring worker can no longer start an update, a prune or a
syslog port change. A new secret in .env, UPDATER_MUTATING_SECRET,
now guards Apply Update, Prune Now and the Syslog page's port change.
Only the API and the updater hold it: the monitoring
worker, which reads the rest of .env, gets it empty. New installs
generate it. On an installed host, the update to this version still runs
the previous update script, so the secret reaches .env at the update
after it; an air-gapped update adds it at once. Until then, Apply Update
and Prune Now use UPDATER_SHARED_SECRET as before. If you change the
secret by hand, recreate the API and the updater together.
An update job's full details now need Full Access. Opening one
update job by its id, with its log, now answers only to an admin with
Full Access (GET /api/v1/licensing/updates/job/<id>); other accounts
get "403 Forbidden". The log can hold error output from the host's
tools. Settings β Updates, the page that shows these details, was
already for Full Access admins only. The update status that every
signed-in user's browser reads to offer a reload after an update still
answers to everyone, without the log unless the account has Full Access.
With a paid licence, download the offline bundle from the licence
portal. With an active paid licence, the Downloads page of the customer
portal offers the signed offline bundle of the two newest stable
releases, starting with the next one, each with a .sha256 file to check
the download. The page
shows the commands to check and extract the bundle, and the fingerprint
of our release signing key, which the key inside the bundle must match.
For high assurance, also compare that fingerprint with the one support
sends you over another channel. A download that stops can be resumed from
your browser. Trial and demo licences do not include the bundle; support
still sends it on request. This comes with an update of the licence
portal, not with a release of AtlasEye.
An account that must change its password can do nothing else until it does. The first sign-in of the installer's admin, or of an account whose password was reset from the host shell, already opened the change-password page, but the server still served that account everywhere else, its API tokens included. Now every other request from it is refused until the password is changed, and live updates, the API documentation and the SSH terminal stay closed to it. If an integration runs with the API token of an account whose password was reset from the host shell, it stops until someone signs in as that account and changes the password.
The host check reports an old OpenSSL with everything else. On a host
with OpenSSL older than version 3, the installer stopped on that one
problem before it checked the host, and --check did the same. The
installer now checks the whole host first and lists every problem at
once, OpenSSL included.
The install guide runs the host check with sudo. The portal's install
guide ran the host check without sudo. When your user is not in the
docker group, Docker refused it, and the check failed on a host that was
ready. The guide now gives sudo bash atlaseye-preflight.sh, as INSTALL.md
does.
You can now change the port devices send syslog to. On Syslog & Security β Security Settings, the new Listening port card shows the port devices send syslog to, one number for UDP and TCP, and a Full Access admin can change it there. AtlasEye restarts the syslog collector and then the web interface, so the page loses its connection for up to a minute and reconnects on its own. When you move away from port 514, port 514 stays open beside the new port by default, so devices you have not reconfigured yet keep working; a move between two other ports opens 514 only when you ask for it, and the confirmation then says so. While it is open, the card lists the devices that still sent to port 514 in the last 24 hours, so you know when to close it. Allow the new port inbound on the host firewall, UDP and TCP. When a change cannot start, the card says why, for example that an update is running; when a change fails, it says what went wrong and whether the previous settings are back. Help now names the port in use.
The syslog port can move from the host, and a new install can start on
another port. sudo atlaseye syslog-port shows the port devices send
syslog to, and sudo atlaseye syslog-port 5140 moves it, UDP and TCP. It
takes 514 or a port from 1024 to 65535, since the lower ports belong to
the host's own services such as SSH, and it refuses a port that is already
in use. If the syslog collector does not come up on the new port, it puts
the previous settings back and says so. Moving away from port 514 keeps
514 open beside the new port, so devices you have not reconfigured yet
keep working; close it with
sudo atlaseye syslog-port 5140 --no-keep-514 once no device sends to it.
Updates keep the port. A rollback to a release from before this one puts
syslog back on port 514, and says so. For a new install,
--syslog-port 5140 gives the installer and the host check the port, for
example when the host's own rsyslog keeps 514. Allow the new port, UDP
and TCP, in every firewall between your devices and the host before you
reconfigure the devices.
INSTALL.md section 4, "Changing the syslog port", has the details. The
setting is for Docker Compose installs. The offline installer takes
--syslog-port with this release; the one-line install takes it once the
licence portal is updated, and stops with a message instead of installing
on 514 when your channel's release is older than the option.
The syslog listening port is 514 or a port from 1024 to 65535. The ports below 1024 belong to the host's own services, such as 22 for SSH, so the Listening port card no longer offers to move syslog there and says why. When a port change fails after a long run, the card still names the cause.
Settings β Updates says when a syslog port change is running. While a change from the Listening port card runs, a note above Apply update says so, and the button is offered again when the change finishes. Before, the port change was listed there as the last update job.
The country database's 30-day limit now checks when MaxMind built it. The release build used to check when the file was last copied, which could let an older database through. It now reads the build date stored inside the database, so a new install's country database really is at most 30 days old when the release is built.
Confirm dialogs follow dark mode. In dark mode, confirm dialogs such as Change port and short pop-up messages came up white. They now use the dark theme like the rest of the page.
The installer no longer shows a misleading cosign warning. A connected install on a host without cosign warned that the downloaded files were only as trustworthy as the download. The installer checks the vendor's signature on the release before it downloads anything, and now says that instead.
Installs and updates no longer warn that the registry credential is stored unencrypted. docker printed that warning after every successful registry login, although the installer and the updater both remove the credential when they finish. A failed login still shows docker's reason.
You can now roll back the last update from Settings β Updates. A new card, "Roll back the last update", lets an admin with Full Access go back to the version that ran before the last update. Before you start, it shows what leaves the live system and what is carried over, which settings keep their current value, which security changes are reverted, which redirects and Service Manager tasks are affected, and how long the site is down. When something blocks a rollback for now, such as a backup that is running, the card says what and, where only the server can help, shows the command to run there. When the server cannot offer a rollback, for example on an air-gapped install, the card is not shown; the Help says why. To start, you tick four statements, type the word ROLLBACK and enter your password and, with 2FA on, your authenticator or recovery code. While the site is down, the card shows how far the rollback got and when the site should be back. If the site stays down much longer than expected, it shows the command to run on the server. At the end it shows the result of each check, with what to do about a failed one. After a rollback that succeeded, the page reloads into the older version.
A new command brings back what going back to the previous version set
aside. Right before a rollback restores the older database, it saves
the current one to a safety dump in backups/pre-update/ on the host,
but the Backups page could not restore that file. Once you have updated
again to the version you went back from, or a later one, run this from
the install directory:
sudo bash scripts/stage_restore_dump.sh pre-rollback-<UTC time>.sql.gz.
It checks the dump and copies it into Backups, where you restore it in
Administration β Backup & Archive. It never replaces a backup of the
same name. While an update, a rollback or a prune runs, it refuses: run
it again when that has finished. On an air-gapped install, run it from
the bundle directory you ran the rollback from. Section 6 of
INSTALL.md, "Going forward again", lists every step. An update now also
warns, in its log, when it applies again the version you went back from
after that version's update had finished. It still goes on, because
updating again is the first step of going forward. The warning starts
with the update after the one to this version.
A syslog port change is now in the audit log even when the updater does not answer in time. The entry used to be written only once the updater confirmed that the change had started. When that answer never came, the port could still change with no entry saying who asked for it. The entry is now written in that case too, without a job id.
Apply Update now waits for the updater to finish restarting. After an update, the updater restarts itself about 30 seconds later. An update started in those seconds was stopped partway by that restart. Apply Update now asks you to try again in a minute instead, as rollback and the syslog port change already did.
A slow Docker no longer makes a started update look failed. AtlasEye now waits up to a minute for the updater to answer Apply Update, instead of 10 seconds. The new syslog port change waits as long.
A syslog port change that is still running shows again after a reload. If you reload Syslog & Security β Security Settings while the listening port is changing, or open the page in another tab, the Listening port card shows the running change with its steps instead of the form, and says how it ended once it is done. A change that finished before the page was opened is not shown again: the card then shows the port in use.
Resetting a user's password can now make them choose a new one. The Reset Password dialog on the Users page has a new box, "Must change password at next sign-in", ticked each time the dialog opens. With it ticked, the user's next sign-in asks for a new password, and until they change it, their personal access tokens (API keys) get error 403. Untick the box for a service account that signs in with this password or uses such a token.
The Help now explains how to go back after an update. The Updates section of the Server runbook now starts with the "Roll back the last update" card in Settings β Updates, the Troubleshooting answers name it, and the Feature catalog lists it. Together they say who can use it and until when, what it keeps, what leaves the live system and stays only in a safety copy on the server, and how to get that copy back once you have updated again. A new Troubleshooting answer explains why the card can be missing: on an air-gapped install, while the server's own check refuses (for example, too little disk space), or when there is nothing to undo. The command on the server is still there for when the web interface does not answer, and the Help now says that it keeps less than the card. The Settings β Updates guide used to say that everything written since the update is lost; it now says where that data goes, how long the way back lasts and which updates cannot be undone.
1.2.347
minor
2026-10-09 23:46
A command approval that gets no answer now says the result is unknown. When you approve a command in the assistant's chat and the server gives no answer, or answers with a server error, the card no longer says that the command was not run, because it may have run. It now shows "Result unknown" and no button to run the command again. Reopen the conversation from AI Agent β Chat: a command that ran shows its result there. If no result shows, check the device before you approve the command again.
A long first start after an update no longer undoes the update. The
first start of a new version prepares the database before AtlasEye
answers. With a large chat history, this one-time step can take several
minutes, and the update took the wait for a failure and went back to the
previous version. The update now waits up to 15 minutes. A normal start is
not slower. An update from a shell on the host waits longer only when it
takes the release's own files (--refresh-installer-files).
Correction: taking the release's own files from a shell on the host
needs the update script of 1.2.346 or later. The 1.2.346 notes did not
say so. An older update script stops with "unknown flag" and changes
nothing, and it cannot replace itself. On such a host, do this once: ask
support for the signed offline bundle of the release, check it as the
air-gapped install guide describes, copy its scripts/update.sh and
scripts/lib/ into the install folder, then run
sudo bash scripts/update.sh --refresh-installer-files. Section 6 of
INSTALL.md gives the commands.
A rollback that can never finish now says what to do instead. When the backup taken before the update, or the images of the previous version, are gone for good, a rollback can never finish. The rollback now says so and shows the commands that give up going back and update instead, after you restore the database from another backup where it may hold part of the backup. The commands that updates and rollbacks print now also work when the path of the install folder has a space.
The install guide now says which ports are open, where AtlasEye
connects and what not to do. INSTALL.md lists each outside connection
AtlasEye makes: when it makes it, which proxy setting it uses and how to
turn it off. Its firewall section now also shows how to limit who reaches
the web interface, next to the syslog example. Docker opens its ports
past ufw and firewalld, so both examples filter in the DOCKER-USER
chain. The first-run checklist ends with a Do and don't list. It opens
with the three notes the installer prints at the end: back up .env,
list your syslog senders and filter the published ports. Help, Getting
started, shows the same three notes after the syslog step. The minimum
Docker, compose and kernel versions and the port list in the guides are
now the ones the installer checks.
Changing the address users open takes one command, and the host check
says how to fix each warning. When the installer finds no usable name
or address for the host, or when you move AtlasEye to another name, point
the name at the host in DNS and run sudo atlaseye url set https://NAME.
It takes the same addresses as the installer's question and refuses
anything else without changing anything. It keeps a copy of the previous
.env, restarts only the parts of AtlasEye that use the address, and
puts the old .env back if AtlasEye does not come back healthy. The
self-signed certificate the installer made is remade for the new name. A
certificate of your own is kept, and the command tells you when it does
not name the new address. Links in notifications use the Public App URL
in Settings β General, and the command tells you when that differs.
Section 4 of INSTALL.md has the details. Before an offline install, and in
scripts/preflight_host.sh --offline, the host check now also looks for
the two tools that verify the bundle, cosign and sha256sum, so a missing
one shows up with the other problems instead of after them. Every warning of the host check now says what
clears it.
Setup checks: an empty syslog allowlist can be accepted, and a failed scheduled backup now shows. If no device sends syslog yet, the syslog allowlist check no longer stays open: choose Acknowledge on the Setup and security card of the Dashboard, or in the Limit who sends logs step of the guided setup, then add the devices with Edit allowlist when you connect them. Acknowledge never covers a syslog collector that accepts every sender. When a scheduled backup fails, for example for lack of disk space, the Backups check now shows Action needed and the time the failed run started, instead of saying that daily backups are on. It clears when a newer backup exists, from the next scheduled run or from Create Backup on Backup & Archive.
An air-gapped installation no longer tries to reach the licence server. It still checked for updates online every hour and tested the licence server's address whenever a page showed the system's health. On a network without internet access these attempts failed, and Settings β Updates showed the update check as unreachable. Now nothing is sent: the update check shows that no check has run, and updates are installed from a signed bundle, as the Offline / air-gapped update card describes.
Installing needs one container image fewer. A new installation no
longer downloads, and the offline installation bundle no longer carries, a
web server image that AtlasEye never ran. The offline bundle is smaller,
and a connected installation has one download fewer. An existing
installation keeps the copy it already has. Nothing uses it, so you can
free the space with docker image rm nginxinc/nginx-unprivileged:1.27-alpine.
Third-party images no longer change without a release. AtlasEye runs some images it does not build: PostgreSQL, Redis, OpenSearch, Prometheus and a few more. Until now some of them came as whatever build their publishers had last put under the version AtlasEye asks for. Each release now names the exact build of each one. A connected installation, and each update, downloads those builds before it stops anything and uses them; the offline installation bundle carries the same builds. PostgreSQL and Redis never go back to an older build: if your server already has a newer one, it stays, and the update log says so. If a download fails, the update stops with everything still running the version you had. Check that the server can reach the public image registries, then apply the update again. An installation that updates from a version without this change gets the named builds at its next update.
The installer checks the release's signature before it downloads anything. The one-line install now checks that the release it is about to install carries AtlasEye's signature, with the same key the in-app update uses, and downloads exactly the installer that the signed release names. If the check fails, it stops and nothing is downloaded. The check needs OpenSSL 3, which Ubuntu 22.04, Debian 12 and RHEL 9 have. On an older system, such as Ubuntu 20.04, Debian 11 or RHEL 8, the installer now stops and says so: use the air-gapped install there.
The installer downloads exactly the AtlasEye images of the signed release. The one-line install now downloads each AtlasEye image by the exact identity that AtlasEye's signed release names, as the in-app update does, so an image changed on the registry afterwards is never installed. If the release does not name one of them, the installer stops before it downloads any.
New installs start with a more recent country database. The installer
now carries a GeoIP country database that was at most 30 days old when the
release was built, down from 90. The Dashboard calls the database stale
after 30 days, so the automatic weekly update (geoipupdate) remains the
way to keep it current.
An update that stops early puts the previous version's images back. An update downloads the new version's images first and switches the running services over later. If it stopped in between, for example because a download failed or a safety check refused the update, the previous version kept running, but the new images were already the ones the services would start from. Starting the services again could then run the new version on the old database, and if a second try of the update failed, it could not go back to the previous version. Such an update now makes the previous images the ones to start from again before it ends, and its log says so. An update runs the update steps of the version already installed, so updates from Settings β Updates get this from the update after the one that installs this version. An air-gapped update gets it with this release's bundle.
The host check now asks for OpenSSL 3 before a connected install. The
one-line install needs OpenSSL 3 to check the release signature and stops
on an older system, but the host check (atlaseye-preflight.sh, or
bash scripts/preflight_host.sh in the install directory) could still say
the host was ready. It now fails on OpenSSL 1.1, LibreSSL or no openssl,
names the version it found and the package to install, and
--ignore-check=openssl cannot accept it, since the installer would stop
anyway. With --offline, and on a server where AtlasEye already runs, it
does not ask for OpenSSL. The host requirements on the licence portal now
list OpenSSL 3 for the online install. The check in the install directory
comes with this release; the downloadable host check and the portal's
requirements are updated on the licence portal separately.
The installer's last message is no longer lost. When the installer or the offline update stopped on an error, the line that says why could be missing from its log and from the screen, most often on a busy host. The log now keeps it.
The licence portal has an install guide. The guide at
/portal/install needs no sign-in. It gives the host requirements, the
sizing table, the host check and the three install steps, and the welcome
and trial e-mails now give the same steps. When a release's installer
image is not available yet, for example while it is being published, the
installer now stops before it changes anything and says to run the same
command again in a few minutes. These changes are on the licence portal
and need no update.
1.2.346
minor
2026-10-08 14:02
Going back after an update says exactly what it did, and release notes read more clearly. When an earlier rollback was cut off while it restored the database, the next run now first warns that the database may hold all, part or none of the backup, even when it then stops with an error, and if the backup file is gone it tells you to restore the database from another backup. After a cut-off restore, if stopping the services fails, the next run now names the services that may still run on that database and shows the command that stops them. A rollback now says the database was not changed only when that is certain, and says the errors came from the database only when they did. The rollback after a failed update, the automatic one or the one an air-gapped update tells you to run, does the same: when it cannot tell whether it restored the database, it now says so and shows the command that goes back by hand. In Settings β Updates, a release whose notes were withdrawn after publishing shows no text instead of its old notes, and headings inside a release's notes show smaller than the release's own version heading.
Alert mails say what is most likely wrong, where to see it and how to fix
it. Each alert mail lists the likely causes, the most likely first. Where
AtlasEye shows the problem, the first step names that page and the link in
the mail opens it. The next step is the fix: in AtlasEye where it can be
done there, otherwise a command, with the install folder to run it in
(/opt/atlaseye). A log command comes only last, for when the alert still
fires, with its output to send to support. Slow-request mails now say
whether the whole API is slow or one endpoint, what that endpoint waits on
(for example the AI provider, the licence server, a device, Prometheus, a
notification channel, the identity provider or OpenSearch) and how many
requests it served; when the endpoint served only a few requests, the mail
says that a few slow ones are enough to fire it. When the other endpoints
answer in time and the slow one waits on nothing outside AtlasEye, the mail
names that endpoint's own work first, most often a database query. For an
endpoint that waits on the licence server, the mail points to the tag beside
Last Heartbeat in Settings β Licensing: where it reads "unreachable", it
says to allow HTTPS to the licence server through the firewall or proxy;
where it reads "airgap" (an air-gapped install), it says to leave the
firewall as it is. A slow health check on an air-gapped install is expected
and does no harm: the health check still waits for the licence server,
which never answers there. A slow heartbeat on an air-gapped install is
this server's own work, because the heartbeat never contacts the licence
server there; the mail says so and points to Host and Database in System
Health. A failing task that only PostgreSQL can stop
points to PostgreSQL and the data disk: the clean-ups of old incidents,
alerts, notification log entries, DNS snapshots and sign-in events, the
status page uptime sample, and the checks that carry on when a host, site
or search they reach fails (certificate expiry, service rediscovery,
configuration snapshots, temporary redirects, Web Analytics traffic alerts
and syslog threat alerts). The other clean-ups, the scheduled reports, the
syslog alert rules and the container log check catch their own errors, so
their mail names an error in AtlasEye. The Web Analytics retention mail
points to each site's Retention (days) in Manage sites.
Going back after an update restores the database whole or not at all, and never runs while an update from the same directory runs. A rollback now puts the database backup back in one step: when it is cut off, the database stays as the update left it instead of holding part of the backup. Before anything changes, a rollback refuses a backup that holds something a normal backup never contains, or one cut off before its end. Run by hand, it also checks that the disk has room to unpack the backup, and it stops every AtlasEye service except the database while it runs (on an install that updates online, the updater keeps running); a service the previous version did not have stays stopped, and the rollback names it with the commands that remove it or start it again. An update, a rollback or Prune Now started while another of them runs from the same directory refuses to start. On an air-gapped install each bundle directory counts on its own, and Prune Now can still start while an update runs, so do not start it then. An update also refuses while a rollback from the same directory has not finished, and shows the command that finishes it; on an air-gapped install, finish a rollback before you run the update of another bundle. Before the rollback puts back the previous version's compose files, it keeps a copy of the newer ones and names the ones changed since the update; if it cannot make that copy, it says so and leaves the newer files in place, and the previous version starts with them. When the automatic rollback after a failed update does not finish, the update shows the full command that finishes it; a rollback you run by hand says what to do next. A rollback you run by hand after an update that never finished now also asks you to type ROLLBACK first, and says that the update never finished. After an air-gapped update has rolled itself back, a rollback run by hand no longer restores the backup a second time: there is nothing left to go back to.
The AI assistant asks before it runs a command, and is clearer about what it sends and why it cannot answer. When a command on a device would help, the assistant now proposes it on a card in the chat that shows the host, user and exact command; it runs only after a Full Access admin approves it, once, and an unanswered card expires after 10 minutes. The chat masks text that looks like a password or key in your messages and chat titles, also in conversations saved before this update: the update rewrites saved chats and their titles for good. Masking matches patterns: it can miss a password, so do not type passwords into the chat, and it can also hide ordinary text that looks like a password. The assistant asks for an SSH password only on the card, when the device has no stored login; that password is used for that one login and is never saved or shown to the AI model. Each role sees only the assistant actions its permissions allow. The daily briefing, Auto-correlate and rule-based predictions are now labelled as fixed rules rather than AI, and Auto-correlate shows the groups before it creates any incident. When the assistant cannot answer, it says why: AI not set up or turned off, a rejected key, a timeout, a rate limit, a network problem or the daily spending limit. Calls on a paid model without a price show "price unknown" instead of $0, and the AI chat no longer carries a vendor name.
The syslog rate-limit alert behaves the same for every window length. The alert "Syslog senders are over the per-sender limit" now counts the messages over the limit, in Enforce and Monitor mode. Its mail is now titled "Over the per-sender limit: syslog messages", followed by how many messages went over the limit in the last 5 minutes. It fires when messages have gone over the limit at least once in every 5 minutes for 15 minutes, so a flood shorter than about 10 minutes raises no alert. Before, its timing depended on the window you set: with a one-hour window a single short burst could raise it up to 75 minutes later, and with a window under 10 seconds a burst could go unseen. A sender is named only once its window has ended, so the mail and the list "Senders over the limit (last hour)" can name no sender while the alert is active, and with a long window the mail can name a sender of an earlier window. "Now" in that list means the sender went over the limit in the last completed window, which with a long window can have ended up to an hour ago. If Apply Update warned that it left the alert rules file as it is because it was edited on your server, take this release's copy with the command in that warning. If that warning said this release's copy could not be parked beside it, there is no command in it: the next update tries to park its own copy there again, and when it can, its warning gives the command. If the same warning comes back, check the free disk space and that the folder of that file belongs to root, as after a standard install. Until then this alert keeps its old rule, and the number in its mail counts senders, not messages. If Apply Update said it left that file as it is for another reason, or that it could not fetch this release's installer files (see the next item), the next update tries again. Keep Prometheus running, because the update checks the new file in Prometheus first. If it reported an error that it could not put the file back, run the command in that error first. Until then, too, the number in the mail can count senders.
An update that cannot fetch its installer files says all it leaves alone. If the Apply Update log says "atlaseye-dist pull failed", or that the signed manifest "pins no atlaseye-dist digest", the update could not fetch the release's installer files. It then leaves the compose files and the monitoring configuration as they are too, not only the host scripts it names, and the next update tries again. From the update after this one, that message names all three.
The free-space checks of an update and of the installer say GiB. Before
it downloads the new version, an update checks the free disk space on the
server and writes the result to the update log, or to your terminal when
you run scripts/update.sh yourself. The air-gapped update
(scripts/update_airgap.sh) checks the same limit, added to the size of the
images it loads, before it loads them. Both gave the sizes in GB, but they
are GiB, the unit the Apply Update dialog uses for the same limit. Both now
say GiB. The installer counts the free space on Docker's disk in GiB too:
its disk check now gives that space, the 30 GiB minimum and the size below
which it warns in GiB, and so does the "Hard floors" note under the sizing
table in the documentation and on the portal's downloads page. The note
also says that these checks read the disk sizes of the table as GiB, and
atlaseye status and atlaseye profile show give the free space in GiB
too.
An update from a shell on the host can take the release's own scripts.
sudo bash scripts/update.sh --refresh-installer-files takes this
release's scripts, compose files and monitoring configuration, as Apply
Update does. This keeps them current on a host where Apply Update
is not supported, such as one with Docker userns-remap. Without the flag,
a run from a shell on the host leaves them as they are and now says so,
instead of downloading them for nothing. In a git checkout the flag is
refused, because git owns those files there.
An update from a shell on the host checks the right addresses. The
checks at the end of an update asked addresses that exist only inside the
updater, so from a shell on the host an update that had gone fine rolled
itself back unless four settings were set by hand. The update now checks
this host's own ports, and so does scripts/rollback.sh. The four settings
still override them.
A failed update rolls back while the new version runs. When an update failed after the new version had started, the automatic rollback could not restore the database while that version still used it, and gave up with the database unchanged. It now stops the new version first, as a rollback by hand already did, and starts it again if the database cannot be restored.
1.2.345
minor
2026-10-07 19:48
The host check lists every problem at once. Run
bash scripts/preflight_host.sh before you install: it now runs every
check and lists each problem with its fix in one report, so a single run
tells you everything to change. It changes nothing on the host. Before,
run with sudo, it also raised vm.max_map_count and net.core.rmem_max;
now it reports a low value with the commands that raise it and keep it
after a reboot, and the installer raises it during the install, as before.
When vm.max_map_count is already high enough, the installer now also
saves it in /etc/sysctl.d/99-atlaseye.conf, so that it survives a
reboot; it never lowers a value already saved there. If you accept a
failed check, for example less RAM than the hard floor on a test host, run
the check with --ignore-check=ram: that check is listed as ignored and
counts as a warning. The os, arch, curl, docker and compose checks cannot
be ignored. The check exits 0 when the host is ready (with or without
warnings), 1 when it is not, and 2 on a wrong option. On a host that
already runs AtlasEye, running this check with sudo no longer raises
net.core.rmem_max: if it reports that value as low, run
sudo sysctl -w net.core.rmem_max=8388608, add the line
net.core.rmem_max=8388608 to /etc/sysctl.d/99-atlaseye.conf, then run
sudo docker restart atlaseye-syslog.
Check a host before you buy. The host check is now one file that
anyone can download, with no login and no licence. On the host you plan
to use, run
curl -fsSLO https://license.atlaseye.eu/portal/static/atlaseye-preflight.sh
and then sudo bash atlaseye-preflight.sh. It changes nothing on the
host, and the downloads page shows it as its first step. To check the
host against the size you need, add --profile with lab, small,
medium or large, or --devices with your number of devices (and
--eps with the average syslog messages per second you expect). Add
--offline on a host without internet access, and
--proxy http://HOST:PORT when the host reaches the internet through a
proxy. Section 2 of INSTALL.md lists every requirement it checks, with
the ports and the proxy setup.
The host check finds more, and the installer stops on more. The check now also looks at the kernel version, how Docker is installed, Docker's storage driver, data directory and cgroup version, SELinux, the disk type, the clock and its NTP synchronisation, an active ufw or firewalld (the ports Docker publishes pass by them), and every port AtlasEye uses. Each problem is listed with the commands that fix it. The installer now stops on each of these, where before it went on:
imudp and imtcp, in /etc/rsyslog.conf or
/etc/rsyslog.d/), then run sudo systemctl restart rsyslog.podman-docker package), rootless Docker or
the Snap package of Docker. AtlasEye needs Docker Engine run by the
system daemon; the check prints the commands that install it on your
distribution.sudo systemctl restart docker.A port that a running AtlasEye container holds passes, so the check also
runs on a host that already runs AtlasEye. To go ahead in spite of one of
these, run the installer or the check with --ignore-check=ports,
--ignore-check=docker-variant, --ignore-check=docker-engine or
--ignore-check=selinux; the Docker Compose check cannot be ignored.
Without --offline, the check also fails when the licence portal or an
image registry cannot be reached over HTTPS, when the clock is more than
300 seconds off, or when the check goes through a proxy that Docker does
not use.
- Offline updates check before they change anything, and keep a log.
Before it touches your installation, scripts/update_airgap.sh now checks
Docker, Docker Compose 2.23 or later and curl, and then the free space on
the disk that holds Docker's data: it needs the size of the update images
plus a margin. Before, it asked for a fixed amount in all, however large
the images were. UPDATE_MIN_FREE_GB in .env now sets that margin, in
whole GB; the sizing table in INSTALL.md gives the default. For Apply
Update the same setting is still the whole free space it needs, because
Apply Update cannot know the size of what it downloads. UPDATE_DISK_MOUNT
still moves Apply Update's check to another mount point; an offline update
no longer uses it, because it loads the images onto Docker's disk, and it
warns when the setting is there. Everything the update prints also goes to
a log under /var/log/atlaseye. When it stops, it says at which of its 12
stages, whether your running version changed, and where the log is.
- Offline updates check the whole system and roll back on their own.
After it recreates the services, an offline update now waits for the
gateway, the application behind it and every container, as the installer
does. Before, it waited only for the gateway, which answers even when the
application does not. When the gateway or the application never answers,
for example after a failed database migration, or the software integrity
check fails, it puts the previous version back by itself, database
included, and saves the failed version's logs in the update log, with
passwords and tokens masked. The message says whether the rollback
finished. It does not roll back when you set AIRGAP_NO_AUTO_ROLLBACK=1 to
keep the new version for diagnosis, or when the snapshot comes from an
earlier run of the same update: restoring that one would also delete
everything written since, so the message gives its age and the command
instead. When the new version answers but a container is not healthy, or
Docker Compose reported errors, the update stays in place and exits with
code 2; running it again is safe. After an automatic rollback, do not run
scripts/rollback.sh: it would restore the snapshot again, and anything
written since would be lost.
- AtlasEye can reach the internet through a proxy. If your server
reaches the internet only through a proxy, set ATLASEYE_OUTBOUND_PROXY in
.env to http://host:port (https:// for a proxy that speaks TLS) or
http://user:password@host:port. In the user name and password,
percent-encode every character other than a letter, a digit or - . _ ~
(@ is %40). Licence activation and checks, Check now, the hourly update
check and Apply Update then reach the licence server through it, and so do
Telegram, Turnstile, Cloudflare DNS and GoDaddy. Your devices, Prometheus,
OpenSearch, Proxmox, single sign-on, webhooks and AI providers stay
direct. The weekly GeoIP download has two settings of its own,
GEOIPUPDATE_PROXY (host:port) and GEOIPUPDATE_PROXY_USER_PASSWORD
(user:password), described in "Updates behind a proxy", section 6 of
INSTALL.md. Docker downloads the update images itself and needs
its own proxy: see "Behind a proxy" in section 2 of INSTALL.md. A value
that is not a proxy URL keeps the application and the monitoring worker
from starting, and stops Apply Update before it changes anything; the
message never shows the value, which can hold a password. When the licence
server cannot be reached, the licence banner now points to this setting.
- What to do after this update. Nothing, unless your server reaches the
internet only through a proxy. Then set ATLASEYE_OUTBOUND_PROXY in .env
and recreate the application and the monitoring worker with the command in
"Updates behind a proxy", section 6 of INSTALL.md: a restart does not read
.env again. Apply Update reads it on every run. For the weekly GeoIP
download, set GEOIPUPDATE_PROXY too; the same section has the command
that applies it.
- Going back after an update stops safely when it cannot tell whether the
database was restored, and the senders list says when it cannot name the
senders. If the database restore of a rollback ends without showing
whether it went through, for example after a lost connection, the rollback
now leaves the services stopped and tells you to run it again, instead of
starting them on a database that may hold only part of the backup. Running
it again restores the whole backup. It also stops before it changes anything
when it cannot read which services are running. In Syslog settings,
"Senders over the limit (last hour)" now says the list is not available when
the syslog collector counts senders over the limit but cannot name them,
instead of showing that no sender went over the limit.
- Settings β Updates shows the notes of every release an update brings.
When an update skips releases, the release notes now list each release
under its own version heading, newest first, below a line that says how
many releases the update brings. Before, only the newest release's notes
showed and the others were under All releases. The list starts with the
first update published after this release; for anything it does not cover,
All releases still has the full history.
- Alert mails no longer slow down the alert receiver. Alerts from the
monitoring stack are now accepted at once and mailed right after, so a slow
mail server no longer makes the receiver look slow and no longer raises false
"slow /webhook" warnings. Slow-request alerts name the full address of the
slow request again, and problem reports name the address of each failed
request again instead of "[unmatched]".
- Container log limits, and a horizon for the sign-in history. Settings β
System β Container log limits sets the size of one log file and the number of
log files kept for every container AtlasEye runs, 50 MB and 3 files unless
you change them. The containers of the AtlasEye host take new limits at the
next update you apply from AtlasEye. cAdvisor and the exporters that AtlasEye
installs on a monitored host take them when AtlasEye installs or sets them up
again; the manual cAdvisor command on the Containers tab carries them too.
The card lists each container of the AtlasEye host with its log settings, and
two new alerts warn when one of them writes its log without a size limit, or
when AtlasEye can no longer check. History Retention has a new row, Sign-in
history: kept 730 days unless you change it, and sign-ins that still count
toward an account lockout are never deleted.
- HTTPS with Docker user namespace remapping: a key that another user
owns is fixed too. With remapping, a private key that a user other than
root owns and only that user can read was left as it was, with a warning,
even when that user was not the web server's user, and then HTTPS did not
come up. One such key is a key given to user 101, which the guides used to
say for every server. When /etc/subuid and /etc/subgid both have a line
for dockremap, Docker's default remapping user, installing and updating,
online or air-gapped (scripts/update.sh or scripts/update_airgap.sh), now
leave such a key as it is only when the web server's user owns it. Any
other key is changed from inside a container; when that container cannot
change it, a warning gives the commands, with the owner the key needs.
Without those lines the key stays as it is, with the warning, as before.
The installation guide, the admin guide, the air-gap guide, .env.example
and the HTTPS steps of the Help now send servers with remapping to the
owner the key needs.
- Backups that retention cannot delete are reported. When backup
retention cannot delete an old scheduled backup, for example because of
its file permissions, the log of the monitoring worker, which runs the
retention (docker logs atlaseye-monitoring-worker), now names the
backup and the kind of error, and the entry of that retention run in the
audit log lists it as failed. Before, the backup stayed on the disk
without a word. Retention tries it again at its next run.
- The disk space warning shows the right unit. The banner that warns
when the server's disk fills up gave its sizes in GB, but they are GiB
(1 GiB is 1024 Γ 1024 Γ 1024 bytes, about 7% more than 1 GB). It now says
GiB in every language. The dialogs that refuse Apply Update, when the disk
is 95% full or more or when it has less free space than an update needs,
give the sizes in GiB too.
The installer checks the host before it uses your licence. The
connected installer now checks the host first, against the size you
choose. When the host is not ready, it stops before it uses your licence
key or downloads anything: fix what the report lists, then run the same
command again. To check a host without installing, run
bash atlaseye-install.sh --check. It needs no licence key and changes
nothing on the host.
One run of the installer asks every question first. The installer
asks all its questions before the long steps start: the size of the
install, your licence key (connected install only) and the address users
will open. After the last answer it finishes on its own. For an
unattended install, give the answers as options or environment variables
instead, as INSTALL.md section 3 describes.
A failed install can be run again with the same command. When an
install stops part-way, run the same command again: it picks up where it
stopped and keeps what the first run set up, the generated passwords
included. Run the installer inside tmux or screen, so that a dropped
SSH session does not stop it.
Every install writes a log. Each run of the installer writes
/var/log/atlaseye/install-<date and time>.log, readable by root only,
and prints its path at the start and at the end. Attach it when you
contact support. The admin password is never written to the log: it is
shown on the terminal only. An install run without a terminal writes it
to the file INITIAL_ADMIN_PASSWORD in the install directory instead,
readable by root only. Delete that file after your first sign-in.
The installer asks for the address users will open. A new install
asks for its address, such as https://atlaseye.example.com (Enter takes
this host's name), or takes it from --url. AtlasEye uses it as its
Public App URL, the address in the links it sends, and names it in the
self-signed certificate it creates. An unattended install without --url
takes this host's name and warns. To change the address later, see
"Changing the address" in INSTALL.md section 4.
A new install is sized for your network. The installer asks how many
devices you will monitor and how many syslog events per second they send
on average (Enter estimates the rate from the device count), or takes
--profile. It then sets the database, search and metrics settings of
the profile that covers both, from the sizing table in INSTALL.md, and
checks the host against that profile. Enter at the first question picks
the largest profile this host can run. An existing install keeps its
settings; to change the size later, run
sudo atlaseye profile set <profile>.
Factory reset asks for the new admin's password. System Reset
(Factory Defaults) now asks for a temporary password for the admin
account it creates again, and checks it against your password policy
before anything is deleted. The admin changes it at the first sign-in.
Before, the new admin got the password from the installation's .env
file, which stays in that file and in every backup.
Air-gapped hosts: the container log limits are checked first. An
air-gapped host does not get Settings β System β Container log limits:
you set ATLASEYE_LOG_MAX_SIZE_MB and ATLASEYE_LOG_MAX_FILES in .env
by hand. update_airgap.sh now checks them before it loads the new
images, and install_airgap.sh before it starts the first container. A
value out of range stops the command with the line to fix, instead of
failing half way through the update.
Air-gapped hosts: going back asks first whenever the new version
stayed. The rollback.sh command an air-gapped update prints when it
leaves the new version running (after a success, after a warning about a
container that is not healthy, or after a failure it did not roll back)
now asks you to type ROLLBACK first, stops the newer services before it
restores the database, and cannot run a second time once it has gone
back. Before, outside a clean success, it went back without asking and
without stopping the newer services first.
The installer sets up your proxy. When your server reaches the
internet only through a proxy, give it to the installer with
--proxy http://host:port, or in ATLASEYE_PROXY as section 3 of
INSTALL.md describes. The installer downloads through it and, on a new
install, writes it to .env as ATLASEYE_OUTBOUND_PROXY, so AtlasEye uses
it from the first start. A value AtlasEye would not accept stops the
installer before it downloads anything. An existing install keeps its
.env: to change the proxy there, see "Updates behind a proxy", section 6
of INSTALL.md. Docker still needs its own proxy setting: see "Behind a
proxy" in section 2 of INSTALL.md.
New atlaseye command on the host. Jobs that took a long
docker compose command or a hand edit now take one command, run with
sudo from any directory. sudo atlaseye status checks the containers,
the health checks, the certificate and the disk. sudo atlaseye doctor
also checks the host and the required settings in .env, and names the
next command for each problem it finds. sudo atlaseye logs api shows
the log of one service with secrets masked.
sudo atlaseye support-bundle writes one file for a support ticket to
/var/log/atlaseye, with secrets masked. It never leaves the host by
itself: you decide whether to send it. A password in .env shorter than
6 characters is too short to mask: sudo atlaseye doctor names each
one, so change it, or check the bundle for it before you send it.
sudo atlaseye cert install --cert FILE --key FILE checks your own
certificate, installs it and puts the previous one back if the gateway
does not serve the new one; cert self-signed renews the generated
certificate and cert show shows the installed one.
sudo atlaseye profile shows the sizing profile in use, and
sudo atlaseye profile set medium resizes the install to another
profile: it checks the host first and lists what restarts and what can
be deleted before it changes anything.
sudo atlaseye reset-admin status shows the state of the admin accounts,
and reset-admin unlock or reset-admin reset lets an admin back in
when nobody can sign in. sudo atlaseye recovery-kit saves .env and
the certificate in one encrypted file to keep off the host.
sudo atlaseye compose ps, or any other compose command, runs against
the files of your install from any directory. compose config prints
every value in .env, passwords included: keep its output to yourself.
sudo atlaseye uninstall --keep-data stops AtlasEye and keeps its data,
for a move to a new host; sudo atlaseye uninstall --purge deletes
AtlasEye with all its data, backups stored on the host included, after
you type PURGE. INSTALL.md Β§5, Β§7, Β§8 and Β§10 show each command in
use. On an install you update in the app, run this once, with your
install directory in place of /opt/atlaseye:
sudo bash /opt/atlaseye/scripts/atlaseye link. It puts the atlaseye
command on the path. Run the same command whenever the shell answers
atlaseye: command not found.
A setting the server refuses at startup is no longer repeated in its
log. When the server refused a password or key in .env because it
was too short or still the example value, its error message showed the
value itself. It now names only the setting and the reason.
HTTPS with Docker user namespace remapping: the key is given to the
web server's user when a container cannot do it. On a server with
remapping, a container cannot change a private key that root owns, such
as one that root has just written, so installing or updating ended with
a warning and the web server could not read the key. When /etc/subuid
and /etc/subgid have lines for dockremap, Docker's default remapping
user, installing and updating now give the key to the web server's user
from the host and print the owner they gave it, and so do
sudo atlaseye cert install and cert self-signed. With another
remapping user, section 5 of INSTALL.md shows how to put the
certificate in place by hand.
Security update for a bundled library. AtlasEye now ships multidict 6.9.1, a library its Python services use to hold HTTP headers. It fixes a published security advisory about a memory leak. Nothing changes in how AtlasEye works.
1.2.344
minor
2026-10-04 12:41
1.2.343
minor
2026-10-04 10:43
A browser that saw a redirect loop during an outage now recovers by itself. During such a loop a browser can store the redirect and keep using it after the server is fixed. Parts of the app then kept failing in that browser until its cache was cleared, for example showing "No license activated" on a licensed installation. When a request fails that way, the app now sends it once more past the browser's cache, which also replaces the stored redirect, so the browser recovers on the next request without anyone clearing its cache.
Changes are no longer refused as read-only right after a licence is activated. Right after a licence was activated, for example on a new install, some changes such as adding a device could be refused for minutes with a "License required" message, although Settings β Licensing already showed the licence as active. Scripts that call the API got "unlicensed: read-only mode β activate a license to make changes". Changes are now accepted within a second of the activation.
Old syslog can now be archived automatically every night. Until now
the Archive retention action kept every day of syslog in search, so the
log store grew until the disk was full and new logs stopped. In Syslog &
Security β Security Settings, Retention Policy, with Auto-lifecycle on,
set the action to Archive and switch on Archive automatically. Once a
day from 03:30 UTC, each day of logs older than the retention days is
written to an archive file, the file is read back and counted, and only
then is that day deleted from search; up to 10 days a night, oldest first.
Before it saves, the card shows what is due now (the number of days, their
size, the free space for the files and the nights it needs) and asks you
to confirm. Delete archive files after (days) deletes the automatic files
once their logs are that old, for the storage limitation of GDPR, in every
mode, also with Archive automatically off; 0 keeps them. Setting or
shortening it first shows how many files it deletes and their size, and
asks you to confirm. The files are listed in Administration β Backup & Archive with Source
Automatic and their size. They are the only copy of those logs and they
stay on this host, so download them there, or copy them off the host with
docker cp atlaseye-api:/app/backups/. <dir> as you do with your backups.
When the disk lacks space for the next file, the run
stops there, keeps that day in search and says so on the card, and an alert
warns when archiving has not finished cleanly for two days. Nothing changes
until you switch it on: a new install still deletes logs after 30 days, and
an update keeps your current setting. Archive + Delete is no longer
offered; a policy saved with it keeps deleting as before.
An archived day can go back into search. In Administration β Backup & Archive, Restore to search loads an archive file, automatic or one you made, into its own copy that Log Explorer searches with the rest, and the row shows Restore running while it loads, then In search. Remove from search deletes the copy and keeps the file. Retention and archiving never delete a restored copy; Manual Purge deletes matching logs from it too. Until now a restore needed an outside tool.
Behind a proxy or CDN that handles HTTPS, the site no longer loops. While
HTTPS is on, plain http to port 80 is sent on to https. A proxy that handles
HTTPS itself and talks plain http to this server had its own traffic sent back
to https, so every page loaded in an endless loop. Such a request now goes
through when it says it came over https: an X-Forwarded-Proto: https header,
which most proxies and load balancers send, Cloudflare's CF-Visitor, or
Forwarded: proto=https. GATEWAY_HTTP_REDIRECT=false is now needed only
behind a proxy that sends none of these. If the update warns that your
compose files do not pass that setting to the gateway, set
TLS_ENABLED=false instead.
Apply Update now checks the sign-in page the way visitors reach it. It
checked only the application behind the gateway, so an update could report
success while visitors got nothing but redirects. It now opens the sign-in
page through the gateway, over http the way a proxy does and over https when
HTTPS worked before the update. If the page answered before the update and no
longer does, the update is rolled back; if it did not answer before either,
the update reports a warning, because a rollback cannot mend that. The
air-gapped update does not have this check yet. When BASE_URL in .env is
a public address, the update also opens it before and after: a redirect loop
that came with the update rolls it back, and any other problem with that
address is reported as a warning, because it can fail for reasons outside
this server.
You can go back after an update that succeeded. Until now an update
applied with Apply update left no way back once it finished, even when
the site turned out broken afterwards. Now the last lines of the update log name a command that goes
back to the previous version; run it on the host:
cd /opt/atlaseye && sudo bash scripts/rollback.sh. It restores the
database backup taken when the update started, so everything written to
AtlasEye since then is lost: settings, devices, users, alerts, incidents and
their history. Before it changes anything it shows when the update
finished, the version it goes back to and how old the backup is, and asks
you to type ROLLBACK; anything else cancels. While it goes back the site is
down: it stops the newer version right before it restores the database,
and the site answers again once the previous version has started. If it
fails after the database was restored, it says so and what running it
again does: normally that only puts the previous version back, without
restoring the database a second time.
It works once, and only until the next update starts. Keeping it costs
disk space: one set of the previous version's images stays on the host
until the next update that succeeds. INSTALL.md section 6 shows how to see
that set, and how to give up the way back to free the space. The update to
this version cannot itself be undone this way; every update after it can.
An update run with SKIP_BACKUP=1 leaves no way back, and neither does an
update applied with Apply update that failed and put itself back. On an
air-gapped install, going back after a successful update now asks the same
question first.
A burst of UDP syslog is no longer lost without a trace. The host's
kernel could drop a burst of UDP syslog before AtlasEye read it, and nothing
in the product showed that it happened. The syslog collector now asks the
kernel for a larger receive buffer, the installer raises the host limit that
caps it (net.core.rmem_max), and a new metric, syslog_udp_rcvbuf_errors,
counts any drop that is left. To read it on the host, run
curl -s 'http://127.0.0.1:9090/api/v1/query?query=syslog_udp_rcvbuf_errors'.
A new install sets this up for you. On an existing install, run
sudo bash scripts/preflight_host.sh once in the install directory, then
docker restart atlaseye-syslog. If the preflight stops on another check
before this one, raise the limit by hand: run
sudo sysctl -w net.core.rmem_max=8388608, add the line
net.core.rmem_max=8388608 to /etc/sysctl.d/99-atlaseye.conf, then run
docker restart atlaseye-syslog.
A new install opens a guided setup page after the first sign-in. Seven steps take you through what a new install needs first: activate the licence, name the install, add a notification channel, protect admin sign-in, turn on backups, add the first device and limit who may send logs. Each step shows what is already in place and opens the page where the rest is done, and you can skip any step and come back to it later. The page opens by itself only for an admin with Full Access, and only on an install that has no device yet, so an install that is already in use is not interrupted. Once someone chooses "Don't open this page automatically", it never opens by itself again. You can always find it under Help & Features β Getting started, which now also shows a Full Access admin which of its steps are done. On this page and in Settings β General, the time zone list now offers UTC at the top.
Full admins see the setup and security work that is still open. After this update, full admins see a "Setup and security" card at the top of the Dashboard. It lists the same checks as the setup page: what is still open, why it matters and the button that fixes it. When everything passes, the card shrinks to one line. While items are open, you can fold it. The other pages show a banner for four problems only: an expired gateway certificate, a certificate that expires within 14 days, a syslog collector that accepts every sender, and alerts that have no active notification channel to go to. Only one banner shows at a time, only once a licence is active, and closing it hides it in that browser tab until you close the tab. When no notification channel is active, a device page no longer says "Using all active channels": it says that the alerts of that device reach no one. On an install that is already in use, nothing opens by itself. Help center β Guides by page β Setup and security status explains every check.
1.2.342
security
2026-10-02 01:09
SYSLOG_ALLOWLIST_MODE=strict
or ATLASEYE_ENV=production only in the shell that runs docker compose
and not in .env, add SYSLOG_ALLOWLIST_MODE=strict to .env before you
update: the update reads only .env to tell whether your collector accepted
only listed senders. Where every sender is accepted, the allowlist card now
warns about it and offers Add senders seen recently: it shows up to the
100 busiest devices that sent syslog in the last 7 days, with private
addresses (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) already
selected, and adds the ones you pick as one change: the collector applies
all of them at its next sync, and if the save fails, none is added. Public
addresses are marked and left unselected, because a sender address is easy
to forge over UDP; shared (CGNAT), loopback and link-local addresses are
marked and left unselected too. When more devices sent syslog than it shows,
it says so: add the others with Add IP / CIDR, where one CIDR entry
covers a whole subnet. Once one sender is listed, syslog from every other
address is dropped. The card counts the senders the collector applies. A
change takes effect after the collector's next sync (about two minutes with
the default settings); until then the card shows both numbers, and if they
still differ after that, it tells you where to read the collector log.More Syslog Settings messages are translated. The error messages of the Syslog Alerts, AI Log Analysis, Custom Watch Patterns and Weekly Security Report cards, and the messages when you add or remove a sender or a source time zone, appeared in English whatever your language; they now use your language. In Arabic, those four cards are translated too, and Help names their controls as the page shows them.
Your install always keeps one Full Access admin. The last active Full
Access admin can no longer be moved to another role, disabled or deleted
from the Users page or the API. If a single sign-on group change would
demote that account, the sign-in is refused instead. The Users page no
longer lets you change your own role, and it says why when it refuses a
change. If no Full Access admin can sign in at all, for example after a
lockout, a forgotten password or a lost authenticator, whoever runs the
server can now unlock or reset the account from the host, starting with
docker exec atlaseye-api python -m app.scripts.admin_recovery status
(see Help, Server runbook, and INSTALL.md Β§7). A reset prints a one-time
password once and is recorded in the audit log.
AUTH_LOCKOUT_DURATION_SECONDS in
.env, keep it at least as long as AUTH_LOCKOUT_WINDOW_SECONDS; the
defaults (900 and 600 seconds) already are, and a change takes effect
when the api container is recreated. The server now warns when it starts
if the lockout is shorter.Refused single sign-on attempts appear in the sign-in history. When single sign-on refuses a sign-in, for example because it would demote the last Full Access admin or the local account could not be created, the attempt is listed on the Access Events page with its reason. Failed single sign-on attempts no longer count toward the password lockout.
You now get a warning before your licence ends. Admins with the full role see a notice at the top of every page from 30 days before a paid licence ends, which turns into a warning in the last 7 days; you can close it for the rest of the browser session. Monthly subscriptions renew themselves and get no advance notice, and a subscription gets one day after its end date to renew before any warning shows. Once a licence has ended, the banner says until when everything keeps working (three days by default) and turns red when paid features switch off. Air-gapped installations renew only with a file from the vendor, so they get the notice even on a monthly subscription and the warning as soon as the licence ends, and are told to request that file. Trials keep their own countdown. If your licence ends within the next 30 days and is not a monthly subscription, or has already ended (more than a day ago, for a subscription that renews itself), the banner appears as soon as this update is installed.
Every Licensing card explains itself. The License Status, Request a License, Activate License and offline cards now have a β in the header. It says what the card's buttons do. For the 14-day demo, it says that while the vendor approves trials by hand, which is the default, the licence server refuses the request and points to the customer portal, the name the Licensing help and the payment reminder now use for it as well. For offline activation and renewal, it names every field the request contains, says that neither step contacts the licence server, lists what is checked before the licence changes, and says that a renewal replaces the active licence completely, its key included.
Every sidebar entry has its own icon. Devices and Topology under Monitoring now have icons like the rest of the menu, and no icon appears twice: pages that shared one, such as the five that showed a globe, now each have their own. Icons that looked almost the same, such as two shields with a tick, were replaced as well.
Syslog from devices that use the older message format is no longer lost for the rest of a day. When a device using the newer syslog format sent the first message of a day, messages from devices using the older format could be rejected until the next day, and they were not kept. Both formats are now stored. The change applies from the next day's log index after this update. The day changes at midnight UTC. Log indices from before the update, including ones restored from a backup taken before it, can still refuse older-format messages dated on their day until retention removes them. The syslog collector no longer waits for the search database before it starts receiving messages. If the search database is not reachable at startup, the collector waits about a minute, plus the time its last attempt takes, for the database to take the new settings before it stores anything; messages received meanwhile wait in its buffer, in memory and then on disk, as during any database outage. After that it stores messages anyway and applies the new settings within about a minute of the database answering. If the search database is not reachable for more than about a minute when the syslog collector starts, the messages of the day it comes back can be stored without the new settings; on a new install the World Map and the IP filters then miss that day's messages. Later days are not affected.
Sizing guidance for your AtlasEye host. INSTALL.md and the air-gapped install guide now describe four host profiles, lab, small, medium and large, for 50 to 2,500 devices, each with the CPU, memory and disk it needs and the settings it uses. Pick the smallest profile that covers both your device count and your average syslog rate. Medium is provisional until a load test measures it, and large is planned. The older capacity figures in the guides, which were never measured, are gone. The security monitoring guide no longer mentions a TLS syslog listener: AtlasEye receives syslog over plain UDP and TCP only.
scripts/preflight_host.sh now refuse a host with less than 5.5 GB of
memory, 2 vCPU or 30 GB of free disk for Docker, and warn below 8 GB of
memory, 4 vCPU or 136 GB of free disk. Before, they refused a host below
3.5 GB of memory or 15 GB of disk. An installation you already run is not
checked again when it updates..env to change the limit, or UPDATE_DISK_MOUNT to
check another mount point.Your settings stay as they are. The profiles come with new .env
settings for the search engine's memory, the database, metrics retention,
the API workers and the syslog queue. Each one defaults to the value
AtlasEye used before, so the values in effect stay the same. The first
update restarts the database container once to apply its new start-up
settings. If you tuned the database's shared_buffers or max_connections
inside PostgreSQL itself (in postgresql.conf or with ALTER SYSTEM), move
the value to POSTGRES_SHARED_BUFFERS or POSTGRES_MAX_CONNECTIONS in .env
before you update: AtlasEye now sets both when the database starts, and
that setting wins. To size an installation for a profile, follow "Sizing"
in INSTALL.md.
Syslog can no longer stop after about a year on a single-node install. OpenSearch writes a security audit-log index every day: its own record of access to the search engine, not the AtlasEye audit trail under Administration β Activity Log. On a single-node install it asked for an extra copy of each of these indices, which one node can never hold, and it never deleted them. After about a year the node would reach its limit of 1,000 shards and stop creating the daily syslog index, and new logs would have nowhere to go. From this release AtlasEye removes the extra copies and deletes OpenSearch audit-log indices older than 30 days. This happens automatically after the update, and the OpenSearch cluster status turns green. Installs that use an external OpenSearch cluster with several nodes are not changed.
Old alerts, incidents, notification history and DNS snapshots are now deleted automatically. These four kinds of history used to be kept forever, so the database kept growing. A daily sweep now deletes resolved alerts older than 730 days, resolved or closed incidents older than 730 days, notification history older than 180 days and DNS snapshots older than 90 days. A DNS snapshot's age counts from the moment a newer snapshot of the same zone replaced it, so every state a zone had in the last 90 days (or the number of days you set) stays restorable. A deleted snapshot takes with it its restore point, the "Diff vs previous" comparison against it and its DNS marker on the Web Analytics traffic chart, which always lies before the period you keep. On an installation you update, nothing is deleted straight away: the first sweep runs about an hour after AtlasEye starts and only opens a 7-day grace period. When the grace period ends, the next sweep deletes everything older than these limits, which on a long-running installation can be years of history, and it cannot be undone. On a large installation that clean-up runs in short steps once an hour until it is done, so it never holds up AtlasEye's other scheduled work for long. Never deleted, whatever their age: open and acknowledged alerts, alerts linked to an incident, incidents still in progress, NIS2-reportable incidents, incidents with a NIS2 report already filed and the newest snapshot of each DNS zone. The audit log is not affected. To keep more, change the days in Settings β System β History Retention, or turn Auto-delete off on a row to keep it forever. Do it before the grace period ends; the card shows the date.
The syslog Retention Policy now says what each mode does. The texts under Syslog & Security β Security Settings promised automatic archiving, which AtlasEye does not do. "Archive" never deletes or archives anything by itself, so the disk keeps growing until you export old logs in Administration β Backup & Archive and purge them, or choose "Delete". "Archive + Delete" deletes logs after the retention period exactly like "Delete", without keeping a copy first. Nothing about how retention works has changed: only the texts are new.
Syslog retention no longer reports a false sync failure. On a fresh
install the API could log "Failed to sync ISM policy" while it set up
the retention policy, and saving the Retention Policy while another
change was being stored could say the OpenSearch sync failed. In both
cases the policy is now stored and applied to the syslog indices at
once. The description of that policy in OpenSearch (syslog-retention)
now also says what the selected mode does. Retention itself works
exactly as before. If the sync does fail, Save stays enabled, so you can
retry it at once without changing a field first.
Metric history takes less disk space. The update removes database indexes on the metrics table that duplicated other indexes. On long-running installations this frees disk space (about half a gigabyte on our test installation). No data is removed, and charts and reports show the same history as before. The first start after the update can take a little longer while the indexes are dropped. If one of the other metrics indexes is missing or was left unfinished by an interrupted earlier update, the update keeps the index that per-device charts fall back on and says so in the server log, naming the index and how to repair or recreate it.
Web Analytics now logs every retention pass and raises an alert when old
data is not being removed. Nothing about what is kept or deleted has
changed. Each daily pass writes one summary line starting with
[retention] sweep to the log of the Web Analytics ingest service
(docker logs atlaseye-weblytics-ingest), also when it has nothing to
delete or skips because no site is synced. That line replaces the two old
ones, [retention] sweep done: {...} and [retention] no synced sites β
sweep skipped: if you search your logs for those, search for
[retention] sweep instead. Each deleted daily index is still named, now
on its own [retention] dropped index line. The new alert, Web Analytics
is not deleting old data, reaches your alert channels when an old daily
index is still there after a pass, or when no pass has succeeded for two
days. A pass in which deleting a site's old visits failed does not count
as a success. That delete may now take up to an hour before it counts as
failed; before, a large one was logged as failed after 10 seconds.
Restarting the ingest service neither restarts the two days nor clears the
alert, unless it keeps restarting within about five minutes of each start,
before its first pass. A restart after which Web Analytics cannot load its
site list for 10 minutes or more can start the two days again. It stays
quiet while no site is set up, and the two-day check starts two days after
this update. The ingest service no longer writes a log line for every
visit it receives, so its log no longer records the page address and
browser details of each visit, and those lines no longer push the daily
summary out of the log. Errors are still logged. The gateway no longer
writes an access-log line for these visits, or for each load of the
tracking snippet, either, so the visitor's IP address, page address and
browser details are no longer written to its access log. Its error log
no longer records the IP address and page address of a visit it turns
away, or of one that arrives while the analytics service restarts.
If you edited the Prometheus alert rules on your server, the update keeps
your file and puts the new rules in a copy beside it whose name ends in
.release; the alert arrives once you take that copy.
Security updates for three bundled libraries. AtlasEye now ships urllib3 2.8.0, the HTTP library its Python services use; axios 1.20.0, the library the web interface uses to talk to the server; and React Router 6.30.6, which moves the web interface from page to page. Each of these releases fixes published security advisories. Nothing changes in how AtlasEye works.
New installs back themselves up every day. A new install now takes one full backup a day, at the first backup check after 03:00 UTC, without anyone editing a file. The check runs about hourly on an idle server and less often on a busy one. The first backup comes at the first check after the install, or after turning the daily backup on; if that check falls between midnight and 03:00 UTC, it comes at the first check after 03:00 UTC instead. An install you update keeps its current setting.
.env file decided. A user
with Full Access can turn it on or off there; turning it off asks first.
The Backups card on Backup & Archive warns while it is off. If you updated
from an older release, check it: it is off unless someone turned it on.The disk warning names the one thing it blocks. At 95 % disk use AtlasEye refuses Apply Update until you free space. The warning banner and the Help said restores and resets were blocked too. They are not, so you can still restore a backup or reset the system to recover.
Plain http now redirects to HTTPS. When AtlasEye serves HTTPS itself,
which a new installation does from the first start, opening an http://
address now takes you to the same https:// address, so nobody signs in
over an unencrypted connection by accident. With the self-signed
certificate a new installation starts with, the browser warns about the
certificate until you install a trusted one (INSTALL.md section 3).
Uptime monitors that check /health, website tracking and Service
Manager agents keep working over http. Service Manager agents you add
while the self-signed certificate is in use talk to AtlasEye over http
on port 80; after you install a certificate from a public certificate
authority, enroll them again to move them to https. With a certificate
from your own certificate authority, set AGENT_CALLBACK_BASE_URL in
.env to the https:// address agents should use (INSTALL.md section 5).
If the certificate cannot be used, AtlasEye keeps serving http as before
instead of locking anyone out.
TLS_ENABLED=false in
.env, and set BASE_URL to the https:// address your users open,
before you install this update. Otherwise browsers are sent back and
forth in a loop. Also list the load balancer in GATEWAY_TRUSTED_PROXIES
(next item). That setting takes effect only with this release's compose
files: after the update, check that they are in place. The update warns
when they are not. INSTALL.md section 5 has the steps and the check.GATEWAY_TRUSTED_PROXIES. Before, any machine on your network could make
its requests look as if they came from another address. Until you set
it, the audit log and active sessions show the proxy's address, all users
behind the proxy share one sign-in limit and one API request limit,
brute-force alerts name the proxy's address instead of the attacker's,
and website tracking cannot tell which country a visitor is in. AtlasEye
also learns from those proxies whether the visitor used https, so behind
a load balancer that handles HTTPS, sign-in cookies are marked secure.
Behind a reverse proxy that has its own certificate, Service Manager
agents you add are given its https:// address once the proxy is listed
there; until then they are given an http:// address on port 80 of the
proxy. INSTALL.md section 5 has the steps.scripts/update.sh from a shell on the server. Apply Update
cannot reach HTTPS from its own container, so its log says "HTTPS not
checked": open AtlasEye at its https:// address once it has finished.Tighter HTTPS settings. The private key of the HTTPS certificate can be read only by its owner, on new installations and after every update. Without Docker user namespace remapping, an update gives the key to the web server's user with that owner-only mode, whoever owned it. With remapping, a key that a user other than root owns and only that user can read stays exactly as it is, and the update warns that HTTPS works only if that user is the web server's user on this server; any other key is changed only from inside a container, where the web server's user is the right one. That container cannot change a key that root owns: the update then warns and gives the commands, with the owner the key needs when Docker uses its default remapping user, or how to work that owner out. When the update cannot ask Docker whether remapping is on, a key that a user other than root owns and only that user can read also stays as it is, and a warning gives the commands to fix it unless the web server's usual user owns it. Apply Update is not supported with remapping, because its updater container is remapped too and cannot use the Docker socket: update such a server with scripts/update.sh from a shell on the server, which does all of the above; installing does the same with a key already in place. The certificate itself is changed only when the web server could not read it; with remapping, when the web server's user cannot be told, a certificate that not every user can read is made readable to all, which is safe for a certificate. When the certificate is in a folder outside the installation folder, Apply Update cannot see it: its log says so and gives the command that checks the files from a shell on the server. Browsers are told to use HTTPS for AtlasEye itself, no longer for every other name under your domain. The outdated X-XSS-Protection header is gone, a Permissions-Policy header blocks camera, microphone and location access, and responses no longer show the web server version.
See whether your AtlasEye host still fits its size. Full admins get a Capacity card on the About page: the sizing profile the installation runs and whether the host meets its minimum, how many devices and syslog events per second it handles, how full the data disk is, how fast it grows and how many days are left before it reaches 75%, the planned fill limit, and 95%, where OpenSearch stops storing new messages, how close OpenSearch is to its shard limit, how long a round of device checks takes, and one recommendation. When one of these needs attention, the System Overview on the dashboard shows one line with a link to the card.
New alerts for the AtlasEye host itself. AtlasEye now alerts when a
disk of its own host is more than 75% full for 15 minutes (more than 85%
for 5 minutes is critical), when OpenSearch uses more than 80% of its shard
limit for 30 minutes, when syslog senders keep going over the per-sender
rate limit for 15 minutes, and when a round of device checks takes longer
than the shortest check interval for 15 minutes. Rate-limit drops used to
raise SyslogMessagesDropped after 5 minutes; now they raise
SyslogSourcesRateLimited once some sender has been over the limit in every
5-minute window for 15 minutes. A flood shorter than about 10 minutes
raises no alert, and a 5-minute pause starts the 15 minutes again. The
drops of a short flood still show on the Capacity card of the About page
(full admins), under Dropped events (24 h) as "Over the per-sender rate
limit", and the syslog collector log names each sender once per rate-limit
window. In enforce mode the messages over the limit are dropped; in monitor
mode (RATE_LIMIT_MODE=monitor) nothing is dropped and the alert only
reports the senders. Apply Update installs the new alert rules. If you
edited the alert rules file on the host, your copy stays as it is and the
new version is placed beside it with a .release suffix.
The licence server and your customer account have new addresses.
AtlasEye now reaches the licence server at license.atlaseye.eu, and your
customer account (downloads, licences and billing) is at
https://portal.atlaseye.eu/portal/. The old address,
license.cdnglobal.eu, keeps working, and account links to it open the new
address. The first time you open your account there, sign in again. If you
mirror your status page to us, its public link moves to the new address
too; links you already shared keep working. If your firewall allows
outbound traffic by name, add license.atlaseye.eu before you install
this update, and keep license.cdnglobal.eu: an update from an earlier
release, and a rollback to one, still use the old name. Images still come
from registry.cdnglobal.eu.
1.2.341
security
2026-09-28 15:17
1.2.340
security
2026-09-28 07:42
level of some alerts changes, as listed
below.Apply Update now also keeps the alert rules and the monitoring configuration up to date. An update used to leave the built-in alert rules and the configuration of the metrics and alerting services exactly as they were installed, so new and corrected alerts reached new installations only. Starting with the update after the one that installs this version, Apply Update brings these files up to date as well, just before it restarts the services. Each new version is checked by the running service first; if the check rejects it, the current file stays in use. A file you changed on the server is left as it is: the new version is placed next to it, and the update log names the file and the one command that takes the new version when you are ready.
Reinstalling no longer stops later updates from refreshing the configuration. After the installer was run again over an existing installation, every later update took the freshly installed service definitions and monitoring configuration for files you had changed: it left them as they were, placed its own copies next to them and warned about changes you never made. The installer now resets that record once it has verified the files, so the next update brings them up to date as usual.
update_airgap.sh never restarted them from the new bundle
directory. So an offline server never got a release's new alert
rules or Prometheus configuration, and monitoring targets added
after an update, for example by Auto Setup (SSH) on a device's
Containers tab, were never collected. Deleting that old directory
also stopped both from starting. The update now moves both to the
new bundle directory. A file that is still as installed takes the
new release's copy, once Prometheus or Alertmanager accepts it. A
file you edited keeps your edits: the release's copy is saved next
to it with .release added to its name, and the update prints the
command that puts it in place. Make monitoring edits in the newest
bundle directory from now on. A rollback leaves both on the new
bundle directory, so keep that directory.Alert Thresholds now tells the truth about a failed Prometheus reload. When Regenerate & reload Prometheus wrote the alert rules but Prometheus did not reload, the warning said the rules would be picked up on the next scan, and Help said the same. Prometheus never rescans them on its own: the new thresholds wait for a successful reload or a Prometheus restart. The warning and Help now say so, and tell you to press the button again.
An alert override edit sent to the wrong alert's address is now refused before anything changes. Through the API, editing an override under an alert it does not belong to answered "not found", but the change had already been saved and applied to the other alert. The request is now rejected first, as deleting one already was.
Signing in no longer makes the rest of the interface pause. Signing in, entering a recovery code, changing a password, setting up or turning off two-factor authentication and creating new recovery codes no longer make the rest of the interface pause for a moment on small servers, for you or for anyone else using it at the time. The same goes for an administrator creating a user or setting a user's password. Nothing changes in how these work.
The interface no longer pauses for everyone while one slow page loads. Checking a port on a host that does not answer, loading a router's firewall block list, signing in through single sign-on or opening a user's activity history could make the whole interface pause, for you and for anyone else using it at the time, until that one request finished. These now run alongside everything else. Nothing changes in how they work.
A factory reset now completes, whoever starts it. System Reset (Factory Defaults) now deletes the data, restores the default administrator and adds an entry to the audit log that names the administrator who started it. If a step fails, nothing is deleted. Before, the reset stopped with an error: usually before deleting anything, but on some older installations only after the data was already deleted, when an administrator other than the first account started it.
Actions recorded without a user account now say who did them. The Activity Log, its page exports and its details panel, and the dashboard's Recent Activity showed "User null", "User n/a" or a bare "User" for them. They now show "system", and the factory reset entry shows the administrator who started it. An action by a user who has since been deleted shows "User" and that user's ID, also in the history of an IP address or range, where it showed "system".
In the Activity Log, row numbers continue across pages. On the second page and later they started again at 1. Each entry also shows the name of the item it is about next to its ID again, as its details panel already did.
The factory-reset dialog shows its title correctly, and the Arabic interface shows it in Arabic. The dialog that System Reset (Factory Defaults) opens under Settings β System showed garbled characters before "DANGER" in its title, in English and in Arabic. It now shows a warning sign there. In Arabic, the card and its dialog were in English; they are now in Arabic, and the word you type to confirm is still RESET. In Portuguese, the Γmbito/Zona label of the IP address form also showed garbled characters; it now reads correctly.
Disable in the Users list shows a stop icon. The Disable action in the Users list, and in the panel that opens when you click a user, showed a trash can. Disabling keeps the account: it signs the user out and blocks sign-in until you enable the account again. The action now shows a stop icon instead.
Your own address opens the sign-in page. Opening AtlasEye at your own address showed the vendor's marketing page first. The sign-in page now opens at every address except the vendor's own marketing site.
About says who to contact. About used to show every user the vendor's support address in one Support card. It now has four cards. Get help shows your organisation's help desk. Report a vulnerability shows the manufacturer's security contact. Manufacturer shows who makes the product. Vendor contacts, which only full admins see, lists the vendor's support, sales and legal contacts and its privacy policy, and now holds the Download diagnostic bundle and Config snapshot buttons.
Support Email is your help desk. The Support Email field under Settings β General is your organisation's own help desk, for your users. About β Get help, the sign-in page, the app footer and the public status page show it. When it is empty, About tells users to ask an administrator and gives full admins a link to set it. It never falls back to a vendor address, and the diagnostic bundle that you send to the vendor leaves it out.
Your public pages stop linking the vendor's privacy policy. With no Privacy Policy URL set, the sign-in page linked the vendor's Privacy page instead, and the public status page always linked the vendor's EULA and Privacy pages. Those pages cover the vendor's licence service, not your users or your visitors. The sign-in page and the status page now link your own Privacy Policy URL and help desk, each only when it is set.
Notices where data goes to the vendor. The demo licence form under Settings β Licensing now names who receives your details, why, the licence service's privacy policy and where to send privacy questions. The Public Status Mirror card warns you not to put personal data in the banner or in a maintenance message: both go to the vendor and appear at the public mirror link.
The trial-expired dialog and the lock screen give real addresses. Contact sales in the trial-expired dialog now opens an email to your vendor's sales address, or to your reseller's when it has set one. The button is hidden when no address is available. The integrity lock screen now shows the support address to send the support code to.
The SSH pop-out warning names your address. When the browser blocks the SSH terminal's pop-out window, the warning now tells you to allow pop-ups for your own address instead of the vendor's.
Your address no longer serves the vendor's security.txt. Every installation published a security.txt that told security researchers to send reports about your domain to the vendor, and promised a response time that no policy backs. It is gone. To report a security flaw in AtlasEye itself, use the contact under About β Report a vulnerability.
The compliance documents no longer promise response times. The evidence pack and the SOC 2 and NIS2 documents promised to acknowledge vulnerability reports within 3 or 10 business days, or 24 and 72 hours. No policy backed those times. The coordinated vulnerability disclosure policy, which is still pending, will set them. The evidence pack also offered a data processing agreement. It now says, as EULA v1.3 section 7.3 and Privacy Policy v1.2 section 2.1 do, that ordinary operation needs none.
Getting help, in Help and in the install guide. Help β Shortcuts & support has a Who to contact card: your help desk first, security flaws to the manufacturer's security contact, and for full admins the vendor's contacts under About β Vendor contacts. INSTALL.md has a new Getting help section with the support and security contacts. Resellers can set their own support, support portal and sales contacts; .env.example describes the settings.
Help now has a server runbook. Administrators who can open Settings β System see a new Help tab, Server runbook. It lists the commands to run on the server that hosts AtlasEye: health checks, logs, the switches to use when a setting cannot be reached in the web interface, restarts, updates, the data services, the TLS certificate, disk space, and what to send with a support request. Every command has a copy button and reads left to right in every language. Steps that interrupt service or can lose data are marked, and the least disruptive option comes first. The Maintenance, Updates, System, Backup & Archive and About guides, the troubleshooting answers that need the server, and the offline update card under Settings β Updates link to the matching section.
Report a problem from inside AtlasEye. Choose Report a problem in the menu behind your name, on Help β Shortcuts & support, on About β Get help, or on the screen shown when a page crashes. Describe what went wrong and review exactly what the report contains before anything leaves your installation. Technical details are optional; your licence key, sign-in tokens and values written as password=β¦ are masked. Full admins send the report to AtlasEye support and get a reference starting with PR- to quote. Everyone can download the report. Email report appears when there is an address to write to: AtlasEye support's for full admins, otherwise your help desk's once your organisation has set a support email. An air-gapped installation, or one without an activated licence, downloads or emails the report instead.
Only the admin who opened a web terminal session can close it. Through the API, any admin with terminal access could end another admin's open SSH session by its id. Each session now remembers who opened it, and a close request from anyone else leaves it running.
An incident only accepts alerts you are allowed to work on. Through the API, a user limited to some devices could link any alert to an incident they could reach, including alerts on devices outside their access and alerts that do not exist. Each linked alert now needs the same access as acknowledging it.
Alert Thresholds now warns when a saved change did not reach Prometheus. Saving a threshold card, or adding, editing or deleting a per-target override, stores the change and asks Prometheus to reload its alert rules. When that reload failed, the panel still said the change was saved, while Prometheus kept alerting on the previous values. You now see a warning instead: the change is saved, the previous values stay active until a reload succeeds, and Regenerate & reload Prometheus tries the reload again.
New AtlasEye logo. The sidebar, the sign-in page and the public status page show the new AtlasEye logo. The browser tab icon, the home-screen icon on phones and tablets, and desktop alert notifications use the new AtlasEye mark.
Your organisation's name is shown instead of an uploaded logo. Settings β General no longer offers uploading an organisation logo, brand mark or favicon: every installation shows the AtlasEye logo. The organisation name you set there appears as text beside it: in the sidebar (hover the logo while the sidebar is collapsed), on the sign-in page, on the public status page and in the browser tab title. The two header colour settings go with the upload; the name now takes the sidebar's own colours. Logos uploaded under earlier releases stay on the server and in backups, but are no longer shown.
Notification History shows forecast and resolved messages. Both have their own colour and name in the Level column, and the level filter can select them.
Status page emails have the new layout. The email that confirms a subscription to the status page, and the emails subscribers get when the status banner changes, now look like the other notification emails: the AtlasEye logo, a coloured bar for the state, and a button that confirms the subscription or opens the status page (for banner updates this needs Public App URL under Settings β General). They are written in the Default Language set under Settings β General, and their times use the system time zone and name it. When an incident is resolved, the email says when it started, when it ended and how long it lasted, instead of repeating the problem.
NIS2 reports emailed to a CSIRT have the new layout. The email shows the AtlasEye logo and has a plain-text version. The report text and the signed attachment are exactly as before.
critical for a device
that is down and for a critical threshold or disk space alert (it was
error), warning for a degraded device (it was error), and
resolved for recoveries (it was info).
The first successful check of a new device and the SLA report arrive
in Telegram without a notification sound.forecast (it
was warning). The weekly syslog report is still sent in English.sudo bash atlaseye-install.sh --channel edge got its first build from
that channel but then looked for updates on the stable channel. The
installer now records the channel, so Settings β Updates offers the
builds of the channel you installed from. A server installed that way
earlier still looks on stable until you set UPDATE_CHANNEL=edge in
its .env and recreate the api and updater containers.1.2.339
security
2026-09-26 17:16
The NOTICE file now includes the attribution notices of bundled components. It now reproduces, word for word, the attribution notices that bundled Apache-2.0 components ship, as their licence requires. It also names the copyright holders of 14 more components, found in those notices and in the other licence files the components carry.
The NOTICE file's MIT section now shows the MIT licence. Up to and including 1.2.338, the MIT section of the NOTICE file showed the Python Software Foundation licence text instead of the MIT licence. It now shows the MIT text. Three entries also no longer show a copyright line that is not the component's own. No component and no licence changed.
The NOTICE file now reproduces licence texts it was missing. Up to and including 1.2.338, it did not include the GNU LGPL version 3 text that covers the PostgreSQL driver psycopg2, or the GNU GPL version 3 text that the LGPL builds on, and it showed no licence text for victory-vendor, a charting component. It now reproduces both GNU texts, and the licence texts of the libraries victory-vendor bundles. No component and no licence changed.
Web analytics keeps the page views it is holding when AtlasEye restarts or updates. Page views and events wait in memory for a few seconds before they are stored. A restart or an update used to wait ten seconds for the web analytics service to stop, then force it off, and everything it held was lost. It now stores what it holds first and then stops, as long as OpenSearch is reachable at that moment. Page views that arrive while it is stopping can still be lost.
The syslog collector stops promptly. On a restart or an update it was forced off after ten seconds instead of stopping when asked; it now stops as soon as it is asked. Log lines it has received but not yet stored at that moment are still not kept.
The licence banner's links work from the keyboard. Open Settings, Upgrade and Subscribe now on the licence banner could not be reached with the Tab key or opened in a new tab. Now they can, and so can Manage in Settings on the Syslog page's excluded IPs notice.
The syslog analytics IP and process links work from the keyboard. The IP addresses in the Brute Force, Port Scan and Coordinated attackers tables and the process names in the Process Γ Severity Matrix could not be reached with the Tab key, and screen readers did not announce them as controls. Now they can be reached and used with the keyboard, and screen readers say what each one does. The device names in the dashboard's Recent outages and Uptime SLA sections can now be reached with the keyboard too, and opened in a new tab.
More IP addresses, names and icons work from the keyboard. The IP addresses under Top Active Threats on the Syslog Security tab, the IP addresses, hosts and processes in the world map's country details panel and the IP addresses in its Live Feed, the exclude icons and Clear all in the Log Explorer, and the copy icons on the API & Integration page could not be reached with the Tab key, and screen readers did not announce them as controls. Now they can be reached and used with the keyboard, and screen readers say what each one does. The same now goes for the AI Assistant's suggested prompts, the suggested questions under Ask your network on the dashboard, the recent targets on the Network Tools page and the MITRE ATT&CK technique IDs under the syslog Pattern Categories. Open full map on the dashboard's live globe can now be opened in a new tab.
The Compliance page counts missed NIS2 deadlines correctly. An Article 23 report still unfiled past its deadline now counts as a missed deadline, not only one filed late, and the final report is timed from the incident notification, as on the incident page. Deleted IP records no longer count toward asset criticality coverage, and deleted or disabled admin accounts no longer count toward admin MFA enrollment. The Help page no longer says the posture cards show backup recency.
NIS2 measure names and notes now follow your language. The Article 21(2) table on the Compliance page showed them in English whatever language was selected; they now appear in the selected language. Each note also says in plain terms what was checked on your installation, or that a result is a fixed property of the product.
Backup download and delete accept backup files only. Before, an API request from an administrator, or from an administrator's API token, could download or delete any other file kept in the backup folder, such as the SSH host keys AtlasEye has saved for your devices. The Backups page never listed those files. Restore refuses them as well.
Files unpacked from an offline bundle now belong to root. Before, unpacking the bundle as root left every file, the install scripts included, owned by the numeric user id of our build account. On your host that id is either no account at all or an unrelated one.
--force. It now simply
starts again. A directory that holds a finished install still
needs --force.The install guide's first-run checklist and host move are
corrected. The checklist now activates the licence before the
two-factor step, because an install is read-only until it is
activated, and it says where two-factor is switched on
(Settings β Security) before each user enrols on the Profile
page. Moving to a new host now follows an order that keeps your
data and your activation: back up, stop the old host, release its
activation, install with the copied .env, activate, then restore
the backup.
The air-gap runbook no longer deletes your database to reset search. Its troubleshooting table offered a command that removes every data volume, the database included, when only OpenSearch had to be reset. It now gives the fixes that keep your data first, and a reset that removes only the search data. The removal instructions in the air-gap installer and the installer's message when Docker is not running are corrected too, and the first-run checklist says where mail is set up (Monitoring β Alerts, Channels tab).
The installer refuses hosts that are not x86_64. AtlasEye
images are published for x86_64 only, but the host check also
accepted 64-bit ARM (aarch64) hosts, so an install there passed the
check and failed later. The host check (scripts/preflight_host.sh)
and the installer now stop on any other architecture and say why,
and the install guides list x86_64 as the only supported
architecture. When the host and an air-gap bundle do not match, the
installer now tells you to use an x86_64 host with an x86_64 bundle
or to ask your vendor, instead of telling you to rebuild the bundle.
The air-gap runbook and the install guide are corrected. The runbook's file list names every file in the bundle once, including the update and rollback scripts. The offline activation steps use the names on the Offline (air-gap) activation card in Settings β Licensing. The troubleshooting rows quote the installer's real message about placeholder values and give the complete command to stop the stack without deleting data. The install guide says where your own certificate goes on an air-gapped host.
Signing out or revoking a session no longer relies on the cache service alone. Before, if the cache service had restarted without its data or was briefly unreachable, whoever held a session that had been signed out, revoked or ended by a password change could renew it and start a new session. That renewal is now refused, and so is a repeat of the sign-in or renewal that had created the session moments before. In those cases some limits remain: the session itself stays usable for up to 15 minutes by default, and a copy of it taken before one of its automatic renewals can still be renewed after a sign-out or after that one session is revoked (a password change or reset stops it). Live updates are not tied to the session: someone holding a copy of it can still connect to them for about 2 hours after the session is revoked or the password changed, and after a sign-out in those cases. A live-update connection that is already open stays open after a sign-out, a session revoke, a password change or disabling the account, until it closes.
Two gaps around password changes and sign-outs are closed. After a password change, or an administrator's password or two-factor reset, a copy of a session taken shortly before one of its automatic renewals stayed usable for up to 15 minutes by default; it now stops at once, unless the cache service has lost its data or cannot be reached. A sign-out, a session revoke or a password change made while one of the session's renewals was in progress could be undone by that renewal, which started a new session. The renewal now checks again first and is refused, which closes most of that window. A sign-out or a single session revoke still leaves a copy taken shortly before the session's latest renewal usable until it expires, up to 15 minutes by default.
A time zone set in .env no longer weakens sign-out or shifts
backup dates. On a server whose .env sets a time zone west of
UTC (for example TZ=America/New_York), signing out, changing a
password, an administrator's password or two-factor reset, or
revoking a session did not end the access tokens already issued:
they kept working until they expired, up to 15 minutes by default.
They now stop at once, as they already did on servers on UTC or
east of it. With any time zone other than UTC in .env, the date
shown for a backup or syslog archive whose metadata file is missing
is no longer shifted by the zone's offset, and new backup file
names use UTC like the rest of the platform. A backup made before
this update that has lost its metadata file can still show its
date shifted.
Enabling a disabled account again no longer brings back its old sign-ins. Before, when a user was disabled on the Users page and later enabled again, the sign-ins the account had before it was disabled came back and kept working. Now disabling the account revokes them, and once it is enabled again the user signs in again. Live updates are not tied to the sign-in: for up to about 2 hours after the account was disabled, a copy of one of its old sessions can still connect to them once it is enabled again. Personal access tokens are not sign-ins and are not revoked: they stop working while the account is disabled and work again once it is enabled. An account disabled before this update keeps its old sign-ins until they expire, 7 days by default: revoke them on Active Sessions before you enable it again.
You can no longer disable your own account from Edit User. The Disable button already refused your own account, but setting Status to Disabled in Edit User, or making the same change through the API, went through. Since disabling an account now ends its sessions, that signed you out at once, and if yours was the only Full Access account nobody could enable it again. Saving your own account with Status set to Disabled is now refused with "Cannot disable your own account", and nothing in that save is applied. Other changes to your own account, such as your display name or email, save as before.
The Users page no longer offers to disable your own account. The Disable User button no longer appears on your own row, nor the Disable button in the panel that opens when you click it, and Edit User no longer lists Disabled as a status when you edit yourself. Disabling your own account is refused either way; the page now stops offering it.
Disable and Enable now say why they failed. When the server refused to disable or enable a user, the Users page showed only "Delete failed" or "Failed to enable user". It now shows the reason the server gave, and a general message only when it gave none.
A timezone set for a user through the API is now saved. Updating a user through the API with a timezone answered with success but did not save the timezone. It is now saved, and checked the same way as the timezone you set in your own profile.
A timezone must now be a real time zone. Setting a timezone through the API, your own or another user's, accepted any name, including ones the browser cannot use to show times. Such a name is now refused, and nothing in that request is saved. Every time zone the Profile page lists is accepted, older spellings such as Asia/Calcutta included, and clearing it in your profile still returns to the system default.
Disabling a user no longer says it was deleted. After you disabled a user, the Users page said "Item deleted successfully", or "Delete failed" when it did not work, although disabling keeps the account and you can enable it again. It now says "User disabled", or "Failed to disable user" when the server gives no reason, in every language.
Relative times, dates and numbers now follow your language. "5 minutes ago", month names, and the grouping of large numbers (1,000 / 1.000 / 1 000) now follow the language chosen in AtlasEye, instead of staying in English or following the browser's language. The Users and Active Sessions pages and the topology map's tooltips show their ages in your language too, instead of short English forms such as "5m ago". In Persian and Arabic, digits are Latin and dates Gregorian, as in the rest of AtlasEye. On the Users page, the time since a user's last login or creation was off by your time zone's offset from UTC, and a login in the last few hours showed "-" in time zones behind UTC, such as the Americas. Both now show the right age.
Portuguese: more texts are now European Portuguese. In the Portuguese interface, the texts of table filters, empty tables, date pickers and similar controls came from the Brazilian Portuguese translation. A table filter's reset button, for example, read "Resetar" instead of "Repor".
Web Analytics: outage and change markers now sit on the right hour. In a browser outside UTC, the traffic chart drew outage bands and incident and DNS-change markers shifted by the browser's offset from UTC, or left them out. They now sit on the hour they happened. On the syslog world map, an IP's first and last seen times now follow the time zone set in AtlasEye instead of the browser's.
Portuguese: the year buttons of date pickers are read out in Portuguese. Screen readers named their keyboard shortcuts in English ("Control + left"); they now say "Control + esquerda" and "Control + direita". In Arabic, the picture on a pricing page with no plans on offer is now labelled in Arabic too.
Short durations use your language's unit letters. Uptimes, outage lengths and the age of the latest data on the dashboard, the device and container pages, the SLA report, the About page and the syslog views now read "2j 3h" in French rather than "2d 3h", as the live counters already did. The French help tip about the diagnostic bundle now names the Support section instead of "Assistance".
OpenSearch no longer has accounts with published passwords. Every installation carried five demo accounts from the OpenSearch image (anomalyadmin, kibanaro, logstash, readall, snapshotrestore), and the account OpenSearch Dashboards signs in with used its published default password. Any program on the server, and any container of the installation, could sign in to OpenSearch with them, and one of them reads everything stored there. New installations never get these accounts, and the Dashboards account gets a password generated for your installation. Offline updates remove the five accounts and change the Dashboards password during the update. Online installations do it from the update after the one that installs this version. If you used any of the five accounts yourself, create an account of your own to replace it.
The OpenSearch administrator password no longer shows in the server's process list. The health check of the OpenSearch container put it on a command line every 20 seconds, where any user signed in to the server could read it.
A restore now brings back the hosts AtlasEye collects metrics from. The hosts whose container and host metrics AtlasEye collects (the cAdvisor and node_exporter hosts added by onboarding or Auto Setup) were not part of the full backup, so a restore onto a new server left them out of metric collection. The full backup now includes this list, and a restore merges it: a host the server already collects from keeps its current port, and only missing hosts are added. The collected metrics themselves are still not part of the backup. Backups made before this change restore as before.
Onboarding checks the hostname the way Add Device does. The
Discover & Onboard wizard now refuses a hostname that is not a
valid IPv4 address, IPv6 address or DNS name, for example one with
a space, a ; or an underscore, with the message Add Device shows.
Before, such a name was looked up in DNS and accepted if it
resolved. A host added by its IPv6 address is now listed for metric
collection in the standard [address]:port form. Collecting from
it still needs IPv6 on the Docker network, which the default
installation does not enable. The online update does not install
this release's Prometheus configuration, so after an online update
a host added by its IPv6 address shows no metrics on its device
page until that configuration is in place.
Devices added by their IPv6 address are now handled correctly.
AtlasEye wrote such an address and its port together without the
square brackets IPv6 needs. The node_exporter, Postfix and nginx
exporter installs then failed to start, the wizard and container
Auto Setup reported every exporter unreachable, the Containers tab
never picked up a running cAdvisor on its own, and Proxmox
collection could not connect. The address is now written in the
standard [address]:port form in the install commands,
reachability checks, scrape targets and Proxmox requests, and HTTP
checks and webhooks sent to an IPv6 address carry a valid Host
header. The check that the chosen address belongs to the device
now accepts an IPv6 address in capitals or written out in full,
and no longer mistakes a longer address for it. AtlasEye can also
be pointed at a PostgreSQL server by its IPv6 address; before, it
could not start. All of this needs AtlasEye's own container
network to carry IPv6, which the default Docker installation does
not set up.
The Infrastructure page loads for users limited to some devices. For such a user the page failed to load whenever one of their devices was added by an IPv4 address or by a host name with a dot or a hyphen. It now loads and shows those devices.
1.2.338
security
2026-09-25 18:59
The Conflicts page opens quickly on a large inventory. With a thousand ranges and 60,000 addresses it took about 14 seconds to open; it now takes under half a second. Each check lists up to 200 findings, while its count still shows the full number. When ranges nest, an address is now judged by the most specific range that holds it, so an active address in an active subnet inside a deprecated one is no longer reported. Addresses outside every range now show their hostname.
The IP Ranges page loads faster on a large inventory. Each range's utilization, next free address, map and discovery now read only the addresses inside that range, instead of every address in the inventory.
The maintenance page now follows your language. The page your users see while maintenance mode is on, including during every update, was always in English. It now uses the language chosen in AtlasEye, laid out right to left for Persian and Arabic.
Two alerts on the same server at the same time now both reach you. When two alert rules on one server fired within five minutes of each other, for example CPU and memory together, only the first was sent to your notification channels; the second was recorded as suppressed. Each rule now has its own five-minute window, so a rule that keeps flapping is still sent only once.
Disk-space alerts now reach your notification channels. When a monitored server's disk alert opens at 80 % or 90 % full, it is sent to that server's email, Telegram or webhook channels, and again when the disk drops back below 77 %, like CPU and memory alerts. Until now these alerts appeared only in the app. A disk warning that keeps filling past 90 % now turns critical and is sent again; before, it stayed a warning until the disk recovered.
The security and compliance documents now describe monitoring as it actually works. Audit-log integrity is checked when you press Verify Chain or open the Compliance page; there is no scheduled check and no alert. Nothing alerts on backup age or on database or search-cluster health; the documents now say so. They also state that scheduled backups stay off until you enable them. Security reports go to security@atlaseye.eu and are acknowledged within three business days.
The AI assistant no longer discards answers that mention an AI vendor. An answer that happened to contain an AI company or model name, for example traffic to an AI service's domain, a user account with that name, or a log format that shares it, was replaced by a generic "I can't share details" reply. Those answers now come through. The assistant still won't say which AI model powers it.
The Compliance page opens faster on a large audit log. Its audit trail integrity result is now reused for up to five minutes instead of being recomputed on every visit. Verify Chain on the Audit Log page still checks every entry each time.
The alerts page stays quick as alert history grows. Each page of alerts no longer sorts every alert ever recorded.
The installation and disaster-recovery guides now check the right addresses. The version check after an install or a restore pointed at an address that does not exist, and the health check could pass while the application was down. Both checks now work as described.
The high-availability reference is corrected. As published, the two-host reference setup could not start, and its failover steps named files and settings that do not exist. It now uses one database, one Redis and one search cluster that you run for both hosts, and keeps a single monitoring scheduler. The guide explains how to bring the hosts up, how to move the scheduler when a host fails, and what the load balancer's health check reacts to. It also lists what the setup does not do yet, such as in-place updates and automatic failover, and includes a failover drill to run on your own hosts.
Form errors now name the field that needs fixing. When a form was rejected because a value was not valid, the message often said only "Operation failed". It now says which field was wrong and why.
Your plan's device limit now applies to every way of adding a device. The onboarding wizard, and finishing a device that was saved as a draft, could add devices beyond the limit. At the limit, the wizard now tells you on its first step, before it connects to the host. Onboarding a host that is already one of your devices still works.
/api/v1/health no longer alarms for this reason. If a connected server
cannot reach the licence server, the licence banner still tells you.=, +, - or @ opened in Excel or LibreOffice as a
formula. These cells are now saved as plain text. Numbers stay numbers.sudo bash scripts/rollback.sh from the new bundle
folder: it restores that copy and starts the previous version again.
Changes made after the update are lost, so decide soon after updating. The
steps are in docs/airgap-install.md, section 6.--license-key off the install command and the installer asks for
the key without showing it on screen. A key on the command line can
be read by other users of the host while the installation runs, and
it stays in your shell history.1.2.337
minor
2026-09-24 19:05
docker rmi, which
refuses to remove an image that is still in use.1.2.336
security
2026-09-23 14:41
docker restart atlaseye-api) clears it.sudo chmod 700 /opt/atlaseye/backups/pre-update (default install folder).1.2.335
minor
2026-09-23 06:37
0 in the syslog rate-limit settings no longer silently turns ingestion
off -- or the limit off. Setting the messages-per-window to 0 used to drop
every incoming syslog message, and setting the window to 0 used to let
everything through unlimited. Values that cannot work are now ignored the same
way as a typo: the built-in default is used instead, a warning names the
variable, and the Settings page reports the number actually in force.<name>_upload_<date>_<time>.tar.gz.10.0.0.5/24 you get from an interface listing), or an address with an
interface suffix (fe80::1%eth0, the form Windows and Linux print for a
link-local address) used to return a server error with nothing to act on. You
now get the field name and, for a network, the address range that was probably
meant. This covers IP records, ranges, gateways, DNS servers and every address
field on a NAT rule..env no longer stops log
collection. Writing 60s where a number of seconds belongs, 200x in a
rate-limit setting, or leaving a value blank used to stop the collector from
starting at all -- and because the allow-list, rate-limit and timezone sync
share one setting as their fallback, a single typo there stopped all three.
Meanwhile the Settings page went on showing the built-in default as though it
were in use. Each value now falls back to its built-in default and says so in
the log..env.example finally takes effect.1.2.334
security
2026-09-20 16:46
The syslog ingestion rate limit moved into the app. How many messages a single source may send per window β and whether the excess is dropped or only logged β used to live in the collector's environment file and needed a restart to change. It is now a panel under Syslog β Settings, takes effect within about a minute without restarting anything, and has a "Reset to env default" button that hands control back to the file. Monitor mode accepts every message and only records the breaches, so you can size the limit on real traffic before enforcing it.
Correction: do not rotate MONITORING_CREDENTIALS_KEY. Earlier
documentation said rotating this key re-encrypts your stored secrets. It does
not. There is no previous-key fallback, so every SNMP/SSH device credential,
TOTP secret, OIDC client secret and alerting channel password saved under the
old key stops being readable, and the affected features fail quietly as though
no credential were set. If you must change the key, plan to re-enter every
stored secret by hand afterwards. The admin guide now says this.
If an update fails, the automatic rollback now either works completely or changes nothing at all. Until now the rollback replayed your pre-update database snapshot statement by statement. If anything went wrong halfway β most often because the failed update had already added a new table β it stopped in the middle, leaving a database that was part old, part new and missing some of the constraints that keep your data consistent, while telling you to recover it by hand. A damaged backup file was worse still: it could be applied silently up to the point where it ran out, and you would be told the restore had failed without being told that most of your data had already been replaced. The rollback now checks the snapshot is readable before touching anything, and applies it as a single all-or-nothing step. If it cannot finish, your database is exactly as it was and the message says so.
Restoring a backup now tells you what it will take away. The confirmation box used to say only that existing data would be overwritten. It now says there is no undo, that the database is put back to the backup β everything recorded since it was taken is deleted, not merged β that a full bundle also writes its uploaded files over the current ones (files you added since are kept) and replaces the syslog indices from the backup's snapshot, and that a backup older than your running version leaves the database schema behind the software until the pending updates are applied. If a restore fails, the message now says what is actually true: the database was not changed, while files and syslog indices from a full bundle may be partly restored. The same facts are in the in-app help and the FAQ, in all seven languages β several of these warnings were still English-only in Arabic and Portuguese.
Restoring a backup is now all-or-nothing, and it really puts the database back to the backup. A restore used to replay the backup over your current database one statement at a time. Anything created since the backup was taken β a table a later update added, for example β stayed behind, so the result was a mixture rather than the database you backed up; and if the replay stopped half way, that half stayed too, while the screen told you nothing had changed. A restore now resets the database to exactly what the backup holds and applies it as one step: either all of it lands, or none of it does and your data is untouched. It also refuses, with an explanation and before changing anything, a file that is not a full backup of this product, and a database it cannot safely reset β one with extra schemas, or with database extensions installed. Two things to plan for: the restore holds the database to itself while it runs (seconds to a few minutes here), and a backup older than your running version still leaves the database structure behind the software until the pending updates are applied.
An audit or sign-in record is no longer at risk when the API cannot determine who the request came from. In that case the address field is now left blank instead of being filled with a placeholder the database rejects. Everything else in the record β the account, the action, the time, the browser β is stored as before, tamper-evidence included, and a request whose address is known still records it. Nothing changes for a normal deployment behind the bundled web server, where the address is always known; this closes the case where it is not.
A server missing its database tools no longer tells you your backup is
gone. If postgresql-client was not installed, the Backups page answered a
restore with "Backup not found" while the file was sitting in the backup
folder. It now says the restore failed and the database was not changed, which
is what happened, and the server log names the missing tool.
The Audit Log shows names again. A page of audit entries that happened to include an alert came back empty of names β not just for that entry, for every entry on the page. Fixed.
The About page reports how many log messages arrived in the last 24 hours. It had been showing a dash on every install. A dash now means only what it should: the search backend could not be reached. A real zero shows as zero.
Locked out by human verification? There is a door. If Cloudflare
Turnstile cannot be reached, nobody can sign in β including the administrator
who would switch it off, because that setting is behind the sign-in page. An
administrator with server access can now run
docker compose exec -T api python -m app.scripts.turnstile off, sign in, and
switch it back on from Settings afterwards; the keys stay stored, so nothing
has to be re-entered. See the admin guide.
Maintenance mode from the server console works. The commands the admin guide gives for "when the interface is unavailable" stopped before doing anything. They run now.
Human verification no longer blocks sign-in when it is not actually on. With verification switched on but no site key saved, the sign-in page showed an empty box, no message, and refused the button β even though the server was not checking at all. The page now follows what the server enforces.
Human verification can no longer be switched off by whoever is signing in.
Verification used to be skipped for visitors whose address was localhost,
which sounds local but was taken from the request itself β so anyone on the
internet could claim it and face no check at all. Account lockout still
applied, so this was never a way into a specific account, but it did let
automated sign-in attempts run unchallenged across many accounts. The skip is
gone, along with its switch in Settings β Security. Locked out with no way to
reach Settings? The way back in is the server command in the admin guide, not
a browser on localhost.
The Turnstile break-glass tells you the truth on an environment-configured
install. If verification was configured through environment variables rather
than the Settings page, β¦python -m app.scripts.turnstile status reported it
as switched off with no keys β while it was live and refusing every sign-in.
It now reports what the server actually applies, and says whether that came
from the environment or from a change saved in Settings. Switching it off
always worked.
1.2.333
minor
2026-09-18 21:59
Incidents and Alerts open even when one record is odd. A single record carrying a status or severity the system no longer recognises β the sort of thing a restored backup leaves behind β used to blank the whole list with a server error. The list now opens, that record still appears with its original value shown as-is, and you can add notes to it. Nothing is silently rewritten.
An odd record cannot be filed with a national CSIRT. Keeping those lists open means the system has to show the record using a stand-in value. That is fine on screen, where you can see the original beside it β it is not fine on an NIS2 Article 23 report, which is signed and sent to a regulator. Exporting or emailing a report for such a record now stops with a message naming the field and the value it holds, so you repair the record first instead of filing a substitute under your signature.
The Alerts list loads in one request instead of one per row. Opening a page of alerts asked the AI service separately about every row to find out which ones already had a triage. It now asks once for the whole page, so the list settles faster and the browser console stays clean.
Status words appear in your language, not in English capitals. Tags such as ACTIVE, RESOLVED or UNKNOWN were shown exactly as the server sends them, uppercased β which does nothing in Persian or Arabic and mangles German. About twenty places across Inventory, Alerts, Incidents, Identity, Monitoring and Services now show the translated word, and where a value has to stay verbatim it no longer flips direction inside a right-to-left sentence.
Missing translations show real text. The disk-pressure banner's "Free up space" link, the AI assistant's welcome line and around forty other labels were showing English β or, in one case, an internal error string β in every language. They are translated now, and a new check refuses to let a label ship with no translation behind it.
1.2.332
minor
2026-09-17 08:35
Long addresses stay inside their own column. In Syslog -> Analytics an IPv6 address in Source IPs used to spill across Last Seen, and narrowing the column made it worse. Addresses now wrap onto another line and the row grows to fit. Every table whose columns you can drag behaves this way, not only that one.
Column layout and page size now work on every table, not just some. Drag a column wider, reorder columns, choose how many rows to show β on DNS, Services, Settings, Identity, Web Analytics, Inventory, Operations and AI, the same way the monitoring and syslog tables already worked. Your choices are remembered per table.
1.2.331
minor
2026-09-16 17:33
1.2.330
minor
2026-09-16 15:32
1.2.329
minor
2026-09-15 21:01
The closed "IPs excluded" bar is easy to bring back. Closing it now leaves a small orange number where the bar was β click it and the bar is back. Before this, closing it and then removing and re-adding the same IP left you with no way to reopen it.
One filter bar on the Analytics page, not two. The bar used to break into a second row on anything but a very wide screen, and that second row looked like a toolbar of its own. Time range and search now stay in view, the rest of the filters live behind a More filters button that shows how many are active, and share link and the two exports moved into the β― menu next to them.
One scrollbar on the syslog pages, not two. On a short window the Explorer, Analytics, Security and Settings pages could show two scrollbars at once, and dragging the wrong one moved nothing you were looking at. Those pages now scroll as one page. The World Map still fills the window as before, and the Analytics filter bar still stays pinned to the top while you scroll.
The Security page now offers the same time ranges as Analytics. It was limited to 24H, 7D and 30D; 1H and 6H are there now, so you can narrow a security review to the last hour the same way you already could on Analytics. Security still opens on 7D and Analytics on 24H.
1.2.328
minor
2026-09-15 14:12
1.2.327
minor
2026-09-15 06:52
1.2.326
minor
2026-09-14 06:19
1.2.325
minor
2026-09-12 18:37
Save your own set-up as a template and reuse it on the next site. If your servers follow more than one convention, the built-in standard only covers one of them. Fill the New vhost form the way you want it, press "Save as template" and give it a name; next time, pick it from "Use a saved template" and the form fills itself in. Server names are never part of a template, and the log file paths follow the site you are creating rather than the one you saved from. Templates are shared across your whole install and are administrator-only, both to use and to manage -- they can hold internal addresses. Saving under a name you have already used replaces that template.
Logs from each site now arrive under their own name. Until now every
virtual host forwarded its logs under the same two names, so Syslog Explorer
showed one pile for the whole server. Each site now gets its own tag, built
from its first server name -- shop.example.com becomes
shop_example_com_access and shop_example_com_error -- so you can filter to
a single site. A catch-all server keeps the old names, so filters you already
have keep working.
One click sets a new site up the way your servers are meant to look. The New vhost wizard has an "Apply standard settings" button: it fills in the log format and the per-domain log files, the upload size limit, WebSocket support and proxy timeouts, compression, security headers and log forwarding. Add your collector address and the site is ready to preview. A new "Log format" field lets you name a format your server already defines.
Disable now works on Red Hat-style servers too. Hosts that keep their
virtual hosts in conf.d have no symlink to switch off, so Disable used to
report that the action was not available there. It now parks the site's file
instead, and Enable brings it back exactly as before -- the site stays in the
list the whole time. On the rare server that loads every file in the
directory, AtlasEye says so up front instead of reporting a site as off while
it is still being served.
1.2.324
security
2026-09-11 18:37
Component versions in the machine-readable inventory were wrong for five packages. Each AtlasEye service publishes the list of open-source components it ships, which auditors and vulnerability scanners read directly. Where two services shipped different versions of the same component, the inventory reported one version for both -- so a scanner was pointed at a version that service does not run. The list now reports each service's own versions, and a check compares it against the pinned dependency files on every build. No component changed; what changed is that the document now says what is actually installed.
Two shipped components were held back from security updates by our own version limits. The updater β the component that installs every other update β was held to a web framework old enough to have seven published advisories against it, and the optional on-host Service Manager agent to a cryptography library with seven of its own. Neither was waiting on anything upstream; both fixes had been available for some time. Both now install current versions, and the dependency scan that should have surfaced this covers every component we ship rather than three of the six.
If you run the on-host agent, note that it now needs Python 3.9 or newer on the managed host. The installer checks and stops with a clear message before it changes anything, so an older host fails safely rather than half-way through. Ubuntu 20.04's default Python 3.8 is below that line.
1.2.323
minor
2026-09-11 09:31
No customer-facing changes in this release.
1.2.322
minor
2026-09-11 06:44
A brand-new install no longer stalls with "opensearch is unhealthy". The installer started the whole stack before it prepared the search node's security configuration, so the services that wait for search to be ready never came up and the install stopped partway β with no way back except starting it again. The search node is now prepared β and given time to report itself ready β before the rest of the stack starts. Updates repair it the same way, air-gap and online alike: a host installed while this was broken is fixed by its next update instead of having that update rolled back.
Installs and updates survive a dropped image download. A single truncated layer used to end a connected install outright, and the only way back was to download the installer again and start over. Image pulls now retry before giving up, on both the install and the Apply Update path.
A failed download now tells you which registry to look at. Any pull failure used to blame your licence credential, even when the image came from a public registry that needs no credential at all β sending you to the portal when the real problem was your host's outbound network.
1.2.321
minor
2026-09-10 15:07
1.2.320
minor
2026-09-09 18:32
1.2.319
minor
2026-09-09 12:16
1.2.318
minor
2026-09-08 12:33
Applying an update now really does refresh the maintenance scripts on your server. That is meant to be the last step of every update, so each update leaves your server ready to run the next one. It has been failing since it was introduced: a cleanup step earlier in the same update removed the files it needed, and the step ended with a warning in the log. Your updates were never affected β but the scripts on disk stayed as they were, so improvements to the update process itself never reached you. They will from now on.
An update now tells you if the maintenance scripts on your server could not be replaced. Applying an update refreshes those scripts as its last step. When the install directory is not writable β which happens when it was put in place by a different account than the one that installed the product β the update log now names how many files were left untouched and what to change, instead of finishing quietly. The update itself was never affected either way.
1.2.317
minor
2026-09-08 05:13
1.2.316
minor
2026-09-07 20:58
docker compose up could have swapped registry 2.8.x for a major on top of ~61G of published release blobs.1.2.315
minor
2026-09-07 09:22
1.2.314
minor
2026-09-06 14:04
Updates download a lot less. The api image was carrying a few hundred megabytes of build-time leftovers that were never needed to run anything. They are gone, so Apply Update pulls a substantially smaller image and finishes sooner β particularly noticeable on a slow or metered link. Nothing about how the product runs changes.
Apply Update now keeps its own machinery current. Until now an update refreshed the product but not the update script itself, which lives on your host β so improvements to the updater (including the checks that verify a release is genuinely ours before installing it) only reached a machine if someone copied a file onto it by hand. From this release forward Apply Update brings its own scripts along, verified against the same signature as the rest of the release, and only after the new version has proven healthy. Nothing to do on your side, and nothing changes if a release ever arrives without them β the update proceeds exactly as before.
1.2.312
major
2026-08-11 00:51
1.2.311
minor
2026-08-10 15:52
65 /100 came
out as 100/ 65, and the devices-online count had the same problem. Numbers
now read left-to-right in every language, as numbers do.1.2.310
minor
2026-08-10 07:17
audit.actions.discover where the action should be. Every entry now shows a
readable action, including ones added by future updates.0% above 0.0%. The dial keeps the reading
and the duplicate line is gone, on the Dashboard and on a device's Metrics
tab. Bandwidth tiles are unchanged: their second line is a different figure,
not a repeat.CPU Usage (NextCloud-White⦠were cut off exactly where the device name
starts. The device name now sits on its own line under the metric name, and
hovering the title still shows the whole thing.1.2.309
minor
2026-08-10 00:00
1.2.308
minor
2026-08-09 21:50
2001β¦ and clouβ¦. The rail is wider now, hovering
any shortened cell shows the whole value, and the narrow marker column that
only exists for AI-flagged addresses disappears when there is nothing to
flag β which also closes the odd gap between the flag and the IP.crit, and a debug line read info just
like a real notice. Each level now has its own short word, and hovering the
tag spells the level out in full.200+
rather than a number we cannot stand behind. Press play to catch up.ΓN count; hover it to see when the run started. They
are only merged when they match completely β same source, same machine, same
program, same severity and the same log line β so two different events from
one address are never presented as a repeat, and on plans where the line is
not sent nothing is merged at all. Your events-per-minute figure, the globe
and the pause counter still count every event individually.1.2.307
major
2026-08-09 14:12
Alongside it: updates are refused over an unencrypted connection to the licence server, and an update that is older than what you already run is rejected β that is what a replayed update looks like. Going back a version deliberately still works through the documented rollback procedure.
You do not need to do anything. If your server sits behind a proxy that
rewrites the licence-server address to http://, point it at https://
before your next update.
1.2.306
security
2026-08-09 01:20
There is no bypass code, by design β a code that unlocks a modified installation would be a back door. Recovery is reinstalling a clean copy or re-applying the update. If you ever need to bring a locked installation back up while we investigate, support will walk you through the documented recovery setting. - Installing and updating now fail loudly on a bad copy. The offline installer and the in-app updater both detect this state and stop with the support code, instead of finishing with "AtlasEye is up" on an installation that will refuse every request.
1.2.305
security
2026-08-08 20:43
1.2.304
major
2026-08-07 17:36
1.2.303
minor
2026-08-07 11:31
1.2.302
minor
2026-08-07 02:34
1.2.301
security
2026-08-06 23:27
sudo and a single refused connection each counted as a security threat, so
the Security Threats card was mostly routine operations. The minimums are
higher now, and the "high"/"critical" labels move with them instead of being
fixed below the minimum, where everything was high.journalctl -p does, and the Explorer's
picker says so.1.2.300
minor
2026-08-05 13:24
1.2.299
minor
2026-08-04 23:51
1.2.298
minor
2026-08-04 21:47
β¦
instead of being rejected, so the record always lands.MONITORING_PROBE_DEADLINE_SECONDS,
default 5 minutes); if it is hit, that cycle is dropped and retried.https:// URL,
which used to show nothing. Changing a check's type no longer leaves the old
target behind, so a TCP check stops displaying the web path it no longer uses.
The list refreshes every ten seconds without flashing grey while you read it.
And two tooltips were simply wrong: interface monitors also work over the
MikroTik RouterOS API, the interface list is the one you already selected for
metrics (down links included), and marking a check "critical" changes what the
outage record says, not how fast the device is marked down β a failing check
degrades and then downs the device on the same probe counts either way.monitoring.wizard.help.virtualMachines) instead of text; it now explains
why you pick individual VMs. A new check reads the pages themselves and fails
the build if any label they use is missing from any of the seven languages.host:port targets, container names and interface names on the device pages are
now isolated from the surrounding right-to-left text, so an address like
10.0.0.1:8080 can no longer be displayed with its parts reordered.cadvisor, the automatic install removes
it. The dialog now says so before you start.1.2.297
minor
2026-08-03 11:04
1.2.296
minor
2026-08-02 23:15
ether1.100 appeared in the legend but never on the chart. It plots now.1.2.295
security
2026-08-02 15:47
http:// instead
of https://, so the next request β carrying the session token β went out
unencrypted before coming back to the secure address. Redirects now keep the
scheme the visitor arrived on.unreleased after the release that made those
features live, because only the version file and the changelogs were stamped
when a version was allocated. The release now stamps the feature list too.1.2.294
minor
2026-08-02 11:55
NOTICE.md alongside everything else.An install that ends with a broken container now says so, and fails. The installer already checked every container and named the broken one β then printed "AtlasEye is up." underneath and finished successfully anyway. Anything driving the install from a script read that as a clean install. The closing line now matches the check, and the run ends with a failure code β after the one-time admin password and the licence fingerprint are on screen, because an unattended install still needs both.
Turning off the public status mirror now keeps trying until the copy is really gone. Switching the mirror off asks your status-page provider to delete the mirrored page and the history behind it. If they could not be reached at that exact moment, the switch still went off, AtlasEye forgot the address β and the copy stayed public, with nothing left to remove it with. The deletion is now retried every minute until it lands, and Settings β System shows a notice for as long as the copy is still out there. The retry stops on an answer that will not change β a provider that does not recognise your licence, or has revoked it, has nothing of yours left to delete β and an installation with no status-page provider configured never contacts one at all. Whatever the provider does, it can no longer hold up device monitoring while AtlasEye waits for it.
A device whose SNMP replies stall now names itself in the log. Devices in this state show as reachable but report no system information; the log line explaining why said only "SNMP walk timeout", with no address, so on a site with several of them you could not tell which one it was about. It now names the device, the port and how long it waited.
The Downloads page in the customer portal shows how many machines a licence is on, not only when it runs out. It warned when every activation slot was used, and said nothing at all below that β so "3 of 5 machines" was only visible from the Dashboard. Both states now read the same way.
Corrections to earlier release notes. A review of the notes for 1.2.282 to 1.2.291 found sentences that promised more than the release delivered β a status incident said to disappear from the off-infrastructure mirror (which never carried incident history), an eight-minute figure that was an eight-item checklist, a translation sweep described as complete. Those entries have been corrected in place; no product behaviour changed with them. The offline-install and high-availability runbooks were corrected in the same pass: the preflight script needs its shared library alongside it to be sent ahead of the bundle, and the OpenSearch certificates must be regenerated before the first multi-node start β for the reason that runbook already gave elsewhere, a certificate subject left over from before the rebrand.
1.2.293
minor
2026-08-02 06:10
NOTICE.md, generated from what is
actually installed rather than maintained by hand, so it cannot quietly
describe an older release. The Software Bill of Materials you can download
from Settings now names each component's licence as well.NOTICE.md records who holds the
copyright and reproduces the licence terms in full β what the permissive
licences require to be delivered with the software, rather than offered
afterwards. It covers the frontend and the bundled service images too, and
it is written into every installer, so an air-gapped site has it on disk
without having to ask for it.1.2.292
security
2026-08-01 22:14
/healthz (or any /health-β¦ address) used to return a
plain healthy even though no such endpoint exists β the monitor showed
green whatever the system was doing. Only /health answers now.1.2.291
minor
2026-08-01 20:34
docs/ops/airgap-install.md for the first-boot
checklist, but the bundle carries that runbook at docs/airgap-install.md β
so the one instruction printed at the end of a successful install could not be
followed. It now points at INSTALL.md, in the directory you are already
standing in.sudo, and the rest is unattended β it checks the
machine first, fetches everything from our registry with credentials your
licence provides, generates every password and key, turns on HTTPS, brings the
platform up, waits until it is genuinely healthy and prints your one-time
admin password. Nothing to transfer, no configuration file to edit, no
credentials for us to email you. The page also shows how many machines each
licence is currently installed on and tells you before you start if they are
all in use, instead of letting the install fail at the end. Air-gapped sites
keep the signed offline bundle, and it is the same installer either way β one
step shorter, and still signature-verified before anything is loaded.INSTALL.md sits in the
directory the installer creates and covers both paths β which install you need,
what the machine has to have, the two commands, what happens while it runs, and
a first-run checklist for the eight minutes after it finishes: log in,
turn on two-factor, activate the licence, back up .env, point it at your mail
server. It ends with a troubleshooting table written against the installer's
actual messages, so whatever it printed is the row you look up. The install
refuses to be built without the guide, so the file the installer tells you to
read is always the one sitting next to you.bash scripts/preflight_host.sh tells you in seconds whether a machine can
run AtlasEye β Docker version, memory, free disk space on the drive Docker
actually uses, whether ports 80/443 are already taken, and the one kernel
setting (vm.max_map_count) that otherwise stops the search engine from
starting. Run as root it also fixes that setting permanently, so the platform
survives the machine's first reboot..env, printed at
the end of the install for you to send when you activate. Existing
installations are untouched and keep working exactly as before; nothing to do
on upgrade.1.2.290
security
2026-08-01 14:10
TLS_ENABLED=true with a certificate and key that don't belong
together β or a key protected by a passphrase β used to make the gateway fail
to start and keep restarting, so plain HTTP stopped working too and AtlasEye
became unreachable. The gateway now checks the certificate before it starts
serving: if it isn't usable, HTTPS is skipped, HTTP keeps working, and the
exact reason (with the command to verify the pair) is written to the gateway
log β docker compose logs gateway | grep docs-allowlist.1.2.289
security
2026-07-31 10:12
/.env, a .env.bak left behind by an edit, /.git/config, an
editor swap file β used to answer 200 with the app shell instead of
refusing. Nothing was ever exposed, because the folder the web server
publishes only contains the built app, but that was a property of what
happened to be in the folder rather than a rule. It is a rule now: those
paths return 404 at the edge, before any of them reach the app.
/.well-known/ stays reachable, so certificate renewal and security.txt
are unaffected..env. It used to wait for the database silently and forever, with
nothing in the log naming the missing setting. It now assumes the standard user,
and if the database really is unreachable it gives up after a minute and says
so instead of hanging.1.2.288
minor
2026-07-30 15:14
1.2.287
minor
2026-07-30 10:47
The number is honest about what it does not know: a day where nothing was recorded stays blank instead of green and never counts as 100%, so does a day heard for less than half its minutes, a component with no history yet says so, and API & web app has no bar of its own because that sample would be taken inside the monitoring process and cannot speak for the API. A degraded sample lowers the percentage the same way an outage does.
The strip does not start empty. Prometheus has been recording the monitoring
engine's heartbeat all along, so the first sample of each day replays up to
fifteen days of it β that is how long Prometheus keeps data by default β and
grades those minutes exactly as the live card grades them. The same happens
after a restart for any days the app spent switched off. Days already on the
strip are never rewritten, a day Prometheus only partly covers stays blank
rather than turning green, and only the monitoring engine can be rebuilt this
way: log ingestion and API & web app are measured from sources Prometheus
does not hold, so those days stay gaps instead of guesses.
- A status page that keeps answering when your instance does not. Your own
/status page lives on the same stack it reports on, so the moment that stack
is unreachable your customers get nothing. Settings β System β Public Status
Mirror sends the roll-up to a status page hosted by your vendor once a
minute, and you hand that link out instead. When your stack goes dark the page
says so.
It is off until you turn it on, and the card lists both halves before you do: what is sent (the headline, the state of API & web app, Monitoring engine and Log ingestion, your maintenance window, your banner's title and message, your organisation name and the app version) and what is never sent (device names, addresses, logs, metrics, users, credentials). Report now sends the first one immediately; Public link appears once a report lands, Last reported names when, and a failure shows as The last report failed with the reason.
The mirrored page will not pass old news off as current: after three missed reports it states how long your instance has been silent and shows every component as unknown, not the last state it heard. With the mirror on, API & web app also gains its 90-day bars, graded from outside your network β minutes nobody heard count as No data and stay grey.
If the switch is on and nothing is arriving, the card says why β including the two cases that can never succeed on their own: an install that was never told where its vendor lives, and an air-gapped licence.
Two caveats worth knowing. The mirrored page is only ever as fresh as the last report, one minute behind at best. And turning the mirror back off deletes the mirrored copy including the uptime history behind it, after which the link answers exactly like a link that never existed. - Past incidents on the status page. Until now the banner showed only the latest thing you wrote; the update before it was gone. Someone arriving late could read what you are saying now and had no way to learn what happened an hour ago, or last month.
Nothing extra to do: the same Save on the banner card files the incident for
you. Change the state and the page gains a new line with its timestamp; fix a
typo in the title and it does not, because a repeated line is noise on a page
strangers read. Set the state back to Operational and the incident closes as
Resolved. /status shows the last 90 days under Past incidents, newest
first, each with its own timeline.
Visitors see the title, the state and the messages with their times β never who wrote them. This is separate from the internal Incidents module on purpose: severities, sectors and reporting deadlines belong to your compliance record, not to a page anyone can open.
History starts with this version. Banners posted before the upgrade were
overwritten as they went and cannot be brought back.
- Follow the status page instead of reloading it. Two new links in the
/status footer, no login for either.
Incident feed (Atom) works in any feed reader, and in the chat tools that accept a feed URL. It carries one item per update, not per incident, so a new line in a running incident actually reaches you β and each item keeps a permanent id, so nothing you have already read is announced a second time.
Maintenance calendar (iCal) is a subscription your calendar refreshes on its own. Windows you plan in Alerting β Maintenance appear with their reason and their times; a window you switch off turns into a cancelled event rather than quietly disappearing, so anyone who already had it in their calendar learns it was called off. Finished windows stay on the calendar for 90 days.
The calendar deliberately says what and when, never which devices β the page has no login, and your inventory is not part of it. - The status page now groups its components. Application access covers the API and the web app; Monitoring pipeline covers the scheduler and log ingestion. Each group shows its own state β the worst of the cards inside it β so a glance at the headings tells you whether people cannot use the console or whether collection is behind. A card with no data leaves the group's state alone, because "we cannot tell" is not an outage.
TLS_ENABLED=true with a certificate the gateway had no permission
to open left the site on plain HTTP and logged only "cert/key missing" β so
the obvious next step was to go looking for a broken file path instead of the
real cause, file ownership. The gateway now names the failing file and which
of the two problems it is, and prints the exact command to fix ownership. It
also logs a clear line when HTTPS does come up, so you can confirm it
rather than assume it. The admin guide and .env.example now include the
ownership step in the enable instructions.1.2.286
minor
2026-07-29 14:55
1.2.285
security
2026-07-29 11:52
0 % β because the tile was being sent a zero
timestamped "just now". Those tiles now grey out and print how old the sample
is, exactly like the gauges on the device page, and show "β" when there is no
sample at all.0 bps β indistinguishable from a genuinely idle link. Both
cases are now labelled..env password.
The installer's final check used to ask only the web front door, which
answers "healthy" without consulting anything behind it; it now confirms the
search engine and the application itself are really answering before it
reports success. The offline bundle also carries the GeoIP database again,
so the syslog world map has its countries. Existing installations are
unaffected β and running the offline updater on one repairs any of these
that apply.1.2.284
minor
2026-07-28 20:16
1.2.283
minor
2026-07-28 12:12
.ico files are not accepted β no current browser needs one
β and transparency is kept exactly as uploaded.1.2.282
minor
2026-07-28 10:13
1.2.281
minor
2026-07-27 22:29
1.2.280
security
2026-07-27 17:36
1.2.279
minor
2026-07-27 13:40
/status says whether the platform is healthy β All
systems operational, Some systems degraded, Major outage or Under
maintenance β and each component below it (API & web app, monitoring engine,
log ingestion) carries its own state instead of a bare number. A component
reading No data means AtlasEye cannot tell, not that it is broken, so it
never turns the page red on its own./status was unreachable exactly when it was needed β maintenance mode hid it
along with the rest of the app./status showed internal placeholder text instead
of Log in, EULA and Privacy.SQL_ECHO=true).
Non-production stacks used to log every query, including the values written
during password and licence changes.1.2.278
security
2026-07-27 11:12
1.2.277
minor
2026-07-27 08:12
1.2.276
minor
2026-07-26 22:04
1.2.275
minor
2026-07-26 15:34
/help) is no longer a flat list of features.
It now opens on a setup checklist, and has a guide for every page in the
product β what the page is for, and the numbered steps for the common task on
it β plus a troubleshooting section written by symptom ("no email arrives",
"containers show no data", "I lost my 2FA device") and a shortcuts/support tab.
Everything is translated into all 7 languages.1.2.274
minor
2026-07-25 21:15
1.2.273
minor
2026-07-25 15:35
1.2.272
minor
2026-07-24 21:13
1.2.271
minor
2026-07-24 18:52
No release notes recorded for this version.
1.2.270
minor
2026-07-24 15:09
1.2.269
minor
2026-07-24 10:59
AGENT_CALLBACK_BASE_URL in the server environment and re-enroll.1.2.268
minor
2026-07-24 10:03
1.2.267
minor
2026-07-23 22:26
1.2.266
minor
2026-07-23 01:08
--prefix); the on-host agent
can't apply a change after AtlasEye has stopped waiting for it; saving a draft
is refused where it wouldn't actually stay disabled; and a change interrupted
by a restart is now flagged for review instead of silently retried.1.2.265
minor
2026-07-21 22:06
1.2.264
minor
2026-07-20 15:41
1.2.263
minor
2026-07-19 01:15
1.2.262
minor
2026-07-18 18:52