Managing a Huge System Built on Top of a Temporary Project: Challenges and Solutions

During my time at Avinity, I experienced firsthand how a small internal web application, initially built to solve a minor problem, evolved into a large and complex system. We used to call it the “Imagine Platform”, and honestly, it ended up beyond any imagination at one point in time. What started as a temporary project quickly became critical to business operations, requiring continuous development and management. This experience taught me valuable lessons about handling the challenges that come with managing a system that was never meant to scale.

Challenges of Growing a Temporary Project into a Large System

Lack of Proper Architecture: Since the initial system was never meant to scale, it often lacks a robust architecture, making future development difficult.

Technical Debt: Quick fixes and workarounds accumulate, leading to inefficiencies and bugs that slow down development.

Performance Bottlenecks: As the system grows, performance issues arise due to poor initial design choices.

Security Risks: A system that started as a small project may not have been built with security in mind, leading to vulnerabilities.

Scalability Issues: The system may not be able to handle increased load or integrate well with newer technologies.

Steps I Took to Manage the System at Avinity

Gradual Refactoring(Most significant): Instead of rebuilding the system from scratch, I initiated incremental updates to modularize components and introduce microservices where applicable.

Performance Optimization(Most significant): By analyzing system performance and identifying bottlenecks, I was able to implement targeted improvements, such as database indexing and caching strategies.

Automating Processes: To improve efficiency, I introduced automation tools for testing, deployment, and monitoring, reducing manual effort and increasing system stability.

Implementing Documentation: Another step I took was to create some documentation(the idea was to create some detailed documentation, but it never happened for an internal project), which helped developers understand the system structure and avoid redundant work.

Introducing Code Reviews: To improve code quality and reduce technical debt, I enforced a strict code review process that ensured best practices were followed. Modified some poorly written codes and eliminated a lot of not used modules.

Budget Constraints and How to Overcome Them

For small to medium-sized businesses, budget limitations are a significant challenge when managing and upgrading such systems. Investing in a complete overhaul may not be feasible, so companies must find ways to improve efficiency without excessive spending.

Prioritize Critical Updates: Instead of rewriting the entire system, focus on fixing the most pressing issues, such as security vulnerabilities and performance bottlenecks.

Use Open-Source Solutions: Many open-source frameworks, tools, and libraries can help modernize the system without the high costs of proprietary software.

Incremental Refactoring: Instead of a full system rebuild, update parts of the system gradually. Start by modularizing key components and introducing microservices where possible.

Leverage Cloud Services: Migrating parts of the system to cloud-based solutions can improve scalability and reduce infrastructure costs.

Seek External Funding or Partnerships: In some cases, government grants, technology partnerships, or investors might help fund critical technology upgrades

    Best Practices for Managing Large, Evolved Systems

    Managing a system that started as a temporary project taught me valuable lessons. It is essential to plan for the future. Even small projects can grow, so design with scalability in mind. It is also important to avoid technical debt. Cutting corners may save time initially, but it will cost you in the long run. Clear documentation is essential for maintainability and onboarding. Finally, the system should be regularly reviewed and improved to prevent it from becoming unmanageable.

    My experience at Avinity taught me that while budget constraints can make upgrades difficult, strategic planning and incremental improvements can help businesses modernize their systems without excessive costs. By focusing on critical updates, leveraging open-source solutions, and implementing best practices, businesses can ensure their systems remain efficient, scalable, and secure for the future. If you’re facing a similar situation, remember that it’s never too late to make improvements. With careful planning and execution, you can turn a chaotic system into a well-oiled machine that drives your business forward.

    Challenges of Starting a New IT Team from the Ground Up

    When I joined Avinity, the company had been outsourcing all its IT work. They decided to bring everything in-house and hired me to build an IT team from scratch. My task was to set up the team and transition the outsourced work within 1-2 years.

    Even though I had some job offers from some big corporations, I decided to join Avinity when I heard about this challenge.

    Starting an IT team from nothing is an exciting challenge, but it comes with many obstacles. The biggest challenge, in my opinion, is the unfamiliarity between team members. If you hire an entire team from the market, you have no idea about their strengths, weaknesses, or how they will work together. It takes time to build trust and relationships.

    My Approach: A Mix of Known and New Talent

    To overcome this, I hired a few people from my own network—people I had worked with before and knew I could trust. These familiar faces helped set the foundation and brought stability. The rest of the team I hired from the market, bringing in fresh perspectives and skills.

    This mix-and-match approach gave me both comfort and flexibility—I had trusted people to rely on while also bringing in new talent to innovate and grow.

    Hiring the Right People

    Finding skilled professionals who also fit the company culture is tough. Just hiring the most talented developers is not enough—if they don’t work well together, the team will struggle. I focused on attitude and teamwork as much as technical skills. It is important to make sure every new hire is aligned with the company’s vision and work culture and has the freedom to open communication from day one.


    Setting Up Processes from Scratch

    Since there was no existing IT team, there were no processes, no documentation, and no guidelines. Everything had to be built from zero. This is where your experience comes to play. If you have a few people in your team who you hired from your network(or previously worked with), you have similar experience fo the process. I started with basic project management tools to track tasks. Slowly introduced coding standards, deployment processes, and documentation habits. I kept things flexible—adjusted processes as the team grew.


    Knowledge Gaps and Learning Curve

    Since IT was fully outsourced before, there was no internal knowledge base. The new team had to learn everything while taking over projects. So I worked closely with the outgoing vendors to document everything before they left. Also encouraged team members to ask questions, experiment, and learn quickly.

    Gaining Trust from the Business Team

    The company had relied on outsourcing for years, so other departments were used to working with external vendors. Convincing them that the in-house team could do better was not easy. So, to win their trust, I made sure we solved and delivered small but important issues quickly and more efficiently. Also maintained regular communication with stakeholders to understand their needs.

    Managing Workload and Expectations

    When a new team starts, everyone expects results immediately. The reality is, it takes time to set up, hire, train, and build efficient workflows. However, I set some realistic but challenging timelines for transitioning work. It was important to prioritise critical projects first, rather than trying to do everything at once.

    Starting an IT team from scratch is a long journey, not a one-time task. It takes careful planning, the right mix of people, and patience to make it work.

    For me, the biggest lesson was that relationships and trust was as important as the technical skills. By building a team with a mix of trusted colleagues and new hires, and by focusing on process, learning, and trust-building, we successfully transitioned the work within the expected time.

    Quiet time in office- is it worth it ?

    One Monday morning, we received an email from our CEO introducing quiet time.

    Dear All,

    I would like the business to trial having some quiet time, over the next 4 weeks…

    One of the great things about this business, is that everyone is always happy to help and support their fellow colleagues. This is a brilliant culture and I would like it to continue but sometimes we need some quiet time for ourselves.

    “I love my kids to bits but sometimes its great when they are in bed and we get a bit of peace to get on with stuff around the house…”

    I would therefore like to propose some quiet time, so that everyone has the opportunity to concentrate and focus on their own job and task in hand. Sometimes we simply don’t have this opportunity.

    I am therefore proposing that on a Monday, Wednesday and Friday between 9.30am and 11.30am we have some quiet time.

    What does this mean ?

    There should be no meetings, no internal commercial conversations, no colleague interruptions, no internal calls, no emails etc….

    I would like to do this during August and will obtain feedback at the end, to see if this trial has worked and if it has given you time, to do what you need to without interruptions.

    Thank you

    CEO

    Quiet Time is a scheduled period, typically ranging from 1 to 3 hours, during which employees are expected to minimize distractions and focus on deep, uninterrupted work. During this time, meetings, phone calls, and non-urgent communications are discouraged, and employees are encouraged to work independently in a quiet environment.

    What has improved in our case

    Initially, it seems to be a good idea to improve focus and productivity. Quiet Time allowed employees to concentrate on complex tasks that require deep thinking, free from the constant interruptions of emails, messages, or casual conversations.

    By providing dedicated time for focused work, some employees completed tasks more efficiently, reducing the need to work overtime or take work home. Some introverts, who often thrive in quiet environments, find Quiet Time particularly beneficial, as it allows them to work in a way that aligns with their natural preferences.

    What are the challenges?

    However, implementing the policy came with its share of challenges. To begin with, quiet time cannot be enforced company-wide, as teams like customer support and sales are required to interact with clients during office hours, and clients are not bound by internal quiet time policies. Additionally, in an open-plan office setup, enforcing such a policy proves to be particularly challenging.

    While quiet time can be beneficial if uniformly adopted, coordinating it becomes complex when teams operate across different time zones. One solution could be to establish separate quiet time slots for each time zone. Still, this approach reduces the available window for communication and collaboration, potentially diminishing the overall value of the effort.

    Is Quiet Time Worth It?

    The answer depends on your organization’s unique needs and work culture. If your employees frequently struggle with distractions and express a need for more focused work time, Quiet Time can be a highly effective solution. It can lead to increased productivity, reduced stress, and a more respectful work environment. If your workplace thrives on constant collaboration and communication, Quiet Time may not be the best fit. In such cases, consider alternative solutions, such as flexible work hours or designated quiet spaces, to accommodate different work styles.

    The policy did not work for us in the long run. Our open-plan office, which housed customer service and sales teams in a collaborative environment, made it challenging for client-focused teams to receive timely support from other business units, which affected our SLA.

    However, Implementing Quiet Time in the office can be a powerful way to enhance productivity, reduce stress, and create a more balanced work environment. However, its success depends on careful planning, clear communication, and a willingness to adapt based on employee feedback. By weighing the benefits and challenges and tailoring the approach to your organization’s needs, you can determine whether Quiet Time is worth implementing in your office. If done right, it can become a valuable tool for fostering both individual focus and team collaboration.

    Leave Monitor has been awarded not one but two great prestigious awards by Finances Online

    With great pride and satisfaction, I would like to announce that Leave Monitor has been awarded not one but two outstanding prestigious awards by FinancesOnline – one of the most renowned and prestigious business review directories! I have single-handedly designed and developed the whole platform in my spare time and decided to take it to the market.

    LeaveMonitor only came into being 3 years ago, and to be now named as one of the top human resources software in the market with two fulfilling awards from FinancesOnline is a great milestone for us.

    The great User Experience 2017 Award is granted to products that offer an especially good user experience. The panel evaluated how easy it is to start using the product and how well-designed its interface and features are to facilitate the work process.

    FinancesOnline highlighted in their review of our product LeaveMonitor’s secure, robust, easy, fast, simple, user-friendly, intuitive, responsive and fluid design in its review and how all these lead to a wonderful user experience for its users no matter how big or small the companies and organizations are. A fully customizable interface and multi-language support feature make our application suitable for any corporate culture anywhere in the world. We were also happy to find out that Leave Monitor was presented among the current leading HR solutions, according to FinancesOnline experts.

    As mentioned earlier, it is still in the early days for LeaveMonitor to be in the market, and FinancesOnline acknowledged that by awarding the Rising Star 2017 Award to us! This particular award is for new SaaS products that only recently appeared on the market, but are already getting good traction with the customers and are viewed as a service that’s really efficient despite its young age.

    In LeaveMonitor, we take this as an encouragement from the experts and are fully committed to growing stronger and better with new innovative features and services to all our current and prospective clients whilst maintaining the same excellent user experience for all.

    Pre- and Post-Release Checklist for an ASP.NET Application with IIS and SQL

    Releasing an ASP.NET application requires careful planning to ensure a smooth deployment without disruptions. Below is a checklist that I use to cover essential pre- and post-release checks, focusing on database changes, application performance, and stability.

    Pre-Release Checklist

    TaskCheckbox
    Prepare the Code and Database Changes
    Peer-review all code changes. Make sure all code changes are reviewed and approved through pull requests.
    Run automated tests (unit, integration, and functional tests).
    Ensure proper logging and error-handling mechanisms are in place.
    Compile the code in Release Mode and make sure it does not throw any errors.
    Make a list of the files that need to be updated in live. Views/ASPX/ASCX/CSS/JS
    Make a list of any hard-coded value that needs to be changed in any file.
    Gather a list of newly added or updated third-party libraries, NuGet packages, or other resource files, such as images.
    Verify all SQL table schema changes (new tables, column modifications, constraints, etc.) and prepare the script.
    Use ALTER TABLE instead of DROP TABLE to prevent data loss.
    Review and test stored procedures, triggers, and views. Make the script ready.
    Verify new indexes are optimized and do not impact write operations.
    Make a script if you need to add any new data to any table. Or update any existing data in any table.
    Ensure that the SQL script does not have any hardcoded value that requires changing the live environment.
    Make a list of what changes in in web.config or appsettings.json.
    Make a list of any new application settings that are required in live(e.g., API keys).
    Make a list of any dependent systems that need to be updated. Review and list any scheduled jobs and background services that need to change with this release.
    Make a list of any site setup changes required in IIS for this release.
    Database Backup
    Take a full backup of the production database just before the start of the release process.
    Prepare a rollback plan in case of deployment failure.
    Deployment Package Preparation
    Generate and package build the files (e.g., DLLs, CSS, JS files). Make sure the ddl is made in release mode. Minify css/js files.
    Organize and test the SQL scripts with a test database.
    Testing
    Run all unit tests.
    Perform integration testing with the database and external services.
    Conduct performance testing.
    Perform regression testing to ensure existing functionality works.
    Documentation
    Document release notes with changes, new features, and known issues.
    Create a step-by-step deployment guide.
    Communication
    Notify stakeholders about the release schedule and potential downtime.
    Brief the development, QA, and operations teams on the release process.

    Follow the step-by-step deployment guide to make the release. For a major release, it is recommended to schedule downtime and include a maintenance page for the user.

    Once the release is done, this is the post-release checklist.

    Post-Release Checklist

    TaskCompleted
    Verify that the application is running correctly in the production environment.
    Perform tests on critical functionalities.
    Check logs for unexpected errors or warnings.
    Validate integrations with external systems (APIs, third-party services, etc.).
    Monitor database performance and query execution times.
    Perform real-user testing to ensure functionalities work as expected.
    Validate security settings post-release.
    Gather user feedback and address any reported issues promptly.
    Be prepared to roll back changes if critical issues arise.
    Communicate fixes and updates to stakeholders as necessary.

    This checklist ensures a structured and thorough approach to deploying your ASP.NET application and minimizing risks to ensure a smooth production environment. Let me know if I have missed anything!

    Searching for a Specific Text String in SQL Server Objects

    When managing a SQL Server database, you may need to find occurrences of a specific text string within database objects, such as table names, stored procedures, functions, or views. This can be useful for debugging, auditing, or refactoring existing code.

    The following stored procedure, sp_search_code, allows you to search for a specific text string across different database objects, including table names, stored procedures, functions, and views

    CREATE PROC [dbo].[sp_search_code] (
    	@SearchStr VARCHAR(100)
    	,@RowsReturned INT = NULL OUT
    	)
    AS
    BEGIN
    	SET NOCOUNT ON
    
    	SELECT DISTINCT USER_NAME(o.uid) + '.' 
        + OBJECT_NAME(c.id) AS 'Object name'
    		,CASE 
    			WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1
    				THEN 'Replication stored procedure'
    			WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1
    				THEN 'Extended stored procedure'
    			WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1
    				THEN 'Stored Procedure'
    			WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1
    				THEN 'Trigger'
    			WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1
    				THEN 'Table-valued function'
    			WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1
    				THEN 'Scalar-valued function'
    			WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1
    				THEN 'Inline function'
    			END AS 'Object type'
    		,'EXEC sp_helptext ''' + USER_NAME(o.uid) + '.' 
              + OBJECT_NAME(c.id) + '''' 
             AS 'Run this command to see the object text'
    	FROM syscomments c
    	INNER JOIN sysobjects o ON c.id = o.id
    	WHERE c.TEXT LIKE '%' + @SearchStr + '%'
    		AND encrypted = 0
    		AND (
    			OBJECTPROPERTY(c.id, 'IsReplProc') = 1
    			OR OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1
    			OR OBJECTPROPERTY(c.id, 'IsProcedure') = 1
    			OR OBJECTPROPERTY(c.id, 'IsTrigger') = 1
    			OR OBJECTPROPERTY(c.id, 'IsTableFunction') = 1
    			OR OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1
    			OR OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1
    			)
    	ORDER BY 'Object type'
    		,'Object name'
    
    	SET @RowsReturned = @@ROWCOUNT
    END
    
    
    

    How to Use the Stored Procedure

    To execute this stored procedure and search for a specific text string, you can use the following SQL command:

    EXEC sp_search_code 'Customer';
    

    This command will return a list of tables, views, stored procedures, and functions containing the word Customer in their names or definitions.

    This stored procedure is a powerful tool for searching database objects based on a specific text string. Whether you need to find references to a particular table or locate a function containing certain logic, this procedure simplifies the process. You can further enhance it by adding search capabilities for triggers, indexes, or column names as needed.

    Deadlock in SQL server

    We have been struggling with many deadlocks in an old project that started getting busier during working hours. This project was initially built quickly to solve a small problem in stock operation. Over the last three years, a lot of code and processes have been added to the platform. As a result, we have a big platform with a very unstable base of code structure. This is one of the common issues where we see projects were developed without any longer-term plan.

    So, what is deadlocks?

    SQL Server deadlocks occur when two processes/queries attempt to access the same data, but each query has already locked the data that the other query needs. In simple terms, it is a lock that takes you to the dead end. While query optimization can improve the speed and efficiency of queries, it’s crucial to understand the root cause of deadlocks and how to prevent them. A deadlock happens when two or more tasks permanently block each other, with each task holding a lock on a resource that the other tasks are trying to acquire. 

    For example, Process-1 needs to modify data in the Product table, which also requires reading data from the ProductDetails table. So, Process-1 puts a lock in the Product table and requests data from the ProductDetails table. At the same time, Process-2 needs to modify data in the ProductDetails table, which also requires reading data from the Product table. So, Process-2 puts a lock in the ProductDetails table and requests data from the Product table.

    At this point neither process can finish because they are both waiting on locked resources. i.e. they are deadlocked. One of them must be killed to allow either of them to finish. SQL decides which is the “least expensive process to kill” and it becomes the Deadlock victim.

    Let’s not confuse deadlock with Blocking.

    Although it’s based on the same principles, blocking is much simpler than deadlock. Blocking happens when two or more processes need access to the same resource. In Microsoft SQL Server, only one process can use a resource at any given time. If the first process is already using (or locking) the resource, the second process is blocked from accessing it. SQL Server will then make the second process wait until the first process has completed its task.

    What was happening in our case

    We have many SQL jobs that frequently get product feeds from our supplier and update the product, product details table and a few other tables. During the process, the SQL job locks the Product table to make necessary updates and request details of the product from the ProductDetails table. This process takes a long time due to the large volume of data the SQL job processes. At the same time, if anyone in our team uses our internal web applications to update any product details that require updating the ProductDetails table and getting data from the product table, the web application becomes the victim of the deadlock. Also, the team always complains that the product update process takes a long to time complete even they do not get the deadlock.

    So what we have done to resolve the issue

    We have identified that our platform is a victim of both blocking and deadlock. So, we have taken the following steps to improve the issue.

    Create a separate temporary Product table to hold the products from all SQL jobs. This will free the main Product table for the web applications.

    Put multiple similar SQL jobs under one job but in steps. Set to run the following step once the current step is completed and succeeds. The last step is to update the main Product table from the temp Product table.

    In our case it is important to allow our web application to get the priority. So we set SET DEADLOCK_PRIORITY LOW for the query behind the SQL job. By default SQL set SET DEADLOCK_PRIORITY NORMAL for all queries so the web application query will have the priority and SQL Job will be the victim of the deadlock.

     Use ” WITH (NOLOCK)” for the select queries, which is equivalent to READ UNCOMMITTED

    Ensure enough Index and tune the transactional code to make sure the query runs faster.

      Deadlock code example

      To experience the deadlock, you can use the code below.

      Creating two tables and adding some sample data

      CREATE TABLE ##Product (
          ProductId INT IDENTITY,
          ProductName VARCHAR(16),
          ProductCode VARCHAR(16)
      )
      GO
      
      INSERT INTO ##Product (ProductName, ProductCode)
      VALUES ('iPhone', '123'), ('iPad', '124')
      GO
      
      CREATE TABLE ##Supplier(
          SupplierId INT IDENTITY,
          SupplierName VARCHAR(64),
          SupplierEmail VARCHAR(64)
      )
      GO
      
      INSERT INTO ##Supplier (SupplierName, SupplierEmail)
      VALUES ('Apple', '222-555-6666'), ('Samsung', '888-568-1234')
      GO
      

      Now, Open two separate query windows in SSMS. In one window, enter the code for session 1, and in the other, enter the code for session 2. Execute the steps in each session alternately, switching between the two query windows as needed. You’ll notice that each transaction holds a lock on a resource that the other transaction is also trying to access.

      -- Step 1 --  -- Run in Session 1 --
      BEGIN TRAN;                 
      
      UPDATE ##Product SET ProductName = 'Apple Watch'
      WHERE ProductId = 1
      
      -- Step 2 -- --  Run in Session 2 --
      BEGIN TRAN;
      
      UPDATE ##Supplier SET SupplierEmail = N't@t.com'
      WHERE SupplierId = 1
      
      -- Step 3 -- --  Run in Session 1 --
      UPDATE ##Supplier SET SupplierEmail = N's@s.com'
      WHERE SupplierId = 1
      
      -- Step 4 -- --  Run in Session 2 --
      UPDATE ##Product SET ProductCode = '234'
      WHERE ProductId = 1
      
      And You will get deadlock.
      
      Msg 1205, Level 13, State 45, Line 7
      Transaction (Process ID 70) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
      

      The Magical Mystery Tour – Avinity’s Unforgettable Trip to Morocco

      25th-27th September 2015

      Some companies give out gift cards. Some host a nice dinner. But how many companies take their entire staff on a luxury mystery trip to Morocco? To celebrate Avinity’s 10-year anniversary, our CEO decided to do something extraordinary—something that would genuinely bring people together, inspire us, and remind us why we do what we do.

      This is what we have received from our CEO

      Dear All,

      It is the company’s 10 year anniversary this year and we would like to celebrate with a bang !!

      We are looking at taking the entire company to somewhere magical for the weekend, all expenses paid. The suggested date is the weekend of 25th September 2015. The date is purely tentative and will depend on availability but it currently looks OK. We do have somewhere in mind and the decision needs to be made asap but it all depends on numbers and currently no partners or children can come but this may change…

      Please could you let me know if you would like to go on the ‘magical mystery tour’ through responding via the Vote button at the top. Before replying, please do think about it as I will be taking your responses to move this forward or not. Your commitment is key to doing something like this en-masse. Can you come back to me asap please.

      For the warehouse without email, please simply let us know “Yes up for it” or “No, not interested”.

      Passports and flying may be required…!

      Best Regards

      Rupert

      And so, on September 25, 2015, at exactly 2:15 AM, the entire Avinity team set off on what would become an unforgettable journey. The only clue? Bring your passport. The excitement was electric as we arrived at Gatwick Airport, still unaware of our destination. Whispers filled the air: Are we heading to Italy? Maybe Spain? Could it be somewhere completely unexpected?

      And then, the big reveal: We were flying to Marrakech, Morocco, to stay at none other than Kasbah Tamadot—an ultra-luxury resort owned by Sir Richard Branson. Yes, A five-star retreat in the Atlas Mountains, owned by one of the most inspirational entrepreneurs of our time.

      Of course, staying in one of the world’s most exclusive resorts was amazing. But this trip was about more than just luxury—it was about reconnecting, recharging, and realigning with what truly matters.

      Our CEO wanted this experience to be more than just a celebration. He wanted it to be a reminder of our purpose—not just as employees, but as people, friends, and inspirers.

      His message was simple yet powerful:

      👉 Deliver happiness—in work, at work, and through our work. If we aspire to make others happy, we will become truly happy, inspired, and fulfilled ourselves.

      Beyond the resort’s luxurious pools and breathtaking views, we had the incredible opportunity to visit a nearby village. Led by local guides, we wandered through winding paths, tasting fresh fruit picked straight from the trees and learning about life in the Berber community.

      One story particularly touched our hearts:

      We visited a local pre-school project, part of the Eve Branson (Richard Branson’s mother) Foundation. The school was built by local residents, giving young children the opportunity to learn English, Arabic, and French—essential skills for their future. Hearing how education was transforming their lives made us reflect: What can we do to help? By the end of the visit, we all agreed to send Christmas parcels filled with books, pens, and school supplies—a small but meaningful way to give back.

      There are company trips, and then there are once-in-a-lifetime experiences. Avinity created something extraordinary—not just a trip, but a moment of pure magic. A memory that will stay with us forever. It takes guts to take an entire company on a mystery trip to a luxury resort. But more than that, it takes vision to use that trip as a way to inspire, connect, and give back. And that’s what makes Avinity different.