TimeWell

TimeWell is a unique platform that lets you store and manage enhanced memories.

In TimeWell, you can upload your photos, create albums and journal entries and enrich all your memories by attaching voice recordings. Since memories are made significant by sharing, TimeWell lets you share your albums and photos with other people for them to add their own perspective to the story through their voice recordings and photos. Through the platform, you can also order a hard copy of your digital photo book along with its voice recordings.

Timewell.io

We are responsible for

Backend Development
Frontend Development
DevOps
summary-box-icon

Scope:

Staff Augmentation


Team:

2 People


Duration:

12 Months

Challenge

We all have a lot of pictures of our friends and family we treasure, but sometimes the photos alone don’t paint the complete picture of what was happening at that moment; you might vaguely remember the situation but forget some important details. To make sure you remember every single detail of that day, you might take pictures, record some voice recordings, or create journal entries, but all of these are scattered across different platforms – photos, notes, recordings and you never really get to look at a picture and fully relieve all of its details. 

Solution

TimeWell allows you to manage and relive your memories and create a cohesive photo album that organizes all your life stories in one central space. By integrating voice recordings and notes into your photos, TimeWell allows you to capture the complete context of your core memories. Most importantly, TimeWell lets you invite your friends and family to upload their photos and attach their voice recordings to enrich your shared memories from their perspective and manage collective memories in one place.

Account setup and management

Creating an account is a very simple process – user needs to input their first name, last name, email and password. Once the account is created, the user chooses from starter and premium plans.

Once logged in, the user can switch between the groups they created and the ones they’ve been invited to under the My Account tab. From here, the owner can also remove anyone from the group.

As for the payment options, users can pay for the subscription with a Credit card, Apple Pay, Google Pay, promo code and a Link, which generates a unique URL. After you’ve chosen your payment method, you’ll need to fill in your billing details, and you’re ready to finalize the order.

We integrated Stripe as a payment gateway, offering both one-time payments for book purchases and premium subscription plans, using the ‘spark-stripe’ package in conjunction with ‘cashier’, which effectively communicates with Stripe’s API.

The application’s architecture supports multi-tenancy, implemented via a billable Tenant model. This model provides secure and efficient management of payments for each individual tenant.

Moreover, Stripe safely stores all card information. We don’t have access to complete card details except for the last four digits, ensuring the highest level of customer data protection.

We further leveraged Stripe’s ‘Prices’ feature to offer flexible yearly and monthly billing options for our premium subscriptions. This billing flexibility is also replicated in our user interface, allowing customers to effortlessly switch between subscription plans.



Photo management

Users start their journey with TimeWell by uploading photos from their devices.

While implementing the photo upload functionality in our project, we encountered an issue with handling images in the High Efficiency Image Format (HEIC/HEIF) – a file format commonly used by iOS devices. Due to PHP’s lack of support for this file format at the time, our application was not equipped to handle these images.

To resolve this issue, we developed a standalone executable file using GoLang, designed to convert HEIC images to the universally supported JPEG format. We also built versions of the GoLang executable for multiple platforms. To help others facing the same issue in the Laravel community, we uploaded it as an open-source package on GitHub (as php-heic-to-jpg). You can read more about the package here.

After uploading their photos, users can enrich them with details like the date of the picture, a title and a voice recording to tell more about the story behind the photo. With these photos, users can create albums and share these photos and albums with others for them to add their photos and voice recordings. There is no limit to how many people you can invite.



Topics

In topics, users can start journaling about a certain topic. They can either create a new topic or browse through the suggestions provided by the platform. The topic could be something like “What was I like as a child?” Once the user chooses a topic, they can add voice recordings and all the necessary details around it. Users can ask others to collaborate with them on any topic.



Books

TimeWell also allows users to order a hardcopy photo book through the platform.

To start creating the photo book, users can either import the photos from the photo and album library they’ve already created on the platform or upload pictures from their devices. Users also customize the title and the cover for the photo book.

Similar to their online library, users can invite others to help them build the book.

In the hard copy, on each page, you’ll have the photo you’ve selected to include in the book, along with a QR code that will hold all the voice recordings you’ve attached to it. You can listen to the stories and read the details behind the photos of your book after scanning the QR code.

To connect our website with our partner print shop, we’ve created a PHP service known as the ‘PrintApiService’. This service acts as the bridge between our system and the OCL (One Click Layout) Printing API. It handles the generation of a ‘print request’. This process involves collating all the essential details of the book. Once these details are compiled, they’re transformed into a format that the OCL Printing API can interpret. This exchange takes place via secure HTTP protocols, ensuring the integrity and safety of the data.

Additionally, this service calculates shipping costs by communicating specific order details to the OCL API, such as the number of books and delivery location.

After sending the book data for printing, the service stays in contact with the OCL API to monitor the status of the order, providing updates on the processing, printing, and shipping stages.

One of the requirements that our printing API had was for the QR component (originally an HTML component consisting of a container, QR code, logo, and short link) to be delivered as an image.

We couldn’t store individual QR codes due to the exorbitant storage space that would be needed. So we decided to construct an image from all the static parts of the QR component, generate dynamic data (QR and URL) and assemble it all for each individual request. To protect this method from DDoS attacks and save on resources, we developed a dual-endpoint strategy: public one for low-resolution, resource-effective, on-page rendering QR components and private high-resolution QR components for printing.



Book Gift Voucher

There are two ways you can gift the voucher to someone – you can send an automatic email through TimeWell with a short message, or you can get the PDF sent to your own email so can send the gift voucher to them yourself at a convenient time.

To create a gift voucher, you will need to fill in the basic information about the recipient – First name, Last name, and Email address.

Our system then generates a special PDF for each gift code. This process is handled by our GiftPdfService. The service first finds the gift linked to that code, gathering all the relevant information. Once all the details are collected, a unique QR code is created, making our gift-giving process both digital and physical. This QR code contains a special link that directly connects to the prefilled gift redemption page. To ensure the QR code can be scanned from the PDF, it’s stored as an image.

With all the elements ready, the service uses a blade template to assemble the final PDF. This PDF can be streamed, making it instantly viewable or downloaded for later viewing.

To make gifting even more seamless, the service can also email the PDF to the gift sender. The service takes care of all the email logistics, and if anything goes wrong, it raises an error. This ensures that every PDF reaches its destination.

All of this is made possible with a reliable PDF package called barryvdh/laravel-dompdf, which enables our service to handle PDFs effectively. This GiftPdfService is a cornerstone of our gifting process, making sure every PDF gift is delivered.


Liked our projects?
Let's create something case-worthy together!

stamp

Involvement & Process

We utilize the Vue.js framework complemented by Vuex, which aids us in managing our application state. The bundling of our assets is streamlined by Webpack. Our development approach is shaped around the SCRUM framework, with our work divided into two-week sprints to ensure productivity and efficiency. Bootstrap and SCSS are our chosen tools for UI design, providing us with a robust and reusable component library. With the integration of Vuedraggable, we can enrich our application with fluid drag-and-drop capabilities. To ensure effective version control and code management, we rely on Bitbucket.

Our project was built using a versatile tech stack. Laravel, our primary framework, was complemented by Laravel Cashier and Sanctum for subscription billing services and secure authentication, respectively. Data management was handled by MySQL, with RESTful API ensuring effective server-client communication. Intervention/image and php-heic-to-jpg were employed for image manipulation, especially for HEIC formats. Laravel-dompdf enabled an easy generation of PDFs from HTML. Spark-stripe facilitated secure online transactions via the Stripe payment gateway. In terms of our continuous deployment pipeline, we leveraged bash scripts and Bitbucket. This allowed us to automate deployment tasks and maintain a consistent delivery process. Altogether, these tools delivered an efficient and robust development environment.

We have orchestrated two distinct environments - production and staging - each residing on dedicated Linode machines. This setup allows us to thoroughly vet any changes in the staging environment before promoting them to the production environment.
We employ Wasabi as our preferred solution for image storage, providing us with scalability and efficient retrieval of media assets. As for code management, BitBucket plays a critical role. It facilitates efficient tracking of code changes and promotes collaboration amongst our developers.

Tech Stack

Meet the authors

We are a 200+ people agency and provide product design, software development, and creative growth marketing services to companies ranging from fresh startups to established enterprises. Our work has earned us 100+ international awards, partnerships with Laravel, Vue, Meta, and Google, and the title of Georgia’s agency of the year in 2019 and 2021.

Contact us

Similar Projects

Athenno

B2B SaaS Platform


Energy Service Center

Solar Panel Installation Management Software


iPaybetter

Fintech


Squadro

SaaS Platform