-
Happy 50th Anniversary, Apple!
For today’s Apple’s 50th anniversary, I didn’t write a special blog post. Maybe I should have. I kind of forgot about it, even though I wrote about it a few days ago. Anyway, a few years ago, I wrote about the root of my passion for Apple. I’m not sure this article aged well, though. Nonetheless, Apple and Steve Jobs played a major role in defining who I am today, that’s for sure.
Continue reading → -
A Little Rant about LinkedIn
Rant of the day: Why is Microsoft not caring about making the LinkedIn app a better app, a better mobile experience? Aren’t they using designers? UX specialists? Even AI? Aren’t they taking care of their brand and image? I mean, using this app on the iPad is such a displeasure.
If someone from Microsoft and / or LinkedIn responsible for this app: have tried it once for real on the iPad? Are you ok with this? Really? If you aren’t, and obviously cannot do anything about it, why are you still working there?
Continue reading → -
The iPad Pro on The Road for Office Work
Finally, I configured my personal iPad Pro with all my office tools. I certainly wish my job would allow me to use a Mac, but no.
The iPad is very good in this scenario with all the M365 apps (bleh). Battery life is 20 times better than my HP laptop, without the always-on noisy fans. I understand this device is way more powerful than the MacBook Neo, much more compact, three times more expensive for an inferior software experience. That is quite a paradox.
Continue reading → -
The iPhone 5 and the MacBook Neo
One of the best iPhone design, the iPhone 5, is now obsolete for Apple, which means is no longer serviceable. It was one of my favorite design of all the iPhone partly because of the tech context it was living. But iOS 6 on this was pure beauty.
As a side note, it’s funny to see reviews of the MacBook Neo where none of them mention macOS as being part of the machine. What makes a Mac is not only the hardware, but the software. I guess tech pundits had to exclude macOS from the equation. Or is it because the Neo design is so unique, so enchanting that the software story has to be sidelined?
Continue reading → -
Good Job Apple, Now Back to Software?
Ok, Apple did a great job this week. A lot has already been said about Apple’s announcements. The MacBook Neo is a killer, even as an entry device. My wife is getting one. It’s the original Mac mini in a laptop shape. Apple did a great balancing act with the Neo. The only two quibbles: only 8 GB of RAM (I wanted 12 GB) and the lack of a MagSafe port.
Continue reading → -
Dim that background for me, will ya?
★ HazeOver — Mac Utility for Highlighting the Frontmost Window:
What HazeOver does is highlight the active window by dimming all background windows. That’s it. But it does this simple task with aplomb, and it makes a significant difference in the day-to-day usability of MacOS. Not just MacOS 26 Tahoe — all recent versions of MacOS suffer from a design that makes it difficult to distinguish, instantly, the frontmost (a.k.a. key) window from background windows.1 Making all background windows a little dimmer makes a notable difference.
Continue reading → -
Micro.blog + RSS = ?
Micro.blog is set to launch soon what could be its most exciting new feature yet: an integrated RSS reader. If I’m not mistaken, this could significantly change how I use the service. I currently follow many Mastodon accounts from news sites, so their updates are pushed to my timeline. With a possible RSS integration, I could use the RSS feeds directly, eliminating the need to follow the Mastodon account. I don’t know how the new feature will integrate with the rest of Micro.blog features, but I’ll find out very soon. I can’t wait. Why? Because I’m a fan of Micro.blog and of RSS.
Continue reading → -
More MacBook Expectations
Here’s what I want for the upcoming entry-level MacBook:
- Size and design: thin and less boxy than two iPad Pro on top of each other.
- Just under 13-inch retina display.
- Full-size keyboard flush with the left and right device edges.
- 8GB of RAM with a 12GB option available.
- 256 GB of fast storage (120 GB/s) with a 512GB upgrade option.
- One fast USB-C port and MagSafe.
- Very thin bezel around the display to minimize the overall device size. Fingers crossed for a notch-less design.
- External display support (a bit far-fetched, though).
- Colors similar to the current iMac desktop.
What I don’t expect:
Continue reading → -
A Short Conversation with ChatGPT About The Upcoming Entry-Level MacBook
Is the Apple A18 Pro more powerful than the Apple Silicon M1 ?
In a straight performance comparison, the Apple A18 Pro (a smartphone SoC used in the iPhone 16 Pro) and the Apple Silicon M1 (Apple’s first Mac/desktop-class chip) are closer than you might expect — but neither is strictly “more powerful” across all categories. The answer depends heavily on how you measure performance:
🔋 Architecture & Design Goals
• Apple A18 Pro
Continue reading → -
About This Tempting Light MacBook
If the rumors turn out to be true, Apple will announce a new entry-level MacBook line on March 4th. Why is this relevant to me? Well, I’m really curious to see what Apple will offer in terms of technical specifications and overall design, because I might be tempted to get one. But why? I already have an M2 MacBook Air 15"!
The short answer: to use while travelling instead of bringing my M4 iPad Pro! But I’ve always said that the iPad is a perfect device to bring on trips! That’s true, but it still lacks one thing: the flexibility macOS provides. Yes, we’re back to the Mac again!
Continue reading → -
When I Retire...
One of my nieces’ friends works in IT and recently contacted me for advice about his career in this field. This isn’t the first time I’ve received this kind of request. Over the past year, two other colleagues have also asked me for similar career advice. I have to admit, I really enjoy it. I like listening to the concerns of the younger generation and, to the best of my knowledge, advising them to help them flourish even more.
Continue reading → -
We're Making a Big Mistake
I believe that IT workers who are also passionate about gen AI are making a major misjudgment. We wrongly assume that the advances we observe in our field, such as the autonomous or semi-autonomous development of applications, also translate to sectors like medicine or law. This is a false generalization.
The field of IT heavily relies on strict formalism: the raw material consumed by LLMs. In the legal field, for example, this is not the case: it is much more complex. Laws, regulations, and judgments are generally written and presented in standardized forms, but the content is far from being as digestible formalism as lines of code written in a programming language. In my opinion, we should remember that when we share our enthusiasm for gen AI. We must be lucid while also setting the right expectations for decision-makers and lawmakers.
Continue reading → -
The Rise of Cognitive Dept
Margaret-Anne Storey introduces “cognitive debt” as a concept that may be more threatening than technical debt in AI-augmented development. Unlike technical debt (which lives in code), cognitive debt is the erosion of shared understanding that resides in developers’ minds. Drawing on Peter Naur’s concept of a program as a “theory” distributed across teams, the article argues that as AI and agentic tools push for development velocity, teams risk losing their collective understanding of why systems work the way they do. Even if AI generates technically clean code, teams can become paralyzed when no one can explain design decisions or anticipate the consequences of changes. The author calls for intentional slowdowns, collaborative practices, and serious research into measuring and mitigating this growing challenge.
Continue reading → -
Traveling to Egypt and Jordan: Some of My Random Travel Notes
-
One of my favourite things while flying is seeing a plane go in the opposite direction at a distance, ideally close enough to feel the raw speed of the plane added to mine.
-
I loved Egypt, but the chaos of Cairo can be overwhelming and tiring. I prefer the relative calm of Jordan’s cities. I may be getting too old for some scenery.
-
WhatsApp is a dominant communication platform worldwide, except in North America. Too bad it is so awkward to navigate and is owned by Meta.
Continue reading →
-
-
Something Is Going On
I’m still working on this, but I’m heading in the right direction. I realize that every blog post should have a title so that my RSS flow feed looks great. 👀
Continue
reading →
-
I'm rebuilding Flickr!
Well, maybe not, but here’s a description of my recently created photo-sharing webapp. And I have many more ideas to improve this.
Photo Sharing WebApp - Feature Overview
A modern, full-stack travel photo gallery built with Next.js 15, featuring intelligent photo management, interactive maps, and seamless cloud storage integration.
🌟 Highlights
- Zero-Database Architecture: Uses Vercel Blob for photos and Redis (via Vercel KV) for metadata
- Privacy Controls: Public, unlisted, and private album visibility options
- Interactive World Map: Displays photo locations extracted from EXIF GPS data
- Responsive Design: Optimized for all devices from mobile to desktop
- Admin Panel: Complete photo management without leaving the browser
🎨 Public Gallery Features
Album Management
- Collapsible Albums: Each travel album can be expanded or collapsed independently
- Smart Defaults: Most recent album automatically expands on page load
- Album Metadata: Title, description, and date for each collection
- Privacy Levels:
- Public: Visible to everyone on the homepage
- Unlisted: Only accessible via direct link
- Private: Visible only to authenticated admins
Photo Display
- Grid Layout Options: Three display modes to suit your preference
- Comfortable: Spacious 2-5 column grid with square thumbnails
- Compact: Dense 3-6 column grid for maximum photos per screen
- Masonry: Pinterest-style layout preserving original aspect ratios
- Layout Persistence: Grid preference saved in browser localStorage
- Newest First: Photos automatically sorted by upload date (newest at top-left)
- Rounded Thumbnails: Modern, elegant aesthetic with subtle shadows
- Hover Effects: Smooth scale and brightness animations on interaction
- Upload Date Display: Shows when each photo was added (in comfortable/masonry modes)
Lightbox Viewer
- Full-Screen Experience: Distraction-free photo viewing
- Navigation Controls:
- Keyboard arrows (← →) for previous/next
- On-screen navigation buttons
- ESC key to close
- Photo Captions: Optional descriptions displayed below photos
- Smooth Transitions: Animated photo changes with loading states
- Mobile Optimized: Touch-friendly controls and responsive sizing
Interactive Features
- World Map Integration:
- Leaflet-based interactive map
- Clustered markers for photos with GPS coordinates
- Click markers to view photos from that location
- Automatic bounds fitting to show all locations
- Album information in marker popups
- Random Featured Photo:
- Displays a random photo from all albums on homepage
- Changes on each page load
- Shows caption if available
- Mini Thumbnails:
- Collapsed albums show preview of first 5 photos
- Smooth animation on expand/collapse
- Photo count badge for albums with 6+ photos
Content Syndication
- RSS Feed: Subscribe to new photo uploads at
/feed.xml - Analytics: Vercel Analytics integration for visitor tracking
🔐 Admin Panel Features
Authentication
- Vercel Authentication: Secure login using your Vercel account
- Protected Routes:
/adminand sub-routes require authentication - Session Management: Logout functionality with redirect
Album Management
- Create Albums:
- Title (required)
- Description (optional)
- Date (optional, ISO format)
- Privacy setting (public/unlisted/private)
- Edit Albums:
- Update all metadata including privacy settings
- Inline editing interface
- Cancel without saving
- Delete Albums:
- Confirmation dialog before deletion
- Automatically deletes all photos in album
- Removes both metadata and blob files
Photo Management
- Bulk Upload:
- Multi-file selection support
- Drag-and-drop interface
- Progress tracking for each file
- Batch processing with individual status indicators
- Total size calculation before upload
- Upload Features:
- Automatic EXIF extraction (GPS, camera, capture settings)
- Optional captions (for single photo uploads)
- Format support: JPG, PNG, WebP, and more
- Visual upload progress bar
- Success/error status for each file
- Photo Organization:
- Clickable photo count badges link to management page
- Grid view of all photos in an album
- Displays metadata: upload date, GPS, camera info
- Empty state with call-to-action
- Delete Photos:
- Individual photo deletion from management page
- Confirmation dialog with photo caption
- Removes both Vercel Blob file and metadata
- Instant UI update on successful deletion
Admin Dashboard
- Album Overview:
- List of all albums (sorted by date, newest first)
- Photo count for each album
- Privacy status indicators with icons
- Quick access buttons (Edit, Upload, Manage, Delete)
- Status Indicators:
- 🌍 Public: Green badge with globe icon
- 🔗 Unlisted: Yellow badge with link icon
- 🔒 Private: Red badge with lock icon
- Responsive Layout: Optimized for tablet and mobile management
🛠️ Technical Architecture
Frontend
- Framework: Next.js 15 with App Router
- Language: TypeScript for type safety
- Styling: Tailwind CSS with custom configurations
- Icons: Lucide React for consistent iconography
- Image Optimization: Next.js Image component with automatic optimization
- State Management: React hooks (useState, useEffect)
- Client-Side Rendering: Dynamic imports for map components (SSR bypass)
Backend
- API Routes: Next.js server-side API endpoints
- File Upload: FormData with multipart handling
- EXIF Parsing:
exif-parserlibrary for metadata extraction - Image Processing: Automatic format conversion and compression
Storage & Database
- Photo Storage: Vercel Blob (CDN-backed object storage)
- Metadata Storage: Redis via Vercel KV Marketplace integration
- Database Client:
ioredisfor Redis connections - Data Structure:
- Albums stored as JSON array in
albumskey - Photos stored per album in
photos:{albumId}keys - No SQL database required
- Albums stored as JSON array in
Deployment
- Platform: Vercel
- Environment:
BLOB_READ_WRITE_TOKEN: Vercel Blob accessKV_REDIS_URL: Redis connection string
- CDN: Automatic edge caching for photos and pages
- Domain: Custom domain support with automatic SSL
📊 Data Models
Album
{ id: string; // album_timestamp_random title: string; // "Japan 2025" description: string; // Trip description date: string; // ISO date "2025-01-15" createdAt: number; // Unix timestamp visibility: "public" | "unlisted" | "private"; }Photo
{ id: string; // photo_timestamp_random albumId: string; // Reference to album blobUrl: string; // Vercel Blob URL caption?: string; // Optional description uploadedAt: number; // Unix timestamp metadata?: { gps?: { latitude: number; longitude: number; altitude?: number; }; camera?: { make?: string; // "Canon" model?: string; // "EOS R5" lens?: string; }; capture?: { dateTaken?: string; // When photo was taken exposureTime?: string; // "1/1000" fNumber?: number; // 2.8 iso?: number; // 100 focalLength?: number; // 50mm }; dimensions?: { width: number; height: number; }; orientation?: number; }; }
🎯 User Flows
Visitor Journey
- Land on homepage → See random featured photo
- View interactive world map with photo locations
- Browse albums (newest expanded by default)
- Click photo → Open lightbox viewer
- Navigate with arrows or keyboard
- Subscribe to RSS feed for updates
Admin Journey
- Navigate to
/admin→ Vercel auth redirect - View dashboard with all albums and photo counts
- Create new album: Click “Create Album” → Fill form → Set privacy
- Upload photos: Click “Upload Photos” → Drag files → Add captions → Upload
- Manage photos: Click photo count badge → View grid → Delete unwanted photos
- Edit album: Click “Edit” → Update metadata/privacy → Save
- Delete album: Click “Delete” → Confirm → Album and all photos removed
🚀 Performance Optimizations
- Image Optimization: Next.js automatic WebP conversion and lazy loading
- CDN Caching: Vercel Edge Network caches photos globally
- Code Splitting: Dynamic imports for heavy components (map)
- Responsive Images: Multiple sizes served based on viewport
- Minimal JavaScript: Client-side JS only where needed
- Fast Page Loads: Static generation where possible
- Efficient Queries: Single Redis calls for album/photo lists
- LocalStorage: Grid layout preference cached client-side
🎨 Design Philosophy
Visual Design
- Color Palette: Blue gradient accents with dark mode support
- Typography: Clear hierarchy with responsive font sizes
- Spacing: Generous whitespace for comfortable reading
- Shadows: Layered depth with hover elevations
- Animations: Subtle 300ms transitions throughout
- Icons: Consistent Lucide icon library
User Experience
- Progressive Disclosure: Collapsed albums reduce cognitive load
- Keyboard Navigation: Full keyboard support in lightbox
- Touch Optimization: Tap targets sized for mobile
- Loading States: Spinners and skeletons during data fetches
- Error Handling: User-friendly error messages
- Confirmation Dialogs: Prevent accidental deletions
Accessibility
- Semantic HTML: Proper heading hierarchy
- Focus States: Visible keyboard focus indicators
- Alt Text: Image descriptions for screen readers
- Color Contrast: WCAG AA compliance
- Responsive Design: Works on all screen sizes
📈 Use Cases
Personal Travel Blog
- Document trips with organized photo albums
- Share adventures with family and friends
- Keep private memories secure with privacy controls
Photography Portfolio
- Showcase work by location or project
- Professional presentation with grid layouts
- Metadata display for technical details
Family Photo Sharing
- Create unlisted albums for family-only access
- Easy upload from mobile devices
- No complicated software required
Educational Projects
- Demonstrate modern web development practices
- Showcase Next.js 15 App Router patterns
- Example of cloud storage integration
🔮 Future Enhancement Ideas
Photo Features
- Bulk photo deletion (select multiple)
- Photo reordering (drag-and-drop)
- Photo editing (crop, rotate, filters)
- Download full-resolution images
- Print/photo book export
Search & Discovery
- Full-text search across captions
- Tag system for categorization
- Timeline view (chronological)
- Favorites/highlights collection
Social Features
- Photo comments system
- Social media share buttons
- Individual photo permalinks
- Public photo embeds
Analytics
- View count tracking
- Popular photos dashboard
- Storage usage metrics
- Visitor analytics
Mobile App
- Native iOS/Android apps
- Offline photo viewing (PWA)
- Camera integration for uploads
- Push notifications for new albums
💡 Why This Architecture?
Serverless-First
- No server maintenance: Vercel handles infrastructure
- Auto-scaling: Handles traffic spikes automatically
- Global CDN: Photos served from edge locations
- Cost-effective: Pay only for usage
Modern Stack
- Type Safety: TypeScript catches bugs at compile time
- React 19: Latest React features and optimizations
- Next.js 15: App Router for improved performance
- Tailwind CSS: Utility-first styling for rapid development
Cloud Storage
- Vercel Blob: Purpose-built for media storage
- Redis: Fast key-value storage for metadata
- No database: Simpler architecture, fewer failure points
- Atomic operations: Redis ensures data consistency
📝 Technical Decisions
Why ioredis instead of @vercel/kv?
The Vercel KV Marketplace integration provides a standard Redis URL, which works better with the
Continue reading →ioredispackage. This offers more flexibility and standard Redis features. -
Building A Dedicated Photo-Sharing Website in Claude Code
Thinking about the upcoming trip to Egypt, I realized I still didn’t have a good solution for sharing photos and comments beyond the usual social networks. Drawing on my experience from the past few weeks deploying web applications on Vercel, I decided to try the same by building a website for sharing and viewing photos. The additional complexity here is that the viewing portion is separate from the photo upload section. Therefore, I need to protect this feature with a password. Additionally, image storage must be optimized to minimize costs and provide a pleasant, flexible viewing experience. I’m using Vercel-only blog storage and Redis for metadata store.
Continue reading → -
Apple Creator Studio - A Few Comments
On today’s announcement by Apple:
- Now we know why it took so long for Apple to update Pages, Numbers and Keynote. Where is iWork? Why no iWork subscription without the pro stuff?
- I don’t understand this bundling of pro apps with consumer-generalistic apps. Is Apple trying to upsell Pro Apps to consumers via a new subscription? They might be. I don’t think pros want to get Numbers or Pages, though.
- Icons are utterly un-Apple, or Apple has become something I no longer relate to software-design-wise. It’s not a good sign.
- Yes, Apple does look like Adobe and … Microsoft. And less, Apple.
- No mention of Photomator. I believe merging Photomator into Photos is not a good idea; combining a photo browsing app with a photo editing app isn’t ideal. Currently, Photos functions more as a photo browser than as a dedicated editing tool, and both aspects risk becoming mediocre. I want a focused, serious photo-editing app that doesn’t try to rival Photoshop. Is that too much to ask? The challenge lies in Apple’s prioritization of profit over user needs, which makes it difficult to develop such an app.
What a strange start to the year.
Continue reading → -
On Scrollbars
After reading a recent Gruber article about the macOS Tahoe window-resizing issue, I found a setting in Appearance that keeps scrollbars always visible. It’s somewhat odd because of the scrollbar’s thickness. I wish Apple would make them thinner and less noticeable. I’m unsure if I’ll get used to this.
Note: On Windows 11, scrollbars are always visible by default but are less obtrusive. 🤷🏻♂️ Apple was once known for leading with excellent design and great visual taste, but this is less obvious nowadays.
Continue reading → -
On Apple’s Deal with Google
Back in November, Google announced Private AI Compute, positioning themselves to offer something like Apple’s Private Cloud Compute. It might be something that OpenAI wasn’t willing to do or didn’t see a fit in their business mission. By offering Private AI Compute, Google might have secured the business with Apple. Anyway, it’s becoming impressive how Google is taking back the lead in AI. Lastly, maybe we will see Google Gemini being added to this week’s next beta of iOS 26.3 to go side-by-side with ChatGPT?
Continue reading →