I worked for Passware from September, 2015 to May 30, 2025, for almost 10 years (9 years and 9 months to be exact).
Rather long period of time but I'm not sure I can share all notable moments and can go into details about software developed.
This post will probably be short long.
Passware is a small company having less than 100 employees. Quoted from the website:
The world leader in encrypted electronic evidence discovery and decryption.
Password recovery tools for forensic teams, businesses and home office with up to 70% success rate.
Thus, the company is developing native Windows/MacOS application for recovering passwords, encryption keys and other types of secrets (the top-tier product supports over 400 applications/file types, according to the website).
My role in the company was significantly different from all other developers' roles as I was focused on web development rather than native Windows/MacOS app development.
I was involved in the development and support of:
Most of the time I worked alone solving problems set by CEO Dmitry Sumin and the sales and customer support departments. In some rare cases I've collaborated with other developers to solve (mostly) integration problems.
In my work I was using Django, PostgreSQL, Celery, Ansible, Jenkins, Sentry, some Javascript libraries for front-end tasks, nginx, git and other tools.
The codebase I've started to work with in 2015 was pretty small - two Flask-powered services and one Django-powered service.
Can't say I liked the code but it was written by C++ developers who knew Python, so it was something to be ready for (I was not ready, though).
A more serious problem was the lack of testing, automated deployment and staging environment - everything I'm used to while working for Chtd. Deployments were made by developers by hand, sometimes with code changes on the server (ouch!).
Not so fast as it could be but all of this was fixed by me.
We initially tried to use third-party CI/CD solution but ran into some issues with the flow so I ended up setting up self-hosted instance of Jenkins.
To collect errors I've setup self-hosted instance of Sentry.
The codebase story turned out to be a bit more complicated. I rewrote the code twice to get it to a state I consider good and manageable - several Django-powered services supported by tests covering up to 60-80% of the code. By the end of 2018 it was deployed to production and is likely still running there (though the company decided to switch to Typescript for these services).
I had never worked with Ansible before this work and not sure I would use it but CTO of the company, Alik Kurdyukov, suggested to use it to manage the servers.
So, after some try-and-fail efforts, by the end of 2015 I've managed to deploy Jenkins and Sentry using Ansible.
Both production and test environments were put under the control of Ansible playbooks in the spring of 2019.
The test environment was a fully functional copy of the production services including a copy of the company's website allowing us to test almost everything we needed.
Here is a list of third-party services that the company used while I was there:
This is not an exhaustive list of features and tasks - just a few.
I think it was the main feature I've introduced while rewriting the old codebase - highly customized version of Django's Admin Site. It was used by staff and has grown to a rather large tool with extended possibilities.
Most interesting features:
This service was started in 2018 as a simple place for company's partners to get marketing materials and has gradually grown to a full featured portal allowing partners to get invoices and products license details.
Most interesting features:
Quite interesting task implemented in 2021 - calculate Retention rate of new, active and returned customers in terms of days and products.
Admin Site allows to manage subscription period which means retention rate must be recalculated every day to ensure proper data.
I decided to do all the calculations on the PostgreSQL side using PL/pgSQL to minimize the data processing overhead.
It worked well.
I think this was the most challenging feature to implement as it involves dynamic pricing for the selected product.
Here is a short description of the feature (quoted from the company's support site):
There is a price lock for Passware Kit Mobile customers: no price increases will be applied for the first two years, and an annual price increase will be capped at 5% thereafter, provided an annual license is maintained.
Sounds simple but the implementation was not so.
Anyway, it was implemented and hopefully worked as expected.
Not as challenging feature as the previous one. But it was long awaited feature needed to simplify occasional edits of HTML templates used to send in emails.
For historical reasons email templates were saved in HTML format. Every time the marketing team decided to update the design manual work was required to place new layout correctly.
Sergei Gromov, website developer focused on frontend and HTML design, was also responsible for getting the emails right. He used MJML in his work and I was impressed by its simplicity.
Thus, a separate nodejs-based service for converting MJML to HTML was born.
This allowed us to store email templates in MJML format which greatly simplified our workflow.
Can't say it was a fun time. But nevertheless I'm grateful to the entire team of the company, to CEO and CTO for this time.
Working alone was not as easy as I thought. It's much better to work in a small team, say 3-5 colleagues.
It's time to move on.