Blog Tech behind the tool

Tech behind the tool

Vadim Kravcenko
Sep 13, 20245 min read

Building an SEO tool like SEOJuice isn't a weekend project. It demands a robust, scalable tech stack capable of handling complex processes while delivering a smooth user experience. When I set out to develop SEOJuice, I knew that every technology choice would significantly impact performance and reliability. I want to share with you the technical backbone of SEOJuice, giving a transparent look at how everything comes together.

Tech-stack Philosophy

My approach has always been to keep things transparent, straightforward and efficient. I aim to avoid unnecessary complexity and try to be as transparent as possible in how things work. I chose proven technologies that I trust and that offer the performance and scalability SEOJuice requires. Minimizing reliance on third-party providers where possible allows for greater control over the core functionality and ensures data security.

Owning the critical components of the platform means I can optimize and adjust as needed without waiting on external services. This philosophy extends to every part of the tech stack, focusing on tools and frameworks that contribute directly to the goals of SEOJuice.

Back-End Stack

At the heart of SEOJuice is Django, a high-level Python web framework known for its robustness and clean design. Django handles everything from URL routing to database interactions, providing a solid foundation for the application. Its "batteries-included" approach means it comes with many features out of the box, reducing the need for additional libraries. It's heavily customized with functionality, but it does the job needed.

The application is served using Gunicorn, a Python WSGI HTTP server, behind Nginx, which acts as a reverse proxy and serves static files. Cloudflare sits in front of everything, providing DNS hosting, SSL Encryption, and additional security features like DDoS protection. This combination ensures that SEOJuice is accessible, secure, and performs well under various conditions.

All servers run on Linux and are hosted by Hetzner, known for reliable and cost-effective hosting solutions. The database is PostgreSQL with the pg-vector extension, enabling efficient similarity searches using vector embeddings — a crucial feature for our AI functionalities.

To handle background tasks and queues, I use Celery with Redis. Celery allows for asynchronous task processing, essential for operations like website crawling and data analysis that shouldn't block the main application. Redis serves as the message broker, facilitating quick communication between components.

Authentication is handled by Auth0. Rather than building and maintaining a custom authentication system, I rely on Auth0 to provide secure and reliable identity management. This includes user registration, login, password resets, and multi-factor authentication, all handled securely.

Everything is containerized using Docker, which ensures consistency across development and production environments. Docker simplifies deployment and scaling, making it easier to manage the various components of the system.

For error monitoring, Sentry keeps an eye on the application. It captures exceptions and errors in real-time, providing detailed reports that help me quickly identify and resolve issues.

Front-End Stack

On the frontend, simplicity and speed are paramount. I use vanilla HTML for the structure and Tailwind CSS for styling. Tailwind is a utility-first CSS framework that lets me build custom designs directly in the markup. It reduces the need for writing additional CSS files and keeps the frontend lightweight.

Alpine.js adds the necessary interactivity to the pages without the bulk of larger JavaScript frameworks. It fits well with the minimalist approach, providing needed functionality without unnecessary bloat.

Static content is delivered through Bunny.net, a content delivery network (CDN) that accelerates content delivery globally. This ensures that users around the world experience fast load times, improving overall user satisfaction.

Processing and AI

A significant portion of SEOJuice revolves around processing large amounts of data and utilizing AI for advanced features.

For language processing, I integrate with OpenAI and Claude Sonnet. These services power features like keyword extraction, and content generation, allowing SEOJuice to offer intelligent automation to users.

I use Pinecone for embedding search, which handles vector representations of data for similarity searches. This is particularly important for matching content and keywords within the platform.

On the natural language processing front, libraries like NumPy, NLTK, and Scikit-learn are essential. NumPy provides support for large, multi-dimensional arrays and matrices, which are fundamental for numerical computations. NLTK is used for processing and analyzing text data, while Scikit-learn offers tools for data mining and building predictive models.

To render JavaScript-heavy websites during crawling, I use Playwright. It allows the system to execute JavaScript and fully render pages, ensuring that all content is captured and analyzed, even on sites built with modern JavaScript frameworks.

Additional Tools and Services

Communication with users is facilitated through Crisp, providing chat functionality directly on the website. This allows for real-time support and engagement, enhancing the user experience.

For email communications, Customer.io handles all transactional and marketing emails. It ensures that emails are sent promptly and reliably, with the flexibility to customize messaging based on user actions.

Payment processing was initially managed through Stripe but has been migrated to Paddle. Paddle acts as a Merchant of Record, simplifying tax compliance and reducing administrative overhead, especially important for handling international transactions.

ChartMogul provides revenue analytics, offering insights into financial performance metrics like monthly recurring revenue, churn rate, and customer lifetime value. This helps in making informed business decisions and tracking growth.

For visitor analytics, I use an open-source instance of Plausible hosted on my own server. This keeps visitor data private and under my control, aligning with privacy best practices.

Conclusion

As a solo founder, I've focused on what genuinely adds value for you, avoiding overengineering wherever possible and keeping the system manageable. 

But this is just the beginning. I'm continuously working to improve SEOJuice, adding new features and refining existing ones to better serve your needs. Thank you for joining me on this journey. I'm excited about what we'll achieve together as we push the boundaries of what's possible in SEO automation.

Let's keep moving forward.

Cheers,
Vadim