Changes in version 0.8.0 (2026-06-02) Per-project settings: save / restore - Model configuration is now keyed by (project, purpose) — the data file is no longer part of the key. A project's several input files (a small test extract, the full dataset) share one variable/parameter configuration, so switching files keeps the setup. get_project_settings() and set_project_settings() lost their file_basename argument accordingly. - Button-only save. The "Save current as default" buttons are the save mechanism: the section 3 button saves the target, effective date, and predictor configuration; the section 4 button saves the earth call parameters and the Allowed Interactions matrix. Each button updates only its own half (read-merge), so they never clobber each other. Fit no longer auto-saves — you can fit experimentally without overwriting your saved default. There is no on-change auto-save. - Save and restore are server-side and DB-authoritative: configuration is written to / read from projects.sqlite directly from the inputs at the render and click, with no localStorage round-trip. This removes a class of restore races and a JSON double-encoding bug that could corrupt a saved row on the next save. - The Effective Date field is shown in all purposes (general/CMA and market values have an effective date too, not just USPAP/IVS appraisals); it is still only used to compute sale_age in appraisal/market modes. Database durability - projects.sqlite opens in WAL journaling mode where supported, for crash-safe writes and non-blocking reads. - The settings-table schema migration runs in a single transaction with crash recovery: an interrupted upgrade rolls back to the original table (no orphaned _old, no half-copied data), and a previously-stranded _old table is restored on the next connect. Legacy per-file rows are collapsed to one row per (project, purpose), keeping the most recent. Bug fixes - Predicting on raw data with a Date column as a model predictor no longer errors ("subscript out of bounds" / column-count mismatch). Newdata is now aligned to the trained frame (align_to_training_): date columns are coerced to the model's numeric encoding and factor levels are matched. Affects the Intermediate Output and RCA exports. - fit_earth() drops a non-zero newvar.penalty (with a message) when case weights are present, since earth does not support that combination — previously it errored mid-fit (notably in market/appraisal mode where a skipped row is encoded as a zero weight). - Character date columns are parsed with the same multi-format set as validate_types(), so any column that validates as a date also coerces (no more silent failures on MM/DD/YYYY and similar). Project model (regProj) - New first-class project concept replaces the old per-file workflow. A project is a stable, named entity at a fixed location in the regProj tree (///_in/... and _out_/...), holding all input files, outputs, and settings together. Files within a project travel as a unit. - Top-of-sidebar Project picker with sort (Recent / A-Z) and a New Project wizard that captures purpose, country, and admin-level cascade with country-specific terminology. - Path layout is flat: /____/_in/. All admin levels concatenated into one segment via _. Reduces depth from 13 to 8 directories under the regProj root. Encoded by regproj_flat_segment(), decoded by regproj_parse_flat(). - Cross-OS multi-leaf scaffold: every project gets mac_in, mac_out_*, ubuntu_in, ubuntu_out_*, win11_in, win11_out_* siblings. - Active-project model drives output paths automatically. The legacy Output Folder field and Project Location cascade are gone — output folder is set from the active project at session time. - Section "Import Data" reads from the active project's _in/; files added manually are picked up via Refresh. Geo data + variable-depth admin schema - New geo.sqlite (in regProj root) replaces the old .regproj-index.json. Two tables: countries and admin_entries with variable depth via (country, level, parent_codes) index. Supports any number of admin levels per country. - Comprehensive shipped data: - US: 51 states, 3,076 counties, ~21,000 incorporated places (Census). - GB / DE / IT / FR / SE: full GeoNames-derived state / county / city data (~45,000 entries combined). - SG: 1-level (planning area) data for Singapore. - Total ~70,000 admin entries shipped; users can add more via the cascade's "create new" path. regproj_index_get/put API unchanged for callers, just SQLite-backed now. - DE specifically uses admin3_code (Kreis) instead of GeoNames' admin2_code (Regierungsbezirk), matching how German appraisers think about administrative geography. Per-project settings (projects.sqlite) - New projects.sqlite in regProj root replaces the user-level settings.sqlite for project model settings. Keyed by (flat_segment, file_basename), separate JSON columns for earth, glmnet, and mgcv settings/variables/interactions. - Public API: get_project_settings() and set_project_settings() — read/write project settings programmatically without launching the Shiny UI. Designed for ValEngr integration and batch automation. - Settings now travel with the regProj tree (sync, backup, share with colleagues — all settings come too). User-level settings.sqlite retained only for locale defaults. Quarto report split: Generate + Convert - Section 9 — "Generate Quarto Report": writes a self-contained .qmd bundle (source + plot assets + reference.docx) under /mac_out_earth/_qmd/. No Quarto rendering happens at this step. - Section 10 — "Convert Quarto Report": file picker + format checkboxes (HTML / Word / PDF). Renders any .qmd file (not just earthUI-generated) to selected formats. Useful for combining reports across projects via Quarto's {{< include >}}. - New exports: generate_quarto_report(), convert_quarto_file(). - report_data.rds is now a lean ~hundreds-of-KB asset (down from hundreds of MB) — the bulky earth model object is no longer saved since the qmd reads pre-generated plots from disk. - Quarto .qmd template now self-renders against a sibling report_data.rds when no params are passed, so quarto preview Appraisal_1.qmd works standalone. Settings tab - New "regProj Root Folder" config in the Settings dropdown — set the location of the regProj tree per machine. Persisted in the per-OS prefs file at R_user_dir("earthUI", "config")/prefs.json. - Resolution order: REGPROJ_ROOT env var → prefs file → per-OS default (~/regProj Mac/Linux, C:/regProj Win). Other - Server startup extends PATH with /usr/local/bin, /opt/homebrew/bin, and TinyTeX bin paths so Quarto / pandoc / latex are findable from the Shiny session even when launched from a stripped-PATH context. - Per-session DB connections (one geo, one projects) — eliminates per-render connection overhead. - Sales Comparison Grid now exported as build_sales_grid() from the package (extracted from the old inst/app/sales_grid.R). Available to batch scripts and ValEngr. Changes in version 0.7.0 Per-Purpose Settings - Switching purpose (General / Appraisal / Market) now fully clears all state: imported data, model results, tabs, variable configuration, and earth parameters. The app resets to a clean default state. - Settings are now stored per purpose. localStorage keys include a purpose suffix (_general, _appraisal, _market), so each purpose maintains independent variable configuration, earth parameters, and interaction matrices for each imported file. - SQLite backup keys encode purpose (filename||purpose), so settings persist across browser sessions per purpose+file combination. - When a file is imported after a purpose switch, previously saved settings for that file+purpose combination are automatically restored. - Backward-compatible migration detects old-format localStorage keys (without purpose suffix) and copies them to the correct purpose-suffixed key on first load. Fitting Modal Auto-Dismiss - The fitting modal and backdrop now auto-dismiss 1.5 seconds after tabs finish rendering, preventing the overlay from blocking sidebar sections. - On error, the backdrop is removed immediately while the modal stays visible with the close button so the user can read the error. Changes in version 0.6.0 Nord Theme Overhaul - Navbar, sidebar, and all UI elements now use Bootstrap CSS variables (var(--bs-body-bg), var(--bs-body-color), var(--bs-border-color)) instead of hardcoded colors, so light and dark modes adapt correctly. - Theme toggle button redesigned as a circular icon matching the glmnetUI and mgcvUI style. - Custom data-eui-theme attribute replaces data-bs-theme to avoid conflicts with Bootstrap 5's built-in color mode system. - Consistent Nord palette usage across earthUI, glmnetUI, and mgcvUI. Predictor Settings Table - Column headers "Include", "Factor", and "Linear" now render vertically (rotated text), saving horizontal space. - Checkbox columns grouped together (Include, Factor, Linear) with the Special dropdown moved after them. - Header row uses position: sticky with a solid theme-aware background so it stays fixed while scrolling the variable list. - Shows "Select a target variable above to configure predictors." when no target is selected, instead of an empty bordered bar. Data Tab Fix - Appraisal mode data preview now shows all columns on initial load when no target or predictors are selected yet. Previously only the "row" column was visible. Section Info Icons - Blue "?" info icons added to section headers (Sections 1-4, 6-9) with Bootstrap popovers describing each section's purpose. - Info icons are right-justified within the sidebar using absolute positioning. Popovers open to the left to avoid overflow. Purpose Mode Improvements - Switching purpose (General / Appraisal / Market) now clears all model results, RCA state, and report assets to prevent stale data. - Purpose radio selection saved back to localStorage for persistence. Button Styling - Buttons updated to use Frost-palette classes (btn-primary, btn-outline-secondary) instead of Aurora classes (btn-success, btn-danger) per the shared UI conventions. Changes in version 0.2.0 3D Interaction Plot Fix - Fixed plotly surface transposition bug — add_surface() uses z[i,j] at (x[j], y[i]), the transpose of base R persp(). Data point dots now correctly align with the surface in interaction contribution graphs. Report Rendering - New prepare_report_assets() function pre-generates all plots (PNG + PDF) and pre-computes all data, so render_report() only runs Quarto/pandoc format conversion. - render_report() gains assets_dir parameter to accept pre-generated assets for faster multi-format rendering. - Report rendering now runs asynchronously via callr::r_bg() with a modal dialog showing elapsed time and Quarto progress. The app stays responsive. - HTML reports now use KaTeX instead of MathJax for faster math rendering. - Word reports now include "Page X of Y" page numbers in the footer. Post-Fit UX - Results tabs appear immediately with "Waiting for processing to complete." messages while the model is fitting. The RCA Adjustments tab shows "7. Calculate RCA Adjustments & Download must first be initiated and completed." - The Data tab persists across fits — same output IDs used before and after fitting, so the data table is never destroyed and recreated. - Tab content renders on-demand (only the active tab computes). - auto_export_for_mgcv_() (saveRDS) now runs in a background process to avoid blocking the UI after fit completion. - Fit log and mgcv auto-export deferred via session$onFlushed() and callr::r_bg() so tabs appear instantly. Event Logging - New session event log: _earthui_log.txt in the output folder records start/end timestamps and elapsed times for Model Fit, Download Output, RCA Adjustments, Sales Grid generation, and Report rendering. One file per data file, appended to across operations. Testing - 71 new tests (1026 total): - eval_g_function_() direct unit tests for all component types (17 tests) - Plotly surface transposition verification (15 tests) - prepare_report_assets() and render_report() with assets_dir (15 tests) - Expanded export report error handling tests Changes in version 0.1.3 (2026-03-18) Locale & Regional Settings - Country-based locale system with 31 country presets controlling CSV separator, decimal mark, thousands separator, date format ordering, and paper size. - Country dropdown with individual override dropdowns for Paper, CSV sep, Decimal, and Date format. - Global locale defaults saved via "Save as my default" (SQLite persistence), independent of per-file settings. - Number formatting on plot axes and slope labels adapts to locale (e.g., German uses period thousands, Finnish uses space, Swiss uses apostrophe). - CSV import uses locale-aware separator and decimal mark. - PDF reports respect locale paper size (Letter or A4). - Date parsing tries locale-preferred format order first (MDY for US, DMY for Europe, YMD for Sweden/Japan). - Currency symbols removed from all outputs --- earthUI is now currency-agnostic. Changes in version 0.1.2 Sales Comparison Grid (Appraisal Mode) - New Sales Comparison Grid output for appraisal workflows — generates multi-sheet Excel workbooks with subject and up to 30 comps (3 per sheet). - Auto-recommended comp selection based on gross adjustment percentage (< 25%), sorted by gross adjustment. - Sale Price / Concessions / Net SP row with formula-based Net SP. - Grouped rows for Location (longitude, latitude, area), Site Size (lot_size, site_dimensions), and Age (actual_age, effective_age) with combined value contributions. - CQA|Residual row with formula-based remaining residual that auto-decreases as the appraiser fills in residual feature breakdowns. - Adjusted Sale Price formula: Net SP + all adjustments above Total VC row. - Sheet protection with locked formulas and data cells; unlocked residual feature input cells for appraiser entry. - Haversine-based subject proximity calculation for each comp. Special Column Types - Added new special column types: dom, concessions, actual_age, effective_age, lot_size, site_dimensions, area. - Special type badges displayed next to variable names in predictor settings. - Single-assignment enforcement: only one column per special type (except display_only which allows multiple). Intermediate Output Improvements - Ranking columns (residual_sf, cqa_sf, residual, cqa) moved to leftmost position in the Step 6 download for easier CQA evaluation. - Excel number formatting: residual_sf as currency (2 dp), residual as currency (0 dp), cqa_sf and cqa as numeric (2 dp). UI Improvements - Fit Earth Model button always visible (no longer inside collapsible section). - Minimum sidebar width (500px) to prevent predictor settings column overlap. - Wider notification popups (450px) with word-wrapping for long file paths. Bug Fixes - Cross-validated R-squared now uses model$cv.rsq directly instead of parsing cv.rsq.tab. Changes in version 0.1.0 Core - Shiny GUI for interactive earth (MARS) model building. - Data import from CSV and Excel files with automatic snake_case column naming. - Variable configuration with include, factor, and linear-only controls. - Full exposure of all earth() parameters through the GUI with inline help popovers. - Cross-validation automatically enabled for interaction and variance models. - Settings persistence via localStorage across browser sessions. - Light/dark mode toggle. Allowed Interactions - Allowed interaction matrix for constraining degree >= 2 models. - CSS sticky headers — top row and left column stay visible while scrolling. - Click variable name to toggle all its interactions (symmetric toggle). - Allow All / Clear All buttons. Multivariate Models - Multi-response model support: select multiple target variables to fit cbind() earth models. - Per-response equation display, summary metrics, and ANOVA decomposition. - All plot functions accept response_idx to select which response to visualize. - Observation weights via the weights parameter in fit_earth(). Model Fitting - Asynchronous background fitting via callr::r_bg() with real-time trace display and elapsed timer. - Automatic nfold/ncross adjustment for variance models. - Synchronous fallback when callr is unavailable. Visualization - Variable importance bar charts. - Per-variable contribution plots with piecewise-linear slope labels and knot markers. - g-function plots: 1D line, interactive 3D surface (plotly), static 3D perspective (persp()), and filled contour. - Correlation matrix heatmap. - Diagnostic plots: residuals vs fitted, Q-Q, actual vs predicted. - Adaptive axis formatting — 3 decimal places for lat/long-scale data, commas for large values. - Slope labels scaled to axis range (/0.001 for small-range, /unit for large-range variables). Model Equation - LaTeX equation with g-function notation rendered via MathJax in the app and native LaTeX in PDF reports. - Full LaTeX special character escaping (_, $, %, &, #). Report Export - Publication-quality HTML, PDF, and Word reports via Quarto. - Both 3D perspective and contour plots for degree-2 groups in static reports. - Earth model summary, ANOVA decomposition, and raw earth output sections.