# Offpunk’s Development Guidelines

## Minimalism

* Offpunk is, first and foremost, a Gemini browser. Gemini should stay first-class. Gopher second, Web third.
* Offpunk is intended first and foremost for offline use. 
* Offpunk goal is not to browse the web but to extract useful information from web pages.
* Each page should always be presented the same. There will never be any CSS or design support in Offpunk.
* Offpunk is a reading tool. It doesn’t run any app. There will never be any kind of JS support. If information cannot be extracted without JS on a given page, this page should be considered as broken and it is not Offpunk’s fault. 
* Offpunk is an open tool. It will only implement free and open protocols. No proprietary protocols.
* Offpunk is a CLI tool. Every interaction is done by typing a visible command, not by using a shortcut or a mouse.

## Contributors Culture

* Offpunk’s people welcome differences and are respectful of themselves and each others, including outside of the community platforms.
* It’s OK to be wrong. It is OK to make a mistake. Be gentle on yourself.
* A mistake should be acknowledged and corrected as quick as possible.
* Nobody should be blamed for honest mistakes.
* It’s OK to change your mind, to disappear for a while or to miss a deadline.
* Contributing to Offpunk should be fun. If it becomes an obligation, stop it for a while.
* Developers are assumed to work offline, development should be done asynchronously by email.
* Each commit should probably comes with an CHANGELOG entry

## Accessibility

* Accessibility is critical. Any changes that improve accessibility is high priority.
* Any patch that impedes accessibility in any way should be refused.
* Feedback from users with special-needs or disabilities are highly welcome. We consider those differences as richness. Improving Offpunk for those users improve it for everyone.
* Accessibility should not be confused with implementing every potential workflow. Offpunk is not an universal solution for everyone. Users must have the motivation to adapt to Offpunk’s philosophy and to learn to use it.

## Code structure

* Offpunk should run directly as a Python script without any installation, environment settings or anything else. This is non-negotiable core value. python ./offpunk.py
* Code should be in as few files as possible in one single folder.
* Code should be split in separate files only if it makes sense to use some part of the code as an independent tool.
* Everything is a file. The only database is user’s hard disk. No complex data structure but plain text files.

## Crash and errors

* Offpunk should never crash. That’s final. Any crash should be corrected.
* Corollary: Offpunk code should not throw exceptions but handle all possible cases.
* Corollary 2: Any call to an external library should catch any potential exception.

## Dependencies

* Offpunk should depend on as few dependencies as possible. Any work toward removing a dependency is good work.
* Dependencies should be optional. Code should run without that dependency.
* For a decency to be considered, 4 conditions should be met:

> 0. The dependency is 100% open and free software, as defined by the FSF.
> 1. The dependency is well maintained with a stable and reliable API. There’s no need to track API changes across versions.
> 2. The dependency is popular and widely packaged in most popular Linux distribution (if it is not in Debian, it is probably not popular enough). It is not uncommon to have it already installed.
> 3. The feature offered by the dependency cannot be implemented directly in Offpunk in less than 1000LOC. The point is to avoid small dependencies for relatively trivial features.
> 4. The dependency doesn’t depend itself on dependencies breaking the previous 3 rules.


