Docs that make complex APIs feel obvious.
I'm a technical writer and software engineer who lives at the intersection of both disciplines. At Programus Ltd. I manage end-to-end documentation for enterprise clients — API docs, user guides, configuration documents, tutorial videos, and release notes.
"role": "Junior Technical Writer",
"employer": "Programus Ltd.",
"based_in": "Sri Lanka",
"education": "BEng (Hons) Software Engineering, University of Westminster",
"toolchain": ["OpenAPI", "Swagger", "Postman", "Git", "Azure DevOps", "RoboHelp"],
"background": "full-stack, Android & API engineering before technical writing",
"targeting": "technical writing / documentation engineering / devrel, EU",
"status": "open_to_work"
}
Overview
With a BEng (Hons) in Software Engineering from the University of Westminster and hands-on experience building real-world applications, I bring genuine technical depth to the work of documentation and developer experience. Before moving into technical writing I spent time as a software engineer across full-stack web, Android, and API layers — Java, JavaScript, React.js, Node.js, SQL, Spring Boot, Bash scripts, Ansible playbooks, Linux environments, and open source contributions. That background means I can read a codebase, understand what developers are building, and document it without needing everything explained from scratch.
I also write about software engineering on Medium — one explainer on Python operators was curated and featured by Medium's editorial team, reaching 2.5K+ readers. If you're building a developer-facing product and need someone who genuinely understands both sides, feel free to reach out.
Experience
Junior Technical Writer — Programus Ltd.
- Independently manage end-to-end documentation deliverables — user guides, configuration documents, tutorial videos, release notes, and client-specific documentation — across multiple enterprise clients.
- Own API documentation and validation workflows using OpenAPI/Swagger and Postman, collaborating with development and QA teams to reduce integration issues and support ongoing feature releases.
- Partner cross-functionally with project managers, developers, support teams, and clients to clarify complex workflows and improve documentation usability and consistency.
Trainee Software Engineer — hSenid Mobile Solutions
- Fixed bugs and shipped features for Applova Admin web, Merchant web, API services, and Android mobile/kiosk applications.
- Wrote Bash scripts and Ansible playbooks to automate module builds and back up/restore databases — the toolchain background that now shapes how I scope documentation work.
Associate Software Engineer — Sustainable Education Foundation
- Wrote and structured the SEF volunteer handbook, took part in wireframing ScholarX v2, and wrote/proofread content for the SEF site and related activities.
- Wrote public-facing web copy for the SEF website, addressing students, industry experts, and volunteers as three distinct audiences.
- Hosted a Google Summer of Code awareness session and led interviews with ScholarX program mentors to gather feedback.
Case studies
Sanitized enterprise documentation samples, published under the placeholder product name "Venuix."
Venuix — event & venue management platform
End-to-end workflow guides written in my current role at Programus Ltd. for an enterprise event and venue management platform, covering simplified event setup, seating chart maintenance mode, and booking status configuration — from high-level setup flows to granular conditional logic, written for a non-technical audience.
Read full guide — Simplified Event Setup (Quick Flow)
To set up an Event using the Simplified Event Setup Process in Venuix,
- Visit the Venuix Portal and sign in using the username and password provided to you.
- Go to the Setup Module by clicking on the Setup button.
- You may then select the Events and Products option from the left side panel.
- A list of modules will be displayed from where you may select the Events option.
- Select the Add New Event button, which will direct you to a new page.
- Under the General tab you may make the following changes:
- Provide a name for the event under the Name field (note that any fields denoted with an asterisk are mandatory, therefore should be treated as such).
- To add an image to the event, select the Upload new image here! button. A pop-up window will open where you may drag and drop or select an image from the computer.
- You may then either select Public or Private from the Event Type drop-down.
- Public events are scheduled in advance before opening to the public for bookings such as sports events, classes and courses.
- Private events on the other hand are customer driven events such as weddings and product launches, which may not be open to the general public.
- You may assign a primary venue to the event from the Primary Venue drop-down. When a booking is placed on the event, the selected venue will be booked by default.
- You may select a preferred option from the Event Category drop-down. This selection will categorize the event based on the activities that will take place (i.e., the event could be an exhibition, a children and family focused event or a community and causes focused event).
- The manager responsible for handling event specific tasks should be selected through the Event Manager drop-down.
- Any campaign monitor codes can be entered under the Event Campaign Code field. This process will link the respective campaign to the event.
- If you prefer to further categorize the event, you may do so by selecting an option from the Event Group drop-down.
- Enter any additional details regarding the event under the Description field. Please note that the description should be no less than 20 words.
- You may enter a Short Description if you wish, under the respective field. This description will be reflected on the Partner Platform as well.
- If there are any keywords related to the event, you may enter them under the Keyword field. In the process of searching for events, these keywords will help further narrow down the search results.
- Under the Event Email and Templates section you may make the following changes:
- Enter an email under the Event Email field, which ideally should be an event dedicated email address.
- If you wish, you may enter a preferred name under the Send As field. Once configured, the Send As field will be automatically populated when sending any event related emails.
- You may select the appropriate templates from the respective Email Template drop-downs. Each template is situation specific:
- Booking Confirmation — sends a confirmation email once a booking is confirmed.
- Enquiry Confirmation — sends a confirmation email once a booking enquiry is confirmed.
- Waitlist Confirmation — sends a confirmation email once a waitlist slot is confirmed.
- Waitlist Availability Confirmation — sends a confirmation email once the availability of a waitlist slot is confirmed.
- A facility is a space in a venue where some activity takes place, such as restaurants, meeting rooms, etc.
Adding a facility to the event
- Navigate to the Facilities section.
- Click on the Add button, which will open a new pop-up window.
- A list of facilities will be displayed.
- By default, the Primary Venue Only toggle button will be selected. If you wish, you may un-toggle this to display all the facilities.
- Select the preferred facilities and click Save to finalize and close the window.
- Click Save again to create the event and refresh the page.
Note: This step is mandatory before adding an Event Period.
- To specify the duration details of the event (how long it will last and on what dates):
Setting the Event Period
- Navigate to the Event Period section.
- Click the Add button, which will open a new pop-up window.
- You may set the date on which the event is held by selecting a date from the Date drop-down.
- You may also set the start and end times of the event from the Start Time and End Time drop-downs.
- If there are any conflicting timeslots (i.e., any overlapping events), a red flag will appear under the Capacity field. In such instances, please re-select a different date/time that will not overlap with any existing events until the red flag no longer appears.
- Under the Asset Type section, select the Facility radio button and the preferred Facility from the respective drop-down.
- You may set a preferred configuration under the Configuration field. This determines how a facility is set up for an event and what capacity can be accommodated.
- Enter the maximum capacity of the event under the Capacity field — the maximum number of covers the facility can accommodate.
- You may then enter the Session Code (a unique identifier for a specific timeslot).
- Enter any additional information regarding the timeslot under the Description field.
- Click Add to save and close the window, then Save again to save the new changes and refresh the page.
Note: This step is mandatory before adding a Package to the event.
- To add packages to the event:
Adding a package
- Navigate to the Packages section and click Add to open a new pop-up window.
- You may initially fill out the details regarding the full added package. The Name field will already be populated — you may change it if you wish.
- Select a preferred Business Area and set a Price for the package, then select the Single Day radio button.
- If you'd like a waiting list, tick Enable Waitlisting, and enter a preferred Capacity plus a processing rule from the Waitlist Processing Rule drop-down.
- Select preferred options from the Package Class, Payment Term, Cancellation Policy and Sales Category drop-downs.
- You may also select an option from the Attendee Capture Profile drop-down and the relevant questionnaire from Attendee Questionnaire.
- From Sales Channel, select Corporate and/or Internet to show the channel to assisted staff flows and the portal respectively.
- Select the preferred method of delivery from Delivery Method.
- To request documents from attendees, select the preferred documents from Document Restrictions.
- To create additional packages, navigate to Linked Packages and click Add Package Type — a new entry appears on the linked packages table where you select a Package Type and enter a Gross Price.
- Click Add to save and close the window, then Save to finalize setting up the event.
- Click Save to create the event (refer to Event Setup - Single Day for additional changes to the event).
Read full guide — Seating Chart in Maintenance Mode
Login to the Venuix portal using the username and password provided to you. There are two ways in which the seating chart page can be accessed:
- Booking Module: Locate the relevant booking from the list and select it to access the booking details. Navigate to Booking Details and select Add → Package. A pop-up lists all existing packages — locate the preferred package and click Select Seats. Alternatively, expand an existing package and click Seat Allocation → Edit Seats in the Venue Map.
- Diary Module: Locate the relevant booking from the diary and click on the timeslot. Select Maintenance Mode from the drop-down that opens.
Once the seating chart has been accessed:
- Switch to maintenance mode using the toggle in the upper right corner.
- By default, seating categories are grouped by price band. You may also group by booking list or block.
- Use the arrow keys in the middle to expand either the seating details section or the seating chart section to full width.
- The seating details section has multiple tabs for general admission, seats, tables, boxes, and accommodations.
- Use the search field to filter by booking reference number, client name, contact name, package name, or notes.
- To filter columns in the seating details section, click Select Fields (visible only when Group By is set to Booking List), check/uncheck preferred fields, and click Save. Click Reset to restore defaults.
- Filter the list of bookings by price band, client category, client type, allocation status, frozen status, notes, or special requests via the Filters drop-down — selecting certain criteria triggers a secondary drop-down for further narrowing.
- Use the zoom buttons or the mouse scroll wheel to adjust zoom on the seating chart.
- Click refresh (next to the zoom controls) to update the view.
- The Viewers section shows who's currently viewing the chart — yellow highlights internal users, green highlights external users; hovering lists the logged-in users.
- Hovering over a seat displays category, row, seat number, block, and any notes.
- To reserve seats: select the preferred seats and click Reserve Seats in the top right. A pop-up opens — enter a note and click Submit. A confirmation message displays on success.
- To un-reserve: select reserved seats, click Un-reserve Seats, and confirm Yes on the pop-up.
- To un-allocate previously allocated seats: select the seats and click Un-allocate at the top of the seating chart view, then confirm again.
- To un-allocate an entire booking: tick the booking reference in the seating details section and click Un-allocate, then confirm again.
- To reallocate unassigned seats: drag and drop the preferred booking reference onto the venue map, or tick the reference and click Allocate.
Note: Using the Allocate button will automatically assign the seats starting from the top left-most available section.
- To freeze seats (prevent them from being un-allocated while other actions are performed): select the allocated seats and click the freeze button, enter a note in the pop-up, and click Submit.
- To block seats from selection: select the seats and click Mark as Unavailable, enter a note, and click Submit.
- The audit trail feature tracks all actions performed under the venue — access it via the audit trail button next to the maintenance mode toggle. You can expand items per page and filter the audit list by price band, seat status, block, and bookings via the Filters drop-down.
Read full guide — Managing Booking Statuses
- Login to the Venuix portal using the username and password provided to you.
- Select the Setup module.
- Select Bookings from the left side panel, then Booking Statuses.
- All booking statuses are listed in tabular format. Search using the search bar, or sort by name via the sort button next to Booking Status Name.
- To edit or delete an existing status, click its ellipsis icon: Edit opens the status for changes (click Save to confirm); Delete opens a confirmation pop-up (Yes, delete it! to confirm).
- To add a new status, click Add New Booking Status.
- Under the General tab:
- Select a Parent Booking Status to establish the status hierarchy, which determines the progression path.
- Provide a name under Booking Status.
- Reserve Stock — whether stock/resources are reserved while the booking remains in this status.
- Require User Rights to Edit the Booking — restricts editing to users with appropriate rights (others get read-only mode).
- Booking Client Restriction — checks that a client is linked before the booking can transition to this status.
- Hide Booking from Portal — useful for internal-only statuses.
- Enter details under Description, select Business Area(s) (or Select All), and set a CalenderColor for the status.
- Click Save to create the status.
- Under the Approval tab:
- Tick Requires Approval to enable the Approved/Rejected Booking Status section — select statuses the booking automatically progresses to on approval or rejection.
- To add advance approval conditions, expand Advance Approval Conditions and click Add Advance Approval Condition.
Advance approval condition options
Provide a Requirement Name, then choose how multiple conditions are evaluated: AND (all conditions must be met) or OR (any one condition is sufficient).
Business Parameters:
- Sales person belongs to a specified user group(s)
- Customer belongs to a specified client category(s)
- Sales channel is any of specified (online, walk-in, call center, etc.)
- A package in the booking is of specified business area(s)
- An item in the booking is of specified item category(s)
- Booking Value — within a specified monetary range
- Discount Percentage — within a specified percentage range
Exceptional Parameters:
- A discount has been applied (manual or automatic)
- Standard package price has been changed
Approver Sequence: Any (any appointed user/group can approve), All in parallel (all required, in parallel), or All in sequence (approved in order, one after another). Use the Select user / Select user group drop-downs — approval from either is valid if both are selected.
Settings: Set the Rejected Booking Status a booking moves to on rejection, and optionally hide booking conflict warnings in the Approval Confirmation popup (this doesn't apply when approving into a stock-allocated status).
Click Add to confirm each condition — add as many as needed, then click Save.
- If the selected Parent Booking Status is Provisional or Quotation, an Expiry tab becomes available:
- Tick Booking Expires in x Days to auto-expire after a set number of days.
- Tick Booking Expires After to tie expiry to the Event Start Date or Event End Date.
- Select the status the booking moves to on expiry from Expiry Booking Status.
Note: This field is mandatory.
- Click Save to save the changes.
SEF volunteer handbook
Written during my time as Associate Software Engineer at the Sustainable Education Foundation (2022–2023). The organizational overview introduces SEF to prospective volunteers across all backgrounds; the Engineering Team chapter covers who the team is, what they do, and the concrete steps to get set up — GitHub, Slack, and Hive accounts — before introducing yourself to the community.
Demonstrates: welcoming organizational writing, and step-by-step onboarding content that stays human for a technical audience.
SEF public-facing website copy
Homepage copy for the SEF website addressing three distinct audiences in turn — students, industry experts, and volunteers — each in their own paragraph and tone, rather than one generic pitch trying to speak to everyone at once.
Demonstrates: audience segmentation and concise web copywriting.
Writing
Working with Operators in Python
A beginner-friendly technical explainer, curated and featured by Medium's editorial team. 2.5K views · 1.4K reads.
Read on Medium ↗Interning as a Software Engineer at hSenid Mobile — Part I & II
A firsthand account of my software engineering internship — onboarding, tools, and technical work.
Part I ↗ · 554 views · 77 reads Part II ↗ · 545 views · 70 readsBright Horizons — Procedurally Generated Serious Game to Promote Learning in Individuals Affected by Trisomy-21
Final year undergraduate thesis for my BEng (Hons) at Westminster — contextualizing a research problem for a broad audience, then explaining a Unity3D/C# implementation and a regression model in structured, precise language.
Read excerpt — Abstract
The special education domain caters to a multitude of individuals with varying mental and physical challenges. Individuals affected by Trisomy 21 fall under the same umbrella as individuals requiring special education. This genetic disorder is commonly referred to as Down syndrome (DS), which is a result of an extra chromosome in an individual's DNA and can cause developmental and cognitive challenges all throughout their lives. The conventional methods of educating children in third world countries, with the inclusion of Sri Lanka, shows signs of disparity towards individuals with special needs. Children affected by Trisomy 21 fall victim to the lack of tailored educational approaches.
Respective medical data shows that higher Gamma Aminobutyric Acid (GABA) levels in the brain of an individual affected by Trisomy 21 reduces neuroplasticity, which also reduces the effectiveness of learning resources provided to them. Medical data also indicate that certain game genres increase the levels of dopamine in the brains of these individuals which result in lower GABA levels for a brief period of time. Furthermore, it has been identified that individuals affected by Trisomy 21 are strong visual learners, hence the proposed solution by the author comes in the form of a serious game, which not only caters to the visual learning preferences of these individuals but also aims to reduce the GABA levels in the brain to effectively provide learning resources.
The serious game 'Bright Horizons,' uses a procedurally generated approach to level design, resulting in a unique experience for the individual each playthrough, to ensure the highest possibility of engagement. Furthermore, a regression model is used to calculate the ideal activity engagement time based on acquired medical data containing gene expression change values. Learning resources such as numbers, letters and colors are distributed throughout the gameplay loop so that individuals in consideration can actively learn while being engaged in gameplay.
Read excerpt — Problem Background (Section 1.2)
The primary objective of this project is to lay the educational foundation for children affected by Trisomy 21. This unique population faces significant challenges all throughout their educational journeys and day-to-day life. In third world countries, most of these children fail to even receive their basic education let alone consider career opportunities. This genetic disorder causes distress to both children and their respective caretakers, and addressing this issue is paramount.
It has been proven that children affected by this condition respond well to game-based learning since they are strong visual learners, as opposed to conventional learning methods. Current educational practices, especially in Sri Lanka, fail to deliver these tailored educational approaches. Serious games are met quite often in the military, government, and healthcare with extensive use in education and learning, since they are proven to be engaging and appealing to people of all social classes. Even though technologies like virtual reality (VR) are on the rise as means of education, there are limited real-life use case scenarios of serious games in the special education domain.
Users are encouraged to make mistakes while they play serious games, as the key objectives are learning, knowledge retention, understanding of new concepts, problem-solving and real-time data analysis. The significance of this research lies in its potential to improve the quality of education and the overall quality of life for individuals with Trisomy 21.
Read excerpt — System Implementation (Section 7.3)
The proposed solution in this project is comprised of two major components: the game itself and the machine learning model. The serious game, built using the Unity3D engine, uses C# for creating logical scripts. These scripts govern the various functionalities of the game - from the main menu and gameplay loop through to the end screen.
Key scripts and their functions:
- Start_Menu Script — Executed on launch; loads the main menu of the game.
- Camera_Controller Script — Ensures the camera object follows the player character as it moves.
- Player_Movement Script — Controls player movement states: idle, running, jumping, and falling. Each state is assigned an animation and a sound. The player character can only occupy one state at a time, and the sprite flips based on movement direction. Jumping is only permitted when the player is in a grounded state.
- Player_Life Script — Oversees the player life and death cycle. Upon colliding with an enemy or trap, the player loses a life and respawns at the start of the level.
- Item_Collector Script — Allows the player to collect numbers, letters, or colors scattered throughout the game world. Each collectible is assigned a collider object that detects the player's rigid body. Upon collision, the game object is destroyed and the score is incremented.
- Sticky_Platform Script — Ensures that once the player character lands on a moving platform, they remain attached as it moves. This is achieved by setting the player object as a child of the platform upon collision.
- Waypoint_Follower Script — Manages platform movement between two waypoint objects placed in the game world, creating back-and-forth motion.
- Pause_Menu Script — Switches the game's time scale between 1 (running) and 0 (paused).
- End_Menu Script — Displayed upon game completion; allows the player to return to the main menu or quit.
- Options_Menu Script — Manages user preferences including resolution, graphical presets, volume, difficulty, and learning resource preferences. Changes take immediate effect and are saved locally for future sessions.
- Level_Manager Script — Determines the number of levels to generate based on the selected difficulty level, and handles level display and completion messaging.
- Procedural_Generation Script — The most complex script in the project, responsible for generating the game world based on difficulty level. This includes creating hills and platforms with varying heights and widths, placing them randomly across the terrain, setting start and end borders, positioning the finish line in a safe zone clear of terrain elements, and distributing collectible items throughout the level.
The regression model was constructed to determine ideal activity engagement times. Medical data was sourced from four Excel sheets containing gene expression changes, which first required a processing stage to remove inconsistent columns and combine the files into a single dataset of over ten thousand entries. This dataset was loaded using the pandas library and underwent a second processing stage - replacing empty Gene ID cells with 'unknown' and converting Direction values to binary representations of 'up' and 'down'. A new column, 'Activity Engagement Time', was created by assigning randomised values between 60 and 120 seconds. The data was then split into features and targets, divided into training and testing sets, and used to train a linear regression model. The trained model predicts ideal activity engagement times and saves the output for use by the game engine.
Toolchain
Get in touch
Open to technical writing, documentation engineering, and developer relations roles across Germany, the Netherlands, Ireland, and the UK. If you're building a developer-facing product and need someone who genuinely understands both sides, feel free to reach out.