---
id: contributing_started
title: Get Started
sidebar_label: Get Started
---

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";

## Install dependencies

### go

The code base is in [go][go], meaning we need a working go setup before we can do anything else.
Have a look at the [go guide][go-started] to get up and running with go in no time!

### golangci-lint

To make sure we keep on writing quality code, [golang-ci lint][golang-ci-lint] is used to validate the changes.
Have a look at the [local installation guide][golang-ci-lint-local] to make sure you can validate this yourself as well.

### go-bindata

Oh my Posh packs the initialization scipts for the different shells, but go does not ship with the ability to add
files other than go code to your compiled binary. [go-bindata][go-bindata] allows us to add initialization files and
ship them in the source code to easily bootstrap your shell with Oh my Posh.

There are multiple ways to install go-bindata.

<Tabs
  defaultValue="homebrew"
  values={[
    { label: 'homebrew', value: 'homebrew', },
    { label: 'linux', value: 'linux', },
    { label: 'source', value: 'source', },
  ]
}>
<TabItem value="homebrew">

```bash
brew install go-bindata
```

</TabItem>
<TabItem value="linux">

```bash
curl --silent --location --output /usr/local/bin/go-bindata https://github.com/kevinburke/go-bindata/releases/download/v3.11.0/go-bindata-linux-amd64
chmod 755 /usr/local/bin/go-bindata
```

</TabItem>
<TabItem value="source">

```bash
go get -u github.com/kevinburke/go-bindata/...
```

Be careful as executing this inside the Oh my Posh repository will adjust the `go.mod` file with this dependency.
Today, there's no way to install a dependency system wide for go, although that's [in the works][go-global].
Make sure to remove this before submitting a PR as there's [a check][pr-go-mod] in place to avoid adding unused dependencies.

</TabItem>
</Tabs>

## Get the source code

The source is hosted on [Github][omp]. When you want to contribute, create a [fork][gh-fork] so you can make changes in your repository
and create pull request in the official Oh my Posh repository.

Clone your fork of Oh my Posh locally, replace `<user>` with your Github username.

```bash
git clone git@github.com:<user>/oh-my-posh3.git
```

## Running tests

The go source code can be found in the `src/` directory, make sure to change to that one before continuing.
Once in the right directory, we need to pack the initialization scripts into the source code.

```bash
go generate
```

Provided the previous steps were performed correctly, you should now see a new file called `init.go`.
Do not wory about this file as it's ignored by git, we generate it every time the app gets build.

### Unit tests

```bash
go test -v
```

### golangci-lint

```bash
golangci-lint run
```

## Building the app

The easiest way to validate your changes is to write tests. Unfortunately, as it's a visual tool, you'll want to validate
the changes by running the prompt in your shell as well. You can make use of go's `bin` folder which is usually added to
your path to add your own Oh my Posh binary to and immediately see the changes appear in your shell.

```bash
go build -o $GOPATH/bin/oh-my-posh
```

## Up Next

With everything set up, you're ready to start making changes and create your first [PR][gh-pr]!

[go]: https://golang.org
[go-started]: https://golang.org/doc/install
[golang-ci-lint]: https://golangci-lint.run
[golang-ci-lint-local]: https://golangci-lint.run/usage/install/#local-installation
[go-bindata]: https://github.com/kevinburke/go-bindata/
[go-global]: https://github.com/golang/go/issues/40276
[pr-go-mod]: https://github.com/JanDeDobbeleer/oh-my-posh3/blob/main/.github/workflows/gomod.yml
[gh-pr]: https://github.com/JanDeDobbeleer/oh-my-posh3/pulls
[omp]: https://github.com/JanDeDobbeleer/oh-my-posh3
[gh-fork]: https://guides.github.com/activities/forking/
