Commit Graph

226 Commits

Author SHA1 Message Date
MarekWo
60c56b9fb8 test: Add visible marker to verify remote update works 2026-01-21 17:39:11 +01:00
MarekWo
df852a1a80 feat: Add remote update capability from web GUI
Adds webhook-based update system that allows triggering updates
directly from the mc-webui menu. Includes:
- Webhook server (updater.py) on port 5050
- Systemd service and install script
- API proxy endpoints for container-to-host communication
- Update modal with progress tracking and auto-reload

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:58:05 +01:00
MarekWo
976d9c6822 docs: Update README to reflect support for Heltec V3 and add DeepWiki badge 2026-01-21 10:44:38 +01:00
MarekWo
59a05b9649 docs: Add Gallery section to README with clickable thumbnails
Add HTML table with 150px thumbnail previews of all screenshots.
Images are clickable to view full size. Updated and added new
screenshots for menu, map, console, and image preview features.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 08:05:33 +01:00
MarekWo
828caaaf98 docs: Screenshot gallery moved out of README 2026-01-20 21:42:15 +01:00
MarekWo
7c78bef906 feat: Add branch info to version display and update checker
- version.py now captures and exports GIT_BRANCH
- Display branch badge next to version in menu (e.g., "2026.01.20+abc1234 [dev]")
- /api/version now returns branch field
- /api/check-update uses frozen branch instead of hardcoded "dev"
- Allows proper update checking for both dev and main branches

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 21:00:11 +01:00
MarekWo
f36c2eb3c8 feat: Add update checker to verify new versions on GitHub
- Add /api/check-update endpoint that queries GitHub API
- Compare current commit hash with latest on dev branch
- Add check button next to version in menu
- Show spinning icon during check, green checkmark when done
- Display "Update available" link when newer version exists
- Handle rate limits and network errors gracefully

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 17:14:59 +01:00
MarekWo
0dc66b8f3c feat: Add update script for easier upgrades
- Add scripts/update.sh with colored output and error handling
- Automates: git pull, version freeze, docker compose rebuild
- Update README with script usage and alias instructions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 16:27:18 +01:00
MarekWo
4a32871d7d fix: Reduce emoji avatar border and chat margins
- Reduce emoji avatar border from 2.5px to 1.5px
- Reduce horizontal padding from 0.5rem to 0.25rem

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 08:17:50 +01:00
MarekWo
d28a791e31 fix: Center emoji vertically in avatar circle
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 08:04:03 +01:00
MarekWo
07de51e56a fix: Use colored border instead of fill for emoji avatars
Emoji avatars are now displayed with a colored ring/outline
instead of filled background for better readability.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 07:56:12 +01:00
MarekWo
2de09811ce fix: Improve chat avatar styling and layout
- Reduce horizontal padding in messages container
- Add colored circle background to emoji avatars
- Fix vertical alignment of avatar with sender name

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 07:52:25 +01:00
MarekWo
5582f85ad0 feat: Add avatar circles to channel messages
- Add mini avatars next to sender names in channel chat
- Extract emoji from username for avatar (first emoji only)
- Use initials for users without emoji (1-2 letters)
- Generate consistent colors based on username hash
- Move sender name outside message bubble (MeshCore style)
- Add responsive styles for mobile devices

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 07:38:15 +01:00
MarekWo
731d4a9d9b refactor: Remove colon from quote format
Format changed from @[User]: »text« to @[User] »text«
Guillemets alone are sufficient to separate the quote.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 11:01:50 +01:00
MarekWo
5d01f90ba1 refactor: Hide guillemets and add line break after quote
- Guillemets (» «) no longer displayed - styling is sufficient
- Added line break after quoted text for better readability
- Raw message still contains guillemets for compatibility

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 10:43:45 +01:00
MarekWo
b2418a50d3 feat: Improve quote format with guillemets and styling
- Changed quote format to: @[Username]: »quoted text«
- Added processQuotes() to detect and style »text« patterns
- Quote styling: italic, gray background, left border
- Different styling for own messages vs others

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 10:29:59 +01:00
MarekWo
936698ca46 feat: Add Quote button to chat messages
Adds a Quote button next to Reply that allows quoting a message.
- Messages ≤20 bytes are quoted in full
- Longer messages are truncated with "..."
- Format: @[Username] "quoted text"
- Uses UTF-8 byte counting for accurate truncation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 10:15:35 +01:00
MarekWo
ffbcd8eead fix: Remove whitespace from image thumbnail template literal
The template literal had newlines and spaces that were preserved by
white-space: pre-wrap CSS, causing unwanted gaps before and after
image previews in chat messages.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 09:48:17 +01:00
MarekWo
039433a8a2 fix: Remove extra spacing before image preview in group chat
Changed message content container from <p> to <div> to fix invalid HTML
when image previews are embedded. The <p> tag cannot contain block-level
elements like <div>, causing browsers to auto-close the paragraph and
create unwanted spacing between text and image preview.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 09:40:14 +01:00
MarekWo
b5cdce18f2 feat: Replace Settings with Device Info modal
- Rename Settings to Device Info with new cpu icon
- Display device parameters in readable table format
- Add copy-to-clipboard buttons for Name and Public Key
- Add map button for device location coordinates
- Show human-readable parameter names and values
- Hide telemetry parameters (not commonly needed)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 17:02:42 +01:00
MarekWo
9bc27042da fix: Re-render messages after geo cache loads to show Map buttons
Messages are now displayed immediately, then re-rendered once geo cache
is ready so Map buttons appear for contacts with GPS coordinates.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 16:28:30 +01:00
MarekWo
7d0fb61533 perf: Don't block UI on geo cache loading
Geo cache now loads fully in background without blocking setupAutoRefresh().
UI is ready as soon as messages are displayed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 13:25:01 +01:00
MarekWo
9e36c17f77 perf: Optimize channel chat loading time
- Add 60s cache for /api/contacts/detailed (reduces 4 USB calls to 0)
- Optimize /api/messages/updates to read file once instead of N×2 times
- Parallelize initialization: timestamps loaded together, messages and
  geo cache loaded in parallel
- Defer checkForUpdates() to after messages are displayed
- Remove blocking checkForUpdates() from loadChannels()
- Add cache invalidation for contacts on add/delete operations
- Add performance timing logs to browser console

Expected improvement: ~10-20s → ~2-3s initial load time

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 13:05:03 +01:00
MarekWo
1e6f47dcde docs: Add version freeze to installation instructions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 12:10:35 +01:00
MarekWo
cd165415e9 docs: Add version freeze step to update instructions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 11:56:26 +01:00
MarekWo
7ca3f4d2dd feat: Add dynamic Git-based versioning system
- Add app/version.py module generating version from Git metadata
- Format: YYYY.MM.DD+<commit_hash> (e.g., 2025.01.18+576c8ca9)
- Add +dirty suffix for uncommitted changes (ignores .env, technotes/)
- Add /api/version endpoint for monitoring
- Display version in hamburger menu
- Add freeze mechanism for Docker builds

Deploy command updated:
git push && ssh ... "cd ~/mc-webui && git pull && python -m app.version freeze && docker compose up -d --build"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 11:47:22 +01:00
MarekWo
7a626ba105 chore: Remove technotes/ from repository
Keep folder local only, already in .gitignore

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:47:13 +01:00
MarekWo
d395656445 feat: Add colored markers and type filtering on contact map
- Use CircleMarker with different colors per contact type:
  - CLI (blue), REP (green), ROOM (purple), SENS (orange)
- Add type filter checkboxes in map modal header
- Dynamically update markers when filters change
- Hide filter panel for single contact view
- Reduce message action buttons to 32x32px

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:21:11 +01:00
MarekWo
f00234af88 style: Make message action buttons icon-only with uniform size
- Remove text labels from Reply and Map buttons
- Add consistent 36x36px square buttons with icons only
- Add tooltips for accessibility
- Prepare for adding more action buttons in the future

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 07:59:18 +01:00
MarekWo
6cb777e90c fix: Map buttons not working in contacts page and message bubbles
- Add Leaflet CSS/JS and map modal to contacts_base.html
- Add showContactOnMap function to contacts.js (contacts page has separate template)
- Load contactsGeoCache before messages to ensure Map buttons appear on bubbles

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 07:51:00 +01:00
MarekWo
72da96e647 feat: Add Leaflet map for contact locations
- Replace Google Maps with Leaflet + OpenStreetMap (free, no API key)
- Add Map button in main menu to show all contacts with GPS
- Add Map button on message bubbles (next to Reply) for senders with GPS
- Contact Management Map buttons now open modal instead of new tab
- Lazy map initialization with proper Bootstrap modal handling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 22:46:36 +01:00
MarekWo
61bd4b41ae chore: Remove unused MC_INACTIVE_HOURS config variable
This variable was defined but never used in the code.
Contact cleanup threshold is controlled directly in the UI.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 17:09:32 +01:00
MarekWo
45e96b9bb7 docs: Simplify installation - auto-detect works by default
Most users don't need to edit .env anymore. Serial port and device
name are auto-detected. Troubleshooting section collapsed by default.

Reduced installation from 8 steps to 7.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:27:49 +01:00
MarekWo
c3d0d3cbdb fix: Add cgroup rule for ttyACM devices (ESP32-S3)
ttyACM uses major 166, not 188 like ttyUSB.
Needed for Espressif ESP32-S3 based devices (Heltec V3, etc.)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:21:11 +01:00
MarekWo
b2496b17b0 feat: Auto-detect serial port from /dev/serial/by-id/
When MC_SERIAL_PORT=auto, bridge scans /dev/serial/by-id/ and:
- Uses the device if exactly one found
- Fails with helpful message if multiple devices (list provided)
- Fails if no devices found

docker-compose.yml now uses device_cgroup_rules instead of explicit
device mapping, allowing auto-detection inside the container.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:18:07 +01:00
MarekWo
b8a77285ab docs: Add MC_DEVICE_NAME=auto as recommended setting
Updated README.md and .env.example to recommend auto-detection
of device name from meshcli prompt instead of manual configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 12:26:58 +01:00
MarekWo
4814b43566 fix: Handle status prefixes in meshcli prompt detection
Meshcli outputs status lines like "Fetching channels ....DeviceName|*".
Updated detection to extract device name after dot sequences.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 12:16:07 +01:00
MarekWo
c7163aa035 feat: Auto-detect device name from meshcli prompt
Bridge now detects device name from meshcli prompt ("DeviceName|*")
and exposes it via /health endpoint. mc-webui fetches this at startup
and uses RuntimeConfig for dynamic device name throughout the app.

Fallback chain: prompt detection → .infos command → MC_DEVICE_NAME env var

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 07:48:10 +01:00
MarekWo
6000750e6c docs: Add update instructions and testing guidelines for mc-webui 2026-01-12 09:51:37 +01:00
MarekWo
d1edbf850d docs: Add Repeater management manual 2026-01-12 09:38:36 +01:00
MarekWo
b00419ce25 fix: Update filtered count badge when type filter returns empty results
The filteredCountBadge in "Add Filtered" button was not updating when
unchecking type filter checkboxes resulted in zero matching contacts.
Now resets badge to '0' and clears filteredPendingContacts array.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 19:23:40 +01:00
MarekWo
672fb2d1ad fix: Add allow_unsafe_werkzeug for threading mode
Flask-SocketIO in threading mode requires explicit permission
to use Werkzeug dev server.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 14:49:45 +01:00
MarekWo
51f64be025 perf: Switch SocketIO from gevent to threading mode
gevent async_mode requires monkey-patching at startup and was causing
6-12s page load times (vs 1-2s before). Threading mode doesn't require
special setup and is sufficient for occasional Console commands.

- Change async_mode from 'gevent' to 'threading'
- Remove gevent/gevent-websocket from requirements (bridge has its own)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 14:44:43 +01:00
MarekWo
195eb10ad9 docs: Update docs/architecture.md with Console feature
- Add Flask-SocketIO to Tech Stack
- Add WebSocket support to mc-webui container description
- Add console.js and socket.io to Project Structure
- Add console.html to templates list
- Add WebSocket API section with Console events and features

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 21:51:26 +01:00
MarekWo
1e22041d42 docs: Add Interactive Console to features and usage
- Add Console to Key Features list
- Add Console to Basic Usage section
- Add Console to Completed Features checklist

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 21:49:00 +01:00
MarekWo
cfa748c5c0 docs: Update diagram 2026-01-09 21:40:44 +01:00
MarekWo
67724ed237 fix: Set COLUMNS/LINES env vars without TERM=dumb
Previous fix with TERM=dumb caused Public channel to disappear.
Only setting COLUMNS and LINES as fallback for os.get_terminal_size().

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 19:38:44 +01:00
MarekWo
85d42d9ffe fix: Set terminal env vars to prevent os.get_terminal_size() errors
meshcli calls os.get_terminal_size() which fails without a TTY.
Setting COLUMNS, LINES, and TERM=dumb provides fallback values.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 18:56:57 +01:00
MarekWo
2412df1d01 fix: Strip leading whitespace from first output line
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 14:01:14 +01:00
MarekWo
1c33ea7b31 fix: Simpler regex to match any prompt line with |*
Previous regex was too specific with \[\d+\] pattern.
New pattern ^[^|]+\|\* matches any line starting with <name>|*

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 13:58:09 +01:00