A Brief Chronicle
This is a live document that updates as I build new things. For what I have planned to do next, see Roadmap.
A Humble Beginning
I’ve always wanted a place to publish my photos on the internet since I got serious about photography in early 2008. At the time, I was starting to learn to program in Visual Basic and didn’t know a thing about web development. Social media wasn’t really a thing back then, so I had to post my photos on whatever blogging platform was popular in China at that time.
In 2010, I learned how to make a simple website by creating the first version of dandyweng.com—my personal homepage with brief information about who I am and what I do. I was inspired by the result and committed to studying web development so that one day I could build a website of my own, one that was sophisticated enough to display my photos.
It was the summer of 2011 when I came across WordPress, an open-source content management system that allows anyone to easily host a blog-like website, even those like me who know little about servers, databases, and PHP—the programming language it was written in. By following a couple of tutorials, I managed to set up and run a WordPress blog and started tweaking its markup and stylesheets to my liking with the built-in theme editor—working with my very limited knowledge of HTML, CSS, and JavaScript. I learned a lot in the process.
By the end of 2011, I finally had a website capable of publishing photos. I decided to name it Camarts—by merging camera and arts. I designed a logo resembling aperture blades and the letter C.
On January 1st, 2012, I published the first photo on Camarts—and so it began.
Going Mobile
It was the beginning of what would come to be known as the golden decade of the mobile internet industry. Every major company started making their websites compatible with mobile browsers and developing iOS and Android apps for their services. I wanted Camarts to have a place on my iPhone’s home screen as well.
The first thing I did was tweak the website to make sure it looked good on the small screen of mobile devices by following the principles of responsive design—a novel concept at the time, a fundamental requirement of today’s websites. Then I managed to add the website to the home screen by packaging it as a Web App, which had a skeuomorphic app icon and even a launch screen, just like any other app! Satisfied with the result, I was too excited to show it to everyone—when I visited Apple retail stores, I would install it on every demo device I could get my hands on. [1]
The satisfaction lasted only a short time. I became obsessed with making the website look and feel like a native app. I tweaked every tiny detail to mimic the iOS appearance and behavior—but something always looked or felt off to me. It was around that time some excellent apps emerged that raised the bar even higher—I remember one in particular: an app called iDaily, a photojournalism app that featured high-quality photographs every day. The images looked perfect on my new iPad’s Retina Display, and its gesture-based interactions felt so smooth and intuitive [2]. It made me realize how limited websites were in comparison. [3]
Understanding the technical limitations of web apps, I began exploring the realm of native apps. It was too big a leap for me. I didn’t know a thing about Objective-C, the programming language for iOS apps, and the code looked intimidating. I was so frustrated that I even considered commissioning an agency to develop an app for me, but the first company I reached out to quoted me about US$60,000 to make an iDaily replica, a staggering amount for a teenager at the time. I had to give up and wait for a better way.
It turned out I didn’t have to wait very long. On June 2nd, 2014, Apple introduced the Swift programming language during its Worldwide Developer Conference (WWDC). The new language had a much gentler learning curve. I started learning it on day one and experimenting with my app ideas.
Over a year later, on September 25th, 2015, I launched the first version of the Camarts app on the Apple App Store. I assembled it from open-source projects and sample code from tutorials. The app was simple: it fetched data from the WordPress website to display a list of photos, and it rendered each post in a simplified webpage with a web view embedded in the app. The app was slow, buggy, and lacked many basic features, but the process of learning, designing, developing, and releasing an app from zero was eye-opening and deeply motivating.
Making the Camarts app gave me the courage to pull together a team of three a few months later to work on another app idea. We eventually launched Vary—a fully-fledged social app with innovative design and features. The experience gave me a much deeper understanding of digital products and software development. It made me eager to create more and better ones.
Farewell, WordPress
Although I’ve worked on many other projects since then, Camarts always holds a special place in my heart—it embodies who I am and should always reflect the best of my ability.
As I began to form a vision for the future of Camarts, I realized the WordPress-based approach would not be sustainable, especially with all the design and technical debt accumulated since the early days. After all, WordPress is a CMS meant for blogging, with a constrained information structure and limited flexibility at deeper levels. It would be challenging, if not impossible, to continue building Camarts on the current platform without making compromises.
I had to rebuild everything from the ground up.
Rebuild from Scratch
In August 2017, I began designing a brand new Camarts with a clear set of goals to turn it into a modern, premium digital product.
Future Oriented
I wanted to create a foundation on which I could continuously build and experiment with new things. I needed to design for the future, but from my experience working on other projects, I knew that things change, and it was almost impossible to predict what was coming.
What I could do was stay forward-thinking—be open to product concepts, design languages, and software frameworks that seemed novel and even somewhat impracticable at the time. I constantly reminded myself not to let my thinking be confined by whatever is generally accepted as the way of doing something. Stay creative. Focus on the future.
Stay Lean and Agile
To keep up with the future, I aimed to treat the project like a living organism, constantly evolving over time. It needed to adapt quickly and be easy to refactor, so it had to stay lean and agile. The core foundation had to be solid and simple, and additional features would only be implemented if and when I was confident they were necessary.
Full Control of Code
In order to build the project exactly how I wanted it to be, I would need to have complete control of the code down to the level of application logic—that meant no ready-to-use content management system or any other Software as a Service (SaaS) solution, and reduced reliance on third-party code in general, especially if they were closed-source. [4]
Cross-platform
The new Camarts would be platform-agnostic by design. While it would start with a web app and a native iOS app, I didn’t want to tie it to any specific platform, either in design or in implementation. The user interface should be designed to feel consistent across platforms while respecting each device’s characteristics. Even the backend should be able to quickly and painlessly adapt to or detach from any platform—so I could run it on a server, my laptop, or even a mini-computer like a Raspberry Pi.
Internationalized
I used to think that things like internationalization and localization were merely finishing touches to a product before I understood how difficult they are to implement in later stages of product design and development. To avoid repeating past mistakes, I decided to bake internationalization into the DNA of the new Camarts—considering it from the very beginning of designing the user interface and database structure.
Informative and Helpful
In addition to making Camarts a visual delight, I also wanted it to be a helpful place to learn photography and explore travel destinations. It should be able to provide detailed information on each photograph—including camera settings, gear used, my thought process behind the image, and contextual details about the geographic location where it was created.
Fast and Resilient
Being a personal project, Camarts usually receives relatively low traffic on ordinary days, so it would be unwise to pay for powerful servers. However, there were times when some influencers posted it on their social media, and the traffic spiked by tens of thousands of visits and instantly overloaded the tiny server. I needed the new Camarts to be ready to handle this kind of scenario and ensure fast access from any city in the world.
Effortless to Run
The new Camarts should be easy to maintain—I travel a lot, and I would never want to be in a situation where I had to squeeze in work during a tight travel schedule on my little laptop in a hotel or café with a poor internet connection just to keep things running. Content management and publishing should be as automated and reliable as possible.
Be Challenging to Build
Building the new Camarts would be a great opportunity to learn new things. I challenged myself to explore new tools, frameworks, and paradigms instead of relying on those I was already familiar with—even though it would take significantly longer to build. After all, I enjoy learning through making things I love.
Learn to build, and build to learn.
Start and Keep Building
On October 1st, 2017, after two months of research and design, I wrote the first line of code for the new Camarts. One year later, I built the foundation, some internal tools, and a simple web app.
Instead of migrating photos from the old website, I decided to start from a clean slate—by going through all my hard drives of raw images, curating and processing them with the new workflow, and then publishing them on the new site one by one. On January 1st, 2019, I posted the first photo on the new Camarts, and since then, I’ve posted a new one every single day.
I launched the web app at the end of the month, but it was rudimentary and had very few photos, so I kept the old website running for a transition period that ended in the summer of 2021 when I shut down the ten-year-old website for good.
After building and polishing the web app for another ten months, I began to design the native iOS app and wrote the first line of code for it on November 16th, 2019. The development, however, took way longer than I had expected as I was swamped with other projects in the years that followed. I had to work on the app intermittently and finally released the first version on January 28th, 2023, on the App Store.
Several weeks later, emboldened by GPT-like AI tools, I challenged myself to create an Android app despite having almost zero knowledge of the platform’s development and programming language. Thanks to AI and open-source frameworks, I managed to make a simple app that provides a slightly better experience than using the web version in a browser. On March 28th, the app debuted on the Google Play Store.
As I continued to expand Camarts to additional platforms, I began to develop a macOS app. Since I could reuse most of the codebase from existing apps, the development process was fairly straightforward, and the first version was released on the Mac App Store on April 28th.
The next platform I built for was Apple TV, which I was especially excited about—the photos just looked so good on a big screen! Although tvOS is a somewhat niche platform within the Apple ecosystem, I still put in a lot of effort to craft the best possible experience, designing a minimalistic user interface with remote control interactions in mind and offering a screensaver slideshow feature. The app was released on May 8th.
It was followed by the watchOS app, launched just four days later. I knew the tiny screen on Apple Watches wouldn’t make much sense for a photo gallery app, but the challenge of designing for a smartwatch tempted me to build the app anyway.
The final platform I built for was visionOS, which was introduced by Apple in June 2023. Designing a spatial user interface was fun and challenging. I was privileged to join the Apple Developer Labs in Singapore and test the app on an actual Vision Pro device starting in August. [5] Camarts was among the first six hundred apps available on the App Store for the new platform on day one.
Now that Camarts has an app on every Apple platform, as well as Android and the web, the first phase of building the new Camarts is nearing completion. It’s time for the next chapter.
To be continued. Last updated on Feb 3, 2024.
Ah, the good old days—when that was still possible. There was a bug in iOS 6 (I think?) where you could install a Web App on a demo device’s home screen but couldn’t delete it without resetting the device. When I revisited a store weeks later, my website was still there on their devices.
Another feature I liked in the iDaily app was showing the distance between where a photo was created and where I was—which is now available in today’s Camarts.
This was back in the early days of HTML5 and CSS3. With advancements in web standards, frameworks, and modern browsers, things are much better today.
I wouldn’t want a company to ship updates that include a dozen features I would never use and the risk of breaking something that was already working—or worse, sunsetting a feature my code depends on. That said, this is just a general principle—I evaluate each case individually—more on that in the Programming chapter.
An interesting bit of trivia: at the time, only hundreds of people worldwide were allowed to use the pre-release hardware—fewer than the number of people who summited Mount Everest that year, according to an Apple employee at the lab, which was held in a secret office. In addition to signing a lot of confidentiality agreements, all personal device cameras had to be covered with security tape upon entry. It was a truly unforgettable experience.