{"id":28346783,"url":"https://github.com/function61/fn61-opencompany","last_synced_at":"2026-02-15T17:09:12.178Z","repository":{"id":144235307,"uuid":"150247400","full_name":"function61/fn61-opencompany","owner":"function61","description":"Open details about function61.com the company","archived":false,"fork":false,"pushed_at":"2023-10-08T08:00:10.000Z","size":16,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-03T21:56:30.895Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://function61.com/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/function61.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-09-25T10:26:59.000Z","updated_at":"2024-10-07T18:30:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"dc57bd59-4e9e-4946-b084-6f7d5165812a","html_url":"https://github.com/function61/fn61-opencompany","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/function61/fn61-opencompany","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Ffn61-opencompany","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Ffn61-opencompany/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Ffn61-opencompany/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Ffn61-opencompany/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/function61","download_url":"https://codeload.github.com/function61/fn61-opencompany/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Ffn61-opencompany/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261225412,"owners_count":23127133,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-27T15:02:51.811Z","updated_at":"2026-02-15T17:09:07.153Z","avatar_url":"https://github.com/function61.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"In this repo I'd like to open up details about how I run the company, its webservices and develop apps.\n\nTODO: more openness. Inspired by [opencompany/awesome-open-company](https://github.com/opencompany/awesome-open-company)\n\n\nInfrastructure level decisions\n------------------------------\n\n| Problem (link = more details)   | Solution                                                                   |\n|---------------------------------|----------------------------------------------------------------------------|\n| [Cloud](docs/selecting-a-cloud-provider.md) | [Hetzner](https://www.hetzner.com/cloud)                       |\n| Cloud lock-in                   | Only compute to maximize portability, everything else like queues from AWS |\n| Single or multi-DC availability | Multi-DC, probably multi-vendor as well for safety                         |\n| OS                              | [Flatcar Linux](https://www.flatcar.org/) with auto-updates disabled    |\n| Infrastructure immutability     | [Packer](https://www.packer.io/) + [Terraform](https://www.terraform.io/), see [function61/james](https://github.com/function61/james) |\n| PKI                             | Root CA in Yubikey, [cfssl](https://github.com/cloudflare/cfssl). [Our toolkit image](https://github.com/function61/certificate-authority). |\n| Secure auth to SSH              | Agent + [Yubikey](https://www.yubico.com/products/yubikey-hardware/)       |\n| Containerization                | [Docker](https://www.docker.com/)                                          |\n| Orchestration                   | [Docker Swarm](https://docs.docker.com/engine/swarm/)                      |\n| Container cross-host networking | [Docker Swarm](https://docs.docker.com/engine/swarm/)                      |\n| Orchestration dashboard         | [Portainer](https://portainer.io/)                                         |\n| Backups                         | [function61/ubackup](https://github.com/function61/ubackup)                |\n| Domain registrar                | [AWS Route53](https://aws.amazon.com/route53/)                             |\n| DNS                             | [Cloudflare](https://www.cloudflare.com/)                                  |\n| DDOS protection                 | [Cloudflare](https://www.cloudflare.com/)                                  |\n| Centralized logging             | [Google Stackdriver](https://cloud.google.com/stackdriver/) (see [instructions](https://joonas.fi/2019/01/06/how-to-configure-gcplogs-for-docker/)) |\n| Alerting                        | [function61/lambda-alertmanager](https://github.com/function61/lambda-alertmanager) |\n| Website uptime monitoring       | alertmanager-canary (sub-project of lambda-alertmanager)                   |\n| Public status page              | [UptimeRobot](https://uptimerobot.com/)                                    |\n| Metrics                         | [Prometheus](https://prometheus.io/) + [function61/promswarmconnect](https://github.com/function61/promswarmconnect) |\n| Metrics dashboard               | [Grafana](https://grafana.com/)                                            |\n| Container secrets               | ENV variable injection via orchestration                                   |\n| Edge routing                    | [function61/edgerouter](https://github.com/function61/edgerouter)          |\n\n\nApplication level decisions\n---------------------------\n\nWhile some applications require different solutions for different problems, this is the basic stack we\nstart with and customize from there where needed.\n\nAlways prefer statically compiled languages. The more safety (= \"if it compiles, it\nprobably works\") the language guarantees, the better. Humans make mistakes - get tools\nthat help with that.\n\n\n| Problem                         | Solution                                                                   |\n|---------------------------------|----------------------------------------------------------------------------|\n| Philosophy                      | [The Twelve-Factor App](https://12factor.net/)                             |\n| Programming language, backend   | [Go](https://golang.org/)                                                  |\n| Programming language, frontend  | [TypeScript](https://www.typescriptlang.org/)                              |\n| Frontend UI architecture        | [React](https://reactjs.org/)                                              |\n| Build system                    | [Turbo Bob](https://github.com/function61/turbobob) ([builder pattern](https://blog.alexellis.io/mutli-stage-docker-builds/))      |\n| CI system                       | [Travis CI](http://travis-ci.org) for public stuff, [GitLab](https://about.gitlab.com/) for private stuff |\n| Source code hosting             | [GitHub](http://github.com/) for public stuff, [GitLab](https://about.gitlab.com/) for private stuff |\n| Container image hosting         | [Docker Hub](https://hub.docker.com/) for public stuff, [GitLab](https://about.gitlab.com/) for private stuff |\n| Build artefact hosting          | [GitHub](http://github.com/) for public stuff, [AWS S3](https://aws.amazon.com/s3/) for private stuff |\n| Log shipping                    | That's an infrastructure concern                                           |\n| Persistence                     | [Eventhorizon](https://github.com/function61/eventhorizon) + [BoltDB](https://github.com/etcd-io/bbolt) |\n| Session mechanism               | [JWT](https://jwt.io/)                                                     |\n| Auth methods                    | SSO(password, [TOTP](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm), [U2F](https://www.yubico.com/solutions/fido-u2f/))                                                   |\n\n\nMiscellaneous design decisions\n------------------------------\n\n| Problem                      | Solution                      |\n|------------------------------|-------------------------------|\n| Payment traffic              | [Stripe](https://stripe.com/) |\n| Accounting                   | [ledger-cli](https://www.ledger-cli.org/) |\n| Developer secrets management | [function61/pi-security-module](https://github.com/function61/pi-security-module) |\n| Helpdesk system              | [Freshdesk](https://freshdesk.com/) |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunction61%2Ffn61-opencompany","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunction61%2Ffn61-opencompany","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunction61%2Ffn61-opencompany/lists"}