MyCount Changelog

[Unreleased]

[3.6.0] - 2026-11-14 @ 11:58

Summary

Show the total visits matching the selected report filters in the Metrics page’s Report Filters title. Expand Recent Visits, Referrers, Visits by Site Chart, and All Traffic by default while keeping the other sections collapsed.

[3.5.3] - 2026-11-13 @ 20:25

Summary

Extend IsoForest with browser/GeoIP timezone disagreement, cross-network browser template reuse, viewport/timezone variation, OS/platform consistency, and direct/unknown referral features. Rolling template comparisons connect matching clients across UTC midnight while preserving daily network observation groups.

Version the representation as browser-context-v3 and migrate feature storage without rewriting earlier runs or collected visits. Add regression coverage for missing metadata, daylight saving, repeated IPs, window boundaries, and upgrades.

[3.5.2] - 2026-11-13 @ 18:59

Summary

Resize the visitor map vertically to fill the available browser window space. Remove the Visitor Log and City DB sections below the map.

Replace the map’s zoom buttons with a vertical slider that adjusts one zoom level at a time and stays in sync with other map zoom gestures.

Remove the IsoForest run notice and schedule link from Report filters.

Move the last refresh time into the title bar below Counting since, aligned left, and display it as a full date with a 12-hour time. Add a version and codename footer to every report page.

[3.5.1] - 2026-11-13 @ 03:16

Summary

Make IsoForest+ the default traffic filter and remember shared report settings throughout browser navigation, including visits to Reference and IsoForest. Keep the filter label consistently capitalized as IsoForest+.

[3.5.0] - 2026-11-12 @ 06:10

Summary

Store browser client details in 29 individual, typed page-view columns. Migrate and verify existing JSON values before removing the old column, and expose each field separately in Visitors while preserving the browser payload format.

Add IsoForest+ traffic filtering alongside the existing Basic Bots filter. Analyze raw visits in scheduled network-block/time-window batches, retain versioned evidence, and combine both methods consistently across report pages.

Added

  • Add an independent IsolationForest pipeline using the tested network-rotation features, IPv4 /16 and IPv6 /48 blocks, daily UTC observation windows, and reproducible model settings. Preserve collected data and Basic Bot flags.
  • Store atomic model runs, typed observation features/scores, visit memberships, source coverage, and model metadata in three new IsoForest tables.
  • Add an IsoForest management page with run history, observation inspection, editable hourly schedule, and a queued-run action. Run analysis through an unprivileged systemd job with the existing protected database environment.

Changed

  • Display up to 20 rows per Visitors page, controlled by DVisitors.PAGE_SIZE.
  • Replace Exclude bots checkboxes with None / Basic Bots / IsoForest+ selectors on Map, Metrics, Marketing, and Visitors. Preserve legacy filter links and apply the selected completed run before aggregation and pagination.
  • Keep unassessed visits visible and the previous completed results active on failed runs. Preserve schedule settings on upgrade and remove job definitions on uninstall while retaining database evidence.

[3.4.0] - 2026-11-06 @ 18:10

  • Added ai, llamasrv, and nd3g sites to the CORS whitelist.
  • Removed llamaserver (it’s deco’d)

[3.3.0] - 2026-11-04 @ 04:32

Summary

Default Map and Metrics to the first recorded visit through today, so older visits stay in the totals and the All Traffic plot grows with the data. Preserve selected date ranges and allow reports spanning more than one year.

[3.2.0] - 2026-11-01 @ 16:50

Added

  • Added devlog.osoyalce.com to CORS whitelist.

[3.1.2] - 2026-11-01 @ 05:11

Summary

Emphasize visitor map density with nine colors from green through yellow to red and gentler logarithmic sizing limited to 5–8 pixel radii. Show all nine equal density bands in a compact Low-to-High legend, preserving dark centers and 2-pixel borders.

[3.1.1] - 2026-11-01 @ 05:05

Summary

Restore distinct visitor map borders by reducing dot fill lightness by two-thirds while preserving the original 2-pixel outline. Match the legend to the dot styling.

[3.1.0] - 2026-11-01 @ 05:00

Summary

Reduce visitor map crowding with smaller dots and green, yellow, and red density bands based on equal thirds of the busiest mapped location’s visit count.

Changed

  • Scale visitor map dots to two-thirds of their previous size and add a Low / Mid / High legend using #2ECC71, #F4D03F, and #E74C3C. Density thresholds follow the current report filters.

[3.0.0] - 2026-11-01 @ 04:15

Summary

Publish trusted collector request and malformed-payload events through the existing systemd journal, ready for BMCyber’s native Fail2ban integration. The companion thresholds are 60 POST attempts or 5 malformed submissions within 60 seconds per IP; BMCyber changes and activation remain outstanding. Performed impact analysis of an update to BMForge standards. It’s significant.

Added

  • Added the bmcyber.osoyalce.com site to the CORS whitelist.
  • Add request-scoped collection_request and malformed_payload events, a message-only security logger, explicit journal service output, source validation, concurrency/error cleanup tests, and an integration guide.
  • Count each attributable POST /count before origin/body validation. Add the malformed event for allowed-origin JSON/content-type/size/schema failures. Health, OPTIONS, counter reads, other routes, dependency outages, and analytics bot classifications do not generate malformed events.

Changed

  • Complete the BMForge 0.21.2 refresh (efb49f99fc86) after checking upstream. Update the shared component blueprints in the database, RCA, and visualization bundles and pin all five attached skills to that revision. HTTP, security-events, and the manager are already current; specification versions and application runtime remain unchanged.
  • Allow the assistant to use Git for inspection, routine development, and BMForge maintenance within the authorized scope. Keep commits, pushes, destructive Git operations, and releases subject to explicit authorization.
  • Pin BMForge security-events 0.1.0 and HTTP 0.5.1 plus the manager from local BMForge 0.21.2 (efb49f99fc86). Keep the existing HTTP stack and Python dependencies; MyCount has no event counter or enforcement client.
  • Reject missing/invalid client attribution rather than falling back to Caddy’s address; normalize numeric direct and trusted-proxy sources.
  • Refresh the four attached BMForge skill bundles and manager from local BMForge 0.21.1 (source revision cbf2ad642fe7) and update the pinned hashes. HTTP and database specifications advance to 0.5.0, adding local timestamp display and explicit charset/collation guidance; RCA and visualization remain at 0.1.0. This updates development guidance and reference assets only; application runtime and database migrations are outside this update.

Required BMCyber companion changes (not implemented)

The BMCyber checkout is unchanged. Its existing file-based fail2safe jail does not consume MyCount’s new journal events. In a separate BMCyber change:

  • Adopt BMForge Fail2ban 0.3.0. Use native backend = systemd, remove logpath, and scope matching to the verified _SYSTEMD_UNIT=mycount-server.service journal metadata.
  • Provide anchored matching for the exact collection_request and malformed_payload events. Either parameterize the existing filter’s event name or provide separate owned filters; keep unrelated messages and user-supplied free text outside matching.
  • Configure two initially disabled jails with these agreed policies:

    Jail Event findtime maxretry
    bmcyber-mycount-flood collection_request 60 seconds 60
    bmcyber-mycount-malformed malformed_payload 60 seconds 5
  • Aggregate by IP across sites, page URLs and collector workers. Preserve usedns = no, administrative/proxy exemptions, the existing finite 20-hour Fail2ban ticket interval and BMCyber’s 20–24-hour enforcement policy. Both jails invoke the existing ban-only BMCyber action with their own source identifiers; unban/stop/flush hooks remain empty.
  • Verify the Fail2ban host interpreter’s native journal bindings and journal access during preflight, including read-only --check. The distribution’s python3-systemd package belongs to Fail2ban’s host environment, not MyCount’s or BMCyber’s application venv.
  • Update the existing installer/service controls to own and manage both jails. Explicitly migrate or retire the legacy bmcyber-mycount jail: the installer currently preserves existing .local files, so replacing a shipped template alone is insufficient. Retain the prior configuration and operator exemptions, and leave the new jails disabled for verification.
  • Update companion documentation and tests. On a disposable systemd host, start from actual MyCount requests through the trusted proxy and verify exact journal messages/metadata, IPv4/IPv6, multi-worker aggregation, below/at-threshold behavior and time-window expiry, exemptions, and the received BMCyber request. Exercise unavailable-service/error/lost-reply action failures without retries. Reuse BMCyber’s existing firewall tests.

Native journal/Fail2ban acceptance and production activation have not been performed here. No host packages, services, firewall rules or BMCyber files were changed by this implementation.

[2.9.1] - 2026-10-29 @ 16:54

This release is named for the element Iridium (Ir). An iridium-rich layer found worldwide helped scientists identify the asteroid impact linked to the dinosaurs’ extinction.

Summary

Recognize coordinated page sweeps that rotate browser identities and pass the existing per-visit bot checks. Detect campaigns independently for each site and keep classified visits available when bot exclusion is disabled.

Added

  • Detect sustained Windows/Chrome crawl campaigns from distinct pages, rotating visitor IDs and IPs, repeated short navigation pairs, and regular timing. Recheck the last 48 hours during collection and log new classifications.
  • Add a read-only historical scan with an explicit --apply option, and document the evidence thresholds and heuristic’s limits.

One-time historical backfill

Deploying this release enables detection on new visits; existing visits retain their stored bot flags. Run this command on wintermute to classify the 72 confirmed KB crawler page views from the October 29 backup. The timestamps are UTC. Visits remain available with Exclude bots disabled.

sudo mariadb --database=mycount <<'SQL'
UPDATE page_views AS v
JOIN pages AS p ON p.page_id = v.page_id
SET v.is_bot = 1
WHERE p.site = 'kb'
  AND v.browser_family = 'Chrome'
  AND v.os_family = 'Windows'
  AND v.received_at >= '2026-10-27 13:35:06'
  AND v.received_at < '2026-10-29 12:51:34'
  AND COALESCE(v.is_bot, 0) = 0
  AND v.page_view_id IN (
    1319, 1321, 1335, 1336, 1337, 1338, 1343, 1345, 1346, 1350, 1351, 1352,
    1355, 1356, 1357, 1367, 1371, 1372, 1381, 1382, 1383, 1384, 1385, 1387,
    1389, 1390, 1392, 1393, 1394, 1410, 1411, 1414, 1415, 1416, 1417, 1418,
    1419, 1420, 1425, 1426, 1429, 1432, 1440, 1441, 1444, 1445, 1446, 1447,
    1449, 1451, 1452, 1469, 1470, 1474, 1481, 1482, 1486, 1492, 1512, 1513,
    1517, 1518, 1519, 1523, 1524, 1525, 1528, 1529, 1534, 1536, 1537, 1539
  );
SELECT ROW_COUNT() AS newly_classified_bot_views;
SQL

Expect 72 newly classified views, or fewer if automatic detection has already flagged some. Repeating the command leaves already classified rows unchanged. Refresh the reports afterward; no service restart is needed.

[2.9.0] - 2026-10-28 @ 18:07

This release is named for the element Tungsten (W). Tungsten has the highest melting point of any pure metal, about 3,422°C.

Summary

Add a single command to start or stop MyCount’s three services sequentially.

Added

  • Add executable scripts/services.sh start|stop, starting the collector, Control, and router worker in order and stopping them in reverse order. Include the helper in deployment and document its usage.

Changed

  • Refresh the four attached BMForge skill bundles and manager to BMForge 0.15.0 (source revision 7817daa5bdec), including shared guidance for sequential multi-service start and stop commands. Update the pinned hashes; component specification versions remain unchanged.

[2.8.1] - 2026-10-28 @ 05:19

  • Updated README.

[2.8.0] - 2026-10-28 @ 04:15

This release is named for the element Gadolinium (Gd). Certain gadolinium compounds are used as contrast agents in MRI scans.

Summary

Adopt pinned BMForge engineering guidance and troubleshooting skills while preserving MyCount’s existing application and development conventions.

Performed a security analysis for the exposure of the listener. Identified

Added

  • Show the country name when hovering over a Unicode flag in the Metrics page’s Recent Visits table, and include the full name in its screen-reader label.
  • Attach BMForge RCA, HTTP, database, and visualization skills with their reference snapshots, version lock, and a local integrity check that runs without Git or network access. Document how to use them within MyCount’s existing coding guidelines and owner-managed update process.

Changed

  • Rename the Metrics location table to “Visits by City Table” and the location chart to “Visits by Country Chart”.

[2.7.0] - 2026-10-25 @ 15:14

This release is named for the element Silver (Ag). Silver conducts electricity better than copper, better than any other metal.

  • Filter phone renderers, desktop/iPhone platform mismatches, oversized renderer viewports, and Facebook preview profiles from bot-filtered reports. Apply the same checks to new visits and historical visits with false or missing bot flags.

[2.6.1] - 2026-10-23 @ 17:20

This release is named for the element Neon (Ne). Neon glows reddish-orange in an electrical discharge, even though many so-called neon signs use other gases for different colors.

  • Fix Control favicon errors after deployment by packaging the image with the server and verifying it through the deployment copier and HTTP endpoint.
  • Show browser language preferences after City on Visitors, in preference order, with column filtering and sorting.

[2.6.0] - 2026-10-20 @ 04:36

The Voyager release is named for NASA’s Interstellar exploration spacecraft.

  • Add a Site drop-down to Report filters on Map, Metrics, and Marketing. Default to * for all sites and filter traffic charts and tables by the selected site, preserving it in recent-visit pagination.

[2.5.2] - 2026-10-19 @ 05:17

The Ulysses release is named for the Solar polar exploration spacecraft.

  • Avoid waiting behind a pending Caddy reload job during upgrade: enable the service separately, start it only when inactive, then reload Caddy directly.

[2.5.1] - 2026-10-19 @ 05:13

The Tianwen release is named for the Chinese planetary exploration program.

  • Fix Caddy reload failures during upgrade by reusing its existing wildcard listeners instead of introducing conflicting IPv4 sockets.
  • Reload Caddy directly with a bounded timeout and restore configuration files on failure, avoiding an indefinite wait on systemd’s reload notification.

[2.5.0] - 2026-10-19 @ 05:05

The Sputnik release is named for the Soviet satellite, the first one to be put into orbit.

  • Create conf/mycount.json in the production install with CMDB network defaults, preserve user overrides during upgrades, and load them on restart.
  • Add scripts/restart.sh to apply network configuration to Caddy, router mappings, and MyCount services without redeploying the application.

  • Use DMyCount.CMDB_NETWORK as the source for local listener interfaces and ports, including Caddy, router mappings, and deployment health checks.

[2.4.3] - 2026-10-18 @ 08:17

The Pioneer release is named to commemorate the early space exploration programs.

  • Use multiples of 5 for the All Traffic chart’s y-axis ticks on the Metrics page.

[2.4.2] - 2026-10-18 @ 08:12

The OSIRIS-REx release is named for the Asteroid sample-return mission.

  • Added bmforge.osoyalce.com to the CORS whitelist.

[2.4.1] - 2026-10-17 @ 21:42

The New-Horizons release is named for the Pluto and Kuiper Belt exploration missions.

  • Minor website edits.

[2.4.0] - 2026-10-17 @ 17:21

The Luna release is named after the Soviet lunar exploration program.

  • Added GitHub marketing category to track GitHub software releases.

[2.3.3] - 2026-10-17 @ 17:07

The Kepler release is named for the Exoplanet-hunting space telescope which in turn was named after Johannes Kepler (1571 – 1630 AD).

Fixed

  • Point the new-site guide’s configuration link to the GitHub source and correct the documentation site’s repository reference to MyCount.
  • Removed another broken link.

[2.3.2] - 2026-10-17 @ 16:57

The Juno release is named after the Jupiter orbiter.

Fixed

  • Removed broken link.

[2.3.1] - 2026-10-17 @ 16:52

The Ingenuity release is named after the Mars helicopter.

Removed

  • Old example MD file.

[2.3.0] - 2026-10-17 @ 16:47

The Hubble release is named for the Hubble Telescope.

  • Significant updates to the public website.

[2.2.0] - 2026-10-17 @ 11:36

The Galileo release is named for the Jupiter exploration mission.

Added

  • A stack of gallery screensots.

Changed

  • Updated map-banner image.

[2.1.1] - 2026-10-17 @ 10:27

The Friendship7 release is named after John Glenn’s orbital spacecraft.

Fixed

  • Added skeleton gallery page.

[2.1.0] - 2026-10-17 @ 10:21

The Europa release is named after Jupiter’s moon.

Changed

  • Updated public website content.

Fixed

  • Exclude HeadlessChrome, Dataprovider.com, web-image-collection-research, and WebDriver automation from bot-filtered reports and counters, including historical records with false or missing bot flags.

[2.0.3] - 2026-10-17 @ 08:36

The Discovery release is named for the NASA Space Shuttle of the same name.

Changed

  • Remove redundant page headings from Map, Marketing, and Visitors, and rename the Reference heading to Data Sources.

[2.0.1] - 2026-10-17 @ 08:26

The Cassini release is named for the Saturn exploration spacecraft.

Changed

  • Show the current page in the internal web interface’s title and header, and use the MyCount logo as its favicon.
  • Website title.
  • Made logo background transparent.
  • Enabled Minimal Mistakes wide layouts while retaining the author sidebar.

[2.0.0] - 2026-10-17 @ 07:57

The BepiColombo release is named for the ESA/JAXA Mercury exploration mission.

Fixed

  • Rebuilt site _config.yml.
  • Added a site logo.

[1.11.4] - 2026-10-17 @ 01:31

This release celebrates the Cree language. This is the nīsitanaw (20) release.

  • Limit the Visits by Location Chart legend to 10 visible countries, with scrolling to see the rest.

[1.11.2] - 2026-10-11 @ 06:34

This release is named for the Smilodon who roamed this planet about 10,000 years ago.

  • Darken Visitor Map dot centers by 50% while keeping the current green outline.

[1.11.1] - 2026-10-11 @ 06:31

This release remembers the Rugops who were here 95 million years ago.

  • Make Visitor Map hit dots darker and more saturated, with less grey.

[1.11.0] - 2026-10-11 @ 06:25

This release remembers the last Quagga that died in 1883.

  • Change Visitor Map hit dots to moderately bright green with a lighter green outline.

[1.10.0] - 2026-10-10 @ 07:56

The “Ingrid” release is dedicated to the Baroness Ingrid Daubechies.

  • Added CMDB_DATABASES = (("MyCount", "mycount"),) to the DMyCount constans for CMDB DB support.

[1.9.0] - 2026-10-10 @ 06:31

The “Grace” release is dedicated to Grace Chisholm Young.

  • Added CMDB information to support modelling Deployed Components. Used for app data backups.

[1.8.3] - 2026-10-09 @ 20:30

The “Emma” release is dedicated to Emmy Noether.

  • Make Visitors column headings sort the displayed rows in ascending or descending order, with numeric sorting for coordinates and bot flags.
  • Add an Exclude bots checkbox to Visitors, checked by default, and preserve its setting with column filters and pagination.

[1.8.2] - 2026-10-09 @ 20:24

The Dorothy release is dedicated to Dorothy Vaughan.

  • Limit the Visitors table to 30 records per page.

[1.8.1] - 2026-10-09 @ 20:18

The Cecilia release is dedicated to Cecilia Krieger.

  • Keep each visitor record on one line, with horizontal scrolling for all columns.

[1.8.0] - 2026-10-09 @ 20:11

The Bertha release is dedicated to Bertha Swirles.

  • Add Visitors before Reference in the control navigation, with every page-view column, site and URL, readable headings, per-column filters, and pagination.

[1.7.0] - 2026-10-09 @ 17:50

This release is named after Maria Gaetana Agnesi.

  • Classify Bytespider as a bot and apply the same classification to historical report filtering and known-bot totals without changing stored visits.
  • Exclude mycount_smoke_ sites and root /__mycount_test__ page paths from reports, maps, daily charts, counting-since dates, and public counters, even when the bot filter is disabled. Keep test records for verification.

[1.6.10] - 2026-10-09 @ 04:55

  • Added aihydra.osoyalce.com to the whitelist.

[1.6.9] - 2026-10-08 @ 06:10

  • Sort the allowed site origins alphabetically.
  • Add diskha.osoyalce.com to the whitelist.

[1.6.7] - 2026-10-07 @ 04:02

  • Added Blog marketing category.

[1.6.6] - 2026-10-06 @ 05:33

  • Use Map, Metrics, Marketing, Reference navigation order with brackets and separators, omitting the current page.

[1.6.5] - 2026-10-06 @ 05:29

  • Distinguish the collapsed Visits by Location and Visits by Site boxes with Chart and Table titles.

  • Show the City DB last-refresh timestamp on its own line below the city count.

[1.6.4] - 2026-10-06 @ 04:13

  • Make Visitor Map the landing page at /, move Metrics to /metrics, and update navigation and Metrics pagination links. /map still opens the map.

  • Organize the map page into a permanently visible Visitor Map box and collapsed Visitor Log and City DB boxes; keep visit totals above the map, simplify explanatory text, and label city database markers as CityDB.

[1.6.2] - 2026-10-06 @ 03:50

  • Apply a dark theme to the visitor map tiles, popups, and controls, with bright orange markers matching MyCount’s palette.
  • Plot visitors without stored coordinates using city, region, and country matches from a local GeoNames reference file; retain ambiguous locations as unmapped and identify approximate city markers.
  • Add BMDynIP-style Enabled, cron expression, and Update controls to the map page, with quarterly city-data refreshes through an unprivileged cron launcher. Preserve settings during upgrades and working data on refresh failures.

[1.6.1] - 2026-10-06 @ 03:20

[1.6.0] - 2026-10-06 @ 03:19

  • Add a Leaflet world map at /map with visitor location markers, page-view counts, date and bot filters, and totals for visits without coordinates.

[1.5.4] - 2026-10-05 @ 18:38

  • Restore deployment metadata preparation and dependency checks in the release script, repair the missing 1.5.3 deployment baseline, and identify version mismatches in upgrade errors.

[1.5.3] - 2026-10-05 @ 18:34

  • Add CMDB scanner metadata: subtype Web Analytics, supplier Nadim-Daniel, and codename Insight.
  • Updated scripts/new-release.sh script.

[1.5.2] - 2026-10-04 @ 19:52

  • Make all Metrics boxes collapsible and collapsed by default, and move Recent Visits pagination links to the right of its title bar.

[1.5.1] - 2026-10-04 @ 19:40

  • Expand all pie charts and legends to 11 Mondrian colors with dark and darker red, blue, and yellow shades, plus matching slice outlines.

  • Show readable language names in the Visits by Language legend and hover text, including country and script names. Preserve unrecognized tags and keep regional preferences separate.

[1.5.0] - 2026-10-04 @ 19:32

  • Split the location pie chart cell into Visits by Location and Visits by Language, using each visit’s first browser language preference and the current report filters. Include missing preferences as Unknown.

[1.4.1] - 2026-10-04 @ 19:09

  • Allow https://bmgeoip.osoyalce.com and https://bmdynip.osoyalce.com to submit page views to the collector.

[1.4.0] - 2026-10-04 @ 07:15

  • Add a MyCount event to track system events.

[1.3.1] - 2026-10-04 @ 05:52

  • Add sidebar content.

[1.3.0] - 2026-10-03 @ 21:00

  • Add a background UPnP worker that checks TCP ports 80 and 443 every five minutes, repairs missing or incorrect mappings, and retries router failures. Preserve correct mappings, bound router commands with timeouts, and manage the worker during installation, upgrades, and uninstall.

[1.2.0] - 2026-10-03 @ 16:55

  • Refresh the documentation site’s client example with a build-versioned script URL, the site counter, and current payload verification instructions; document the /get_count Caddy route and publication of updated client assets.
  • Remove the date-range and pagination hint from Report Filters.
  • Remove the Report Filters timezone control and automatically use the browser’s local timezone for report dates and marketing chart posting times, including when following report links from another timezone.

[1.1.0] - 2026-10-03 @ 16:19

Summary

Preserve marketing screenshots when a save may already have committed and make retries confirm the same posting. Bound control reports by date range, paginate recent visits, and move report orchestration into an activity.

  • Distinguish uncertain database commits, retain affected screenshots, and use unique marketing submission IDs to prevent duplicate retry effects.
  • Add explicit reconciliation for old unreferenced screenshots, preserving referenced files and recent uploads.
  • Default reports to 30 local calendar days, allow ranges up to 366 days, and paginate recent visits in groups of 50 using receipt time and record ID.
  • Query daily chart aggregates using timezone-aware UTC day boundaries instead of loading every visit timestamp into the browser.
  • Move report queries, snapshot transactions, and connection cleanup to ReadReports; keep filters and pagination in the report URLs.

  • Add scripts/clear-upnpc-routes.sh to clear MyCount’s TCP port 80/443 router mappings and matching UDP destinations, verify removal, and preserve other ports and unmatched UDP mappings.
  • Invoke router cleanup during uninstall before removing application files; stop file removal if cleanup fails.

[1.0.0] - 2026-10-03 @ 15:22

Summary

Use BMGeoIP for geolocation and detect the deployment host when routing public traffic, so MyCount can be installed on wintermute without local GeoIP datasets.

  • Query BMGeoIP at geoip.osoyalce.com:54300, validate its response, and preserve location snapshots and overlapping-range selection. Service failures return 503.
  • Remove local GeoIP import code and refresh scheduling; retain visitor data and remove legacy schedules during full setup.
  • Discover the install host through UPnP, replace TCP port 80/443 mappings, and verify that both mappings point to the detected host.
  • Restore alphabetical platform ordering, including Discord.
  • Tighten marketing form, URL, Origin, and request framing validation.

[0.14.2] - 2026-10-03 @ 04:55

  • Smooth the Marketing visits line with Plotly spline interpolation.

[0.14.1] - 2026-10-03 @ 04:53

  • Added Discord platform.

[0.14.0] - 2026-10-03 @ 04:45

  • Attach optional PNG screenshots to promotional posts, store files in the server’s pages/marketing folder, and display them from the event details or chart marker. Preserve existing events with a nullable screenshot reference, retain uploads through upgrades and uninstall, and remove new files if saving fails.
  • Add a simple Marketing form for promotional posts with browser-local posting time, alphabetized platforms, posting URL, and notes; store posting events in UTC with system-generated creation timestamps.
  • Plot daily total visits on Marketing with vertical posting markers and a bot filter, alongside the saved posting details.
  • Show the creator’s GitHub account in the documentation author profile.
  • Remove brackets from the top-right navigation, hide the current page’s link, and add a blank Marketing page.
  • Added mycount site name to the _config.yml.

[0.13.2] - 2026-10-01 @ 03:05

  • Increase the bottom chart content height to 300px, with a taller Visits by Site pie and legend.

[0.13.1] - 2026-10-01 @ 03:02

  • Show Visits by Site legend items on one line as site - visits (23%), rounding percentages to whole numbers for this chart only.

[0.13.0] - 2026-10-01 @ 02:56

  • Use Mondrian chart colors with brighter 4-pixel bar and pie outlines, and render the location pie with Plotly.
  • Add a Visits by Site pie beside All Traffic at the bottom of Metrics, occupying one third of the row and stacking on small screens.

[0.12.0] - 2026-10-01 @ 02:40

  • Add a compact, full-width Plotly bar chart titled All Traffic at the bottom of Metrics, showing daily hits across all sites in browser-local time, including zero-traffic days and respecting the bot filter.

[0.11.1] - 2026-09-30 @ 17:37

  • Populate Counting since from the earliest recorded visit on Metrics and Reference, using the browser’s local date and keeping it independent of the bot filter.

    [0.11.0] - 2026-09-30 @ 17:29

  • Add a sortable Referrers table in the right column, grouped by host with visit totals, Direct / Unknown visits, bot filtering, and a 10-row scroll area.
  • Move the Visits by Location pie chart above the location table.

  • Limit Recent Visits and Visits by Location to a 10-record viewport with scrolling, and load all matching recent visits instead of only the latest 20.

  • Add “Counting since September XX, 2026” beneath MyCount Control in the title box.

[0.10.0] - 2026-09-28 @ 12:32

  • Add a Visits by Location country pie chart below the location table, with visit counts, percentages, and the existing bot filter.

[0.9.1] - 2026-09-27 @ 17:44

  • Prefix country names in Visits by Location with Unicode flags while preserving country-name sorting.
  • Prefix cities in Recent Visits with Unicode country flags, retaining city-name sorting and omitting flags for unknown countries.
  • Add City between Time and URL in Recent Visits, displaying --- for unknown cities.

[0.9.0] - 2026-09-27 @ 17:38

  • Add Recent Visits below Visits by Site with the latest 20 matching visits, newest first, browser-local dates, 12-hour times, and URLs. Apply the existing bot filter.

[0.8.0] - 2026-09-27 @ 16:36

  • Add a read-only, bot-filtered /get_count?site=... endpoint and optional data-mycount-counter elements in the shared client. Fetch once after tracking, reuse the count across elements, and show an em dash on failure without retrying or recording extra visits. Route the endpoint through Caddy.

[0.7.3] - 2026-09-27 @ 16:24

  • Add a Filters box with Exclude bots enabled by default, consistently filtering site/page/location counts, last-visited times, and totals. Include historical GoogleOther/Googlebot records in exclusion and correctly flag new GoogleOther visits as bots.
  • Fix country-name backfill timeouts by scanning primary keys in bounded batches and committing each batch independently. Log progress and preserve completed updates on retry.

[0.7.2] - 2026-09-27 @ 16:06

  • Store CSV country names in GeoIP ranges and visits; backfill missing historical names from ISO codes using pycountry. Display full country names while retaining country codes for grouping.
  • Remove Continent from the location report, collection, and both database schemas; upgrades drop the old columns while preserving visits and ranges.

[0.7.0] - 2026-09-27 @ 15:56

  • Add bold, right-aligned total rows to the site and location tables, kept at the bottom when sorting.
  • Rename Sites to Visits by Site and add a sortable Visits by Location table alongside it, with continent, country code, state/province, city, and visit totals. Show unknown locations as --- and stack the tables on narrow screens.

[0.6.11] - 2026-09-27 @ 14:44

Added

  • Store the request’s full IPv4 or IPv6 address with each new page view. Add a nullable IP column for existing databases, preserving unknown historical addresses.
  • Retain page query strings separately from page URLs, store the full browser-provided HTTP(S) referrer, and import/copy GeoIP continent values with nullable schema migrations.
  • Import optional GeoIP latitude/longitude, ZIP/postal code, and timezone and retain them with new visits. Validate coordinates and field lengths, preserve postal-code leading zeros, keep the browser timezone separate, and add nullable schema migrations.

Changed

  • Format Last refresh as MMM DD - HH:MM in browser-local time.
  • Consolidate Reference into one Visitor Data inventory with Source, Source Details, Table, Column, and Details; include optional browser fields, all GeoIP CSV fields, and explicit markers for values not stored.
  • Limit Visitor Data to external browser, request, and GeoIP inputs, sorted by Source and then Source Details.
  • Update the collection documentation and Reference storage mappings for the new fields.

Removed

  • Remove the unused region-code field from collection and reference documentation; upgrades drop its database column while preserving visits and region names.
  • Remove internal identifiers, derived values, protocol metadata, and the hypothetical IP-hash entry from the Reference inventory.
  • Remove obsolete tracking placeholders and the browser identity documentation section.

[0.6.9] - 2026-09-27 @ 13:50

  • Add Metrics and Reference navigation to the report server, show the collection tables and optional browser fields on Reference, move Last refresh below the header, and enable column sorting for metrics.
  • Document collected page-view data, optional browser details, storage locations, and browser ID behavior in a linked data inventory.

[0.6.8] - 2026-09-27 @ 13:06

  • Extract portable, standard-library deployment tooling with project-supplied configuration. Generate DDeployment.py from source scans and explicit MyCount rules; require a nonmutating freshness check during release preparation. Document the reusable boundary and maintenance workflow.
  • Shorten the deployment dependency guide for DevOps and document the portability boundary and planned dependency generator.
  • Refactor deployment into explicit stages selected by impact flags. Limit service-only file copies and removals to affected targets, skip deployment stages for no-impact releases, and publish installed release metadata only after successful completion.
  • Record deployment-impact flags during release preparation and combine them across skipped releases during upgrades. Report-only releases restart only the control service; filesystem/setup changes use the full deployment workflow.
  • Add an initial installed-artifact baseline and preserve the last successful deployed version for retrying failed upgrades. Reject unprepared deployment files before stopping services.
  • Add DeploymentImpact to check whether an artifact affects a deployment target through direct or transitive dependencies, and list all affected targets.
  • Require deployment dependency updates alongside relevant code and asset changes, prominently in the Coding Guidelines.
  • Define static file dependency graphs for the report server, listener, and filesystem/setup targets in DDeployment, as the foundation for selective deployment decisions.

[0.6.6] - 2026-09-27 @ 12:12

  • Expand site rows to show per-page visit counts and last-visited times, ordered by most visits first with URL order breaking ties.

[0.6.5] - 2026-09-27 @ 12:02

  • Show per-site visit totals and latest visit times in MyCount Control, with browser-local timestamps and a title-bar last-refresh time. Load database credentials for the control service.

[0.6.2] - 2026-09-27 @ 11:52

  • Add a standalone mycount-control service on port 61777 with a dark orange banner styled after R3el. Install and upgrade deploy and health-check both services; uninstall removes both.

[0.6.0] - 2026-09-27 @ 09:46

  • Count unique browsers per site using a persistent random first-party local-storage ID. Keep collecting unidentified page views when storage is blocked, and preserve historical rows without inventing visitor identities.
  • Add per-site totals for page views, unique browser IDs, unidentified views, and known bot views; document rollout and counting limits.

[0.5.0] - 2026-09-27 @ 09:35

Summary

Record referring sites and richer visitor details alongside existing city, region, country, and language data. Preserve historical visits and accept older clients during rollout.

  • Add referrer hostname, retained user-agent, browser/OS versions, device brand/model, and bot classification.
  • Collect optional screen, timezone, hardware, connection, navigation, and browser preference details with bounded validation.
  • Add repeatable schema migration and document collector-first deployment and referrer/city reporting.

[0.4.2] - 2026-09-27 @ 08:39

  • Allow https://r3el.osoyalce.com to submit page views to the collector.

[0.4.0] - 2026-09-27 @ 08:01

  • Added a bunch of allowed sites.

Added

  • Add an Ax3l HTTPS smoke test for health, CORS preflight, and one identifiable test visit, with an optional local Caddy mode.

[0.3.0] - 2026-09-27 @ 07:19

Added

  • Add an upgrade script that reuses deployment, validates retained credentials before stopping the collector, and preserves GeoIP data instead of repeating the import.
  • Allow MyCount and Ax3l through a configurable origin allowlist; accept validated client site labels and require page URLs to match the requesting origin.

Changed

  • Update the client example to display its configured /count endpoint and explain how to verify that a page view was stored.

[0.2.0] - 2026-09-27 @ 07:03

Added

  • Add a repeatable uninstaller and removal guide; preserve collected data, credentials, accounts, and shared services and router mappings.
  • Add isolated deployment tests for repeated installation/removal, Caddy preservation, validation failures, and reload rollback.

Changed

  • Show installation stages and GeoIP download/import progress so the initial data load no longer appears stuck after dependency installation.
  • Check Python and deployment prerequisites, stop the collector before dependency updates, and verify collector health before configuring HTTPS.
  • Validate Caddy with relative imports anchored to its configuration directory and restore previous configuration files if service activation or reload fails.
  • Add Caddy setup preserving existing sites, public certificate automation, and UPnP forwarding; accept validated visitor addresses from the local proxy for geolocation.
  • Use standard HTTPS port 443 with /count for collection; keep port 36666 local, forward router ports 80/443, and update the browser endpoint and installation guide.
  • Document the complete Caddy configuration, import placement alongside the LAN-only site, validation and reload commands, and public HTTPS verification.

[0.1.0] - 2026-09-26 @ 16:20

Summary

Establish the MyCount documentation website and development foundation, with shared coding conventions and a tested release workflow. Add the shared MariaDB layer and explicit schema setup as the foundation for collection and reporting. Add local IPv4/IPv6 geolocation and an installer with weekly reference-data updates.

Added

  • Separate GeoIP download, import, schema, and lookup components using the free ipapi.is IPv4 and IPv6 datasets and the shared MariaDB layer.
  • Root installer for the application, database, credentials, systemd service, and weekly GeoIP cron job; refreshes publish both address families together.
  • Collector skeleton with HTTP handling, visit preparation, and persistence in separate components.
  • Visit entity for passing validated visit data between processing activities, independent of database persistence.
  • Generic DbMgr with parameterized queries, UTC connections, transaction rollback, read-only transactions, and explicit connection cleanup.
  • Separate visitor schema activity with reporting indexes and relational constraints, designed for repeatable installation and upgrade setup.
  • PyMySQL dependency, focused database tests, and a data access guide linked from the documentation index.
  • JavaScript page-view client and Jekyll example targeting https://count.osoyalce.com/, with a linked integration guide.
  • Project mission documenting the mydynip testing purpose, planned visitor metrics, browser and service components, and privacy boundaries, linked from the homepage.
  • Jekyll configuration for mycount.osoyalce.com using the dark Minimal Mistakes theme.
  • Minimal homepage linking coding guidelines, release management, and the changelog.
  • AGENTS.md and MyCount coding guidelines covering component responsibilities, constants naming, and focused documentation.
  • Python package foundation with DMyCount.VERSION, initially 0.0.1.
  • Release script that updates the version and changelog, merges feature work through dev to main, and publishes an annotated tag.
  • Six isolated release tests covering successful publication, prereleases, invalid input, dirty working trees, duplicate versions, and help output.
  • Release guide documenting development checks and the maintainer’s release workflow.

Changed

  • Replace the preliminary MaxMind integration with local ipapi.is reference data; widen city names to accommodate verified upstream values.
  • Use index.md as the sole documentation root, require every documentation page to be reachable from it, and simplify the README to a website pointer; record these conventions in the coding guidelines.
  • Document development ownership: the AI assistant handles implementation, tests, and documentation; the project owner owns architecture, all Git operations, and release scripts.
  • Extend .gitignore for Jekyll output, caches, and local Bundler dependencies.