Hi there đź‘‹

Telegram Attendance Tracker with n8n and Google Sheets

What A fully automated attendance tracking system where team members simply send “IN” or “OUT” messages to a Telegram group. An n8n workflow processes these messages, validates states, logs data to Google Sheets, and replies with confirmations—all without any manual intervention. Components: Telegram bot for message interface n8n workflow for automation logic Google Sheets for data storage and calculations OpenAI GPT-4o-mini (optional) for intelligent message filtering Real scenario: Your team works remotely or in office. Each person sends “IN” when they start work, “OUT” when they finish. The system automatically tracks hours, prevents errors (like double check-ins), and maintains a permanent record in Google Sheets. ...

November 23, 2025 Â· 13 min Â· 2714 words Â· Me

ESP32 Development Setup on Ubuntu

What Install ESP-IDF (Espressif IoT Development Framework) on Ubuntu and run a hello world example on ESP32. Why Official SDK: ESP-IDF is Espressif’s native framework with full hardware support. No Arduino overhead: Direct hardware access, smaller binaries, complete control. Production-ready: Same toolchain used in commercial ESP32 development. How System Requirements Ubuntu/Debian-based Linux Python 3.6 or newer At least 4GB free disk space USB port for ESP32 Video Tutorial ESP32 Setup on Linux: https://www.youtube.com/watch?v=Jt6ZDct4bZk ...

November 22, 2025 Â· 4 min Â· 827 words Â· Me

ESP32 WiFi Ping Server for On-Prem Power Monitoring

What A minimal ESP32 web server that responds with “OK” when pinged. Used to detect on-prem power/network status in cloud-failover architectures. Use case: You have an on-prem server with cloud backup. Ping the ESP32 to know if power is up. If ping fails, start cloud backup. Components: ESP32 board WiFi connection (2.4GHz) ESP-IDF framework HTTP server responding on port 80 Why Failover detection: Cloud apps can ping this to know if on-prem is offline. Cheap: ESP32 costs $5-10. No need for UPS monitoring APIs or expensive hardware. Simple: Single endpoint (/) returns OK. No auth, no dependencies. Low power: ESP32 draws minimal current. Runs indefinitely. Reliable: No OS overhead. Boots in seconds after power restoration. Real scenario: On-prem PostgreSQL + cloud RDS standby. ESP32 sits on same network. Cloud Lambda pings every 30 seconds. If 3 consecutive failures, promote RDS and switch DNS. When ESP32 responds again, you know on-prem is back. ...

November 22, 2025 Â· 6 min Â· 1265 words Â· Me

Mount AWS S3 as a Windows Drive with rclone

What Goal: Mount an AWS S3 bucket as a Windows drive letter (e.g., S:) using rclone. Scope: One S3 remote via rclone config, one batch file to mount, optional auto‑start. Prerequisites: AWS account + S3 bucket + IAM user with access to that bucket. rclone for Windows. WinFSP (required for rclone mount on Windows). Why Faster access: Browse S3 in File Explorer without separate apps or consoles. Simplicity: Open, copy, rename like a normal drive letter. Integrations: Any Windows app that works with drive letters can work with S3. How Step 1 — Install rclone + WinFSP ...

October 15, 2025 Â· 3 min Â· 614 words Â· Me

Error Handling in Spring Boot: Controllers vs Filters

What Two paths: controller exceptions vs pre-controller (filters/interceptors) exceptions. Single response shape via GlobalExceptionHandler for both paths. Flow (who catches what): Controller throws → handled by @ControllerAdvice methods. Filter/interceptor throws → not handled by @ControllerAdvice unless you forward via HandlerExceptionResolver. Why Consistency: avoid container default error pages/messages. Control: send structured GenericResponse with proper HTTP codes. How Global handler (GlobalExceptionHandler): @ControllerAdvice class GlobalExceptionHandler { @ExceptionHandler(UnAuthorizedExceptionThrowable::class) fun handleUnauthorized(ex: UnAuthorizedExceptionThrowable, req: WebRequest): ResponseEntity<GenericResponse<Nothing>> { val body = GenericResponse<Nothing>( responseType = ResponseType.FAIL, message = ex.errorMessage, code = ex.code, type = ex.errorMessage ) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(body) } @ExceptionHandler(Exception::class) fun handleGeneric(ex: Exception, req: WebRequest) = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( GenericResponse<Nothing>( responseType = ResponseType.ERROR, message = ex.message ?: "Internal server error", code = HttpStatus.INTERNAL_SERVER_ERROR.value(), type = "Internal server error" ) ) } Explanation: ...

October 14, 2025 Â· 2 min Â· 359 words Â· Me