{"id":25052099,"url":"https://github.com/effectiveaf/effective","last_synced_at":"2025-08-25T01:36:38.201Z","repository":{"id":57588278,"uuid":"150233927","full_name":"EffectiveAF/effective","owner":"EffectiveAF","description":"Effective: end-to-end encrypted project management for activists and human rights organizations. Making activists 10x more powerful via ultra effective communities of action and autonomous software. [deprecated]","archived":false,"fork":false,"pushed_at":"2019-07-22T22:12:24.000Z","size":18678,"stargazers_count":83,"open_issues_count":23,"forks_count":10,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-06-05T09:40:51.498Z","etag":null,"topics":["activism","autonomous-agents","basic-income","effective","golang","greatness","justice","postgresql","postgrest","project-management","react","reactjs","saving-the-world","task-management"],"latest_commit_sha":null,"homepage":"https://effective.af/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EffectiveAF.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-09-25T08:43:42.000Z","updated_at":"2025-05-27T12:33:14.000Z","dependencies_parsed_at":"2022-09-16T16:20:40.037Z","dependency_job_id":null,"html_url":"https://github.com/EffectiveAF/effective","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/EffectiveAF/effective","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EffectiveAF%2Feffective","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EffectiveAF%2Feffective/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EffectiveAF%2Feffective/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EffectiveAF%2Feffective/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EffectiveAF","download_url":"https://codeload.github.com/EffectiveAF/effective/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EffectiveAF%2Feffective/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271991982,"owners_count":24854897,"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","status":"online","status_checked_at":"2025-08-24T02:00:11.135Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["activism","autonomous-agents","basic-income","effective","golang","greatness","justice","postgresql","postgrest","project-management","react","reactjs","saving-the-world","task-management"],"created_at":"2025-02-06T10:21:17.741Z","updated_at":"2025-08-25T01:36:38.156Z","avatar_url":"https://github.com/EffectiveAF.png","language":"JavaScript","readme":"# Effective.af\n\n![Task hierarchy](https://user-images.githubusercontent.com/139603/50059966-96bdc800-0142-11e9-8f76-238f3012d877.png)\n\n---\n\n## What is Effective?\n\nEffective is open source software for effectively organizing groups\nand individuals to achieve a shared mission.\n\nAt its core, **Effective is end-to-end encrypted task management\nsoftware designed to facilitate mass collaboration/coordination**, and\nthat has a number of unique features.\n\n\n### The Big Picture\n\nThe short-term goal is for Effective to enable participants to: create\na **project** with a name and mission, create a **hierarchy of tasks**\nthat build up to the achievement of that mission, **invite others by URL**\n(without requiring invitees to hand over their email address to the\nserver), optionally **invite others into specific roles** (with a\ntitle and associated task list), ask for help or clarify the assigned\ntasks in **per-task chat rooms**, attach **files and documents** to\ntasks, **get summoned** when relevant events occur (e.g., when you are\nassigned a task, or when mentioned), receive **social recognition**\nfor contributions (via karma points), and **assign tasks _to other projects_**\nin this ecosystem in order to harness its collective expertise and\ndesire to change the world.\n\nEffective can be used for a great many things.  But we, its creators,\nhave certain interests.  Specifically, we are focused on organizing\nactivists, non-profits, and projects tackling grand challenges in\norder to help solve serious problems we face as a society and fight\nfor a better future for all.\n\nIn addition to fighting for this more prosperous future, we aim to\nconfront and correct, via an energetic, global network of\nforward-thinking individuals, the injustices imposed on society by\ncriminalized institutions the world over.\n\nTo learn more, please see https://effective.af/ or follow us\non Twitter at [@EffectiveAF](https://twitter.com/EffectiveAF/).\n\n_See the next section to learn more about what else makes Effective unique, or look below that for how to run or contribute to the software yourself._\n\n\n## Software components: Effective and LeapChat\n\nThe software that makes up Effective has 2 major features/components:\n**task management** and **secure chat**.\n\nThe task management functionality can be found at\nhttps://github.com/EffectiveAF/effective .  This `effective` repo\nuses LeapChat (currently via an iframe, though this will change);\nLeapChat can be found in its own GitHub repo at\nhttps://github.com/cryptag/leapchat .\n\nSo, to be clear, we have:\n\n1. [**Effective**](https://github.com/EffectiveAF/effective) --\n(soon-to-be) end-to-end encrypted task management optimized for large\nnumbers of participants (especially volunteers), and\n\n2. [**LeapChat**](https://github.com/cryptag/leapchat) -- end-to-end\nencrypted chat in the browser (which we've already launched; see\n[LeapChat.org](https://www.leapchat.org/)).\n\n\n### The Interplay Between Chat and Task Management\n\nEach project has many associated tasks. Each task has its own\nLeapChat room attached to it for discussing the details of what should\nbe done, how best to achieve that task, etc.\n\n\n## Unique Features\n\nAside from the unique aspects mentioned above, here are some features\nthat differentiate Effective from other task management-centric\nsoftware:\n\n\n#### Task/Participant Auto-pairing and Recruitment by Skill Set\n\n(Future feature)\n\nWhen you have a non-trivial number of people participating in a\nproject, they're not going to know each other's skill sets, and\ntherefore won't know who they should assign a task that they think\n_someone_ should complete, or that they personally need done as a\nsub-task of whatever they are working on.\n\n_Other task management systems do not scale_ in the ways we need them\nto.\n\nIn Effective, when a new task is created and the skills necessary to\ncomplete it are specified (by tag), participants within that task's\nproject who have all of the requisite skills will be notified and\nasked if they'd like to be the assignee.  (Users will add their skills\nto their respective profiles so that this pairing can occur.)\n\nWe'll also build in skill-based recruitment that lets users request\nhelp from users who are on the same _server_ as the project you're\nrecruiting from and who have opted into creating a server-wide profile\nthat includes their skills and interests.\n\n\n#### Assigning Tasks to Other Projects\n\nOther systems think it terms of _teams_.  What is a team?  A small\ngroup of closely-knit people who know each other's names, skill sets,\nand so on.  But a team is also a silo cut off from the rest of the\nworld.\n\nEffective does not see the world this way.  By enabling projects to\nassign tasks _to other projects_, we are enabling a federation of\npolitically-aligned organizations/groups/projects asking each other\nfor help, perhaps specializing within the ecosystem, and offering\ntheir unique talents and knowledge to other projects with whom they\npartner.\n\n\n#### Automatic Task Reassignment\n\n(Future feature)\n\nVolunteers are flaky. Someone will often volunteer for a task, or\notherwise have a task assigned to them, and not do it.\n\nWhen a task's assignee hasn't made recent progress, Effective will\neither ask the task's creator or reviewer if they want to ask its\nassignee for a status update, or Effective could automatically,\nperiodically ask for said updates from assignees _without_ first\nasking the reviewer if these messages should be sent out.  But the\ninteresting part is: an unresponsive or otherwise seemingly\nnot-working-on-the-task assignee can be given, say, 24 hours (or a\ndynamic amount of time depending on the \"velocity\" of the project,\nwhich we can measure by tracking changes in the task phases) to\nrespond or to make progress or _do something_, after which, if nothing\nis done, **our software can automatically reassign this task** to,\nsay, the last person who logged in who has all of the skills required\nby the task, or to the person with the most karma points with all the\nrequisite skills, or to the person who invited the current assignee to\nthe project in the first place, or some other auto-calculable\nvariant.\n\n...and in writing this, I realize that the tasks's _reviewer_, not\njust assignee, could be auto-reassigned in the same fashion if a task\nis finished but the reviewer doesn't mark it as done for some period\nof time.\n\n\n#### End-to-end Encryption\n\n(This feature partially exists for chat, not yet there for task\nmanagement)\n\nFor private projects, tasks will be encrypted, in which case the\nserver will not be able to see the title, description/deliverables,\netc of a task in unencrypted form, just its relation to other tasks,\nthe username of the assignee, and its status (e.g., \"WorkingOn\").\n\nThe encryption library we are currently using is\n[miniLock](https://github.com/kaepora/minilock), which has undergone a\nthorough security audit by the venerable Cure53.  miniLock enables us\nto deterministically generate a passphrase from (1) a username and (2)\na passphrase.  From the user's perspective, they will sign into\nEffective as they would sign into any other website or app (other than\nus requiring a stronger password), but in this case we are generating\na keypair for that user, which JavaScript running in their browser\n(and, later, their native app) uses to encrypt and decrypt content.\n\nEach private project is associated with 3 top-level passphrases, each\nof which used to generate a unique keypair using miniLock.  That\npassphrase is generated in the browser/on the device of the user who\ncreated that project.  When some other user is invited to a private\nproject, the invite includes a passphrase that can be used to decrypt\nan encrypted copy of the top-level-key-generating passphrase (using\nthe same technique as\n[miniShare](https://github.com/cryptag/minishare), which we also\nbuilt, and that has been launched at \u003chttps://minishare.io\u003e),\ndepending upon which permissions level they were invited at.\n\n\n## Tech Stack\n\nEffective is all React on the frontend and Go + Postgres +\n[PostgREST](https://tryingtobeawesome.com/postgrest/) on the backend.\n(Eventually we will add TypeScript type annotations; contact\n@elimisteve if you would like to help with this!)\n\nThe strategy: write React code once, begin on-boarding users into a\nweb app version of Effective ASAP, make a bunch of improvements based\non user feedback, add [various features](https://effectiveaf.nolt.io/),\nthen reuse 80% of that code to build a React Native version for Android\nand iOS, and also a native desktop version using Electron.  And _then_\nwe'll have a 3rd party security audit done.\n\n---\n\n# Running Effective\n\n## WARNING\n\nDo not yet expose this server software to the world without at least\nsetting `REACT_APP_BASIC_AUTH_USERNAME` and\n`REACT_APP_BASIC_AUTH_PASSWORD` in `.env`, and even then everyone who\npossesses those credentials can do anything to the database; we have\nyet to add proper accounts/authentication, which we're doing via a\ncombination of cryptographic auth and PostgREST's JWTs (JSON Web\nTokens).  Hang tight!\n\n\n## Linux Quickstart\n\nIf you're trying to run Effective on an Ubuntu server that does _not_\nalready have Go installed, then just run this one command:\n\n```\ncurl https://raw.githubusercontent.com/EffectiveAF/effective/develop/install_linux.sh | bash\n```\n\nYou'll be asked to type in your `sudo` password, then to type two\nother commands, but after that, Effective should be running on your\nsystem!\n\n\n## Getting Started\n\n### Install Go\n\nIf you're on Linux or macOS _and_ if don't already have\n[Go](https://golang.org/dl/) version 1.8 or newer installed\n(`$ go version` will tell you), you can install Go by running:\n\n```\ncurl https://raw.githubusercontent.com/elimisteve/install-go/master/install-go.sh | bash\nsource ~/.bashrc\n```\n\nThen grab and build the `effective` source:\n\n```\ngo get github.com/EffectiveAF/effective\n```\n\n### macOS Instructions\n\nIf you don't already have Postgres 9.5 or newer installed and running,\ninstall it with Homebrew:\n\n```\nbrew install postgresql\n```\n\nNext, you'll need three terminals.\n\n**In the first terminal**, run database migrations, download `postgrest`,\nand have `postgrest` connect to Postgres:\n\n```\ncd $(go env GOPATH)/src/github.com/EffectiveAF/effective/db\ncreatedb\nsudo -u $USER bash init_sql.sh\nwget https://github.com/begriffs/postgrest/releases/download/v0.4.3.0/postgrest-v0.4.3.0-osx.tar.xz\ntar xvf postgrest-v0.4.3.0-osx.tar.xz\n./postgrest postgrest.conf\n```\n\n**In the second terminal**, run Effective's Go backend:\n\n```\ncd $(go env GOPATH)/src/github.com/EffectiveAF/effective\ngo build\n./effective\n```\n\n**In the third terminal**, install JavaScript dependencies and start\nEffective's auto-reloading dev server:\n\n```\ncd $(go env GOPATH)/src/github.com/EffectiveAF/effective\nnpm install\nnpm run build\nnpm run start\n```\n\nEffective should now be running on \u003chttp://localhost:8081\u003e!\n\n\n### Linux Instructions (for Ubuntu; works on Debian if other dependencies met)\n\nIf you don't already have Node 8.x installed (`node --version` will tell\nyou the installed version), install Node by running:\n\n```\ncurl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -\nsudo apt-get install nodejs\n```\n\n\nIf you don't already have Postgres 9.5 or newer installed and running,\ninstall it by running:\n\n```\nsudo apt-get install postgresql postgresql-contrib\n```\n\nNext, you'll need three terminals.\n\n**In the first terminal**, run database migrations, download `postgrest`,\nand have `postgrest` connect to Postgres:\n\n```\ncd $(go env GOPATH)/src/github.com/EffectiveAF/effective/db\nsudo -u postgres bash init_sql.sh\nwget https://github.com/begriffs/postgrest/releases/download/v0.4.3.0/postgrest-v0.4.3.0-ubuntu.tar.xz\ntar xvf postgrest-v0.4.3.0-ubuntu.tar.xz\n./postgrest postgrest.conf\n```\n\n**In the second terminal**, run Effective's Go backend:\n\n```\ncd $(go env GOPATH)/src/github.com/EffectiveAF/effective\ngo build\n./effective\n```\n\n**In the third terminal**, install JavaScript dependencies and start\nEffective's auto-reloading dev server:\n\n```\ncd $(go env GOPATH)/src/github.com/EffectiveAF/effective\nnpm install\nnpm run start\n```\n\nEffective should now be running on \u003chttp://localhost:8081\u003e!\n\n\n### Production Deployment Build\n\nSame as the Linux commands above, with two modifications.\n\nReplace:\n\n```\nnpm run start\n```\n\nwith\n\n```\n# !!! Add HTTP Basic Auth credentials to .env to password-protect your Effective server! !!!\nsource .env\nnpm run build\n```\n\nReplace:\n\n```\ngo build\n./effective\n```\n\nwith\n\n```\ngo build\n# !!! Add HTTP Basic Auth credentials to .env to password-protect your Effective server! !!!\nsource .env\nsudo setcap cap_net_bind_service=+ep effective\n./effective -prod -domain YOURDOMAINNAMEGOESHERE.com -http :80 -https :443\n```\n\nTo enable chat functionality, run\n[LeapChat](https://github.com/cryptag/leapchat) on port 8080.\n\nTo send email notifications to users, run\n[EffectiveMail](https://github.com/EffectiveAF/effectivemail)\nas instructed in its\n[`README`](https://github.com/EffectiveAF/effectivemail#effectivemail).\n\n\n## Conventions\n\nPlease follow these naming and spacing conventions when submitting a pull request:\n[React + Redux Conventions](https://unbug.gitbooks.io/react-native-training/content/45_naming_convention.html).\n\n\n## Code style and format\n\nWe use a combination of [Prettier](https://prettier.io/docs/en/index.html) and [Eslint](https://eslint.org/docs/user-guide/getting-started). Prettier is an opinionated code formatter but does not care about code-quality rules. It only concerns formatting rules. This is why we use Eslint for code-quality rules but not for formatting rules. Read more about the difference between linters and Prettier here: \u003chttps://prettier.io/docs/en/comparison.html\u003e. Not ever do we want formatting rules in the `.eslintrc` configuration file. Not implicitly or explicitly. To make sure of that we have a NPM script called verify-eslint-rules (`npm run verify-eslint-rules`) that gives an error if there are Eslint rules somewhere in our `.eslintrc` configuration that conflicts with Prettier's formatting rules.\n\nBefore submitting PRs, please fix and format your code using `npm run lint`.\n\n\n## NPM scripts\n\nBesides from the script [generated by create-react-app](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#available-scripts) (`npm start`, `npm test`, `npm run build` and `npm run eject`) we have several custom scripts as well:\n\n- `lint` - Runs linting with the `--fix` flag AND formats the code with Prettier (**please run this against your code before submitting PRs**).\n- `lint:check` - Just checks the code for lint errors (Eslint only).\n- `format` - Automatically fixes the code to fit Prettier's format rules.\n- `format:check` - Just checks the code for format errors (Prettier only).\n- `ci` - The purpose of this script is to be executed in a CI platform for every pull request. It checks linting, code format and makes sure that there are not any Eslint rules that conflicts with Prettier format rule.\n\n\n# Partners, Sponsors, Thank Yous\n\n## Hypothesis\n\n\u003ca href=\"https://hypothes.is/\"\u003e\n  \u003cimg src=\"public/assets/img/HypothesisLogo.png\" alt=\"Hypothesis logo\" /\u003e\n\u003c/a\u003e\n\nWe are in the process of integrating with\n[Hypothesis](https://hypothes.is/), the web annotation platform, so\nthat our users can coordinate crowdsourced investigative resource more\neffectively.\n\n\n## BrowserStack\n\n\u003ca href=\"https://www.browserstack.com/\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/139603/41737979-bd4af8f0-7545-11e8-8b2e-ab2a8e6e30b8.png\" alt=\"BrowserStack logo\" /\u003e\n\u003c/a\u003e\n\nWe use BrowserStack to ensure the cross-browser compatibility of\nEffective on both mobile and desktop.  Thank you BrowserStack for\nsponsoring us!\n\n\n## Pursuance\n\nEffective began its life as a fork of the original\n[Pursuance](https://github.com/PursuanceProject/pursuance) code base.\nBoth forks were started by\n[@elimisteve](https://github.com/elimisteve).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feffectiveaf%2Feffective","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feffectiveaf%2Feffective","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feffectiveaf%2Feffective/lists"}