A serverless, event-driven system that transforms field uploads into an automated travel journal using AWS services.
This is an automated travel journal built on AWS serverless infrastructure with OpenAI integration for intelligent audio transcription validation. The system processes photos, audio recordings, and text notes uploaded to S3, automatically generating timestamped blog posts served via CloudFront.
Click diagram to enlarge
Two buckets: one for raw uploads, one for processed website content. S3 event notifications trigger Lambda functions.
Five serverless functions: start transcription, validate transcription, process photos, build blog posts, and hourly batch creator for aggregating pending content.
GPT models for validating and cleaning Amazon Transcribe output to improve transcription accuracy.
Converts voice recordings (.m4a files) into text transcriptions automatically.
Detects objects, scenes, and wildlife in photos, generating automatic tags and labels.
NoSQL database storing metadata for each upload: timestamps, transcriptions, image labels, and processing status.
Scheduled events triggering hourly batch blog creation to aggregate pending content into unified posts.
Global CDN serving the static website with low latency from edge locations worldwide.
Infrastructure as Code (IaC) for deploying Lambda functions, permissions, and event triggers.
Fine-grained permissions for Lambda execution roles, S3 access, and service-to-service communication.
User uploads files to the source S3 bucket from mobile device or computer. Files are organized by timestamp and type (photos/, notes/, audio/).
S3 sends event notifications to Lambda functions based on file suffix:
FnStartTranscribeFnProcessPhotosFnBuildBlogPost
FnStartTranscribe starts an Amazon Transcribe job. When complete, FnValidateTranscription
is triggered to download the transcript, store it in DynamoDB, and mark the audio as processed.
FnProcessPhotos uses Amazon Rekognition to detect objects, scenes, and landmarks. It generates
web-optimized thumbnails, stores labels in DynamoDB, and saves metadata for later blog assembly.
FnBuildBlogPost queries DynamoDB for all entries matching the timestamp, assembles notes, transcriptions,
and photos into an HTML post, and uploads it to the site bucket.
The blog post is added to site/blog/index.json, which contains metadata for all posts
(timestamps, S3 keys). This index is read by blog.html to display entries.
Lambda creates a CloudFront invalidation for updated paths, ensuring users see fresh content immediately without cache delays.
Users access blog.html via CloudFront. JavaScript fetches index.json, loads individual
post HTML files, and renders them as magazine-style cards with photos, transcriptions, and notes.