Software Engineer Handbook

Software Engineer Handbook

Welcome! The Surfe Software Engineer Handbook is where you will find all information relevant for Surfe Software Engineers to better understand who we are, what we do, and how we do it.

This documentation is open to everyone in the team and in constant evolution. So please feel free to suggest improvements, ask questions or even directly edit the document if you find some errors!

🌏 What is Surfe?

Surfe is the nΒ°1 tool salespeople need to use on LinkedIn for their sales activities. It lets them connect their CRM (Salesforce, Hubspot, Pipedrive or Copper) to LinkedIn through a simple browser extension. Surfe makes it easy to create and enrich contacts, update their status and synchronize LinkedIn conversations - directly from a prospect's LinkedIn profile to the CRM in 1-click. No need to waste time on manual data entry. With Surfe, salespeople are 4x faster when sourcing and save a minimum of 60 minutes of boring tasks per day.

🌷 Our Values

  • Humility / No Ego: Everybody can learn from anybody. We are all humans after all. Be nice!
  • Psychological safety: Failing is OK. We believe in trial and mistakes.
  • Trust & Ownership: We take necessary time to build features. We don’t track time nor number of pull requests.
  • No boring tasks: Variety creates balance.
  • Learn & share knowledge
  • Team spirit, cooperation & collaboration

πŸ‘“ Product Vision

  • Be the go-to solution for doing sales on LinkedIn and beyond
  • Design a dead-simple UI / UX which can be used by any sales teams in the world
  • Set the standard for simple, safe and healthy prospecting on LinkedIn
  • Not an automation tool, save time when doing customized outreach and curated profiling
  • No human explanation needed for understanding & using the product
  • Connecting the dots to build powerful end-to-end integrations
  • Embedded intelligence to eliminate manual tasks and provide additional sales insights


πŸ… Missions

As a developer, your mission is the following:

  • Develop the new features of the product road-map
  • Ensure the maintenance of the platform
  • Contribute to the improvement of the existing features
  • Follow software engineering best practices
  • Contribute to the success of our early-stage company!

πŸ’¬ Working with the Team

Our Team has been remote from day-1. To keep the communication open and create synergies with the team and allow the teammates to report on their progress, we have put in place the following events:

πŸ• Weekly goal & achievement meeting every Monday

πŸ•– Weekly dev check-points every Monday

You are also free to have calls with other developers for giving / asking for guidance, working on related tasks or even just chitchat.

As a developer, your relation with the rest of the team is outlined below

With the Founders

You work alongside the CTO (Romain), and will have regular meetings with him to touch on:

  1. Progress and potential obstacles
  2. Feature prioritization and time estimation
  3. Help needed and questions to ask

With the Marketing team

Product and marketing must be working hand in hand towards the same goal: making Surfe successful. It is therefore crucial to keep the communication open between the tech and marketing team to touch on:

  1. New features explanation & demo
  2. Continuous feedback from the field
  3. Product strategy
  4. Brand positioning

With the Product Managers

Product Managers build the product's strategic vision, interpret and anticipate the needs of clients. They are responsible for prioritizing future work. Subject touched on:

  1. Features priority
  2. User feedback
  3. Roadmap
  4. Sprint planning

With the Design team

UI/UX being crucial while building an outstanding product, it is important that we, as developers, work closely with designers to make sure that their vision is implemented in the best way.

The design system currently being created and its implementation in Storybook will be the cornerstone of this collaboration.

With the Tech team

Among our fellow developers, we must keep the communication straight to maximize efficiency.

  1. Peer review
  2. Task division
  3. Progress update
  4. Friendly advice
  5. Experience sharing


πŸ—οΈ Tech Stack & Architecture


Surfe uses multiple technologies under the hood:

  • Chrome Extension: Typescript, Sass, React (Migration ongoing)
  • Client admin dashboard: VueJS, Vuexy theme (here)
  • Back-end: Golang, Echo framework
  • Database: MongoDB, Redis
  • Infrastructure: Ubuntu Linux (VPS), Caddy (reverse-proxy)

What are the HTML files and these weird .njk files ? - The HTML files are not actually HTML but strings to be parsed with underscore.js template function - The .njk files are using the Nunjucks templating system Both of these systems are currently being migrated to React


The following diagram gives an overview of how Surfe is built.

πŸ’» Development

Tasks division

Tasks are the basic currency when it comes to organizing the team around a common project.

  1. Tasks are prioritized and reported in Linear with dedicated technical specs.
  2. The tasks are assigned to one developer.
  3. Tasks are linked to branches and PRs in the Git repositories of the project, to enable accurate tracking of completion status :
  4. image

At any time, if you need help, struggle to fix an issue, etc: stop and ask instead of wasting time.

Contributing to Surfe

Here is the overall flow when it comes to contributing to the project:

  • Open Linear to find what task is assigned to you with the most priority
  • Open a branch with the exact name provided by Linear corresponding to the current task
  • Create a Pull Request after your first commit with the following format: [LEA-XX] My Task
  • After finishing development, ask for review from Github
  • Wait for the code to be reviewed and the CI to run
  • Adapt the code if necessary

Regularly rebase or merge your current branch on dev (when possible) for easier merges.

For the extension, a basic CI (GitHub actions) checks the linting and pushes the new version to Google Chrome (when on master branch).

master and dev are protected branches.

Coding in the server

Most advised: VS Code with the Golang extension

Install gomon for automatic restart on save

We use Makefile for speed:

  • make env sets required git config options
  • make watch runs the code and auto restarts on save
  • make builds the executable


We use golangci-lint to run multiple linters (configured in .golangci.yml file). Linting is done automatically by Github Actions for each new commit.

To integrate golangci-lint to your development environment please follow steps in this page.

It’s also possible to run linters manually with below command;

golangci-lint run

Deprecated Usage

Use standard convention for godoc;

For API documentation, our preferred convention is:

// FunctionName godoc
// @Deprecated
// @Summary ...
// @Description Use ... instead

Coding in the extension

Make sure the linter is enabled on save (Prettier)

Run yarn lint before commit

Tests / Go

We use these libraries:

Test Naming Convention

  • Test<FuncName> if function is simple, and everything is testable in one test e.g. TestNewContact
  • Test<FuncName>_<PropertyToTest> if a Property requires a standalone test with multiple scenarios e.g. TestNewContact_Address
  • Test<FuncName>_<PropertyToTest>_<BehaviourToTest> if a Property has a Behaviour which requires another test e.g. TestNewContact_Address_RestrictedFields


For the Extension code-base, when merged on master and pushed β†’sent for approval to Google

The CTO only can deploy the server on the production environment.

Checking Build Version

Surfe API has an endpoint displaying the build info published at;

    "version": "v1.1.5-0-g1f549669-dirty",
    "time": "2022-05-09T09:42:55Z"

It’s possible to get same build info using version flag;

./leadjet-server --version
Version:        v1.0.0-98-ga9c256df-dirty
BuildTime:      2022-05-10T06:21:25Z


Support request can come at anytime, and be more or less prioritized given their criticality.

Slack channels for support exists#bug-report , #feature-requests and #customer-support.

You will never be asked to do support directly but in times of critical need, your priorities might need to switch to the more urgent tasks.

We try to limit this switches to a minimum since losing focus has a cost but sometimes we have to put out fires!


πŸ“ Initial Setup

  1. Make sure you have received an invitation to all following services that we rely on
  2. Gmail: your own Surfe email address
    Slack: where all our team communication take place
    Linear: where tasks will be assigned to you
    Github: where our code is hosted, shared and checked
    Notion: where we create & organize all out knowledge and roadmap
    Datadog: where server errors are reported
  3. Access and pull the main code base Github repositories
  4. Make sure everything works.
  5. Install full tech stack
    Create the config files (copy config.example)
    Setup your databases
    Make sure the code runs smoothly
    Connect to all 4 CRMs
  6. Create test accounts for every CRM we support
  7. For Hubspot, Pipedrive, Copper, Salesforce CRM
    Connect to Surfe (in production)
    Copy your authentication tokens in your local MongoDB collection

  8. Access founder's shared calendars (optional)
  9. Start your first mission πŸš€

πŸ™€ Where to go from here?

Your first week

  • Meet the team in our Weekly Team Meeting and with 1-to-1 calls
  • Participate to client demos to better understand the product
  • Setup your development environment
  • Learn your way into the code
  • Understand how CRMs work
  • Discover Linear’s task process
  • Debrief your first assigned tasks
  • Start with small tasks to get to know the code-base
  • Ask questions
  • Make your first commit

Your first month

  • Get to know everyone in the team
  • Gain confidence and knowledge about what you do
  • Find your rhythm
  • Perfect your knowledge of the product
  • Start peer programming, coding with others
  • Have regular chat with teammates about issues, suggestions, ...
  • Understand where your strength are, where you’d like to improve and get involved more
  • Start working on some more larger and more autonomous missions
  • Participate in development checkpoints, report what you did, ask questions and help others
  • Fix some bugs
  • Formulate some ideas to improve our current stack / org / process / code
  • Witness the first push of your code to production


ℹ️ Where to ask for help?

The team and founders are reachable on Slack.

Prefer direct messages to target the person you want.

You can also jump in a quick meeting if needed (see shared agenda for availabilities).

πŸ”— Useful Links

Surfe website: