Contents

Progress Update and Roadmap

In our recent post about Accrescent’s financial future and sustainability, we announced that to build trust and transparency with our community, we’d be publishing a follow-up blog post about what we’ve been working on lately and where we’ve been setting our sights, i.e., what our roadmap is. This is that post.

If you haven’t already read our post about Accrescent’s future, we highly recommend reading through it for context. The items planned on our long-term roadmap cannot be accomplished unless we reach our funding goal, so any time you spend reading or sharing our post is deeply appreciated.

Beside our long-term roadmap we also provide a timeline of what we plan to accomplish in the next 3 months. We hope this will encourage our supporters and demonstrate our commitment to delivering a first-class Android app store which not only is private and secure, but has the modern features users and developers have come to expect.

Without further ado, here is what we have accomplished in the past many months.

Development progress update

Because we believe in the open source ecosystem, most of our development happens in the open on GitHub and is published under an open source license. However, when creating new projects or experimenting with large changes, we tend to keep some work private temporarily until it’s ready for release1. We’re publicizing and open sourcing our most recent work2 (described below) today to share with our supporters what we’ve been accomplishing. This doesn’t mean it’s all ready to be used in production, but most of it is close or already deployed.

There are 4 major projects we want to talk about:

  1. Parcelo, our server backend
  2. The directory service, a major addition to our server architecture
  3. Ina, our delta update library
  4. Our server infrastructure

Server backend (Parcelo)

Parcelo was already a public project, but the changes we’ve made recently are significant enough to warrant a mention here especially since they relate closely to our other projects.

Decoupling for scale

/posts/progress-update-and-roadmap/parcelo-diagram.png
Parcelo in Accrescent's architecture.

First, we’ve made a number of changes to Parcelo which make it easier to reason about, deploy, and scale. Originally, Parcelo only ran as a single instance on a single server. Its database and all files it stored and served were only accessible on one machine. This approach was sufficient for a while but eventually began to crack at the seams. Server operating system limitations3, VM configuration drift, and manual maintenance tasks4 made maintenance difficult and time-consuming. Besides these problems, Accrescent app developers are distributed worldwide, meaning those far away from our server experience higher latency than those close to it, worsening their experience.

In the end, we decided to decouple Parcelo from its dependencies to enable it to:

  • Run decoupled from its deployment environment, removing OS limitations
  • Scale to support multiple instances worldwide, bringing them closer to developers
  • Deploy automatically almost anywhere, reducing our maintenance burden

In more technical terms, we rewrote core parts of Parcelo and our deployment scripts to:

  • Use a central networked database (PostgreSQL) rather than a local database (SQLite)
  • Store files in object storage (S3, GCS) rather than the local filesystem
  • Read configuration from the environment rather than a local file
  • Deploy Parcelo in a container rather than on a VM
  • Deploy our developer console frontend in the cloud rather than on a VM behind a reverse proxy

This migration required extensive changes in Parcelo’s codebase, but in the end, it made Parcelo much easier to maintain and update. To be specific:

  • We are no longer limited by the operating system we choose
  • It is much easier for third parties to deploy Parcelo in an environment of their choosing
  • We can automatically deploy to the cloud much easier than before
  • Parcelo can run with multiple instances5

all while maintaining very reasonable costs.

We’ll go over our cloud usage and how it’s changed in more detail when we get to our server infrastructure.

The directory service

The directory service is a new server we’re introducing to Accrescent’s architecture. It represents the largest overhaul to how Accrescent works since its inception, completely revamping how Accrescent finds apps, calculates app compatibility6, fetches app listings, and checks for updates. Its introduction also enables a swath of new features and improvements and makes implementing our most-demanded features finally possible.

Features and features and features, oh my!

To be specific, integrating the directory service will immediately make the following improvements:

Additionally, the directory service will make the following features very simple to add shortly after release:

  • Support for localized app listings (i.e. non-English app descriptions)
  • Support for long-form app descriptions
  • Support for screenshots in app descriptions
  • On-demand app publishing / listing and unpublishing / de-listing
  • Scheduled releases / publishing

Finally, the groundwork the directory service lays will make it finally possible and feasible to implement these important major features:

  • Viewing app usage metrics
    • Downloads
    • Active installation estimates
    • Listing views
  • Release channels (e.g. beta releases alongside regular stable releases)
  • Delta updates
  • Private / internal apps and paid apps10

How it works

/posts/progress-update-and-roadmap/directory-service-diagram.png
The directory service fitting into Accrescent's architecture.

Accrescent requests all app metadata from the directory service. This includes:

  • Which apps are available in the store
  • Whether an app is compatible with the device
  • App descriptions and icons
  • How large an app is
  • Whether updates are available
  • Where to download an app’s APKs
  • etc.

Accrescent can then download an app’s files from the app repository as before. The key difference from our previous architecture is that app metadata is dynamic. Thus, it can adapt to users' different devices and languages on-demand.

Quarkus ClickHouse extension

As part of developing the directory service (which uses the Quarkus framework), we’ve developed a Quarkus extension11 for using the ClickHouse database. This makes using ClickHouse from Quarkus significantly easier as a developer, so we hope the community finds it helpful.

Source code

Today we’re open sourcing our work on the directory service and the Quarkus ClickHouse extension and releasing it to the public. You can find the directory service’s source code at the embedded link.

Delta updates (Ina)

Delta updates are a method of reducing software update sizes by reusing existing code from the old version of an app when it hasn’t changed in the new version. Google Play has had delta updates since 2012, but they are noticeably absent from alternative Android app stores. Because we believe the alternative app store experience shouldn’t lack the features of the big players, we created our own implementation of delta updates for Accrescent early last year to bring dramatic bandwidth savings to our tens of thousands of users.

Our implementation is designed to have:

  • A memory-safe implementation
  • Android support out-of-the-box
  • Comparable performance to existing solutions
  • Low memory requirements
  • Streamable patches

We’ve been waiting to integrate delta updates into Accrescent and open source them until after the directory service is deployed since it will be significantly easier for us to do so then. While we still need to deploy the directory service before adding delta updates to Accrescent (which we can’t do without your support), we’re open sourcing Ina (our delta update library) today. You can find Ina’s source code at the embedded link on our GitHub and test it out for yourself by installing Rust and then Ina with

cargo install ina-cli

The ina and sufsort crates are also available on crates.io for any Rust developers who want to use them.

Server infrastructure

We’ve made massive changes to our server infrastructure this year to handle our increases in global traffic and to ensure we (the Accrescent developers) can spend our time focused on improving Accrescent instead of managing and deploying servers. For some numbers: we serve over 17 TB per month in apps, respond to over 28 million requests per month, and have an estimated 63,000+ active installations today12.

The two biggest changes we’ve made in this category are 1) migrating to the cloud and 2) managing our infrastructure as code. These two changes combined have made our server infrastructure nearly zero-maintenance and increased our capacity for traffic with only a slight increase in costs compared to previously.

For an idea of the size of this effort, we currently have 80 managed resources including:

  • Object storage buckets
  • Containerized applications
  • Certificates
  • Databases
  • API keys
  • DNS records
  • Application configurations
  • VPC networks
  • Firewall rules

and many, many more. While some of these are infrastructure boilerplate, almost all of them represent resources we previously had to manage manually, so this migration lifts a huge maintenance burden off of our shoulders.

Managing our infrastructure as code also means deployments are (semi-)automated. We used to use Ansible playbooks to deploy new configurations or versions of Parcelo, but the process was slow and error-prone. Now, we only have to update a few values and run a deploy to upgrade server applications or update configurations, which has drastically reduced the amount of time we spend on deployments and server maintenance

Roadmap

Accrescent is a novel Android app store focused on security, privacy, and usability. Building an app store is an enormous project, and it’s especially difficult to build an app store with built-in security and privacy guarantees beneath a clean, modern, and usable interface. We have big plans for Accrescent, so here we outline some of the major features we plan to implement in an estimated timeline for the next 3 months along with a coherent long-term roadmap.

Short-term timeline

/posts/progress-update-and-roadmap/short-term-timeline.png
Short-term timeline for the Accrescent project roadmap.

The above image summarizes the features we want to implement (or start implementing) in the next 3 months of Accrescent’s development. Here’s what they mean:

  • Directory service: Developing, deploying, and integrating Accrescent with the directory service, a huge overhaul to how Accrescent works which enables a swath of new features and makes implementing further features drastically easier. This is mostly an under-the-hood change.
  • Long descriptions: Developing and releasing long-form (up to 4,000 characters) descriptions for app listings. Developers will be able to add long descriptions to their apps, and users will be able to see them inside Accrescent.
  • Localized listings: Developing and releasing support for localized app listings. Until now, Accrescent has only supported creating a single listing per app, meaning information about the app (e.g. its description) could only be distributed in a single language. This feature will allow developers to create app listings for multiple languages and enable Accrescent to automatically select the best-matching app listing language based on the user’s settings.
  • Listing screenshots: Developing and releasing support for screenshots in app listings. A highly requested feature, this will allow developers to add screenshots of their app to app listings and enable users to see them from within Accrescent, boosting visibility and giving users an opportunity to preview apps before installing them. Screenshots will support localization.
  • Download metrics: Starting development on support for app download metrics. Another highly demanded feature, this will enable developers to see how many downloads their apps are getting, how popular their listing pages are, and how many active installations they have all while preserving user privacy.

This timeline is only an estimate and could change based on the difficulties (or welcome surprises!) we encounter.

Long-term roadmap

As helpful as a short-term timeline is for the immediate future, we know it’s just as important to have a big-picture vision and a plan for the long haul. That’s why here we list a pool of major features we hope to implement after our short-term roadmap is complete.

These features are not yet set to any specific timeline. As a developing project, we want to stay flexible to changing priorities and incorporate feedback from our users. However, we have ordered the below features in the approximate order we would like to implement them from top to bottom.

  • Miscellaneous features
    • Release channels: Allowing developers to create (and users to opt-in to) beta development channels of their app for testing new or unstable app features.
    • Delta updates: Updating Accrescent’s architecture to generate delta (i.e. patch) updates using Ina, our delta update library and utilize them in the Accrescent app to save dramatic amounts of bandwidth for users and us.
  • Developer-focused features
    • App management teams: Enabling multiple Accrescent console users to manage a single app with fine-grained permission support.
    • App publishing API: Developing a stable API to enable developers to publish app updates, listing changes, etc. programatically instead of exclusively via the Accrescent developer console.
    • Scheduled releases: Allowing developers to schedule when app updates or listing changes are published instead of publishing them only on-demand.
    • Staged rollouts: Supporting staged app update rollouts (i.e. updates which are rolled out to only a percentage of users which developers can increase over time).
  • New projects
    • Web store frontend: Creating a web store frontend to Accrescent so that people can browse Accrescent’s app catalog without installing Accrescent.
    • Accrescent CLI: Developing an official CLI for app developers to package, upload, and manage their Accrescent apps with ease from an interactive terminal or CI/CD pipeline.

There are many other features we hope to implement in the background, such as improving the robustness of our server applications, enhancing our infrastructure security, refining store policy, and improving the user experience of our developer console. But the above includes the major features we currently have in our sights.

One small step, one giant leap

It is absolutely incredible for us to see how people have surrounded and supported Accrescent. What began as a passion project with a vision has grown into a an app store globally trusted by tens of thousands of people unified in their desire for a secure, private, and easy-to-use Android app store. We have made leaps in our goal of providing a modern, open source alternative to the big tech app stores, and we hope to make bounds more by pushing the traditional quality standards of free and open source software.

But we can’t do that alone. All of the above planned long-term work is conditional on us reaching our funding goal, which is $5,800/month in recurring donations to cover full-time development. Without funding, we cannot afford to continue advancing Accrescent, so we need your help. If just 2% of our users each gave $5/month, we’d have enough to keep Accrescent actively developed far into the foreseeable future. Our expenses are very lean, and we hope this post demonstrates the progress we can make and hope to make with the donations we receive.

If you want to help us develop Accrescent into the featureful app store it was meant to be, please visit our donation page and make a recurring donation with GitHub Sponsors (all donation forms are appreciated, but recurring is the most helpful for ensuring we can continue development). If you can’t donate but still want to help, share this post with others to spread the word. You can always email sponsor@accrescent.app with donation questions or for other sponsorship arrangements.

We’ll be sharing funding progress updates on our social media accounts and you can view the progress directly on our GitHub Sponsors page. Until then, we’ll ensure Accrescent continues running smoothly in the background: freely, securely, privately, and open source as ever.


  1. We do this for a few reasons. Sometimes we’re just testing an approach which may or may not work out, we may not have chosen an open source license yet, we don’t want people depending on experimental code, or we want to keep it a surprise for a later announcement. ↩︎

  2. Our infrastructure setup is the only exception since it’s tailored to our needs and not required for self-hosting Accrescent. ↩︎

  3. We used to run Parcelo on the latest version of Fedora. Even though Fedora is a relatively up-to-date Linux distro, it held us back from e.g. moving from Java 17 to Java 21 for a while. ↩︎

  4. e.g. upgrading the operating system, updating configuration files (this was partially automated with Ansible, but still painful), and deploying new versions of Parcelo. ↩︎

  5. There may be a little more work to do to verify that running multiple instances of Parcelo with the same data doesn’t cause data corruption. However, it should work fine to the best of our knowledge. ↩︎

  6. Determining whether an app is compatible with a specific Android device (and which files to download for it) is surprisingly complex. There are a slew of attributes to check using complicated matching rules — rules few app stores bother implementing. They may not be relevant for many apps, but for apps using more advanced features like texture compression format targeting or asset modules (commonly used by games), they are essential for ensuring an app store can serve all kinds of apps. ↩︎ ↩︎

  7. ABI, language, and screen density targeting were already supported (though now they’re supported “better”). Additionally, all non-technical targeting (e.g. global region) is unsupported. ↩︎

  8. Our previous schema language for server metadata was JSON. While not inherently bad, protobuf (the de-facto schema language of gRPC) has clear rules and guidelines which make it easy to develop an envolving schema without breaking existing clients. It also has some other benefits over JSON which we liked such as stronger typing and smaller payload size. ↩︎

  9. With our previous static repository metadata approach, we always had two options for adding new information to the schema:

    1. Add it to an existing file, returning more data than needed to the client when it doesn’t need the new field.
    2. Add it to a new file, requiring the client to make another network round trip and thus increasing latency.

    With gRPC, however, we can design our APIs to include only the information requested. And because our endpoints are in predictable locations, there is no need for extra round trips to reduce bandwidth use. ↩︎

  10. We don’t have any specific plans on when and how to support paid apps yet. However, it will be possible to support them with the directory service, whereas formerly it was not since Accrescent’s repository was inherently public. It would be possible to have private repositories / apps (such as internal company apps) or paid apps guarded by authentication at the directory service. ↩︎

  11. Another Quarkus ClickHouse extension already exists. However, it didn’t work on the latest version of Quarkus in our testing, used a very old version of the clickhouse-jdbc driver, and used various deprecated APIs we didn’t want to use, so we decided to write our own. ↩︎

  12. This active installation estimate is based on the number of updates to Accrescent 0.26.0 distributed by our update servers over the past week. Updates are still being distributed at a significant rate, so the real number of active installations is likely higher. Our previous estimate (42,000) was lower as we expected since it was gathered over a much shorter period of time, so it’s not surprising that the more accurate estimate in this article is significantly higher. ↩︎