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 was serious about photography in early 2008. At the time, I was starting to learn to program in Visual Basic language and didn't know a thing about web development. Social media wasn't 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've done. I was inspired by the result and committed to studying web development so that one day I could build a website of my own that's sophisticated enough to display my photos.
By the end of 2011, I finally had a website capable of publishing photos. I decided to name it Camarts — by merging the two words of camera and arts together, and 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.
It was the beginning of what 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 to tweak the website and make sure it looked good on the small screen of handheld 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 — it 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. 
The satisfaction lasted only a short time. I began obsessed with making the website look and feel like a native app by tweaking every tiny detail to mimic the native iOS appearance and behavior, but there was always something that looked or felt wrong to me. It was around that time some excellent apps emerged that raised the bar even higher — I remember a particular one ￼called iDaily, ￼a photojournalism app that features high-quality pictures every day — the images looked perfect on my iPad's Retina Display, and its gesture-based interactions felt so smooth and intuitive . It made me realize that there are so many things impossible to achieve with websites. 
Understanding the technical limitations of web apps, I began exploring the realm of native apps. It was too giant a leap for me. I didn't know a thing about Objective-C, the programming language for iOS apps, and the code looked very 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. 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 dramatically smoother 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-sourced projects and sample codes from tutorials. It was a simple one that fetched data from the WordPress website to generate 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 elucidating and encouraging.
Making the Camarts app gave me so much audacity that a few months later, I managed to pull together a team of three to work on another app idea and 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.
Although I started to work on many other projects since then, Camarts always holds a special place in my heart — it is a representation of me 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 debts accumulated since the early days. After all, WordPress is a CMS meant for blogging, with a constrained information structure and lacks customizability on 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 list of key goals in mind to make it a modernized, high-quality 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 of working on other projects, I knew that things change, and it is almost impossible to predict what is coming.
What I could do is 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 mind be confined by whatever is generally accepted as the way of doing something. Stay creative, and focus on the future.
Stay Lean and Agile — To keep up with the future, I should make the project like a living organism constantly growing over time. It must evolve quickly and be easy to refactor, so it has to stay lean and agile. The core foundation has to be solid and simple, and additional features should only be implemented if and when I'm confident they are 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 — it means no ready-to-use content management system or any other Software as a Service (SaaS) solution, and reduce reliance on third-party code in general, especially if they are close-sourced. 
Cross-platform — The new Camarts should be platform-agnostic by nature. Sure, it would have a web app and a native iOS app to start with, but I would not tie it to any specific platform from a design and technical standpoint. The user interface should be designed to feel consistent across various platforms and considerate of each device's traits. Even the backend should be able to quickly and painlessly adapt to or detach from any platform — so that I could run it from a server, on my laptop, or even on 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 the difficulties of implementing them at a later stage of product design and development. To avoid repeating the same mistakes, I decided to bake internationalization into the DNA of the new Camarts — to be considerate of 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 photo — including camera settings, gears used, my thinking behind the shot, and various aspects of data and description of the geographical location where it was taken.
Fast and Resilient — Being a personal project, Camarts only has 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 tens of thousands of times and overloading the tiny server instantly. I needed the new Camarts to be ready to handle this kind of scenario and ensure speedy 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 work between a tight trip schedule on my little laptop in a hotel or café with a lousy internet connection to keep things running. The process of content management and publishing should be reliably automated as much as possible.
Be Challenging to Build — Building the new Camarts would be the greatest opportunity to learn new things. I decided to challenge myself to learn new tools, technologies, frameworks, and paradigms instead of using the ones I have already been familiar with — even though it would take significantly longer to build. Anyway, I enjoy the process of learning while making things I love.
Learn to build, and build to learn.
Start and Keep Building
After two months of research and design, on October 1st, 2017, I wrote the first line of code for the new Camarts in a hotel room in Hangzhou. 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 the hard drives with raw images, picking and editing 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 have been posting a new one on it 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 following years. I had to work on the app intermittently and finally released the first version on the App Store on January 28th, 2023.
Several weeks later, emboldened by GPT-based 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-sourced frameworks, I managed to make a simple app that provides a slightly better experience than using the web version with 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 to build for is Apple TV, which is the one I’m very excited about. Although tvOS is considered a niche platform in the Apple ecosystem, I’ve 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 go ahead and create the app regardless.
The last platform to build an app 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 since August.  Camarts was among the first six hundred apps built for the new platform available on the App Store on day one.
Now that there’s 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.
The good old days when it was still possible. There was actually a bug in iOS 6 (I think?) where you could install a Web App to a demo device's home screen, but you won't be able to delete them without resetting the device. When I revisited a store weeks after I added my website on their devices, they were still there.
Another feature I liked in the iDaily app was the display of the distance from the location where the photo was taken to where I am — which is now available in today's Camarts.
It was in the early days of HTML 5 and CSS 3. 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 chance that it might break something that worked well, or worse, to sunset some of their service or feature that my code depends on. However, this is just a general principle, and I decide what to use case by case — more on that in the Programming chapter.
An interesting trivia is that at the time, only hundreds of people worldwide were allowed to use the pre-release hardware — less than the number of people who summited Mount Everest in the past year, according to an Apple employee at the lab, which was conducted at a secret office. In addition to signing a lot of confidentiality agreements, all personal devices’ cameras must be covered by security tapes upon entry. It was a tremendous and unforgettable experience.