diff --git a/.github/workflows/enrich-projects.yml b/.github/workflows/enrich-projects.yml new file mode 100644 index 00000000..25c96e91 --- /dev/null +++ b/.github/workflows/enrich-projects.yml @@ -0,0 +1,44 @@ +name: Enrich Projects + +on: + schedule: + # Every Monday at 02:00 UTC + - cron: "0 2 * * 1" + workflow_dispatch: {} + +permissions: + contents: write + pull-requests: write + +jobs: + enrich: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm ci + + - name: Run enrichment + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/enrich-projects.mjs + + - name: Check for changes + id: diff + run: | + git diff --quiet data/projects.enriched.json && echo "changed=false" >> $GITHUB_OUTPUT || echo "changed=true" >> $GITHUB_OUTPUT + + - name: Commit enriched data + if: steps.diff.outputs.changed == 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add data/projects.enriched.json + git commit -m "chore: update enriched project data [skip ci]" + git push diff --git a/.github/workflows/generate-readme.yml b/.github/workflows/generate-readme.yml new file mode 100644 index 00000000..14d9d2e1 --- /dev/null +++ b/.github/workflows/generate-readme.yml @@ -0,0 +1,43 @@ +name: Generate README + +on: + push: + branches: + - main + paths: + - "data/projects.json" + workflow_dispatch: {} + +permissions: + contents: write + +jobs: + generate: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm ci + + - name: Regenerate README + run: node scripts/generate-readme.mjs + + - name: Check for changes + id: diff + run: | + git diff --quiet README.MD && echo "changed=false" >> $GITHUB_OUTPUT || echo "changed=true" >> $GITHUB_OUTPUT + + - name: Commit README + if: steps.diff.outputs.changed == 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add README.MD + git commit -m "chore: regenerate README from projects.json [skip ci]" + git push diff --git a/.github/workflows/validate-pr.yml b/.github/workflows/validate-pr.yml new file mode 100644 index 00000000..bd5ca37b --- /dev/null +++ b/.github/workflows/validate-pr.yml @@ -0,0 +1,23 @@ +name: Validate PR + +on: + pull_request: + paths: + - "data/projects.json" + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm ci + + - name: Validate projects.json + run: node scripts/validate-projects.mjs diff --git a/app/utils/projects.ts b/app/utils/projects.ts index e843644b..213e0a71 100644 --- a/app/utils/projects.ts +++ b/app/utils/projects.ts @@ -1,107 +1,92 @@ -import { marked } from "marked"; -import * as cheerio from "cheerio"; import { cache } from "react"; +import projectsData from "../../data/projects.enriched.json"; + +export type ProjectStatus = + | "active" + | "stale" + | "inactive" + | "archived" + | "deprecated" + | "deleted" + | "unknown"; + +export type ManualStatus = "inactive" | "archived" | "deprecated" | "deleted"; + +export type Author = { + name: string; + link: string; +}; -const getData = cache(async () => { - const res = await fetch( - "https://raw.githubusercontent.com/acekyd/made-in-nigeria/main/README.MD", - { next: { revalidate: false } } - ); - - if (!res.ok) { - // This will activate the closest `error.js` Error Boundary - throw new Error("Failed to fetch data"); - } - - const markdownData = await res.text(); - - // const markdownData = await fs.readFile(process.cwd() + '/README.MD', 'utf8'); - - const html = marked(markdownData); - const $ = cheerio.load(html); // load the html string into cheerio - - // Select all
  • elements using jQuery-like syntax and extract their text - const liTextArray = $("li") - .map((index, element) => $(element).html()) - .get(); +export type Project = { + name: string; + repoUrl: string; + description: string; + authors: Author[]; + manualStatus?: ManualStatus; + computed?: { + status: ProjectStatus; + stars: number | null; + lastPushed: string | null; + language: string | null; + checkedAt: string; + error?: string; + }; + // Legacy shape — keeps existing components working without changes + repoName: string; + repoLink: string; + repoDescription: string; + repoAuthor: string; + repoAuthorLink: string; + isInactive: boolean; + isArchived: boolean; +}; - // process the text to get the data you want - const repositories = convertToJSON(liTextArray); +function normalizeProject(raw: (typeof projectsData)[number]): Project { + const primaryAuthor = raw.authors?.[0]; + const status = raw.computed?.status as ProjectStatus; - return repositories; -}); + return { + ...raw, + authors: (raw.authors ?? []) as Author[], + computed: raw.computed as Project["computed"], + manualStatus: raw.manualStatus as ManualStatus | undefined, + repoName: raw.name, + repoLink: raw.repoUrl, + repoDescription: raw.description, + repoAuthor: primaryAuthor?.name ?? "", + repoAuthorLink: primaryAuthor?.link ?? "", + isInactive: status === "inactive" || status === "stale", + isArchived: status === "archived", + }; +} -function convertToJSON(repositories: string[]) { - return repositories.map((repository) => { - const $ = cheerio.load(repository); +const getData = cache((): Project[] => + (projectsData as (typeof projectsData)[number][]).map(normalizeProject) +); - // Extract text content and href from element - const repoName = $("a").first().text(); - const repoLink = $("a").first().attr("href"); +export const useProjects = () => { + const data = getData(); - // Status of the repo - const status = $("span").first().text(); + const filterProjects = () => ({ + byName: (input: string) => { + const q = input.toLocaleLowerCase(); + return data.filter((p) => p.repoName.toLocaleLowerCase().includes(q)); + }, - const isInactive = status?.includes("Inactive"); - const isArchived = status?.includes("Archived"); + byAuthor: (input: string) => { + const normalized = input.trim().toLocaleLowerCase().replace(/^@/, ""); + const q = `@${normalized}`; + return data.filter((p) => p.repoAuthor.toLocaleLowerCase().includes(q)); + }, - // @ts-ignore - let description = $("*").contents()[3].data; // I don't know why the fuck this works but if it's not broken, don't touch it. - const repoDescription = description.replace(/^ - /, ""); - const repoAuthor = $("strong a").text(); - const repoAuthorLink = $("strong a").attr("href"); + byLetter: (input: string) => { + const q = input.toLocaleLowerCase(); + return data.filter((p) => p.repoName.toLocaleLowerCase().startsWith(q)); + }, - // Create JSON object - return { - repoName, - repoLink, - repoDescription, - repoAuthor, - repoAuthorLink, - isInactive, - isArchived, - }; + byStatus: (status: ProjectStatus) => + data.filter((p) => p.computed?.status === status), }); -} - -export const useProjects = async () => { - const data = await getData(); - - const filterProjects = () => { - return { - byName: (input: string) => { - return data.filter( - (projects) => - projects.repoName - .toLocaleLowerCase() - .includes(input.toLocaleLowerCase()) || - projects.repoName.toLocaleLowerCase() === input.toLocaleLowerCase() - ); - }, - - byAuthor: (input: string) => { - return data.filter( - (projects) => - projects.repoAuthor.toLocaleLowerCase() === - `@${input.toLocaleLowerCase()}` || - projects.repoAuthor - .toLocaleLowerCase() - .includes(`@${input.toLocaleLowerCase()}`) - ); - }, - byLetter: (input: string) => { - return data.filter((projects) => - projects.repoName - .toLocaleLowerCase() - .startsWith(input.toLocaleLowerCase()) - ); - }, - }; - }; - - return { - projects: data, - filterProjects, - }; + return { projects: data, filterProjects }; }; diff --git a/contributing.md b/contributing.md index 3ff74cd3..1688c4eb 100644 --- a/contributing.md +++ b/contributing.md @@ -1,36 +1,77 @@ -# Made in Nigeria Github collection Guidelines +# Made in Nigeria — Contribution Guide -## Contributing a Project +## What qualifies a project for inclusion? +To be included in the Made in Nigeria list, a project must meet the following criteria: -To add a new project to the collection, please ensure they meet the following requirements arranged in order of importance +- **Made in Nigeria** — created or primarily maintained by a Nigerian developer. +- **Open source** — publicly available source code. +- **Global use** — not limited to a Nigerian audience or use case. +- **At least 20 GitHub stars** — a signal that others find it useful. +- **Not a list** — curated lists (alone) of links don't qualify. +- Provide a social media or personal site link for the author(s) - outside GitHub is preferred. -* The project must be **made in Nigeria** as the name implies :grin:. -* The project must be open source. +## Adding a project +Open `data/projects.json` and add a new entry anywhere in the array (it will be sorted alphabetically on merge): -* The project must have global use - meaning it's not made just for use by Nigerians and there really is no geographical limitation for anyone that may be interested in using this project. +```json +{ + "name": "Your Project Name", + "repoUrl": "https://github.com/your-username/your-repo", + "description": "One or two sentences describing what the project does.", + "authors": [ + { "name": "@yourhandle", "link": "https://twitter.com/yourhandle" } + ] +} +``` -* The project should have at least 20 stars. This is to serve as a way to determine that people actually have a use for the project and it does what it says it does. [ Stars likely to go up as time goes on :smiley: ]. +That's all. The automated pipeline will: +- validate your entry on the PR +- fetch real GitHub data (stars, last push, language) on the next weekly run +- regenerate `README.MD` automatically after your PR is merged -* The project should not be a list of some sort. +### Multiple authors -* Ensure to provide a social media url of the creator of the project outside GitHub. +```json +"authors": [ + { "name": "@alice", "link": "https://twitter.com/alice" }, + { "name": "@bob", "link": "https://github.com/bob" } +] +``` -* Try to add the project to it's appropriate alphabetical location. +### Optional: manual status -* You might want to include the **made in Nigeria** badge to your project. Place the following code in your **README** file: -`[![Made in Nigeria](https://img.shields.io/badge/made%20in-nigeria-008751.svg?style=flat-square)](https://github.com/acekyd/made-in-nigeria)` +If you know a project has been deprecated or deleted, you can include: -More requirements may be added as time goes on. +```json +"manualStatus": "deprecated" +``` +Valid values: `inactive`, `archived`, `deprecated`, `deleted`. +Leave it out for active projects — the weekly enrichment job infers status automatically from GitHub activity. -## Contributing to Repo showcase website +--- -There is a webpage that has been developed by awesome members of the community used to view the contents of this repo in a very pleasing manner. If you'd like to contribute to this website, please try to follow these steps: +## How status is tracked automatically -* If you are fixing a bug or adding a new feature, please create a branch for it. +A scheduled GitHub Action runs every Monday, queries the GitHub API for every project, and writes computed data to `data/projects.enriched.json`: -* Make Pull requests as descriptive as possible. +| Condition | Computed status | +|---|---| +| GitHub repo is archived | `archived` | +| No push in > 2 years | `inactive` | +| No push in > 6 months | `stale` | +| Active | `active` | +| Non-GitHub or API error | `unknown` | -* Every other best practice recommended when contributing to a project. +`manualStatus` always overrides the computed status for `archived`, `deprecated`, and `deleted`. +--- + +## Contributing to the website + +- Create a branch for each bug fix or feature. +- Make pull requests as descriptive as possible. +- Run `npm run build` and check for errors before opening a PR. +- Remove all `console.log` statements. +- For UI changes, include screenshots or a short recording. diff --git a/data/projects.enriched.json b/data/projects.enriched.json new file mode 100644 index 00000000..6ffae299 --- /dev/null +++ b/data/projects.enriched.json @@ -0,0 +1,4821 @@ +[ + { + "name": "Adonis Auth Scaffold", + "repoUrl": "https://github.com/creatrixity/adonis-auth-scaffold", + "description": "Seamlessly scaffold a ready-to-use authentication system for your Adonis app with one neat command.", + "authors": [ + { + "name": "@creatrixity", + "link": "https://twitter.com/creatrixity" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Adonis Hexa", + "repoUrl": "https://github.com/creatrixity/adonis-hexa", + "description": "An opinionated software development framework for maintaining a scalable Adonis application.", + "authors": [ + { + "name": "@creatrixity", + "link": "https://twitter.com/creatrixity" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Adonis Queue", + "repoUrl": "https://github.com/stitchng/adonis-queue", + "description": "An addon/plugin package to provide driver-based job queueing services in AdonisJS 4.0+.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Adonis Stripe", + "repoUrl": "https://github.com/mezielabs/adonis-stripe", + "description": "This package makes it seamless to work with Stripe in AdonisJS 5 applications.", + "authors": [ + { + "name": "@ammezie", + "link": "https://twitter.com/ammezie" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "adonis-sse", + "repoUrl": "https://github.com/stitchng/adonis-sse", + "description": "An addon/plugin package to provide server-sent events functionality for AdonisJS 4.0+.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Ahnlich", + "repoUrl": "https://github.com/deven96/ahnlich", + "description": "Suite of tools including a vector database and AI proxy for semantic search and embedding storage written in Rust.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@IamDavidOnuh", + "link": "https://twitter.com/IamDavidOnuh" + }, + { + "name": "@HASKSOAT", + "link": "https://twitter.com/haksoat" + }, + { + "name": "@Lord__Sarcastic", + "link": "https://twitter.com/Lord__Sarcastic" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Alix", + "repoUrl": "https://github.com/ireade/alix", + "description": "Alix, a Chrome extension for a11y.css.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Altair", + "repoUrl": "https://github.com/altair-graphql/altair", + "description": "A sleek graphQL client app for querying GraphQL servers, like Postman for graphQL. It also comes as a Chrome extension.", + "authors": [ + { + "name": "@imolorhe", + "link": "https://twitter.com/imolorhe" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Amazon Pay v2 Ruby SDK", + "repoUrl": "https://github.com/bytenaija/amazon-pay-sdk-ruby", + "description": "An SDk that makes it easy to integrate amazon pay checkout and instore v2 clients in your ruby/ruby on rails projects.", + "authors": [ + { + "name": "@bytenaija", + "link": "https://twitter.com/bytenaija" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Angular-tag", + "repoUrl": "https://github.com/theo4u/angular-tag", + "description": "Tags input directive for AngularJS.", + "authors": [ + { + "name": "@theo4me", + "link": "https://twitter.com/theo4me" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Angular2-Sails-starter-pack", + "repoUrl": "https://github.com/Mozartted/Angular2-Sails-starter-pack", + "description": "A starter pack for angular2 based projects using sails backend, integrating hot reload functionalities.", + "authors": [ + { + "name": "@mozartted", + "link": "https://twitter.com/mozartted" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Angular4-paystack", + "repoUrl": "https://github.com/ashinzekene/angular4-paystack", + "description": "This is an angular module that abstracts the complexity of making paystack payments with Angular2+.", + "authors": [ + { + "name": "@ashinzekene", + "link": "https://twitter.com/ashinzekene" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "AnimatedCountTextView", + "repoUrl": "https://github.com/r4sh33d/AnimatedCountTextView", + "description": "A library that helps you animate change in numeric values in an Android TextView.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "AppFramer", + "repoUrl": "https://github.com/olucurious/AppFramer", + "description": "AppFramer helps to put your app screenshots in beautiful device frames with annotations by running a simple command.", + "authors": [ + { + "name": "@olucurious", + "link": "https://twitter.com/olucurious" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "APX", + "repoUrl": "https://github.com/othreecodes/APX", + "description": "A Javafx Library for building MVC Applications.", + "authors": [ + { + "name": "@othreecodes", + "link": "https://twitter.com/othreecodes" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Article Idea Generator", + "repoUrl": "https://github.com/Olanetsoft/article-idea-generator", + "description": "This simple tool generates article ideas and abstract drafts for your blog or website. It's a great way to get started with your content marketing strategy.", + "authors": [ + { + "name": "@olanetsoft", + "link": "https://twitter.com/olanetsoft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Atom Aurelia snippets", + "repoUrl": "https://github.com/unicodeveloper/atom-aurelia-snippets", + "description": "A plugin for Atom Editor to autocomplete aurelia snippets when working with Aurelia.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Atom Material Palenight Syntax", + "repoUrl": "https://github.com/whizkydee/atom-material-palenight-syntax", + "description": "🍹🍩 An elegant and juicy material-like theme for Atom.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "BàngáJS", + "repoUrl": "https://github.com/bangajs/banga-cli", + "description": "A CLI generator for bootstrapping ExpressJS applications and generating application layer files.", + "authors": [ + { + "name": "@saucecodee", + "link": "https://twitter.com/saucecodee" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Blackmaria", + "repoUrl": "https://github.com/Smyja/blackmaria", + "description": "A Python package for webscraping in Natural language.", + "authors": [ + { + "name": "@ogbonigwe1", + "link": "https://twitter.com/ogbonigwe1" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Blink Alert", + "repoUrl": "https://github.com/obayomi96/blinkalert", + "description": "A Chrome Extension for 20-20-20 exercise of the eye.", + "authors": [ + { + "name": "@martinsobayomi", + "link": "https://twitter.com/martinsobayomi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Bloc Node", + "repoUrl": "https://github.com/D-Lite/bloc-node", + "description": "The first Bloc API wrapper 🚀🚀🚀 The Bloc-Node library provides convenient access to the Bloc API.", + "authors": [ + { + "name": "@danielolabemiwo", + "link": "https://twitter.com/danielolabemiwo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Bob", + "repoUrl": "https://github.com/stephenafamo/bob", + "description": "SQL Query Builder for Go that can be progressively adopted from raw SQL query strings, to fully typed queries and models generated for your database.", + "authors": [ + { + "name": "@stephenafamo", + "link": "https://twitter.com/stephenafamo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Breadcrumb For Codeigniter", + "repoUrl": "https://github.com/iamuchejude/Breadcrumb-for-Codeigniter", + "description": "A Lightweight Library for generating Breadcrumb in Codeigniter.", + "authors": [ + { + "name": "@iamuchejude", + "link": "https://twitter.com/iamuchejude" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Broad-state", + "repoUrl": "https://github.com/adenekan41/broadstate", + "description": "Easy state manager for state values from one component to the other with useState and React Hooks in < 1KB!", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Browsengine", + "repoUrl": "https://github.com/isocroft/browsengine", + "description": "Rendering Engine Detection Script for Browsers on Any Device.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Busser", + "repoUrl": "https://github.com/codesplinta/busser", + "description": "A robust, opinionated, state management option for scalable and precise communication across ReactJS Components.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Button4Android", + "repoUrl": "https://github.com/tdscientist/button4Android", + "description": "Android button selector generator.", + "authors": [ + { + "name": "@tdscientist", + "link": "https://twitter.com/tdscientist" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Buzz", + "repoUrl": "https://github.com/chidiwilliams/buzz", + "description": "Buzz transcribes audio from your computer's microphones to text using OpenAI's Whisper.", + "authors": [ + { + "name": "@chidiwilliams_", + "link": "https://twitter.com/@chidiwilliams_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "C# Permutation", + "repoUrl": "https://github.com/Oziomajnr/C--Permutation", + "description": "A library for permutating C# objects.", + "authors": [ + { + "name": "@oziomajnr", + "link": "https://twitter.com/Oziomajnr" + }, + { + "name": "@mykeels", + "link": "https://twitter.com/mykeels" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "caddy-docker", + "repoUrl": "https://github.com/abiosoft/caddy-docker", + "description": "Docker image for Caddy web server.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "caddy-git", + "repoUrl": "https://github.com/abiosoft/caddy-git", + "description": "Git plugin for Caddy web server.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Caniuse-embed", + "repoUrl": "https://github.com/ireade/caniuse-embed", + "description": "The (unofficial) embed for caniuse.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Cartie", + "repoUrl": "https://github.com/LPMatrix/cartie", + "description": "A clean shopping cart implementation for Laravel.", + "authors": [ + { + "name": "@LPMatrix", + "link": "https://twitter.com/WeirdMatrix" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "chakra-ui", + "repoUrl": "https://github.com/chakra-ui/chakra-ui", + "description": "Simple, modular and accessible component library for React applications.", + "authors": [ + { + "name": "@thesegunadebayo", + "link": "https://twitter.com/thesegunadebayo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "chocotea", + "repoUrl": "https://github.com/cleopatra27/chocotea", + "description": "A library that generates postman collection an integration tests from java code.", + "authors": [ + { + "name": "@succedor23", + "link": "https://twitter.com/succedor23" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ci-toastr", + "repoUrl": "https://github.com/joshuachinemezu/ci-toastr", + "description": "Codeigniter package for integrating javascript toastr into your web applications.", + "authors": [ + { + "name": "@joshuachinemezu", + "link": "https://twitter.com/joshuachinemezu" + } + ], + "manualStatus": "deprecated", + "computed": { + "status": "deprecated", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ClassroomIO", + "repoUrl": "https://github.com/rotimi-best/classroomio", + "description": "Meet a better collaboration tool for teachers and students. ClassroomIO is a no-code tool that allows you build and scale your own teaching platform with ease.", + "authors": [ + { + "name": "@rotimi-best", + "link": "https://twitter.com/rotimi-best" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Client_manager", + "repoUrl": "https://github.com/timigod/client_manager", + "description": "API Client Manager is a mountable Rails (engine) gem that helps identify and authenticate your API clients' requests.", + "authors": [ + { + "name": "@timigod", + "link": "https://twitter.com/timigod" + } + ], + "manualStatus": "deprecated", + "computed": { + "status": "deprecated", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "CodeOps Studio", + "repoUrl": "https://github.com/euptron/CodeOps-Studio", + "description": "A mobile-based integrated development environment (IDE) and Code Editor for Android devices.", + "authors": [ + { + "name": "@euptron", + "link": "https://x.com/euptron" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Cogent PHP", + "repoUrl": "https://github.com/wilforlan/CogentPHP", + "description": "A Simple PHP MVC Framework for Fast and Minimal Applications.", + "authors": [ + { + "name": "@wilforlan", + "link": "https://twitter.com/wilforlan" + } + ], + "manualStatus": "deprecated", + "computed": { + "status": "deprecated", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "colima", + "repoUrl": "https://github.com/abiosoft/colima", + "description": "Container runtimes on macOS (and Linux) with minimal setup.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Composer-git-hook", + "repoUrl": "https://github.com/BrainMaestro/composer-git-hooks", + "description": "Easily manage git hooks in your composer config.", + "authors": [ + { + "name": "@BrainMaestro", + "link": "https://twitter.com/BrainMaestro" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "CountryPickerView", + "repoUrl": "https://github.com/kizitonwose/CountryPickerView", + "description": "A simple, customizable view for efficiently collecting country information in iOS apps.", + "authors": [ + { + "name": "@kizitonwose", + "link": "https://github.com/kizitonwose/CountryPickerView" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "csv49", + "repoUrl": "https://github.com/stigwue/csv49", + "description": "Comma Separated Values For Nigeria.", + "authors": [ + { + "name": "@stigwue", + "link": "https://github.com/stigwue" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "danfojs", + "repoUrl": "https://github.com/javascriptdata/danfojs", + "description": "Danfo.js is an open source, JavaScript library providing high performance, intuitive, and easy to use data structures for manipulating and processing structured data.", + "authors": [ + { + "name": "@risingodegua", + "link": "https://twitter.com/risingodegua" + }, + { + "name": "@steveoni", + "link": "https://twitter.com/steveoni" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Datasist", + "repoUrl": "https://github.com/risenW/datasist", + "description": "Python library for easy data analysis, visualization, exploration and modeling.", + "authors": [ + { + "name": "@risingodegua", + "link": "https://twitter.com/risingodegua" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "DevDb", + "repoUrl": "https://github.com/damms005/devdb-vscode", + "description": "A zero-config VS Code extension that auto-loads your database and displays the data right inside VS Code.", + "authors": [ + { + "name": "@_damms005", + "link": "https://twitter.com/_damms005" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "DevOps-Toolkit", + "repoUrl": "https://github.com/umegbewe/devops-toolkit", + "description": "Easily and quickly setup your Cloud & DevOps development environment.", + "authors": [ + { + "name": "@0xGreat", + "link": "https://twitter.com/0xGreat" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Display Medium Posts", + "repoUrl": "https://github.com/acekyd/display-medium-posts", + "description": "Display Medium Posts is a WordPress plugin that allows users display posts from medium.com on any part of their website. Available on the WordPress store.", + "authors": [ + { + "name": "@acekyd", + "link": "https://twitter.com/ace_kyd" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Dockward", + "repoUrl": "https://github.com/abiosoft/dockward", + "description": "Port forwarding tool for Docker containers.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Dot Music Player", + "repoUrl": "https://github.com/r4sh33d/musicslam", + "description": "🎧 A light, feature-packed and very customisable material designed Android music player.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "DownloadThisVideo", + "repoUrl": "https://github.com/shalvah/DownloadThisVideo", + "description": "Twitter bot for easily downloading videos/GIFs off tweets.", + "authors": [ + { + "name": "@theshalvah", + "link": "https://twitter.com/theshalvah" + } + ], + "manualStatus": "archived", + "computed": { + "status": "archived", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Dropd", + "repoUrl": "https://github.com/whizkydee/dropd", + "description": "Zero-dependency minimalistic dropdown component for React and Vue.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "dumb_password_rails", + "repoUrl": "https://github.com/arinzeokeke/dumb_password_rails", + "description": "Rails Password Validator. Validate your user passwords and prevent them from using vulnerable passwords.", + "authors": [ + { + "name": "@arinzeokeke", + "link": "https://www.github.com/arinzeokeke" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "DuplicateContactsRemover", + "repoUrl": "https://github.com/r4sh33d/DuplicateContactsRemover", + "description": "📒A simple app to optimize your address book and remove duplicate contacts.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Early Access", + "repoUrl": "https://github.com/neoighodaro/laravel-early-access", + "description": "This package makes it easy to add early access mode to your existing application.", + "authors": [ + { + "name": "@neoighodaro", + "link": "https://twitter.com/neoighodaro" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "esgit — easy-git", + "repoUrl": "https://github.com/dillionmegida/esgit", + "description": "CLI package with simplified aliases for git commands.", + "authors": [ + { + "name": "Dillion Megida", + "link": "https://twitter.com/iamdillion" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Essential Kit", + "repoUrl": "https://github.com/ichtrojan/essential-kit", + "description": "A Boilerplate for NodeJS with all the essential tools.", + "authors": [ + { + "name": "@ichtrojan", + "link": "https://twitter.com/ichtrojan" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "eth-vue", + "repoUrl": "https://github.com/DOkwufulueze/eth-vue", + "description": "A Vue.js boilerplate for Ethereum Apps, built on Truffle. Authentication functionalities included.", + "authors": [ + { + "name": "@DOkwufulueze", + "link": "https://twitter.com/DOkwufulueze" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "expo-push-notification-helper", + "repoUrl": "https://github.com/just1and0/expo-push-notification-helper", + "description": "This library makes it easy to use push notification in react native using expo.", + "authors": [ + { + "name": "@just1and0", + "link": "https://twitter.com/just1and0" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ExpressWebJs", + "repoUrl": "https://github.com/Alexigbokwe/ExpressWebJs", + "description": "ExpressWebJs is a NodeJS FrameWork with expressive and organised syntax that runs on all major operating systems. It provides the starting point for creating your node project, allowing you to focus more on developing your amazing solution.", + "authors": [ + { + "name": "@EmekaIgbokwe", + "link": "https://twitter.com/emekaigbokwe" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Face-detector", + "repoUrl": "https://github.com/moyheen/face-detector", + "description": "An application containing all the code from the article on the FaceDetector API.", + "authors": [ + { + "name": "@moyheen", + "link": "https://twitter.com/moyheen" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Faker.ng", + "repoUrl": "https://github.com/binkabir/faker.ng", + "description": "a library for generating Nigerian fake data such as names, addresses, and phone numbers.", + "authors": [ + { + "name": "@binkabir", + "link": "https://github.com/binkabir" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Fastapi-mongo", + "repoUrl": "https://github.com/Youngestdev/fastapi-mongo", + "description": "Template for building FastAPI applications with MongoDB.", + "authors": [ + { + "name": "@kvng_zeez", + "link": "http://twitter.com/kvng_zeez" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Favico-generator", + "repoUrl": "https://github.com/Youngestdev/favico-generator", + "description": "A npm module for generating favicons from image.", + "authors": [ + { + "name": "@kvng_zeez", + "link": "http://twitter.com/kvng_zeez" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Fawn", + "repoUrl": "https://github.com/e-oj/Fawn", + "description": "A library for multi-document transactions in MongoDB via two-phase commits.", + "authors": [ + { + "name": "@e-oj", + "link": "https://e-oj.com" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "flair", + "repoUrl": "https://github.com/mezielabs/flair", + "description": "AdonisJS 5 authentication scaffolding.", + "authors": [ + { + "name": "@ammezie", + "link": "https://twitter.com/ammezie" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "flargd", + "repoUrl": "https://github.com/pmbanugo/flargd", + "description": "A fast & minimalist feature flag app that runs on Clouflare Workers.", + "authors": [ + { + "name": "@p_mbanugo", + "link": "https://twitter.com/p_mbanugo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "folabelle", + "repoUrl": "https://github.com/BolajiOlajide/folabelle", + "description": "A VSCode theme - Cross breed of Monokai + Palenight", + "authors": [ + { + "name": "@Bolaji___", + "link": "https://twitter.com/Bolaji___" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "FormHack", + "repoUrl": "https://github.com/ireade/formhack", + "description": "A hackable css form reset.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Frontend-app-starter", + "repoUrl": "https://github.com/D-sense/frontend-app-starter", + "description": "A simple frontend app starter packed with Webpack, Twitter Bootstrap, and well-defined CSS media queries. Edit.", + "authors": [ + { + "name": "@D-sense", + "link": "https://twitter.com/Delameh" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Gbowo", + "repoUrl": "https://github.com/adelowo/gbowo", + "description": "The easiest way to accept payments via Paystack and Amplifypay.", + "authors": [ + { + "name": "@Adelowo", + "link": "https://twitter.com/lanreadelowo" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "generator-nestjs-app", + "repoUrl": "https://github.com/ashinzekene/generator-nestjs-app", + "description": "A yeoman generator for creating nestsjs apps.", + "authors": [ + { + "name": "@ashinzekene", + "link": "https://twitter.com/ashinzekene" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "GeoIP Location", + "repoUrl": "https://github.com/victorybiz/geoip-location", + "description": "Get the geographical location of website visitors based on their IP addresses. Support Laravel and PHP (Non-Laravel) Project.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Githint Bot", + "repoUrl": "https://github.com/Chieze-Franklin/githint-bot", + "description": "A GitHub bot that ensures that your pull requests follow specified conventions.", + "authors": [ + { + "name": "@franklin_chieze", + "link": "https://twitter.com/franklin_chieze" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "GitProfile Manager", + "repoUrl": "https://github.com/MeNsaaH/git-profile-manager", + "description": "A git extension to allow you manage multiple git profiles on your workstation with ease.", + "authors": [ + { + "name": "@iamMensaah", + "link": "https://twitter.com/iamMensaah" + } + ], + "manualStatus": "archived", + "computed": { + "status": "archived", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Goignore", + "repoUrl": "https://github.com/hacktivist123/goignore", + "description": "A lightweight CLI tool for generating .gitignore file in your project.", + "authors": [ + { + "name": "@coder_blvck", + "link": "https://twitter.com/coder_blvck" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Goldmark PDF", + "repoUrl": "https://github.com/stephenafamo/goldmark-pdf", + "description": "A PDF renderer for the Go goldmark markdown parser.", + "authors": [ + { + "name": "@stephenafamo", + "link": "https://twitter.com/stephenafamo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Google Dictionary", + "repoUrl": "https://github.com/chizoba/google-dictionary", + "description": "An android library that provides easy access to meanings of any word, phrase, or slang via Google, within any application.", + "authors": [ + { + "name": "@its_tobie", + "link": "https://twitter.com/its_tobie" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Gophie", + "repoUrl": "https://github.com/Go-phie/gophie", + "description": "A CLI written in golang for scraping movie download links and bypassing ads.", + "authors": [ + { + "name": "@GophieTeam", + "link": "https://twitter.com/GophieTeam" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Gophie-web", + "repoUrl": "https://github.com/Go-phie/gophie-web", + "description": "A web client for streaming/downloading movies without hassle built on Gophie.", + "authors": [ + { + "name": "@GophieTeam", + "link": "https://twitter.com/GophieTeam" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Grabity", + "repoUrl": "https://github.com/e-oj/grabity", + "description": "Get preview data from a link.", + "authors": [ + { + "name": "@e-oj", + "link": "https://github.com/e-oj" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Gulp-Email-Workflow", + "repoUrl": "https://github.com/ireade/gulp-email-workflow", + "description": "A Gulp workflow for building HTML emails.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "H.php", + "repoUrl": "https://github.com/devHammed/H.php", + "description": "The Minimalist PHP Framework!", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ], + "manualStatus": "deleted", + "computed": { + "status": "deleted", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "HearItFresh", + "repoUrl": "https://github.com/Dun-sin/HearItFresh", + "description": "-Discover new tracks with Hear It Fresh! This user-friendly web app generates personalized Spotify playlists based on your favourite artists or a Spotify playlist link. Explore fresh music.", + "authors": [ + { + "name": "@dun-sin", + "link": "https://github.com/Dun-sin" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "helpers", + "repoUrl": "https://github.com/whizkydee/helpers", + "description": "Super-handy JavaScript utility functions for front-end development.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "HUI.js", + "repoUrl": "https://github.com/devHammed/HUI.js", + "description": "Lightweight JavaScript UI Library.", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Icicle", + "repoUrl": "https://github.com/segunfamisa/icicle", + "description": "An annotation based tool for saving and restoring instance states.", + "authors": [ + { + "name": "@segunfamisa", + "link": "https://twitter.com/segunfamisa" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "IGdm", + "repoUrl": "https://github.com/ifedapoolarewaju/igdm", + "description": "Multi-platform Desktop application for INSTAGRAM DMs.", + "authors": [ + { + "name": "@ifedapolarewaju", + "link": "https://twitter.com/ifedapolarewaju" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Ijeawele", + "repoUrl": "https://github.com/viclotana/Ijeawele", + "description": "A Browser Extension that displays a random suggestion from the Dear Ijeawele book by Chimamanda Adichie.", + "authors": [ + { + "name": "@viclotana", + "link": "https://twitter.com/viclotana" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ImageAI", + "repoUrl": "https://github.com/OlafenwaMoses/ImageAI", + "description": "A python library built to empower developers to build applications and systems with self-contained Computer Vision capabilities.", + "authors": [ + { + "name": "@OlafenwaMoses", + "link": "https://twitter.com/OlafenwaMoses" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ImageQ", + "repoUrl": "https://github.com/bisohns/imageq", + "description": "Reverse Image search engine powered by Django and Keras.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@mensaah", + "link": "https://twitter.com/_Mensaah__" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ImgR", + "repoUrl": "https://github.com/mykeels/ImgR", + "description": "ImgR.NET aims at automating the process of serving Images dynamically based on the client device.", + "authors": [ + { + "name": "@mykeels", + "link": "https://twitter.com/mykeels" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Inlinetweetjs", + "repoUrl": "https://github.com/ireade/inlinetweetjs", + "description": "InlineTweet.js allows you to easily create tweetable links out of any text on a webpage.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "inspireNuggets", + "repoUrl": "https://github.com/BolajiAyodeji/inspireNuggets", + "description": "inspireNuggets is a Chrome Browser (Web) Extension that displays random inspiring techie quotes for developers/designers.", + "authors": [ + { + "name": "@iambolajiayo", + "link": "https://twitter.com/iambolajiayo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Instaword", + "repoUrl": "https://github.com/acekyd/instaword", + "description": "InstaWord is a Chrome and Opera browser plugin that makes learning new words much easier.", + "authors": [ + { + "name": "@acekyd", + "link": "https://twitter.com/ace_kyd" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "IntentManip", + "repoUrl": "https://github.com/KingsMentor/IntentManip", + "description": "Gives more control over implicit intents creation and the way it is presented to users.", + "authors": [ + { + "name": "@Kingsmentor", + "link": "https://twitter.com/kingsmentor" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ip-num", + "repoUrl": "https://github.com/ip-num/ip-num", + "description": "ip-num is a TypeScript library for working with IP Resources(ASN, IPV4, IPV6).", + "authors": [ + { + "name": "@dadepo", + "link": "https://twitter.com/dadepo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "iShell", + "repoUrl": "https://github.com/abiosoft/ishell", + "description": "Library for creating interactive CLI applications with Go.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Jollof", + "repoUrl": "https://github.com/isocroft/Jollof", + "description": "A lightweight PHP framework for developers who love smart work.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "JSON Preview", + "repoUrl": "https://github.com/ugwustanley/json-preview", + "description": "A tool that allows you to convert your JSON file into visual interactive diagrams.", + "authors": [ + { + "name": "@chiagozie_ugwu", + "link": "https://twitter.com/chiagozie_ugwu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Jusibe JavaScript Library", + "repoUrl": "https://github.com/azemoh/jusibe", + "description": "A JavaScript library for", + "authors": [ + { + "name": "@azemoh", + "link": "https://twitter.com/josh_azemoh" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Jusibe PHP Library", + "repoUrl": "https://github.com/unicodeveloper/jusibe-php-lib", + "description": "A library for", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Kanary", + "repoUrl": "https://github.com/SeunAdelekan/Kanary", + "description": "A minimalist🔬 Kotlin web framework for building🔩⚙ scalable📈 and expressive🎨 RESTful APIs.", + "authors": [ + { + "name": "@IyanuAdelekan", + "link": "https://twitter.com/IyanuAdelekan" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Keygen", + "repoUrl": "https://github.com/gladchinda/keygen-php", + "description": "A fluent PHP random key generator.", + "authors": [ + { + "name": "@gladchinda", + "link": "https://twitter.com/gladchinda" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "KhaledBot", + "repoUrl": "https://github.com/ireade/khaledbot", + "description": "Delivering Major Keys to your Slack Team.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "koii", + "repoUrl": "https://github.com/BolajiOlajide/koii", + "description": "A simple middleware to display routes in an express application.", + "authors": [ + { + "name": "@Bolaji___", + "link": "https://twitter.com/Bolaji___" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "LaraCaptcha", + "repoUrl": "https://github.com/hendurhance/laracaptcha", + "description": "A Laravel package to seamlessly use hCapthca or reCaptcha v2 or v3 on your forms or RESTful APIs.", + "authors": [ + { + "name": "@hendurhance", + "link": "https://twitter.com/hendurhance" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Codepen", + "repoUrl": "https://github.com/unicodeveloper/laravel-codepen", + "description": "A Codepen Package for Laravel 5.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Crypto Payment Gateway", + "repoUrl": "https://github.com/victorybiz/laravel-crypto-payment-gateway", + "description": "GoUrl.io Crypto Payment Gateway for Laravel.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Email Validator", + "repoUrl": "https://github.com/unicodeveloper/laravel-email-validator", + "description": "Validate email addresses on the fly in Laravel 5.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Emoji", + "repoUrl": "https://github.com/unicodeveloper/laravel-emoji", + "description": "Laravel 5 Package that harnesses the power of PHP 7 Unicode features to provide emojis in your laravel app.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Exam", + "repoUrl": "https://github.com/unicodeveloper/laravel-exam", + "description": "A Laravel exam with questions from beginner to expert curated.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Feeder", + "repoUrl": "https://github.com/unicodeveloper/laravel-feeder", + "description": "Laravel 5 Package to extract atom and RSS feeds from any website in a very good readable format.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Hackathon Starter", + "repoUrl": "https://github.com/unicodeveloper/laravel-hackathon-starter", + "description": "A hackathon/MVP boilerplate for laravel web applications. Start your hackathons without hassle.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Identify", + "repoUrl": "https://github.com/unicodeveloper/laravel-identify", + "description": "Laravel 5 Package to Detect Users' Browsers, Devices, Languages and Operating Systems.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Jusibe", + "repoUrl": "https://github.com/unicodeveloper/laravel-jusibe", + "description": "Laravel 5 package for Jusibe SMS Service.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Mentions", + "repoUrl": "https://github.com/unicodeveloper/laravel-mentions", + "description": "Laravel 5 Package for enabling facebook type of mentions in your application.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Password", + "repoUrl": "https://github.com/unicodeveloper/laravel-password", + "description": "Guard your users against entering dumb passwords in your Laravel 5 apps.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Payant", + "repoUrl": "https://github.com/olaoluwa-98/laravel-payant", + "description": "Laravel 5 Payant Package.", + "authors": [ + { + "name": "@olaoluwa_98", + "link": "https://twitter.com/olaoluwa_98" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Paystack", + "repoUrl": "https://github.com/unicodeveloper/laravel-paystack", + "description": "Laravel 5 Paystack Package.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Simple Select", + "repoUrl": "https://github.com/victorybiz/laravel-simple-select", + "description": "Laravel Simple Select inputs component for Blade and Livewire.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel SMTP Validator", + "repoUrl": "https://github.com/samolabams/smtp-validator", + "description": "Validate SMTP credentials without sending a test mail in Laravel 5.", + "authors": [ + { + "name": "@samolabams", + "link": "https://twitter.com/samolabams" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Telephone Input", + "repoUrl": "https://github.com/victorybiz/laravel-tel-input", + "description": "Laravel Telephone Input component for Blade and Livewire based on the intl-tel-input JavaScript plugin.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel Wikipedia", + "repoUrl": "https://github.com/unicodeveloper/laravel-wikipedia", + "description": "A Wikipedia Package for Laravel 5.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel-PDF-Viewer", + "repoUrl": "https://github.com/goodnesskay/LARAVEL-PDF-VIEWER", + "description": "A Laravel Package for viewing PDF files or documents on the web without leaving your Web Application.", + "authors": [ + { + "name": "@goodnesskay", + "link": "https://twitter.com/goodnesskayode" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel-Slack", + "repoUrl": "https://github.com/goodnesskay/laravel-slack", + "description": "A Laravel Package that makes Automatic Invitation to Slack Channels or team seamless.", + "authors": [ + { + "name": "@goodnesskay", + "link": "https://twitter.com/goodnesskayode" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel-SMS", + "repoUrl": "https://github.com/djunehor/laravel-sms", + "description": "Laravel SMS allows you to send SMS from your Laravel application using one of over 10 SMS providers, or your custom SMS provider.", + "authors": [ + { + "name": "@djunehor", + "link": "https://twitter.com/djunehor" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Laravel-Spam-Email", + "repoUrl": "https://github.com/hendurhance/laravel-spam-email", + "description": "This package is a Laravel package that checks if an email address is a spammer. It verifies your signups and forms submissions to confirm that they are legitimate.", + "authors": [ + { + "name": "@hendurhance", + "link": "https://twitter.com/hendurhance" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Lib-ussd", + "repoUrl": "https://github.com/hextremelabs/lib-ussd", + "description": "A lightweight USSD application framework.", + "authors": [ + { + "name": "@hextremelabs", + "link": "https://twitter.com/hextremelabs" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Linda ORM", + "repoUrl": "https://github.com/solutionstack/Linda", + "description": "A lightweight and fast Active-record based ORM for PHP.", + "authors": [ + { + "name": "@solutionstack", + "link": "https://github.com/solutionstack" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Lindaikeji CLI", + "repoUrl": "https://github.com/unicodeveloper/lindaikeji-cli", + "description": "Linda Ikeji for Hackers, HR Associates, HR Managers, Lazy People, e.t.c.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "LocalGoogle", + "repoUrl": "https://github.com/kodejuice/localgoogle", + "description": "A search engine built for offline websites on your local machine.", + "authors": [ + { + "name": "@KodeJuice", + "link": "https://twitter.com/kodejuice" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Magic Grid", + "repoUrl": "https://github.com/e-oj/Magic-Grid", + "description": "A simple, lightweight Javascript library for dynamic grid layouts.", + "authors": [ + { + "name": "@e-oj", + "link": "https://e-oj.com" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Markdown Badges", + "repoUrl": "https://github.com/Ileriayo/markdown-badges", + "description": "Badges for your personal developer branding, profile, and projects.", + "authors": [ + { + "name": "@ileriayooo", + "link": "https://twitter.com/ileriayooo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "MarkedIt", + "repoUrl": "https://github.com/christiannwamba/markedit", + "description": "Simple markdown editor widget.", + "authors": [ + { + "name": "@codebeast", + "link": "https://twitter.com/codebeast" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Math Alarm Clock", + "repoUrl": "https://github.com/t-regbs/MathAlarm", + "description": "Android Alarm app in which you solve math problems of varying difficulty to dismiss alarms. Built with jetpack compose.", + "authors": [ + { + "name": "@t-regbs", + "link": "https://twitter.com/timiaregbs" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "MediumUnooficialSDK", + "repoUrl": "https://github.com/KingsMentor/medium-android-sdk-unofficial", + "description": "Unofficial implementation of medium API for android. Support Medium Oauth Sign in, retrieve users' post, make publications, and other medium supported features.", + "authors": [ + { + "name": "@kingsmentor", + "link": "https://twitter.com/kingsmentor" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Meethub", + "repoUrl": "https://github.com/iyanuashiri/meethub", + "description": "A web application for organizing meetups.", + "authors": [ + { + "name": "@iyanuashiri", + "link": "https://github.com/iyanuashiri" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Mini-Inventory-and-Sales-Management-System", + "repoUrl": "https://github.com/amirsanni/Mini-Inventory-and-Sales-Management-System", + "description": "An Inventory and Sales Management System written in PHP (codeIgniter) with support for MySQL and Sqlite3 databases.", + "authors": [ + { + "name": "@amirsanni", + "link": "https://twitter.com/amirsanni" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "MLog", + "repoUrl": "https://github.com/mykeels/MLog", + "description": "MLog is the simplest .NET library for data logging.", + "authors": [ + { + "name": "@mykeels", + "link": "https://twitter.com/mykeels" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "MobileVisionBarcodeScanner", + "repoUrl": "https://github.com/KingsMentor/MobileVisionBarcodeScanner", + "description": "Mobile Vission Barcode Scanner.", + "authors": [ + { + "name": "@kingsmentor", + "link": "https://twitter.com/kingsment" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Modern-Mean-Stack", + "repoUrl": "https://github.com/Mozartted/Modern-Mean-Stack", + "description": "Functional stack of angular2, MongoDB, express all on nodejs, coupled with webpack and angular cli features.", + "authors": [ + { + "name": "@mozartted", + "link": "https://github.com/Mozartted" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Money-To-Words-Converter", + "repoUrl": "https://github.com/TNkemdilim/Money-To-Words-Converter", + "description": "A PHP library that converts any money value in digit [in any numeric system] to words in any language.", + "authors": [ + { + "name": "@TNkemdilim", + "link": "https://twitter.com/tnkemdilim" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "moneywave-nodejs", + "repoUrl": "https://github.com/CodebyOmar/moneywave-nodejs", + "description": "A client library for moneywave API.", + "authors": [ + { + "name": "@codebyomar", + "link": "https://twitter.com/codebyomar" + } + ], + "manualStatus": "archived", + "computed": { + "status": "archived", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Mui-data-table", + "repoUrl": "https://github.com/andela-cdaniel/mui-data-table", + "description": "Data table for react material-ui.", + "authors": [ + { + "name": "@AustinSwaggz", + "link": "https://twitter.com/AustinSwaggz" + } + ], + "manualStatus": "archived", + "computed": { + "status": "archived", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Multi-tenant Employee Management System", + "repoUrl": "https://github.com/Timtech4u/employee-manager", + "description": "Multi-tenant Employee Management System * Job Portal with Django API & Vuejs.", + "authors": [ + { + "name": "@timtech4u", + "link": "https://twitter.com/timtech4u" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Mvrd", + "repoUrl": "https://github.com/unicodeveloper/mvrd", + "description": "Motor Vehicle Registration Information Search Portal Library.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Mythra", + "repoUrl": "https://github.com/Go-phie/mythra", + "description": "Music search engine API and CLI downloader written in Rust.", + "authors": [ + { + "name": "@deven96", + "link": "https://twitter.com/_deven96" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Naija Phone Number", + "repoUrl": "https://github.com/Udokah/naija-phone-number", + "description": "A fast minimal module to validate Nigerian mobile phone numbers using Regular Expressions.", + "authors": [ + { + "name": "@thisisudo", + "link": "https://twitter.com/thisisudo" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Naija State And Local Government", + "repoUrl": "https://github.com/atomicman57/naija-state-local-government", + "description": "A simple zero dependency npm package that lists Nigeria states and local governments.", + "authors": [ + { + "name": "@blessingadesina3", + "link": "https://twitter.com/blessingadesin3" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Narrative-Generator", + "repoUrl": "https://github.com/thebolarin/narrative-generator", + "description": "An AI powered research tool that leverages OpenAI's API to extract and analyze key narratives, analyze their dominance, and track narrative evolution.", + "authors": [ + { + "name": "@Moses", + "link": "https://www.linkedin.com/in/thebolarin" + }, + { + "name": "@thebolarin", + "link": "https://twitter.com/thebolarin" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "NativeDoctor", + "repoUrl": "https://github.com/rubbieKelvin/nativedoctor", + "description": "A configurable API testing tool built in Rust, designed for easy YAML definition and seamless integration into CI/CD pipelines.", + "authors": [ + { + "name": "@rubbiekelvin", + "link": "https://rubbietheone.com" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Netty-Finder", + "repoUrl": "https://github.com/BolajiAyodeji/netty-finder", + "description": "This script checks a Nigerian Telephone number and detects which network it belongs to.", + "authors": [ + { + "name": "@iambolajiayo", + "link": "https://twitter.com/iambolajiayo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Newspaperjs", + "repoUrl": "https://github.com/flickz/newspaperjs", + "description": "Nodejs: News extraction, scraping and article \nparsing module.", + "authors": [ + { + "name": "@flickzcode", + "link": "https://twitter.com/flickzcode" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Nexios", + "repoUrl": "https://github.com/nexios-labs/Nexios", + "description": "A high-performance async Python web framework for building modern applications with simplicity and speed on per with fastapi.", + "authors": [ + { + "name": "@mrdunamix", + "link": "https://x.com/mrdunamix" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Ngyn.rs", + "repoUrl": "https://github.com/ngyn-rs/ngyn", + "description": "An opinionated rust framework for building scalable web servers.", + "authors": [ + { + "name": "@iamelcharitas", + "link": "https://twitter.com/iamelcharitas" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Nigerian states api", + "repoUrl": "https://github.com/seyi-adeleke/Nigerian-states-api", + "description": "An api for basic information about all 36 states in Nigeria.", + "authors": [ + { + "name": "@seyi__adeleke", + "link": "https://twitter.com/seyi__adeleke" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Nimble", + "repoUrl": "https://github.com/neoighodaro/nimble", + "description": "Fast PHP framework made with very loose optional components.", + "authors": [ + { + "name": "@neoighodaro", + "link": "https://twitter.com/neoighodaro" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "No-CAPTCHA-reCAPTCHA", + "repoUrl": "https://github.com/collizo4sky/No-CAPTCHA-reCAPTCHA", + "description": "Protect WordPress login, registration and comment form from spam with the new No CAPTCHA reCAPTCHA.", + "authors": [ + { + "name": "@w3guy", + "link": "https://twitter.com/w3guy" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Nodestorage.js", + "repoUrl": "https://github.com/iamuchejude/nodestorage.js", + "description": "File system storage utility with", + "authors": [ + { + "name": "@iamuchejude", + "link": "https://twitter.com/iamuchejude" + } + ], + "manualStatus": "deleted", + "computed": { + "status": "deleted", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Nojs", + "repoUrl": "https://github.com/ifedapoolarewaju/nojs", + "description": "Library that helps minimize js you have to write.", + "authors": [ + { + "name": "@ifedapolarewaju", + "link": "https://twitter.com/ifedapolarewaju" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Notes", + "repoUrl": "https://github.com/rubbieKelvin/notes", + "description": "Distraction free notes app, minimal at its core. Create and share notes with ease.", + "authors": [ + { + "name": "@rubbiekelvin", + "link": "https://rubbietheone.com" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "NUBAN Validator/Generator", + "repoUrl": "https://github.com/emyu01/nuban", + "description": "Easily verify or generate valid account numbers for any Nigerian financial institution.", + "authors": [ + { + "name": "@iemyu_", + "link": "https://twitter.com/iemyu_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Omnipay 2Checkout", + "repoUrl": "https://github.com/collizo4sky/omnipay-2checkout", + "description": "2Checkout driver for the Omnipay PHP payment processing library.", + "authors": [ + { + "name": "@w3guy", + "link": "https://twitter.com/w3guy" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "OpenWriter", + "repoUrl": "https://github.com/ireade/openwriter", + "description": "A free theme for Ghost.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Orchestra", + "repoUrl": "https://github.com/stephenafamo/orchestra", + "description": "Orchestra is a library to manage long running go processes.", + "authors": [ + { + "name": "@stephenafamo", + "link": "https://twitter.com/stephenafamo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Outray", + "repoUrl": "https://github.com/outray-tunnel/outray", + "description": "OutRay is an open-source ngrok alternative that makes it easy to expose your local development server to the internet via secure tunnels.", + "authors": [ + { + "name": "@akinkunmi", + "link": "https://x.com/akinkunmi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "P-integrate", + "repoUrl": "https://github.com/TaslimOseni/p-integrate", + "description": "This is a demo app that guides Android developers on how to integrate any of several popular payment platforms into their apps.", + "authors": [ + { + "name": "@taslimOseni", + "link": "https://twitter.com/taslimOseni" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "PackageHub", + "repoUrl": "https://github.com/BrainMaestro/packagehub", + "description": "An extension for displaying dependencies for many package managers on GitHub.", + "authors": [ + { + "name": "@BrainMaestro", + "link": "https://twitter.com/BrainMaestro" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "PageCarton", + "repoUrl": "https://github.com/pagecarton/pagecarton", + "description": "PageCarton - a fully functional software suite and framework + CMS tool for anyone to build a secure web site and app easily.", + "authors": [ + { + "name": "@AyoolaFalola", + "link": "https://twitter.com/AyoolaFalola" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Paystack Ruby", + "repoUrl": "https://github.com/IkoroVictor/paystack-ruby", + "description": "Ruby Gem for Paystack.", + "authors": [ + { + "name": "@IkoroVictor", + "link": "https://twitter.com/IkoroVictor" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Paystack wrapper", + "repoUrl": "https://github.com/kehers/paystack", + "description": "Nodejs API wrapper for Paystack.", + "authors": [ + { + "name": "@kehers", + "link": "https://twitter.com/kehers" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Pentecost", + "repoUrl": "https://github.com/knightbenax/Pentecost", + "description": "Payment Android UI Library for PayStack.", + "authors": [ + { + "name": "@knightbenax", + "link": "https://twitter.com/knightbenax" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Piggment", + "repoUrl": "https://github.com/adenekan41/piggment", + "description": "A curated collection of amazingly colored gradients for designers, developers and art makers over the world.", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Plugman", + "repoUrl": "https://github.com/ayotycoon/plugman", + "description": "A Postman like socket testing application.", + "authors": [ + { + "name": "@ayotycoon", + "link": "https://twitter.com/ayotycoon" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Product-Tour", + "repoUrl": "https://github.com/Robophil/Product-Tour", + "description": "A responsive tour snippet, with a step-by-step guide(onboarding).", + "authors": [ + { + "name": "@robophil_", + "link": "https://twitter.com/robophil_" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "PyDialogflow Fulfillment", + "repoUrl": "https://github.com/Emmarex/dialogflow-fulfillment-python", + "description": "This library makes creating fulfillment for Dialogflow v2 agents easily with Python Backend. (", + "authors": [ + { + "name": "@emmarex", + "link": "https://twitter.com/_emmarex_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "PyFCM", + "repoUrl": "https://github.com/olucurious/PyFCM", + "description": "Python client for FCM - Firebase Cloud Messaging (Android & iOS).", + "authors": [ + { + "name": "@olucurious", + "link": "https://twitter.com/olucurious" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Pymvrd", + "repoUrl": "https://github.com/othreecodes/pymvrd", + "description": "Motor Vehicle Registration Information Search Portal Library for python.", + "authors": [ + { + "name": "@othreecodes", + "link": "https://twitter.com/othreecodes" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Python WhatsApp bot", + "repoUrl": "https://github.com/Radi-dev/python-whatsapp-bot", + "description": "A Whatsapp Business Cloud API client Library for python.", + "authors": [ + { + "name": "@Radi-dev", + "link": "https://twitter.com/Radi_dev" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Quicksi CLI", + "repoUrl": "https://github.com/AnayoOleru/quicksi", + "description": "A command-line bot tool that contains reuseable templates in different languages, frameworks and libraries designed to make it easy for developers to start projects without having to worry about the setup.", + "authors": [ + { + "name": "@AnayoOleru", + "link": "https://twitter.com/AnayoOleru" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "R3con1z3r", + "repoUrl": "https://github.com/abdulgaphy/r3con1z3r", + "description": "A lightweight Web information gathering tool with an intuitive features written in python. it provides a powerful environment in which open source intelligence (OSINT) web-based footprinting can be conducted quickly and thoroughly.", + "authors": [ + { + "name": "@mrgaphy", + "link": "https://twitter.com/mrgaphy" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Radixx", + "repoUrl": "https://github.com/isocroft/Radixx", + "description": "a simple library that implements the Facebook Flux Architecture with a twist to how the entire application state is managed and changed/updated.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Random48LawsOfPower", + "repoUrl": "https://github.com/acekyd/Random48LawsOfPower", + "description": "Chrome extension that shows a random law from the popular '48 Laws of Power' Book.", + "authors": [ + { + "name": "@acekyd", + "link": "https://twitter.com/Ace_KYD" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Ratio", + "repoUrl": "https://github.com/theratioproject/simple", + "description": "The Simple Intelligent and Modular Programming Language and Environment.", + "authors": [ + { + "name": "@iamthecarisma", + "link": "https://www.twitter.com/iamthecarisma" + } + ], + "manualStatus": "archived", + "computed": { + "status": "archived", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Rationale", + "repoUrl": "https://github.com/KingsMentor/Rationale", + "description": "Android permission rationale helper dialog.", + "authors": [ + { + "name": "@Kingsmentor", + "link": "https://twitter.com/kingsmentor" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "React Native okra webview", + "repoUrl": "https://github.com/just1and0/React-Native-Okra-Webview", + "description": "React Native okra sdk.", + "authors": [ + { + "name": "@just1and0", + "link": "https://twitter.com/just1and0" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "React Native paystack webview", + "repoUrl": "https://github.com/just1and0/React-Native-Paystack-WebView", + "description": "React Native paystack sdk.", + "authors": [ + { + "name": "@just1and0", + "link": "https://twitter.com/just1and0" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "react-autocomplete-hint", + "repoUrl": "https://github.com/ejmudi/react-autocomplete-hint", + "description": "A React component for Autocomplete Hint.", + "authors": [ + { + "name": "@ejmudi", + "link": "https://twitter.com/ejmudi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "react-hooks-paginator", + "repoUrl": "https://github.com/codenaz/react-paginator", + "description": "A simple paginator interface for react.", + "authors": [ + { + "name": "@codenaz", + "link": "https://twitter.com/codenaz" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "react-multi-state", + "repoUrl": "https://github.com/whizkydee/react-multi-state", + "description": "Declarative, simplified way to handle complex local state with hooks.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "react-native-woocommerce-api", + "repoUrl": "https://github.com/JamesUgbanu/react-native-woocommerce-api", + "description": "A wrappper that connects react Native to the WooCommerce API.", + "authors": [ + { + "name": "james ugbanu", + "link": "https://linkedin.com/in/james-ugbanu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "React-Raise", + "repoUrl": "https://github.com/andela-iamao/react-raise", + "description": "A cli kit for creating react applications.", + "authors": [ + { + "name": "@ash__amao", + "link": "https://twitter.com/ash__amao" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "react-webpack-starter", + "repoUrl": "https://github.com/temilaj/react-webpack-starter", + "description": "A boiler plate for creating react applications bundled by webpack (using ES6, Babel, SASS and the webpack development server).", + "authors": [ + { + "name": "@temilaj", + "link": "https://twitter.com/temilaj" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "reka", + "repoUrl": "https://github.com/MeNsaaH/reka", + "description": "A Cloud Resource management Tool to destroy, stop, resume, or clean up unsed resources.", + "authors": [ + { + "name": "@iamMensaah", + "link": "https://twitter.com/iamMensaah" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "RemindMeOfThisTweet", + "repoUrl": "https://github.com/shalvah/RemindMeOfThisTweet", + "description": "Twitter bot to set reminders for tweets.", + "authors": [ + { + "name": "@theshalvah", + "link": "https://twitter.com/theshalvah" + } + ], + "manualStatus": "archived", + "computed": { + "status": "archived", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Reuq", + "repoUrl": "https://github.com/ifedapoolarewaju/reuq", + "description": "Frontend Javascript framework.", + "authors": [ + { + "name": "@ifedapolarewaju", + "link": "https://twitter.com/ifedapolarewaju" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "River", + "repoUrl": "https://github.com/abiosoft/river", + "description": "Lightweight REST framework for Go.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "saido", + "repoUrl": "https://github.com/bisohns/saido", + "description": "A yaml driven tool for easily monitoring metrics on multiple servers", + "authors": [ + { + "name": "@bisohns", + "link": "https://twitter.com/_deven96" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "sailboat", + "repoUrl": "https://github.com/sailscastshq/sailboat", + "description": "Sailboat is a VS Code extension that enhances the Sails.js development experience by providing Visual Studio Code users with advanced features such as Commands to quickly access the Sails docs, Jump to Action, and Commands to lift Sails.", + "authors": [ + { + "name": "@Dominus_Kelvin", + "link": "https://twitter.com/Dominus_Kelvin" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "sails-hook-jsonwebtoken", + "repoUrl": "https://github.com/Robophil/sails-hook-jsonwebtoken", + "description": "A sails hook for easily working with jsonwebtoken", + "authors": [ + { + "name": "@robophil_", + "link": "https://twitter.com/robophil_" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "sails-hook-swagger-generator", + "repoUrl": "https://github.com/theo4u/sails-hook-swagger-generator", + "description": "A tool to help generate Swagger specification documentation for Sails APIs", + "authors": [ + { + "name": "@theo4me", + "link": "https://twitter.com/theo4me" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Search Engine Parser", + "repoUrl": "https://github.com/bisohns/search-engine-parser", + "description": "Lightweight package to query popular search engines and scrape for result titles, links and descriptions.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@iamMensaah", + "link": "https://twitter.com/iamMensaah" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "ShelfView", + "repoUrl": "https://github.com/tdscientist/ShelfView", + "description": "Android Library to display books on shelf", + "authors": [ + { + "name": "@tdscientist", + "link": "https://twitter.com/tdscientist" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Shutdown", + "repoUrl": "https://github.com/emmanuelkehinde/Shutdown", + "description": "A lightweight android library that handles the closing of your app interactively.", + "authors": [ + { + "name": "@emmakoko96", + "link": "https://twitter.com/emmakoko96" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Signalum", + "repoUrl": "https://github.com/bisohns/signalum", + "description": "A Linux Library to explore creating an application that detects available connections at once from WiFi and Bluetooth.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@mensaah", + "link": "https://twitter.com/_Mensaah__" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Signalum Desktop", + "repoUrl": "https://github.com/bisohns/signalum-desktop", + "description": "A Desktop application for the signalum python library.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@mensaah", + "link": "https://twitter.com/_Mensaah__" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Simple-DB", + "repoUrl": "https://github.com/shalvah/simple-db", + "description": "Get your Android app's SQLite database set up in five minutes!", + "authors": [ + { + "name": "@theshalvah", + "link": "https://twitter.com/theshalvah" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Slackword", + "repoUrl": "https://github.com/larikraun/slackword", + "description": "Dictionary in your slack....additionally, you can get random words.", + "authors": [ + { + "name": "@_larikraun", + "link": "https://twitter.com/_larikraun" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Slideview", + "repoUrl": "https://github.com/MAXDeliveryNG/slideview", + "description": "An awesome sliding button library for Android.", + "authors": [ + { + "name": "@kizitonwose", + "link": "https://twitter.com/kizitonwose" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "SlidingSquaresLoader", + "repoUrl": "https://github.com/biodunalfet/SlidingSquaresLoader", + "description": "A simple progress loader.", + "authors": [ + { + "name": "@biodunalfet", + "link": "https://twitter.com/biodunalfet" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "SlidingUpMenu", + "repoUrl": "https://github.com/r4sh33d/SlidingUpMenu", + "description": "🚀A very customizable Android library that allows you to present menu items (from menu resource and/or other sources) to users as a bottom sheet.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "sms-nigeria-go", + "repoUrl": "https://github.com/D-sense/sms-nigeria-go", + "description": "A Go client for sending SMS to any Nigeria phone-number with ease.", + "authors": [ + { + "name": "@D-sense", + "link": "https://twitter.com/Delameh" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "stacks", + "repoUrl": "https://github.com/nerdeveloper/stacks", + "description": "A tool for setting up your stack quickly for Local development, on-prem and Bare metal servers.", + "authors": [ + { + "name": "@nerdeveloper", + "link": "https://github.com/nerdeveloper" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Stargazer", + "repoUrl": "https://github.com/kaf-lamed-beyt/stargazer", + "description": "Get notified when someone stars or \"unstars\" your OSS project.", + "authors": [ + { + "name": "@kafLamed", + "link": "https://twitter.com/kafLamed" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "StartEase Cli", + "repoUrl": "https://github.com/JC-Coder/startease", + "description": "StartEase is a command-line interface (CLI) tool designed to make project setup a breeze. Whether you're working with your favorite technologies or exploring new ones, StartEase is your companion for quickly and effortlessly scaffolding projects.", + "authors": [ + { + "name": "@jc_coder1", + "link": "https://twitter.com/jc_coder1" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "status-modal", + "repoUrl": "https://github.com/kaf-lamed-beyt/status-modal", + "description": "A react component that you can use to render current error or success messages from a particular API endpoint.", + "authors": [ + { + "name": "@kafLamed", + "link": "https://twitter.com/kafLamed" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Stickynotes", + "repoUrl": "https://github.com/Kolaposki/Stickynotes", + "description": "A functional note taking web application with alluring user interface.", + "authors": [ + { + "name": "@Kolaposki", + "link": "https://twitter.com/KolapoOshodi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Stream2Peer", + "repoUrl": "https://github.com/tobySolutions/stream2peer", + "description": "Stream2Peer is a decentralized video stream management platform", + "authors": [ + { + "name": "@tobySolutions", + "link": "https://twitter.com/toby_solutions" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "StudyLog", + "repoUrl": "https://github.com/codehakase/studyLog", + "description": "A tiny web application for Logging streaks and events.", + "authors": [ + { + "name": "@codehakase", + "link": "https://twitter.com/codehakase" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "STX", + "repoUrl": "https://github.com/lamarrr/STX", + "description": "C++17 & C++ 20 error-handling an utility.", + "authors": [ + { + "name": "@basit_ayantunde", + "link": "https://twitter.com/basit_ayantunde" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Suet", + "repoUrl": "https://github.com/kehers/suet", + "description": "Detailed analytics and reporting for your transactional Mailgun emails.", + "authors": [ + { + "name": "@kehers", + "link": "https://twitter.com/kehers" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Suphle", + "repoUrl": "https://github.com/nmeri17/suphle", + "description": "A PHP framework for building logic heavy full stack applications to be actively maintained over time.", + "authors": [ + { + "name": "Nmeri", + "link": "https://twitter.com/mmayboy_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Support-ticket", + "repoUrl": "https://github.com/ammezie/support-ticket", + "description": "A support ticket application in Laravel.", + "authors": [ + { + "name": "@ammezie", + "link": "https://twitter.com/ammezie" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "TenseiJS", + "repoUrl": "https://github.com/tenseijs/tensei", + "description": "Content management and distribution with a touch of elegance.", + "authors": [ + { + "name": "@bahdcoder", + "link": "https://twitter.com/bahdcoder" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "testkit", + "repoUrl": "https://github.com/apitoolkit/testkit", + "description": "A DSL for testing. Starting with APIs.", + "authors": [ + { + "name": "@tonialaribe", + "link": "https://twitter.com/tonialaribe" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Time", + "repoUrl": "https://github.com/kizitonwose/Time", + "description": "Type-safe time calculations in Kotlin, powered by generics.", + "authors": [ + { + "name": "@kizitonwose", + "link": "https://github.com/kizitonwose" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "TinyPress", + "repoUrl": "https://github.com/kehers/tinypress", + "description": "Create and easily manage your blog on Github.", + "authors": [ + { + "name": "@kehers", + "link": "https://twitter.com/kehers" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Toast.js", + "repoUrl": "https://github.com/ireade/Toast.js", + "description": "A library for Toast messages.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "TransformersPHP", + "repoUrl": "https://github.com/CodeWithKyrian/transformers-php", + "description": "A toolkit for PHP developers to run state-of-the-art pretrained machine-learning models locally in PHP.", + "authors": [ + { + "name": "@CodeWithKyrian", + "link": "https://twitter.com/CodeWithKyrian" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "TweetThreader", + "repoUrl": "https://github.com/Udokah/tweet-threader", + "description": "A tool to create threads on Twitter.", + "authors": [ + { + "name": "@thisisudo", + "link": "https://twitter.com/thisisudo" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "TwittaSave", + "repoUrl": "https://github.com/emmanuelkehinde/TwittaSave-Web", + "description": "Web, Android and Chrome Extension that enables you to download videos and gifs from tweets to your device easily; built using Twitter API.", + "authors": [ + { + "name": "@emmakoko96", + "link": "https://twitter.com/emmakoko96" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "type-reverse", + "repoUrl": "https://github.com/whizkydee/type-reverse", + "description": "🦄 Lightweight reverse utility around strings, arrays, numbers and more.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Unitcss", + "repoUrl": "https://github.com/adenekan41/unitcss", + "description": "A cli tool to convert css units in your file, helps you swiftly convert units / mesurements in your file or folder.", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "URISanity", + "repoUrl": "https://github.com/codesplinta/URISanity", + "description": "sanitize uris in web and web-like applications with confidence.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Urley", + "repoUrl": "https://github.com/adenekan41/urley", + "description": "A cross-platform library with a collection of handy utilities to work with URLs.", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "use-cookie", + "repoUrl": "https://github.com/devhammed/use-cookie", + "description": "Get, Set, Update and Delete Cookie using React Hooks.", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "use-global-hook", + "repoUrl": "https://github.com/devhammed/use-global-hook", + "description": "Painless global state management for React using Hooks and Context API in 1KB!", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "UseFormBee", + "repoUrl": "https://github.com/Eazybee/useFormBee", + "description": "useFormBee is a lightweight library that helps me manage and abstract react form logic.", + "authors": [ + { + "name": "@Eazybee", + "link": "https://github.com/Eazybee" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Video-Call-App", + "repoUrl": "https://github.com/amirsanni/Video-Call-App", + "description": "A text, audio and video chat application built with webRTC and Ratchet (PHP WebSockets).", + "authors": [ + { + "name": "@amirsanni", + "link": "https://twitter.com/amirsanni" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "VSCode Material Palenight Theme", + "repoUrl": "https://github.com/whizkydee/vscode-material-palenight-theme", + "description": "🍹🎨 An elegant and juicy material-like theme for Visual Studio Code.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "VSCode NestsJs Snippets", + "repoUrl": "https://github.com/ashinzekene/vscode-nestjs-snippets", + "description": "A VScode extension for adding snippets for your", + "authors": [ + { + "name": "@ashinzekene", + "link": "https://twitter.com/ashinzekene" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "VSCode One Monokai", + "repoUrl": "https://github.com/azemoh/vscode-one-monokai", + "description": "Beautiful dark theme for Visual Studio Code Editor.", + "authors": [ + { + "name": "@azemoh", + "link": "https://twitter.com/josh_azemoh" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Vue 3 OTP Input", + "repoUrl": "https://github.com/ejirocodes/vue3-otp-input", + "description": "🐗 A fully customizable OTP input component built with Vue 3.x.", + "authors": [ + { + "name": "@ejirocodes", + "link": "https://twitter.com/ejirocodes" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Vue Simple ACL", + "repoUrl": "https://github.com/victorybiz/vue-simple-acl", + "description": "A simple unopinionated Vue plugin for managing user roles and permissions, access-control list (ACL) and role-based access control (RBAC).", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Vue Transitions CSS", + "repoUrl": "https://github.com/Edmund1645/vue-transitions-css", + "description": "A lightweight CSS library for adding transitions to Vue components.", + "authors": [ + { + "name": "@26th_edmund", + "link": "https://twitter.com/26th_edmund" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "WAFEDA", + "repoUrl": "https://github.com/adejumoridwan/WAFEDA", + "description": "Simple Web App For Exploratory Data Analysis.", + "authors": [ + { + "name": "@abuuAishaaa", + "link": "https://twitter.com/abuuAishaaa" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Waihona", + "repoUrl": "https://github.com/bisohns/waihona", + "description": "Rust crates for performing cloud storage actions across AWS, GCP and Azure.", + "authors": [ + { + "name": "@deven96", + "link": "https://twitter.com/_deven96" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "wasmo", + "repoUrl": "https://github.com/appcypher/wasmo", + "description": "A WebAssembly Compiler and Runtime.", + "authors": [ + { + "name": "@theappcypher", + "link": "https://twitter.com/theappcypher" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "WatchDog", + "repoUrl": "https://github.com/IzyPro/WatchDog", + "description": "WatchDog is a Realtime HTTP (Request & Response) and Exception logger and viewer for ASP.Net Core Web Apps and APIs.", + "authors": [ + { + "name": "@IzyPro_", + "link": "https://twitter.com/IzyPro_" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "web-crawljs", + "repoUrl": "https://github.com/kayslay/web-crawljs", + "description": "A web crawler package for Nodejs that makes it easy to crawl web pages.", + "authors": [ + { + "name": "@Kayslaycode", + "link": "https://twitter.com/Kayslaycode" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Web3terms", + "repoUrl": "https://github.com/Olanetsoft/web3terms", + "description": "A Twitter bot explaining and simplifying web3 terms to everyone.", + "authors": [ + { + "name": "@olanetsoft", + "link": "https://twitter.com/olanetsoft" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "WhatsBot", + "repoUrl": "https://github.com/Yusadolat/DicoBot", + "description": "WhatsApp DicoBot is a dictionary bot that enhances your messaging experience.", + "authors": [ + { + "name": "@yusadolat", + "link": "https://twitter.com/yusadolat" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Whatsticker", + "repoUrl": "https://github.com/deven96/whatsticker", + "description": "Automatically turn images/videos into stickers by using a caption.", + "authors": [ + { + "name": "@deven96", + "link": "https://twitter.com/_deven96" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "WordPress Persist Admin Notices Dismissal", + "repoUrl": "https://github.com/collizo4sky/persist-admin-notices-dismissal", + "description": "Simple plugin that persists dismissal of admin notices across pages in WordPress dashboard.", + "authors": [ + { + "name": "@w3guy", + "link": "https://twitter.com/w3guy" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "wtfoperamini", + "repoUrl": "https://github.com/ireade/wtfoperamini", + "description": "Development features not supported in Opera Mini, and some crowsourced workarounds for them.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "Yorlang", + "repoUrl": "https://github.com/anoniscoding/yorlang", + "description": "A programming language with Yoruba language construct.", + "authors": [ + { + "name": "@anoniscoding", + "link": "https://twitter.com/anoniscoding" + } + ], + "manualStatus": "inactive", + "computed": { + "status": "inactive", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + }, + { + "name": "zag", + "repoUrl": "https://github.com/chakra-ui/zag", + "description": "Finite state machines for building accessible design systems and UI components.", + "authors": [ + { + "name": "@thesegunadebayo", + "link": "https://twitter.com/thesegunadebayo" + } + ], + "computed": { + "status": "unknown", + "stars": null, + "lastPushed": null, + "language": null, + "checkedAt": "2026-04-12" + } + } +] diff --git a/data/projects.json b/data/projects.json new file mode 100644 index 00000000..b218a8ce --- /dev/null +++ b/data/projects.json @@ -0,0 +1,3001 @@ +[ + { + "name": "Adonis Auth Scaffold", + "repoUrl": "https://github.com/creatrixity/adonis-auth-scaffold", + "description": "Seamlessly scaffold a ready-to-use authentication system for your Adonis app with one neat command.", + "authors": [ + { + "name": "@creatrixity", + "link": "https://twitter.com/creatrixity" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Adonis Hexa", + "repoUrl": "https://github.com/creatrixity/adonis-hexa", + "description": "An opinionated software development framework for maintaining a scalable Adonis application.", + "authors": [ + { + "name": "@creatrixity", + "link": "https://twitter.com/creatrixity" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Adonis Queue", + "repoUrl": "https://github.com/stitchng/adonis-queue", + "description": "An addon/plugin package to provide driver-based job queueing services in AdonisJS 4.0+.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "Adonis Stripe", + "repoUrl": "https://github.com/mezielabs/adonis-stripe", + "description": "This package makes it seamless to work with Stripe in AdonisJS 5 applications.", + "authors": [ + { + "name": "@ammezie", + "link": "https://twitter.com/ammezie" + } + ] + }, + { + "name": "adonis-sse", + "repoUrl": "https://github.com/stitchng/adonis-sse", + "description": "An addon/plugin package to provide server-sent events functionality for AdonisJS 4.0+.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "Ahnlich", + "repoUrl": "https://github.com/deven96/ahnlich", + "description": "Suite of tools including a vector database and AI proxy for semantic search and embedding storage written in Rust.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@IamDavidOnuh", + "link": "https://twitter.com/IamDavidOnuh" + }, + { + "name": "@HASKSOAT", + "link": "https://twitter.com/haksoat" + }, + { + "name": "@Lord__Sarcastic", + "link": "https://twitter.com/Lord__Sarcastic" + } + ] + }, + { + "name": "Alix", + "repoUrl": "https://github.com/ireade/alix", + "description": "Alix, a Chrome extension for a11y.css.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Altair", + "repoUrl": "https://github.com/altair-graphql/altair", + "description": "A sleek graphQL client app for querying GraphQL servers, like Postman for graphQL. It also comes as a Chrome extension.", + "authors": [ + { + "name": "@imolorhe", + "link": "https://twitter.com/imolorhe" + } + ] + }, + { + "name": "Amazon Pay v2 Ruby SDK", + "repoUrl": "https://github.com/bytenaija/amazon-pay-sdk-ruby", + "description": "An SDk that makes it easy to integrate amazon pay checkout and instore v2 clients in your ruby/ruby on rails projects.", + "authors": [ + { + "name": "@bytenaija", + "link": "https://twitter.com/bytenaija" + } + ] + }, + { + "name": "Angular-tag", + "repoUrl": "https://github.com/theo4u/angular-tag", + "description": "Tags input directive for AngularJS.", + "authors": [ + { + "name": "@theo4me", + "link": "https://twitter.com/theo4me" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Angular2-Sails-starter-pack", + "repoUrl": "https://github.com/Mozartted/Angular2-Sails-starter-pack", + "description": "A starter pack for angular2 based projects using sails backend, integrating hot reload functionalities.", + "authors": [ + { + "name": "@mozartted", + "link": "https://twitter.com/mozartted" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Angular4-paystack", + "repoUrl": "https://github.com/ashinzekene/angular4-paystack", + "description": "This is an angular module that abstracts the complexity of making paystack payments with Angular2+.", + "authors": [ + { + "name": "@ashinzekene", + "link": "https://twitter.com/ashinzekene" + } + ] + }, + { + "name": "AnimatedCountTextView", + "repoUrl": "https://github.com/r4sh33d/AnimatedCountTextView", + "description": "A library that helps you animate change in numeric values in an Android TextView.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ], + "manualStatus": "inactive" + }, + { + "name": "AppFramer", + "repoUrl": "https://github.com/olucurious/AppFramer", + "description": "AppFramer helps to put your app screenshots in beautiful device frames with annotations by running a simple command.", + "authors": [ + { + "name": "@olucurious", + "link": "https://twitter.com/olucurious" + } + ], + "manualStatus": "inactive" + }, + { + "name": "APX", + "repoUrl": "https://github.com/othreecodes/APX", + "description": "A Javafx Library for building MVC Applications.", + "authors": [ + { + "name": "@othreecodes", + "link": "https://twitter.com/othreecodes" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Article Idea Generator", + "repoUrl": "https://github.com/Olanetsoft/article-idea-generator", + "description": "This simple tool generates article ideas and abstract drafts for your blog or website. It's a great way to get started with your content marketing strategy.", + "authors": [ + { + "name": "@olanetsoft", + "link": "https://twitter.com/olanetsoft" + } + ] + }, + { + "name": "Atom Aurelia snippets", + "repoUrl": "https://github.com/unicodeveloper/atom-aurelia-snippets", + "description": "A plugin for Atom Editor to autocomplete aurelia snippets when working with Aurelia.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Atom Material Palenight Syntax", + "repoUrl": "https://github.com/whizkydee/atom-material-palenight-syntax", + "description": "🍹🍩 An elegant and juicy material-like theme for Atom.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ], + "manualStatus": "inactive" + }, + { + "name": "BàngáJS", + "repoUrl": "https://github.com/bangajs/banga-cli", + "description": "A CLI generator for bootstrapping ExpressJS applications and generating application layer files.", + "authors": [ + { + "name": "@saucecodee", + "link": "https://twitter.com/saucecodee" + } + ] + }, + { + "name": "Blackmaria", + "repoUrl": "https://github.com/Smyja/blackmaria", + "description": "A Python package for webscraping in Natural language.", + "authors": [ + { + "name": "@ogbonigwe1", + "link": "https://twitter.com/ogbonigwe1" + } + ] + }, + { + "name": "Blink Alert", + "repoUrl": "https://github.com/obayomi96/blinkalert", + "description": "A Chrome Extension for 20-20-20 exercise of the eye.", + "authors": [ + { + "name": "@martinsobayomi", + "link": "https://twitter.com/martinsobayomi" + } + ] + }, + { + "name": "Bloc Node", + "repoUrl": "https://github.com/D-Lite/bloc-node", + "description": "The first Bloc API wrapper 🚀🚀🚀 The Bloc-Node library provides convenient access to the Bloc API.", + "authors": [ + { + "name": "@danielolabemiwo", + "link": "https://twitter.com/danielolabemiwo" + } + ] + }, + { + "name": "Bob", + "repoUrl": "https://github.com/stephenafamo/bob", + "description": "SQL Query Builder for Go that can be progressively adopted from raw SQL query strings, to fully typed queries and models generated for your database.", + "authors": [ + { + "name": "@stephenafamo", + "link": "https://twitter.com/stephenafamo" + } + ] + }, + { + "name": "Breadcrumb For Codeigniter", + "repoUrl": "https://github.com/iamuchejude/Breadcrumb-for-Codeigniter", + "description": "A Lightweight Library for generating Breadcrumb in Codeigniter.", + "authors": [ + { + "name": "@iamuchejude", + "link": "https://twitter.com/iamuchejude" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Broad-state", + "repoUrl": "https://github.com/adenekan41/broadstate", + "description": "Easy state manager for state values from one component to the other with useState and React Hooks in < 1KB!", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Browsengine", + "repoUrl": "https://github.com/isocroft/browsengine", + "description": "Rendering Engine Detection Script for Browsers on Any Device.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "Busser", + "repoUrl": "https://github.com/codesplinta/busser", + "description": "A robust, opinionated, state management option for scalable and precise communication across ReactJS Components.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "Button4Android", + "repoUrl": "https://github.com/tdscientist/button4Android", + "description": "Android button selector generator.", + "authors": [ + { + "name": "@tdscientist", + "link": "https://twitter.com/tdscientist" + } + ] + }, + { + "name": "Buzz", + "repoUrl": "https://github.com/chidiwilliams/buzz", + "description": "Buzz transcribes audio from your computer's microphones to text using OpenAI's Whisper.", + "authors": [ + { + "name": "@chidiwilliams_", + "link": "https://twitter.com/@chidiwilliams_" + } + ] + }, + { + "name": "C# Permutation", + "repoUrl": "https://github.com/Oziomajnr/C--Permutation", + "description": "A library for permutating C# objects.", + "authors": [ + { + "name": "@oziomajnr", + "link": "https://twitter.com/Oziomajnr" + }, + { + "name": "@mykeels", + "link": "https://twitter.com/mykeels" + } + ], + "manualStatus": "inactive" + }, + { + "name": "caddy-docker", + "repoUrl": "https://github.com/abiosoft/caddy-docker", + "description": "Docker image for Caddy web server.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ] + }, + { + "name": "caddy-git", + "repoUrl": "https://github.com/abiosoft/caddy-git", + "description": "Git plugin for Caddy web server.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Caniuse-embed", + "repoUrl": "https://github.com/ireade/caniuse-embed", + "description": "The (unofficial) embed for caniuse.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ] + }, + { + "name": "Cartie", + "repoUrl": "https://github.com/LPMatrix/cartie", + "description": "A clean shopping cart implementation for Laravel.", + "authors": [ + { + "name": "@LPMatrix", + "link": "https://twitter.com/WeirdMatrix" + } + ] + }, + { + "name": "chakra-ui", + "repoUrl": "https://github.com/chakra-ui/chakra-ui", + "description": "Simple, modular and accessible component library for React applications.", + "authors": [ + { + "name": "@thesegunadebayo", + "link": "https://twitter.com/thesegunadebayo" + } + ] + }, + { + "name": "chocotea", + "repoUrl": "https://github.com/cleopatra27/chocotea", + "description": "A library that generates postman collection an integration tests from java code.", + "authors": [ + { + "name": "@succedor23", + "link": "https://twitter.com/succedor23" + } + ] + }, + { + "name": "ci-toastr", + "repoUrl": "https://github.com/joshuachinemezu/ci-toastr", + "description": "Codeigniter package for integrating javascript toastr into your web applications.", + "authors": [ + { + "name": "@joshuachinemezu", + "link": "https://twitter.com/joshuachinemezu" + } + ], + "manualStatus": "deprecated" + }, + { + "name": "ClassroomIO", + "repoUrl": "https://github.com/rotimi-best/classroomio", + "description": "Meet a better collaboration tool for teachers and students. ClassroomIO is a no-code tool that allows you build and scale your own teaching platform with ease.", + "authors": [ + { + "name": "@rotimi-best", + "link": "https://twitter.com/rotimi-best" + } + ] + }, + { + "name": "Client_manager", + "repoUrl": "https://github.com/timigod/client_manager", + "description": "API Client Manager is a mountable Rails (engine) gem that helps identify and authenticate your API clients' requests.", + "authors": [ + { + "name": "@timigod", + "link": "https://twitter.com/timigod" + } + ], + "manualStatus": "deprecated" + }, + { + "name": "CodeOps Studio", + "repoUrl": "https://github.com/euptron/CodeOps-Studio", + "description": "A mobile-based integrated development environment (IDE) and Code Editor for Android devices.", + "authors": [ + { + "name": "@euptron", + "link": "https://x.com/euptron" + } + ] + }, + { + "name": "Cogent PHP", + "repoUrl": "https://github.com/wilforlan/CogentPHP", + "description": "A Simple PHP MVC Framework for Fast and Minimal Applications.", + "authors": [ + { + "name": "@wilforlan", + "link": "https://twitter.com/wilforlan" + } + ], + "manualStatus": "deprecated" + }, + { + "name": "colima", + "repoUrl": "https://github.com/abiosoft/colima", + "description": "Container runtimes on macOS (and Linux) with minimal setup.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ] + }, + { + "name": "Composer-git-hook", + "repoUrl": "https://github.com/BrainMaestro/composer-git-hooks", + "description": "Easily manage git hooks in your composer config.", + "authors": [ + { + "name": "@BrainMaestro", + "link": "https://twitter.com/BrainMaestro" + } + ] + }, + { + "name": "CountryPickerView", + "repoUrl": "https://github.com/kizitonwose/CountryPickerView", + "description": "A simple, customizable view for efficiently collecting country information in iOS apps.", + "authors": [ + { + "name": "@kizitonwose", + "link": "https://github.com/kizitonwose/CountryPickerView" + } + ] + }, + { + "name": "csv49", + "repoUrl": "https://github.com/stigwue/csv49", + "description": "Comma Separated Values For Nigeria.", + "authors": [ + { + "name": "@stigwue", + "link": "https://github.com/stigwue" + } + ] + }, + { + "name": "danfojs", + "repoUrl": "https://github.com/javascriptdata/danfojs", + "description": "Danfo.js is an open source, JavaScript library providing high performance, intuitive, and easy to use data structures for manipulating and processing structured data.", + "authors": [ + { + "name": "@risingodegua", + "link": "https://twitter.com/risingodegua" + }, + { + "name": "@steveoni", + "link": "https://twitter.com/steveoni" + } + ] + }, + { + "name": "Datasist", + "repoUrl": "https://github.com/risenW/datasist", + "description": "Python library for easy data analysis, visualization, exploration and modeling.", + "authors": [ + { + "name": "@risingodegua", + "link": "https://twitter.com/risingodegua" + } + ] + }, + { + "name": "DevDb", + "repoUrl": "https://github.com/damms005/devdb-vscode", + "description": "A zero-config VS Code extension that auto-loads your database and displays the data right inside VS Code.", + "authors": [ + { + "name": "@_damms005", + "link": "https://twitter.com/_damms005" + } + ] + }, + { + "name": "DevOps-Toolkit", + "repoUrl": "https://github.com/umegbewe/devops-toolkit", + "description": "Easily and quickly setup your Cloud & DevOps development environment.", + "authors": [ + { + "name": "@0xGreat", + "link": "https://twitter.com/0xGreat" + } + ] + }, + { + "name": "Display Medium Posts", + "repoUrl": "https://github.com/acekyd/display-medium-posts", + "description": "Display Medium Posts is a WordPress plugin that allows users display posts from medium.com on any part of their website. Available on the WordPress store.", + "authors": [ + { + "name": "@acekyd", + "link": "https://twitter.com/ace_kyd" + } + ] + }, + { + "name": "Dockward", + "repoUrl": "https://github.com/abiosoft/dockward", + "description": "Port forwarding tool for Docker containers.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Dot Music Player", + "repoUrl": "https://github.com/r4sh33d/musicslam", + "description": "🎧 A light, feature-packed and very customisable material designed Android music player.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ] + }, + { + "name": "DownloadThisVideo", + "repoUrl": "https://github.com/shalvah/DownloadThisVideo", + "description": "Twitter bot for easily downloading videos/GIFs off tweets.", + "authors": [ + { + "name": "@theshalvah", + "link": "https://twitter.com/theshalvah" + } + ], + "manualStatus": "archived" + }, + { + "name": "Dropd", + "repoUrl": "https://github.com/whizkydee/dropd", + "description": "Zero-dependency minimalistic dropdown component for React and Vue.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ] + }, + { + "name": "dumb_password_rails", + "repoUrl": "https://github.com/arinzeokeke/dumb_password_rails", + "description": "Rails Password Validator. Validate your user passwords and prevent them from using vulnerable passwords.", + "authors": [ + { + "name": "@arinzeokeke", + "link": "https://www.github.com/arinzeokeke" + } + ], + "manualStatus": "inactive" + }, + { + "name": "DuplicateContactsRemover", + "repoUrl": "https://github.com/r4sh33d/DuplicateContactsRemover", + "description": "📒A simple app to optimize your address book and remove duplicate contacts.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ] + }, + { + "name": "Early Access", + "repoUrl": "https://github.com/neoighodaro/laravel-early-access", + "description": "This package makes it easy to add early access mode to your existing application.", + "authors": [ + { + "name": "@neoighodaro", + "link": "https://twitter.com/neoighodaro" + } + ] + }, + { + "name": "esgit — easy-git", + "repoUrl": "https://github.com/dillionmegida/esgit", + "description": "CLI package with simplified aliases for git commands.", + "authors": [ + { + "name": "Dillion Megida", + "link": "https://twitter.com/iamdillion" + } + ] + }, + { + "name": "Essential Kit", + "repoUrl": "https://github.com/ichtrojan/essential-kit", + "description": "A Boilerplate for NodeJS with all the essential tools.", + "authors": [ + { + "name": "@ichtrojan", + "link": "https://twitter.com/ichtrojan" + } + ], + "manualStatus": "inactive" + }, + { + "name": "eth-vue", + "repoUrl": "https://github.com/DOkwufulueze/eth-vue", + "description": "A Vue.js boilerplate for Ethereum Apps, built on Truffle. Authentication functionalities included.", + "authors": [ + { + "name": "@DOkwufulueze", + "link": "https://twitter.com/DOkwufulueze" + } + ] + }, + { + "name": "expo-push-notification-helper", + "repoUrl": "https://github.com/just1and0/expo-push-notification-helper", + "description": "This library makes it easy to use push notification in react native using expo.", + "authors": [ + { + "name": "@just1and0", + "link": "https://twitter.com/just1and0" + } + ] + }, + { + "name": "ExpressWebJs", + "repoUrl": "https://github.com/Alexigbokwe/ExpressWebJs", + "description": "ExpressWebJs is a NodeJS FrameWork with expressive and organised syntax that runs on all major operating systems. It provides the starting point for creating your node project, allowing you to focus more on developing your amazing solution.", + "authors": [ + { + "name": "@EmekaIgbokwe", + "link": "https://twitter.com/emekaigbokwe" + } + ] + }, + { + "name": "Face-detector", + "repoUrl": "https://github.com/moyheen/face-detector", + "description": "An application containing all the code from the article on the FaceDetector API.", + "authors": [ + { + "name": "@moyheen", + "link": "https://twitter.com/moyheen" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Faker.ng", + "repoUrl": "https://github.com/binkabir/faker.ng", + "description": "a library for generating Nigerian fake data such as names, addresses, and phone numbers.", + "authors": [ + { + "name": "@binkabir", + "link": "https://github.com/binkabir" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Fastapi-mongo", + "repoUrl": "https://github.com/Youngestdev/fastapi-mongo", + "description": "Template for building FastAPI applications with MongoDB.", + "authors": [ + { + "name": "@kvng_zeez", + "link": "http://twitter.com/kvng_zeez" + } + ] + }, + { + "name": "Favico-generator", + "repoUrl": "https://github.com/Youngestdev/favico-generator", + "description": "A npm module for generating favicons from image.", + "authors": [ + { + "name": "@kvng_zeez", + "link": "http://twitter.com/kvng_zeez" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Fawn", + "repoUrl": "https://github.com/e-oj/Fawn", + "description": "A library for multi-document transactions in MongoDB via two-phase commits.", + "authors": [ + { + "name": "@e-oj", + "link": "https://e-oj.com" + } + ] + }, + { + "name": "flair", + "repoUrl": "https://github.com/mezielabs/flair", + "description": "AdonisJS 5 authentication scaffolding.", + "authors": [ + { + "name": "@ammezie", + "link": "https://twitter.com/ammezie" + } + ] + }, + { + "name": "flargd", + "repoUrl": "https://github.com/pmbanugo/flargd", + "description": "A fast & minimalist feature flag app that runs on Clouflare Workers.", + "authors": [ + { + "name": "@p_mbanugo", + "link": "https://twitter.com/p_mbanugo" + } + ] + }, + { + "name": "folabelle", + "repoUrl": "https://github.com/BolajiOlajide/folabelle", + "description": "A VSCode theme - Cross breed of Monokai + Palenight", + "authors": [ + { + "name": "@Bolaji___", + "link": "https://twitter.com/Bolaji___" + } + ], + "manualStatus": "inactive" + }, + { + "name": "FormHack", + "repoUrl": "https://github.com/ireade/formhack", + "description": "A hackable css form reset.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ] + }, + { + "name": "Frontend-app-starter", + "repoUrl": "https://github.com/D-sense/frontend-app-starter", + "description": "A simple frontend app starter packed with Webpack, Twitter Bootstrap, and well-defined CSS media queries. Edit.", + "authors": [ + { + "name": "@D-sense", + "link": "https://twitter.com/Delameh" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Gbowo", + "repoUrl": "https://github.com/adelowo/gbowo", + "description": "The easiest way to accept payments via Paystack and Amplifypay.", + "authors": [ + { + "name": "@Adelowo", + "link": "https://twitter.com/lanreadelowo" + } + ], + "manualStatus": "inactive" + }, + { + "name": "generator-nestjs-app", + "repoUrl": "https://github.com/ashinzekene/generator-nestjs-app", + "description": "A yeoman generator for creating nestsjs apps.", + "authors": [ + { + "name": "@ashinzekene", + "link": "https://twitter.com/ashinzekene" + } + ], + "manualStatus": "inactive" + }, + { + "name": "GeoIP Location", + "repoUrl": "https://github.com/victorybiz/geoip-location", + "description": "Get the geographical location of website visitors based on their IP addresses. Support Laravel and PHP (Non-Laravel) Project.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ] + }, + { + "name": "Githint Bot", + "repoUrl": "https://github.com/Chieze-Franklin/githint-bot", + "description": "A GitHub bot that ensures that your pull requests follow specified conventions.", + "authors": [ + { + "name": "@franklin_chieze", + "link": "https://twitter.com/franklin_chieze" + } + ] + }, + { + "name": "GitProfile Manager", + "repoUrl": "https://github.com/MeNsaaH/git-profile-manager", + "description": "A git extension to allow you manage multiple git profiles on your workstation with ease.", + "authors": [ + { + "name": "@iamMensaah", + "link": "https://twitter.com/iamMensaah" + } + ], + "manualStatus": "archived" + }, + { + "name": "Goignore", + "repoUrl": "https://github.com/hacktivist123/goignore", + "description": "A lightweight CLI tool for generating .gitignore file in your project.", + "authors": [ + { + "name": "@coder_blvck", + "link": "https://twitter.com/coder_blvck" + } + ] + }, + { + "name": "Goldmark PDF", + "repoUrl": "https://github.com/stephenafamo/goldmark-pdf", + "description": "A PDF renderer for the Go goldmark markdown parser.", + "authors": [ + { + "name": "@stephenafamo", + "link": "https://twitter.com/stephenafamo" + } + ] + }, + { + "name": "Google Dictionary", + "repoUrl": "https://github.com/chizoba/google-dictionary", + "description": "An android library that provides easy access to meanings of any word, phrase, or slang via Google, within any application.", + "authors": [ + { + "name": "@its_tobie", + "link": "https://twitter.com/its_tobie" + } + ] + }, + { + "name": "Gophie", + "repoUrl": "https://github.com/Go-phie/gophie", + "description": "A CLI written in golang for scraping movie download links and bypassing ads.", + "authors": [ + { + "name": "@GophieTeam", + "link": "https://twitter.com/GophieTeam" + } + ] + }, + { + "name": "Gophie-web", + "repoUrl": "https://github.com/Go-phie/gophie-web", + "description": "A web client for streaming/downloading movies without hassle built on Gophie.", + "authors": [ + { + "name": "@GophieTeam", + "link": "https://twitter.com/GophieTeam" + } + ] + }, + { + "name": "Grabity", + "repoUrl": "https://github.com/e-oj/grabity", + "description": "Get preview data from a link.", + "authors": [ + { + "name": "@e-oj", + "link": "https://github.com/e-oj" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Gulp-Email-Workflow", + "repoUrl": "https://github.com/ireade/gulp-email-workflow", + "description": "A Gulp workflow for building HTML emails.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive" + }, + { + "name": "H.php", + "repoUrl": "https://github.com/devHammed/H.php", + "description": "The Minimalist PHP Framework!", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ], + "manualStatus": "deleted" + }, + { + "name": "HearItFresh", + "repoUrl": "https://github.com/Dun-sin/HearItFresh", + "description": "-Discover new tracks with Hear It Fresh! This user-friendly web app generates personalized Spotify playlists based on your favourite artists or a Spotify playlist link. Explore fresh music.", + "authors": [ + { + "name": "@dun-sin", + "link": "https://github.com/Dun-sin" + } + ] + }, + { + "name": "helpers", + "repoUrl": "https://github.com/whizkydee/helpers", + "description": "Super-handy JavaScript utility functions for front-end development.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ] + }, + { + "name": "HUI.js", + "repoUrl": "https://github.com/devHammed/HUI.js", + "description": "Lightweight JavaScript UI Library.", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Icicle", + "repoUrl": "https://github.com/segunfamisa/icicle", + "description": "An annotation based tool for saving and restoring instance states.", + "authors": [ + { + "name": "@segunfamisa", + "link": "https://twitter.com/segunfamisa" + } + ], + "manualStatus": "inactive" + }, + { + "name": "IGdm", + "repoUrl": "https://github.com/ifedapoolarewaju/igdm", + "description": "Multi-platform Desktop application for INSTAGRAM DMs.", + "authors": [ + { + "name": "@ifedapolarewaju", + "link": "https://twitter.com/ifedapolarewaju" + } + ] + }, + { + "name": "Ijeawele", + "repoUrl": "https://github.com/viclotana/Ijeawele", + "description": "A Browser Extension that displays a random suggestion from the Dear Ijeawele book by Chimamanda Adichie.", + "authors": [ + { + "name": "@viclotana", + "link": "https://twitter.com/viclotana" + } + ], + "manualStatus": "inactive" + }, + { + "name": "ImageAI", + "repoUrl": "https://github.com/OlafenwaMoses/ImageAI", + "description": "A python library built to empower developers to build applications and systems with self-contained Computer Vision capabilities.", + "authors": [ + { + "name": "@OlafenwaMoses", + "link": "https://twitter.com/OlafenwaMoses" + } + ] + }, + { + "name": "ImageQ", + "repoUrl": "https://github.com/bisohns/imageq", + "description": "Reverse Image search engine powered by Django and Keras.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@mensaah", + "link": "https://twitter.com/_Mensaah__" + } + ] + }, + { + "name": "ImgR", + "repoUrl": "https://github.com/mykeels/ImgR", + "description": "ImgR.NET aims at automating the process of serving Images dynamically based on the client device.", + "authors": [ + { + "name": "@mykeels", + "link": "https://twitter.com/mykeels" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Inlinetweetjs", + "repoUrl": "https://github.com/ireade/inlinetweetjs", + "description": "InlineTweet.js allows you to easily create tweetable links out of any text on a webpage.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive" + }, + { + "name": "inspireNuggets", + "repoUrl": "https://github.com/BolajiAyodeji/inspireNuggets", + "description": "inspireNuggets is a Chrome Browser (Web) Extension that displays random inspiring techie quotes for developers/designers.", + "authors": [ + { + "name": "@iambolajiayo", + "link": "https://twitter.com/iambolajiayo" + } + ] + }, + { + "name": "Instaword", + "repoUrl": "https://github.com/acekyd/instaword", + "description": "InstaWord is a Chrome and Opera browser plugin that makes learning new words much easier.", + "authors": [ + { + "name": "@acekyd", + "link": "https://twitter.com/ace_kyd" + } + ], + "manualStatus": "inactive" + }, + { + "name": "IntentManip", + "repoUrl": "https://github.com/KingsMentor/IntentManip", + "description": "Gives more control over implicit intents creation and the way it is presented to users.", + "authors": [ + { + "name": "@Kingsmentor", + "link": "https://twitter.com/kingsmentor" + } + ], + "manualStatus": "inactive" + }, + { + "name": "ip-num", + "repoUrl": "https://github.com/ip-num/ip-num", + "description": "ip-num is a TypeScript library for working with IP Resources(ASN, IPV4, IPV6).", + "authors": [ + { + "name": "@dadepo", + "link": "https://twitter.com/dadepo" + } + ] + }, + { + "name": "iShell", + "repoUrl": "https://github.com/abiosoft/ishell", + "description": "Library for creating interactive CLI applications with Go.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ] + }, + { + "name": "Jollof", + "repoUrl": "https://github.com/isocroft/Jollof", + "description": "A lightweight PHP framework for developers who love smart work.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "JSON Preview", + "repoUrl": "https://github.com/ugwustanley/json-preview", + "description": "A tool that allows you to convert your JSON file into visual interactive diagrams.", + "authors": [ + { + "name": "@chiagozie_ugwu", + "link": "https://twitter.com/chiagozie_ugwu" + } + ] + }, + { + "name": "Jusibe JavaScript Library", + "repoUrl": "https://github.com/azemoh/jusibe", + "description": "A JavaScript library for", + "authors": [ + { + "name": "@azemoh", + "link": "https://twitter.com/josh_azemoh" + } + ] + }, + { + "name": "Jusibe PHP Library", + "repoUrl": "https://github.com/unicodeveloper/jusibe-php-lib", + "description": "A library for", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ] + }, + { + "name": "Kanary", + "repoUrl": "https://github.com/SeunAdelekan/Kanary", + "description": "A minimalist🔬 Kotlin web framework for building🔩⚙ scalable📈 and expressive🎨 RESTful APIs.", + "authors": [ + { + "name": "@IyanuAdelekan", + "link": "https://twitter.com/IyanuAdelekan" + } + ] + }, + { + "name": "Keygen", + "repoUrl": "https://github.com/gladchinda/keygen-php", + "description": "A fluent PHP random key generator.", + "authors": [ + { + "name": "@gladchinda", + "link": "https://twitter.com/gladchinda" + } + ], + "manualStatus": "inactive" + }, + { + "name": "KhaledBot", + "repoUrl": "https://github.com/ireade/khaledbot", + "description": "Delivering Major Keys to your Slack Team.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive" + }, + { + "name": "koii", + "repoUrl": "https://github.com/BolajiOlajide/koii", + "description": "A simple middleware to display routes in an express application.", + "authors": [ + { + "name": "@Bolaji___", + "link": "https://twitter.com/Bolaji___" + } + ] + }, + { + "name": "LaraCaptcha", + "repoUrl": "https://github.com/hendurhance/laracaptcha", + "description": "A Laravel package to seamlessly use hCapthca or reCaptcha v2 or v3 on your forms or RESTful APIs.", + "authors": [ + { + "name": "@hendurhance", + "link": "https://twitter.com/hendurhance" + } + ] + }, + { + "name": "Laravel Codepen", + "repoUrl": "https://github.com/unicodeveloper/laravel-codepen", + "description": "A Codepen Package for Laravel 5.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Crypto Payment Gateway", + "repoUrl": "https://github.com/victorybiz/laravel-crypto-payment-gateway", + "description": "GoUrl.io Crypto Payment Gateway for Laravel.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ] + }, + { + "name": "Laravel Email Validator", + "repoUrl": "https://github.com/unicodeveloper/laravel-email-validator", + "description": "Validate email addresses on the fly in Laravel 5.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Emoji", + "repoUrl": "https://github.com/unicodeveloper/laravel-emoji", + "description": "Laravel 5 Package that harnesses the power of PHP 7 Unicode features to provide emojis in your laravel app.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Exam", + "repoUrl": "https://github.com/unicodeveloper/laravel-exam", + "description": "A Laravel exam with questions from beginner to expert curated.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Feeder", + "repoUrl": "https://github.com/unicodeveloper/laravel-feeder", + "description": "Laravel 5 Package to extract atom and RSS feeds from any website in a very good readable format.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Hackathon Starter", + "repoUrl": "https://github.com/unicodeveloper/laravel-hackathon-starter", + "description": "A hackathon/MVP boilerplate for laravel web applications. Start your hackathons without hassle.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ] + }, + { + "name": "Laravel Identify", + "repoUrl": "https://github.com/unicodeveloper/laravel-identify", + "description": "Laravel 5 Package to Detect Users' Browsers, Devices, Languages and Operating Systems.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Jusibe", + "repoUrl": "https://github.com/unicodeveloper/laravel-jusibe", + "description": "Laravel 5 package for Jusibe SMS Service.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Mentions", + "repoUrl": "https://github.com/unicodeveloper/laravel-mentions", + "description": "Laravel 5 Package for enabling facebook type of mentions in your application.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Password", + "repoUrl": "https://github.com/unicodeveloper/laravel-password", + "description": "Guard your users against entering dumb passwords in your Laravel 5 apps.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ] + }, + { + "name": "Laravel Payant", + "repoUrl": "https://github.com/olaoluwa-98/laravel-payant", + "description": "Laravel 5 Payant Package.", + "authors": [ + { + "name": "@olaoluwa_98", + "link": "https://twitter.com/olaoluwa_98" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Paystack", + "repoUrl": "https://github.com/unicodeveloper/laravel-paystack", + "description": "Laravel 5 Paystack Package.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ] + }, + { + "name": "Laravel Simple Select", + "repoUrl": "https://github.com/victorybiz/laravel-simple-select", + "description": "Laravel Simple Select inputs component for Blade and Livewire.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ] + }, + { + "name": "Laravel SMTP Validator", + "repoUrl": "https://github.com/samolabams/smtp-validator", + "description": "Validate SMTP credentials without sending a test mail in Laravel 5.", + "authors": [ + { + "name": "@samolabams", + "link": "https://twitter.com/samolabams" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel Telephone Input", + "repoUrl": "https://github.com/victorybiz/laravel-tel-input", + "description": "Laravel Telephone Input component for Blade and Livewire based on the intl-tel-input JavaScript plugin.", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ] + }, + { + "name": "Laravel Wikipedia", + "repoUrl": "https://github.com/unicodeveloper/laravel-wikipedia", + "description": "A Wikipedia Package for Laravel 5.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel-PDF-Viewer", + "repoUrl": "https://github.com/goodnesskay/LARAVEL-PDF-VIEWER", + "description": "A Laravel Package for viewing PDF files or documents on the web without leaving your Web Application.", + "authors": [ + { + "name": "@goodnesskay", + "link": "https://twitter.com/goodnesskayode" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel-Slack", + "repoUrl": "https://github.com/goodnesskay/laravel-slack", + "description": "A Laravel Package that makes Automatic Invitation to Slack Channels or team seamless.", + "authors": [ + { + "name": "@goodnesskay", + "link": "https://twitter.com/goodnesskayode" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Laravel-SMS", + "repoUrl": "https://github.com/djunehor/laravel-sms", + "description": "Laravel SMS allows you to send SMS from your Laravel application using one of over 10 SMS providers, or your custom SMS provider.", + "authors": [ + { + "name": "@djunehor", + "link": "https://twitter.com/djunehor" + } + ] + }, + { + "name": "Laravel-Spam-Email", + "repoUrl": "https://github.com/hendurhance/laravel-spam-email", + "description": "This package is a Laravel package that checks if an email address is a spammer. It verifies your signups and forms submissions to confirm that they are legitimate.", + "authors": [ + { + "name": "@hendurhance", + "link": "https://twitter.com/hendurhance" + } + ] + }, + { + "name": "Lib-ussd", + "repoUrl": "https://github.com/hextremelabs/lib-ussd", + "description": "A lightweight USSD application framework.", + "authors": [ + { + "name": "@hextremelabs", + "link": "https://twitter.com/hextremelabs" + } + ] + }, + { + "name": "Linda ORM", + "repoUrl": "https://github.com/solutionstack/Linda", + "description": "A lightweight and fast Active-record based ORM for PHP.", + "authors": [ + { + "name": "@solutionstack", + "link": "https://github.com/solutionstack" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Lindaikeji CLI", + "repoUrl": "https://github.com/unicodeveloper/lindaikeji-cli", + "description": "Linda Ikeji for Hackers, HR Associates, HR Managers, Lazy People, e.t.c.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "LocalGoogle", + "repoUrl": "https://github.com/kodejuice/localgoogle", + "description": "A search engine built for offline websites on your local machine.", + "authors": [ + { + "name": "@KodeJuice", + "link": "https://twitter.com/kodejuice" + } + ] + }, + { + "name": "Magic Grid", + "repoUrl": "https://github.com/e-oj/Magic-Grid", + "description": "A simple, lightweight Javascript library for dynamic grid layouts.", + "authors": [ + { + "name": "@e-oj", + "link": "https://e-oj.com" + } + ] + }, + { + "name": "Markdown Badges", + "repoUrl": "https://github.com/Ileriayo/markdown-badges", + "description": "Badges for your personal developer branding, profile, and projects.", + "authors": [ + { + "name": "@ileriayooo", + "link": "https://twitter.com/ileriayooo" + } + ] + }, + { + "name": "MarkedIt", + "repoUrl": "https://github.com/christiannwamba/markedit", + "description": "Simple markdown editor widget.", + "authors": [ + { + "name": "@codebeast", + "link": "https://twitter.com/codebeast" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Math Alarm Clock", + "repoUrl": "https://github.com/t-regbs/MathAlarm", + "description": "Android Alarm app in which you solve math problems of varying difficulty to dismiss alarms. Built with jetpack compose.", + "authors": [ + { + "name": "@t-regbs", + "link": "https://twitter.com/timiaregbs" + } + ] + }, + { + "name": "MediumUnooficialSDK", + "repoUrl": "https://github.com/KingsMentor/medium-android-sdk-unofficial", + "description": "Unofficial implementation of medium API for android. Support Medium Oauth Sign in, retrieve users' post, make publications, and other medium supported features.", + "authors": [ + { + "name": "@kingsmentor", + "link": "https://twitter.com/kingsmentor" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Meethub", + "repoUrl": "https://github.com/iyanuashiri/meethub", + "description": "A web application for organizing meetups.", + "authors": [ + { + "name": "@iyanuashiri", + "link": "https://github.com/iyanuashiri" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Mini-Inventory-and-Sales-Management-System", + "repoUrl": "https://github.com/amirsanni/Mini-Inventory-and-Sales-Management-System", + "description": "An Inventory and Sales Management System written in PHP (codeIgniter) with support for MySQL and Sqlite3 databases.", + "authors": [ + { + "name": "@amirsanni", + "link": "https://twitter.com/amirsanni" + } + ] + }, + { + "name": "MLog", + "repoUrl": "https://github.com/mykeels/MLog", + "description": "MLog is the simplest .NET library for data logging.", + "authors": [ + { + "name": "@mykeels", + "link": "https://twitter.com/mykeels" + } + ], + "manualStatus": "inactive" + }, + { + "name": "MobileVisionBarcodeScanner", + "repoUrl": "https://github.com/KingsMentor/MobileVisionBarcodeScanner", + "description": "Mobile Vission Barcode Scanner.", + "authors": [ + { + "name": "@kingsmentor", + "link": "https://twitter.com/kingsment" + } + ] + }, + { + "name": "Modern-Mean-Stack", + "repoUrl": "https://github.com/Mozartted/Modern-Mean-Stack", + "description": "Functional stack of angular2, MongoDB, express all on nodejs, coupled with webpack and angular cli features.", + "authors": [ + { + "name": "@mozartted", + "link": "https://github.com/Mozartted" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Money-To-Words-Converter", + "repoUrl": "https://github.com/TNkemdilim/Money-To-Words-Converter", + "description": "A PHP library that converts any money value in digit [in any numeric system] to words in any language.", + "authors": [ + { + "name": "@TNkemdilim", + "link": "https://twitter.com/tnkemdilim" + } + ] + }, + { + "name": "moneywave-nodejs", + "repoUrl": "https://github.com/CodebyOmar/moneywave-nodejs", + "description": "A client library for moneywave API.", + "authors": [ + { + "name": "@codebyomar", + "link": "https://twitter.com/codebyomar" + } + ], + "manualStatus": "archived" + }, + { + "name": "Mui-data-table", + "repoUrl": "https://github.com/andela-cdaniel/mui-data-table", + "description": "Data table for react material-ui.", + "authors": [ + { + "name": "@AustinSwaggz", + "link": "https://twitter.com/AustinSwaggz" + } + ], + "manualStatus": "archived" + }, + { + "name": "Multi-tenant Employee Management System", + "repoUrl": "https://github.com/Timtech4u/employee-manager", + "description": "Multi-tenant Employee Management System * Job Portal with Django API & Vuejs.", + "authors": [ + { + "name": "@timtech4u", + "link": "https://twitter.com/timtech4u" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Mvrd", + "repoUrl": "https://github.com/unicodeveloper/mvrd", + "description": "Motor Vehicle Registration Information Search Portal Library.", + "authors": [ + { + "name": "@unicodeveloper", + "link": "https://twitter.com/unicodeveloper" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Mythra", + "repoUrl": "https://github.com/Go-phie/mythra", + "description": "Music search engine API and CLI downloader written in Rust.", + "authors": [ + { + "name": "@deven96", + "link": "https://twitter.com/_deven96" + } + ] + }, + { + "name": "Naija Phone Number", + "repoUrl": "https://github.com/Udokah/naija-phone-number", + "description": "A fast minimal module to validate Nigerian mobile phone numbers using Regular Expressions.", + "authors": [ + { + "name": "@thisisudo", + "link": "https://twitter.com/thisisudo" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Naija State And Local Government", + "repoUrl": "https://github.com/atomicman57/naija-state-local-government", + "description": "A simple zero dependency npm package that lists Nigeria states and local governments.", + "authors": [ + { + "name": "@blessingadesina3", + "link": "https://twitter.com/blessingadesin3" + } + ] + }, + { + "name": "Narrative-Generator", + "repoUrl": "https://github.com/thebolarin/narrative-generator", + "description": "An AI powered research tool that leverages OpenAI's API to extract and analyze key narratives, analyze their dominance, and track narrative evolution.", + "authors": [ + { + "name": "@Moses", + "link": "https://www.linkedin.com/in/thebolarin" + }, + { + "name": "@thebolarin", + "link": "https://twitter.com/thebolarin" + } + ] + }, + { + "name": "NativeDoctor", + "repoUrl": "https://github.com/rubbieKelvin/nativedoctor", + "description": "A configurable API testing tool built in Rust, designed for easy YAML definition and seamless integration into CI/CD pipelines.", + "authors": [ + { + "name": "@rubbiekelvin", + "link": "https://rubbietheone.com" + } + ] + }, + { + "name": "Netty-Finder", + "repoUrl": "https://github.com/BolajiAyodeji/netty-finder", + "description": "This script checks a Nigerian Telephone number and detects which network it belongs to.", + "authors": [ + { + "name": "@iambolajiayo", + "link": "https://twitter.com/iambolajiayo" + } + ] + }, + { + "name": "Newspaperjs", + "repoUrl": "https://github.com/flickz/newspaperjs", + "description": "Nodejs: News extraction, scraping and article \nparsing module.", + "authors": [ + { + "name": "@flickzcode", + "link": "https://twitter.com/flickzcode" + } + ] + }, + { + "name": "Nexios", + "repoUrl": "https://github.com/nexios-labs/Nexios", + "description": "A high-performance async Python web framework for building modern applications with simplicity and speed on per with fastapi.", + "authors": [ + { + "name": "@mrdunamix", + "link": "https://x.com/mrdunamix" + } + ] + }, + { + "name": "Ngyn.rs", + "repoUrl": "https://github.com/ngyn-rs/ngyn", + "description": "An opinionated rust framework for building scalable web servers.", + "authors": [ + { + "name": "@iamelcharitas", + "link": "https://twitter.com/iamelcharitas" + } + ] + }, + { + "name": "Nigerian states api", + "repoUrl": "https://github.com/seyi-adeleke/Nigerian-states-api", + "description": "An api for basic information about all 36 states in Nigeria.", + "authors": [ + { + "name": "@seyi__adeleke", + "link": "https://twitter.com/seyi__adeleke" + } + ] + }, + { + "name": "Nimble", + "repoUrl": "https://github.com/neoighodaro/nimble", + "description": "Fast PHP framework made with very loose optional components.", + "authors": [ + { + "name": "@neoighodaro", + "link": "https://twitter.com/neoighodaro" + } + ] + }, + { + "name": "No-CAPTCHA-reCAPTCHA", + "repoUrl": "https://github.com/collizo4sky/No-CAPTCHA-reCAPTCHA", + "description": "Protect WordPress login, registration and comment form from spam with the new No CAPTCHA reCAPTCHA.", + "authors": [ + { + "name": "@w3guy", + "link": "https://twitter.com/w3guy" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Nodestorage.js", + "repoUrl": "https://github.com/iamuchejude/nodestorage.js", + "description": "File system storage utility with", + "authors": [ + { + "name": "@iamuchejude", + "link": "https://twitter.com/iamuchejude" + } + ], + "manualStatus": "deleted" + }, + { + "name": "Nojs", + "repoUrl": "https://github.com/ifedapoolarewaju/nojs", + "description": "Library that helps minimize js you have to write.", + "authors": [ + { + "name": "@ifedapolarewaju", + "link": "https://twitter.com/ifedapolarewaju" + } + ] + }, + { + "name": "Notes", + "repoUrl": "https://github.com/rubbieKelvin/notes", + "description": "Distraction free notes app, minimal at its core. Create and share notes with ease.", + "authors": [ + { + "name": "@rubbiekelvin", + "link": "https://rubbietheone.com" + } + ] + }, + { + "name": "NUBAN Validator/Generator", + "repoUrl": "https://github.com/emyu01/nuban", + "description": "Easily verify or generate valid account numbers for any Nigerian financial institution.", + "authors": [ + { + "name": "@iemyu_", + "link": "https://twitter.com/iemyu_" + } + ] + }, + { + "name": "Omnipay 2Checkout", + "repoUrl": "https://github.com/collizo4sky/omnipay-2checkout", + "description": "2Checkout driver for the Omnipay PHP payment processing library.", + "authors": [ + { + "name": "@w3guy", + "link": "https://twitter.com/w3guy" + } + ], + "manualStatus": "inactive" + }, + { + "name": "OpenWriter", + "repoUrl": "https://github.com/ireade/openwriter", + "description": "A free theme for Ghost.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Orchestra", + "repoUrl": "https://github.com/stephenafamo/orchestra", + "description": "Orchestra is a library to manage long running go processes.", + "authors": [ + { + "name": "@stephenafamo", + "link": "https://twitter.com/stephenafamo" + } + ] + }, + { + "name": "Outray", + "repoUrl": "https://github.com/outray-tunnel/outray", + "description": "OutRay is an open-source ngrok alternative that makes it easy to expose your local development server to the internet via secure tunnels.", + "authors": [ + { + "name": "@akinkunmi", + "link": "https://x.com/akinkunmi" + } + ] + }, + { + "name": "P-integrate", + "repoUrl": "https://github.com/TaslimOseni/p-integrate", + "description": "This is a demo app that guides Android developers on how to integrate any of several popular payment platforms into their apps.", + "authors": [ + { + "name": "@taslimOseni", + "link": "https://twitter.com/taslimOseni" + } + ], + "manualStatus": "inactive" + }, + { + "name": "PackageHub", + "repoUrl": "https://github.com/BrainMaestro/packagehub", + "description": "An extension for displaying dependencies for many package managers on GitHub.", + "authors": [ + { + "name": "@BrainMaestro", + "link": "https://twitter.com/BrainMaestro" + } + ], + "manualStatus": "inactive" + }, + { + "name": "PageCarton", + "repoUrl": "https://github.com/pagecarton/pagecarton", + "description": "PageCarton - a fully functional software suite and framework + CMS tool for anyone to build a secure web site and app easily.", + "authors": [ + { + "name": "@AyoolaFalola", + "link": "https://twitter.com/AyoolaFalola" + } + ] + }, + { + "name": "Paystack Ruby", + "repoUrl": "https://github.com/IkoroVictor/paystack-ruby", + "description": "Ruby Gem for Paystack.", + "authors": [ + { + "name": "@IkoroVictor", + "link": "https://twitter.com/IkoroVictor" + } + ] + }, + { + "name": "Paystack wrapper", + "repoUrl": "https://github.com/kehers/paystack", + "description": "Nodejs API wrapper for Paystack.", + "authors": [ + { + "name": "@kehers", + "link": "https://twitter.com/kehers" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Pentecost", + "repoUrl": "https://github.com/knightbenax/Pentecost", + "description": "Payment Android UI Library for PayStack.", + "authors": [ + { + "name": "@knightbenax", + "link": "https://twitter.com/knightbenax" + } + ] + }, + { + "name": "Piggment", + "repoUrl": "https://github.com/adenekan41/piggment", + "description": "A curated collection of amazingly colored gradients for designers, developers and art makers over the world.", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ] + }, + { + "name": "Plugman", + "repoUrl": "https://github.com/ayotycoon/plugman", + "description": "A Postman like socket testing application.", + "authors": [ + { + "name": "@ayotycoon", + "link": "https://twitter.com/ayotycoon" + } + ] + }, + { + "name": "Product-Tour", + "repoUrl": "https://github.com/Robophil/Product-Tour", + "description": "A responsive tour snippet, with a step-by-step guide(onboarding).", + "authors": [ + { + "name": "@robophil_", + "link": "https://twitter.com/robophil_" + } + ], + "manualStatus": "inactive" + }, + { + "name": "PyDialogflow Fulfillment", + "repoUrl": "https://github.com/Emmarex/dialogflow-fulfillment-python", + "description": "This library makes creating fulfillment for Dialogflow v2 agents easily with Python Backend. (", + "authors": [ + { + "name": "@emmarex", + "link": "https://twitter.com/_emmarex_" + } + ] + }, + { + "name": "PyFCM", + "repoUrl": "https://github.com/olucurious/PyFCM", + "description": "Python client for FCM - Firebase Cloud Messaging (Android & iOS).", + "authors": [ + { + "name": "@olucurious", + "link": "https://twitter.com/olucurious" + } + ] + }, + { + "name": "Pymvrd", + "repoUrl": "https://github.com/othreecodes/pymvrd", + "description": "Motor Vehicle Registration Information Search Portal Library for python.", + "authors": [ + { + "name": "@othreecodes", + "link": "https://twitter.com/othreecodes" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Python WhatsApp bot", + "repoUrl": "https://github.com/Radi-dev/python-whatsapp-bot", + "description": "A Whatsapp Business Cloud API client Library for python.", + "authors": [ + { + "name": "@Radi-dev", + "link": "https://twitter.com/Radi_dev" + } + ] + }, + { + "name": "Quicksi CLI", + "repoUrl": "https://github.com/AnayoOleru/quicksi", + "description": "A command-line bot tool that contains reuseable templates in different languages, frameworks and libraries designed to make it easy for developers to start projects without having to worry about the setup.", + "authors": [ + { + "name": "@AnayoOleru", + "link": "https://twitter.com/AnayoOleru" + } + ] + }, + { + "name": "R3con1z3r", + "repoUrl": "https://github.com/abdulgaphy/r3con1z3r", + "description": "A lightweight Web information gathering tool with an intuitive features written in python. it provides a powerful environment in which open source intelligence (OSINT) web-based footprinting can be conducted quickly and thoroughly.", + "authors": [ + { + "name": "@mrgaphy", + "link": "https://twitter.com/mrgaphy" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Radixx", + "repoUrl": "https://github.com/isocroft/Radixx", + "description": "a simple library that implements the Facebook Flux Architecture with a twist to how the entire application state is managed and changed/updated.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "Random48LawsOfPower", + "repoUrl": "https://github.com/acekyd/Random48LawsOfPower", + "description": "Chrome extension that shows a random law from the popular '48 Laws of Power' Book.", + "authors": [ + { + "name": "@acekyd", + "link": "https://twitter.com/Ace_KYD" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Ratio", + "repoUrl": "https://github.com/theratioproject/simple", + "description": "The Simple Intelligent and Modular Programming Language and Environment.", + "authors": [ + { + "name": "@iamthecarisma", + "link": "https://www.twitter.com/iamthecarisma" + } + ], + "manualStatus": "archived" + }, + { + "name": "Rationale", + "repoUrl": "https://github.com/KingsMentor/Rationale", + "description": "Android permission rationale helper dialog.", + "authors": [ + { + "name": "@Kingsmentor", + "link": "https://twitter.com/kingsmentor" + } + ], + "manualStatus": "inactive" + }, + { + "name": "React Native okra webview", + "repoUrl": "https://github.com/just1and0/React-Native-Okra-Webview", + "description": "React Native okra sdk.", + "authors": [ + { + "name": "@just1and0", + "link": "https://twitter.com/just1and0" + } + ] + }, + { + "name": "React Native paystack webview", + "repoUrl": "https://github.com/just1and0/React-Native-Paystack-WebView", + "description": "React Native paystack sdk.", + "authors": [ + { + "name": "@just1and0", + "link": "https://twitter.com/just1and0" + } + ] + }, + { + "name": "react-autocomplete-hint", + "repoUrl": "https://github.com/ejmudi/react-autocomplete-hint", + "description": "A React component for Autocomplete Hint.", + "authors": [ + { + "name": "@ejmudi", + "link": "https://twitter.com/ejmudi" + } + ] + }, + { + "name": "react-hooks-paginator", + "repoUrl": "https://github.com/codenaz/react-paginator", + "description": "A simple paginator interface for react.", + "authors": [ + { + "name": "@codenaz", + "link": "https://twitter.com/codenaz" + } + ] + }, + { + "name": "react-multi-state", + "repoUrl": "https://github.com/whizkydee/react-multi-state", + "description": "Declarative, simplified way to handle complex local state with hooks.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ] + }, + { + "name": "react-native-woocommerce-api", + "repoUrl": "https://github.com/JamesUgbanu/react-native-woocommerce-api", + "description": "A wrappper that connects react Native to the WooCommerce API.", + "authors": [ + { + "name": "james ugbanu", + "link": "https://linkedin.com/in/james-ugbanu" + } + ] + }, + { + "name": "React-Raise", + "repoUrl": "https://github.com/andela-iamao/react-raise", + "description": "A cli kit for creating react applications.", + "authors": [ + { + "name": "@ash__amao", + "link": "https://twitter.com/ash__amao" + } + ], + "manualStatus": "inactive" + }, + { + "name": "react-webpack-starter", + "repoUrl": "https://github.com/temilaj/react-webpack-starter", + "description": "A boiler plate for creating react applications bundled by webpack (using ES6, Babel, SASS and the webpack development server).", + "authors": [ + { + "name": "@temilaj", + "link": "https://twitter.com/temilaj" + } + ], + "manualStatus": "inactive" + }, + { + "name": "reka", + "repoUrl": "https://github.com/MeNsaaH/reka", + "description": "A Cloud Resource management Tool to destroy, stop, resume, or clean up unsed resources.", + "authors": [ + { + "name": "@iamMensaah", + "link": "https://twitter.com/iamMensaah" + } + ] + }, + { + "name": "RemindMeOfThisTweet", + "repoUrl": "https://github.com/shalvah/RemindMeOfThisTweet", + "description": "Twitter bot to set reminders for tweets.", + "authors": [ + { + "name": "@theshalvah", + "link": "https://twitter.com/theshalvah" + } + ], + "manualStatus": "archived" + }, + { + "name": "Reuq", + "repoUrl": "https://github.com/ifedapoolarewaju/reuq", + "description": "Frontend Javascript framework.", + "authors": [ + { + "name": "@ifedapolarewaju", + "link": "https://twitter.com/ifedapolarewaju" + } + ], + "manualStatus": "inactive" + }, + { + "name": "River", + "repoUrl": "https://github.com/abiosoft/river", + "description": "Lightweight REST framework for Go.", + "authors": [ + { + "name": "@abiosoft", + "link": "https://twitter.com/abiosoft" + } + ], + "manualStatus": "inactive" + }, + { + "name": "saido", + "repoUrl": "https://github.com/bisohns/saido", + "description": "A yaml driven tool for easily monitoring metrics on multiple servers", + "authors": [ + { + "name": "@bisohns", + "link": "https://twitter.com/_deven96" + } + ] + }, + { + "name": "sailboat", + "repoUrl": "https://github.com/sailscastshq/sailboat", + "description": "Sailboat is a VS Code extension that enhances the Sails.js development experience by providing Visual Studio Code users with advanced features such as Commands to quickly access the Sails docs, Jump to Action, and Commands to lift Sails.", + "authors": [ + { + "name": "@Dominus_Kelvin", + "link": "https://twitter.com/Dominus_Kelvin" + } + ] + }, + { + "name": "sails-hook-jsonwebtoken", + "repoUrl": "https://github.com/Robophil/sails-hook-jsonwebtoken", + "description": "A sails hook for easily working with jsonwebtoken", + "authors": [ + { + "name": "@robophil_", + "link": "https://twitter.com/robophil_" + } + ], + "manualStatus": "inactive" + }, + { + "name": "sails-hook-swagger-generator", + "repoUrl": "https://github.com/theo4u/sails-hook-swagger-generator", + "description": "A tool to help generate Swagger specification documentation for Sails APIs", + "authors": [ + { + "name": "@theo4me", + "link": "https://twitter.com/theo4me" + } + ] + }, + { + "name": "Search Engine Parser", + "repoUrl": "https://github.com/bisohns/search-engine-parser", + "description": "Lightweight package to query popular search engines and scrape for result titles, links and descriptions.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@iamMensaah", + "link": "https://twitter.com/iamMensaah" + } + ] + }, + { + "name": "ShelfView", + "repoUrl": "https://github.com/tdscientist/ShelfView", + "description": "Android Library to display books on shelf", + "authors": [ + { + "name": "@tdscientist", + "link": "https://twitter.com/tdscientist" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Shutdown", + "repoUrl": "https://github.com/emmanuelkehinde/Shutdown", + "description": "A lightweight android library that handles the closing of your app interactively.", + "authors": [ + { + "name": "@emmakoko96", + "link": "https://twitter.com/emmakoko96" + } + ] + }, + { + "name": "Signalum", + "repoUrl": "https://github.com/bisohns/signalum", + "description": "A Linux Library to explore creating an application that detects available connections at once from WiFi and Bluetooth.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@mensaah", + "link": "https://twitter.com/_Mensaah__" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Signalum Desktop", + "repoUrl": "https://github.com/bisohns/signalum-desktop", + "description": "A Desktop application for the signalum python library.", + "authors": [ + { + "name": "@_deven96", + "link": "https://twitter.com/_deven96" + }, + { + "name": "@mensaah", + "link": "https://twitter.com/_Mensaah__" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Simple-DB", + "repoUrl": "https://github.com/shalvah/simple-db", + "description": "Get your Android app's SQLite database set up in five minutes!", + "authors": [ + { + "name": "@theshalvah", + "link": "https://twitter.com/theshalvah" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Slackword", + "repoUrl": "https://github.com/larikraun/slackword", + "description": "Dictionary in your slack....additionally, you can get random words.", + "authors": [ + { + "name": "@_larikraun", + "link": "https://twitter.com/_larikraun" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Slideview", + "repoUrl": "https://github.com/MAXDeliveryNG/slideview", + "description": "An awesome sliding button library for Android.", + "authors": [ + { + "name": "@kizitonwose", + "link": "https://twitter.com/kizitonwose" + } + ], + "manualStatus": "inactive" + }, + { + "name": "SlidingSquaresLoader", + "repoUrl": "https://github.com/biodunalfet/SlidingSquaresLoader", + "description": "A simple progress loader.", + "authors": [ + { + "name": "@biodunalfet", + "link": "https://twitter.com/biodunalfet" + } + ], + "manualStatus": "inactive" + }, + { + "name": "SlidingUpMenu", + "repoUrl": "https://github.com/r4sh33d/SlidingUpMenu", + "description": "🚀A very customizable Android library that allows you to present menu items (from menu resource and/or other sources) to users as a bottom sheet.", + "authors": [ + { + "name": "@srasheed", + "link": "https://twitter.com/srasheed_" + } + ] + }, + { + "name": "sms-nigeria-go", + "repoUrl": "https://github.com/D-sense/sms-nigeria-go", + "description": "A Go client for sending SMS to any Nigeria phone-number with ease.", + "authors": [ + { + "name": "@D-sense", + "link": "https://twitter.com/Delameh" + } + ], + "manualStatus": "inactive" + }, + { + "name": "stacks", + "repoUrl": "https://github.com/nerdeveloper/stacks", + "description": "A tool for setting up your stack quickly for Local development, on-prem and Bare metal servers.", + "authors": [ + { + "name": "@nerdeveloper", + "link": "https://github.com/nerdeveloper" + } + ] + }, + { + "name": "Stargazer", + "repoUrl": "https://github.com/kaf-lamed-beyt/stargazer", + "description": "Get notified when someone stars or \"unstars\" your OSS project.", + "authors": [ + { + "name": "@kafLamed", + "link": "https://twitter.com/kafLamed" + } + ] + }, + { + "name": "StartEase Cli", + "repoUrl": "https://github.com/JC-Coder/startease", + "description": "StartEase is a command-line interface (CLI) tool designed to make project setup a breeze. Whether you're working with your favorite technologies or exploring new ones, StartEase is your companion for quickly and effortlessly scaffolding projects.", + "authors": [ + { + "name": "@jc_coder1", + "link": "https://twitter.com/jc_coder1" + } + ] + }, + { + "name": "status-modal", + "repoUrl": "https://github.com/kaf-lamed-beyt/status-modal", + "description": "A react component that you can use to render current error or success messages from a particular API endpoint.", + "authors": [ + { + "name": "@kafLamed", + "link": "https://twitter.com/kafLamed" + } + ] + }, + { + "name": "Stickynotes", + "repoUrl": "https://github.com/Kolaposki/Stickynotes", + "description": "A functional note taking web application with alluring user interface.", + "authors": [ + { + "name": "@Kolaposki", + "link": "https://twitter.com/KolapoOshodi" + } + ] + }, + { + "name": "Stream2Peer", + "repoUrl": "https://github.com/tobySolutions/stream2peer", + "description": "Stream2Peer is a decentralized video stream management platform", + "authors": [ + { + "name": "@tobySolutions", + "link": "https://twitter.com/toby_solutions" + } + ] + }, + { + "name": "StudyLog", + "repoUrl": "https://github.com/codehakase/studyLog", + "description": "A tiny web application for Logging streaks and events.", + "authors": [ + { + "name": "@codehakase", + "link": "https://twitter.com/codehakase" + } + ], + "manualStatus": "inactive" + }, + { + "name": "STX", + "repoUrl": "https://github.com/lamarrr/STX", + "description": "C++17 & C++ 20 error-handling an utility.", + "authors": [ + { + "name": "@basit_ayantunde", + "link": "https://twitter.com/basit_ayantunde" + } + ] + }, + { + "name": "Suet", + "repoUrl": "https://github.com/kehers/suet", + "description": "Detailed analytics and reporting for your transactional Mailgun emails.", + "authors": [ + { + "name": "@kehers", + "link": "https://twitter.com/kehers" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Suphle", + "repoUrl": "https://github.com/nmeri17/suphle", + "description": "A PHP framework for building logic heavy full stack applications to be actively maintained over time.", + "authors": [ + { + "name": "Nmeri", + "link": "https://twitter.com/mmayboy_" + } + ] + }, + { + "name": "Support-ticket", + "repoUrl": "https://github.com/ammezie/support-ticket", + "description": "A support ticket application in Laravel.", + "authors": [ + { + "name": "@ammezie", + "link": "https://twitter.com/ammezie" + } + ], + "manualStatus": "inactive" + }, + { + "name": "TenseiJS", + "repoUrl": "https://github.com/tenseijs/tensei", + "description": "Content management and distribution with a touch of elegance.", + "authors": [ + { + "name": "@bahdcoder", + "link": "https://twitter.com/bahdcoder" + } + ] + }, + { + "name": "testkit", + "repoUrl": "https://github.com/apitoolkit/testkit", + "description": "A DSL for testing. Starting with APIs.", + "authors": [ + { + "name": "@tonialaribe", + "link": "https://twitter.com/tonialaribe" + } + ] + }, + { + "name": "Time", + "repoUrl": "https://github.com/kizitonwose/Time", + "description": "Type-safe time calculations in Kotlin, powered by generics.", + "authors": [ + { + "name": "@kizitonwose", + "link": "https://github.com/kizitonwose" + } + ] + }, + { + "name": "TinyPress", + "repoUrl": "https://github.com/kehers/tinypress", + "description": "Create and easily manage your blog on Github.", + "authors": [ + { + "name": "@kehers", + "link": "https://twitter.com/kehers" + } + ], + "manualStatus": "inactive" + }, + { + "name": "Toast.js", + "repoUrl": "https://github.com/ireade/Toast.js", + "description": "A library for Toast messages.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ] + }, + { + "name": "TransformersPHP", + "repoUrl": "https://github.com/CodeWithKyrian/transformers-php", + "description": "A toolkit for PHP developers to run state-of-the-art pretrained machine-learning models locally in PHP.", + "authors": [ + { + "name": "@CodeWithKyrian", + "link": "https://twitter.com/CodeWithKyrian" + } + ] + }, + { + "name": "TweetThreader", + "repoUrl": "https://github.com/Udokah/tweet-threader", + "description": "A tool to create threads on Twitter.", + "authors": [ + { + "name": "@thisisudo", + "link": "https://twitter.com/thisisudo" + } + ], + "manualStatus": "inactive" + }, + { + "name": "TwittaSave", + "repoUrl": "https://github.com/emmanuelkehinde/TwittaSave-Web", + "description": "Web, Android and Chrome Extension that enables you to download videos and gifs from tweets to your device easily; built using Twitter API.", + "authors": [ + { + "name": "@emmakoko96", + "link": "https://twitter.com/emmakoko96" + } + ] + }, + { + "name": "type-reverse", + "repoUrl": "https://github.com/whizkydee/type-reverse", + "description": "🦄 Lightweight reverse utility around strings, arrays, numbers and more.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ] + }, + { + "name": "Unitcss", + "repoUrl": "https://github.com/adenekan41/unitcss", + "description": "A cli tool to convert css units in your file, helps you swiftly convert units / mesurements in your file or folder.", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ] + }, + { + "name": "URISanity", + "repoUrl": "https://github.com/codesplinta/URISanity", + "description": "sanitize uris in web and web-like applications with confidence.", + "authors": [ + { + "name": "@isocroft", + "link": "https://twitter.com/isocroft" + } + ] + }, + { + "name": "Urley", + "repoUrl": "https://github.com/adenekan41/urley", + "description": "A cross-platform library with a collection of handy utilities to work with URLs.", + "authors": [ + { + "name": "@codewonders", + "link": "https://twitter.com/code_wonders" + } + ] + }, + { + "name": "use-cookie", + "repoUrl": "https://github.com/devhammed/use-cookie", + "description": "Get, Set, Update and Delete Cookie using React Hooks.", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ] + }, + { + "name": "use-global-hook", + "repoUrl": "https://github.com/devhammed/use-global-hook", + "description": "Painless global state management for React using Hooks and Context API in 1KB!", + "authors": [ + { + "name": "@devhammed", + "link": "https://profile.codersrank.io/user/devhammed" + } + ] + }, + { + "name": "UseFormBee", + "repoUrl": "https://github.com/Eazybee/useFormBee", + "description": "useFormBee is a lightweight library that helps me manage and abstract react form logic.", + "authors": [ + { + "name": "@Eazybee", + "link": "https://github.com/Eazybee" + } + ] + }, + { + "name": "Video-Call-App", + "repoUrl": "https://github.com/amirsanni/Video-Call-App", + "description": "A text, audio and video chat application built with webRTC and Ratchet (PHP WebSockets).", + "authors": [ + { + "name": "@amirsanni", + "link": "https://twitter.com/amirsanni" + } + ] + }, + { + "name": "VSCode Material Palenight Theme", + "repoUrl": "https://github.com/whizkydee/vscode-material-palenight-theme", + "description": "🍹🎨 An elegant and juicy material-like theme for Visual Studio Code.", + "authors": [ + { + "name": "@mrolaolu", + "link": "https://twitter.com/mrolaolu" + } + ] + }, + { + "name": "VSCode NestsJs Snippets", + "repoUrl": "https://github.com/ashinzekene/vscode-nestjs-snippets", + "description": "A VScode extension for adding snippets for your", + "authors": [ + { + "name": "@ashinzekene", + "link": "https://twitter.com/ashinzekene" + } + ] + }, + { + "name": "VSCode One Monokai", + "repoUrl": "https://github.com/azemoh/vscode-one-monokai", + "description": "Beautiful dark theme for Visual Studio Code Editor.", + "authors": [ + { + "name": "@azemoh", + "link": "https://twitter.com/josh_azemoh" + } + ] + }, + { + "name": "Vue 3 OTP Input", + "repoUrl": "https://github.com/ejirocodes/vue3-otp-input", + "description": "🐗 A fully customizable OTP input component built with Vue 3.x.", + "authors": [ + { + "name": "@ejirocodes", + "link": "https://twitter.com/ejirocodes" + } + ] + }, + { + "name": "Vue Simple ACL", + "repoUrl": "https://github.com/victorybiz/vue-simple-acl", + "description": "A simple unopinionated Vue plugin for managing user roles and permissions, access-control list (ACL) and role-based access control (RBAC).", + "authors": [ + { + "name": "@victoryosayi", + "link": "https://twitter.com/victoryosayi" + } + ] + }, + { + "name": "Vue Transitions CSS", + "repoUrl": "https://github.com/Edmund1645/vue-transitions-css", + "description": "A lightweight CSS library for adding transitions to Vue components.", + "authors": [ + { + "name": "@26th_edmund", + "link": "https://twitter.com/26th_edmund" + } + ] + }, + { + "name": "WAFEDA", + "repoUrl": "https://github.com/adejumoridwan/WAFEDA", + "description": "Simple Web App For Exploratory Data Analysis.", + "authors": [ + { + "name": "@abuuAishaaa", + "link": "https://twitter.com/abuuAishaaa" + } + ] + }, + { + "name": "Waihona", + "repoUrl": "https://github.com/bisohns/waihona", + "description": "Rust crates for performing cloud storage actions across AWS, GCP and Azure.", + "authors": [ + { + "name": "@deven96", + "link": "https://twitter.com/_deven96" + } + ] + }, + { + "name": "wasmo", + "repoUrl": "https://github.com/appcypher/wasmo", + "description": "A WebAssembly Compiler and Runtime.", + "authors": [ + { + "name": "@theappcypher", + "link": "https://twitter.com/theappcypher" + } + ] + }, + { + "name": "WatchDog", + "repoUrl": "https://github.com/IzyPro/WatchDog", + "description": "WatchDog is a Realtime HTTP (Request & Response) and Exception logger and viewer for ASP.Net Core Web Apps and APIs.", + "authors": [ + { + "name": "@IzyPro_", + "link": "https://twitter.com/IzyPro_" + } + ] + }, + { + "name": "web-crawljs", + "repoUrl": "https://github.com/kayslay/web-crawljs", + "description": "A web crawler package for Nodejs that makes it easy to crawl web pages.", + "authors": [ + { + "name": "@Kayslaycode", + "link": "https://twitter.com/Kayslaycode" + } + ] + }, + { + "name": "Web3terms", + "repoUrl": "https://github.com/Olanetsoft/web3terms", + "description": "A Twitter bot explaining and simplifying web3 terms to everyone.", + "authors": [ + { + "name": "@olanetsoft", + "link": "https://twitter.com/olanetsoft" + } + ] + }, + { + "name": "WhatsBot", + "repoUrl": "https://github.com/Yusadolat/DicoBot", + "description": "WhatsApp DicoBot is a dictionary bot that enhances your messaging experience.", + "authors": [ + { + "name": "@yusadolat", + "link": "https://twitter.com/yusadolat" + } + ] + }, + { + "name": "Whatsticker", + "repoUrl": "https://github.com/deven96/whatsticker", + "description": "Automatically turn images/videos into stickers by using a caption.", + "authors": [ + { + "name": "@deven96", + "link": "https://twitter.com/_deven96" + } + ] + }, + { + "name": "WordPress Persist Admin Notices Dismissal", + "repoUrl": "https://github.com/collizo4sky/persist-admin-notices-dismissal", + "description": "Simple plugin that persists dismissal of admin notices across pages in WordPress dashboard.", + "authors": [ + { + "name": "@w3guy", + "link": "https://twitter.com/w3guy" + } + ] + }, + { + "name": "wtfoperamini", + "repoUrl": "https://github.com/ireade/wtfoperamini", + "description": "Development features not supported in Opera Mini, and some crowsourced workarounds for them.", + "authors": [ + { + "name": "@ireaderinokun", + "link": "https://twitter.com/ireaderinokun" + } + ] + }, + { + "name": "Yorlang", + "repoUrl": "https://github.com/anoniscoding/yorlang", + "description": "A programming language with Yoruba language construct.", + "authors": [ + { + "name": "@anoniscoding", + "link": "https://twitter.com/anoniscoding" + } + ], + "manualStatus": "inactive" + }, + { + "name": "zag", + "repoUrl": "https://github.com/chakra-ui/zag", + "description": "Finite state machines for building accessible design systems and UI components.", + "authors": [ + { + "name": "@thesegunadebayo", + "link": "https://twitter.com/thesegunadebayo" + } + ] + } +] diff --git a/scripts/bootstrap-enriched.mjs b/scripts/bootstrap-enriched.mjs new file mode 100644 index 00000000..14f7b827 --- /dev/null +++ b/scripts/bootstrap-enriched.mjs @@ -0,0 +1,26 @@ +/** + * Creates an initial projects.enriched.json from projects.json without + * hitting the GitHub API. The weekly Action will populate real data on first run. + * Usage: node scripts/bootstrap-enriched.mjs + */ + +import { readProjects, writeJSON, ENRICHED_PATH } from "./utils.mjs"; + +const TODAY = new Date().toISOString().split("T")[0]; +const projects = readProjects(); + +const enriched = projects.map((p) => ({ + ...p, + computed: { + status: p.manualStatus || "unknown", + stars: null, + lastPushed: null, + language: null, + checkedAt: TODAY, + }, +})); + +writeJSON(ENRICHED_PATH, enriched); + +console.log(`✓ Bootstrapped projects.enriched.json (${enriched.length} projects)`); +console.log(" Run `node scripts/enrich-projects.mjs` with GITHUB_TOKEN to populate full data."); diff --git a/scripts/enrich-projects.mjs b/scripts/enrich-projects.mjs new file mode 100644 index 00000000..18fdabe2 --- /dev/null +++ b/scripts/enrich-projects.mjs @@ -0,0 +1,164 @@ +/** + * Reads data/projects.json, queries the GitHub API for each repo, computes + * status, and writes data/projects.enriched.json. + * + * Uses GITHUB_TOKEN env variable for authenticated API access when available. + * Rate limits depend on the token type; a PAT may be needed for higher throughput. + * Usage: node scripts/enrich-projects.mjs + */ + +import { root, ENRICHED_PATH, readProjects, writeJSON } from "./utils.mjs"; + +const GITHUB_TOKEN = process.env.GITHUB_TOKEN; +const TODAY = new Date().toISOString().split("T")[0]; + +const INACTIVE_DAYS = 365 * 2; +const STALE_DAYS = 180; +const CONCURRENCY = 5; +const MAX_GITHUB_RETRIES = 5; + +const GITHUB_RE = /github\.com\/([^/]+\/[^/?#]+)/; + +function sleep(ms) { + return new Promise((r) => setTimeout(r, ms)); +} + +async function getRateLimitRetryMs(res) { + const retryAfter = res.headers.get("retry-after"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds >= 0) { + return retryAfterSeconds * 1000; + } + } + + const remaining = res.headers.get("x-ratelimit-remaining"); + const reset = res.headers.get("x-ratelimit-reset"); + if (remaining === "0" || reset) { + const resetSeconds = parseInt(reset, 10); + if (!Number.isNaN(resetSeconds)) { + return Math.max(0, resetSeconds * 1000 - Date.now()) + 1000; + } + return 60_000; + } + + try { + const body = await res.clone().json(); + const message = typeof body?.message === "string" ? body.message.toLowerCase() : ""; + if (message.includes("rate limit")) { + return 60_000; + } + } catch { + // Ignore non-JSON response bodies when determining rate limiting. + } + + return null; +} + +async function fetchGitHub(path) { + const headers = { Accept: "application/vnd.github+json" }; + if (GITHUB_TOKEN) headers["Authorization"] = `Bearer ${GITHUB_TOKEN}`; + + for (let attempt = 0; attempt <= MAX_GITHUB_RETRIES; attempt++) { + const res = await fetch(`https://api.github.com${path}`, { headers }); + + if (res.status === 403 || res.status === 429) { + const waitMs = await getRateLimitRetryMs(res); + if (waitMs == null) { + throw new Error(`GitHub API ${res.status} for ${path}`); + } + if (attempt === MAX_GITHUB_RETRIES) { + throw new Error(`GitHub API ${res.status} for ${path} after ${MAX_GITHUB_RETRIES + 1} attempts`); + } + console.warn(` Rate limited — waiting ${Math.round(waitMs / 1000)}s…`); + await sleep(waitMs); + continue; + } + + if (res.status === 404) return null; + if (!res.ok) throw new Error(`GitHub API ${res.status} for ${path}`); + return res.json(); + } +} + +function computeStatus(repo, manualStatus) { + if (manualStatus === "deleted") return "deleted"; + if (manualStatus === "deprecated") return "deprecated"; + if (repo?.archived || manualStatus === "archived") return "archived"; + if (!repo) return manualStatus || "unknown"; + + const pushedAt = repo.pushed_at ? new Date(repo.pushed_at) : null; + if (!pushedAt) return "unknown"; + + const daysSincePush = (Date.now() - pushedAt.getTime()) / 86_400_000; + if (daysSincePush > INACTIVE_DAYS) return "inactive"; + if (daysSincePush > STALE_DAYS) return "stale"; + return "active"; +} + +function fallbackComputed(manualStatus, error) { + return { + status: manualStatus || "unknown", + checkedAt: TODAY, + ...(error ? { error } : {}), + }; +} + +async function enrichProject(project) { + const match = project.repoUrl?.match(GITHUB_RE); + + if (!match) { + return { ...project, computed: fallbackComputed(project.manualStatus) }; + } + + const repoPath = match[1].replace(/\.git$/, ""); + + try { + const repo = await fetchGitHub(`/repos/${repoPath}`); + return { + ...project, + computed: { + status: computeStatus(repo, project.manualStatus), + stars: repo?.stargazers_count ?? null, + lastPushed: repo?.pushed_at ? repo.pushed_at.split("T")[0] : null, + language: repo?.language ?? null, + checkedAt: TODAY, + }, + }; + } catch (err) { + console.error(` Error fetching ${repoPath}: ${err.message}`); + return { ...project, computed: fallbackComputed(project.manualStatus, err.message) }; + } +} + +async function withConcurrency(items, limit, fn) { + const results = new Array(items.length); + const queue = items.map((item, i) => ({ item, i })); + let cursor = 0; + + async function worker() { + while (cursor < queue.length) { + const { item, i } = queue[cursor++]; + results[i] = await fn(item); + if (i > 0 && i % 25 === 0) console.log(` ${i}/${items.length} done…`); + } + } + + await Promise.all(Array.from({ length: limit }, worker)); + return results; +} + +const projects = readProjects(); + +console.log(`Enriching ${projects.length} projects…`); +if (!GITHUB_TOKEN) { + console.warn("Warning: GITHUB_TOKEN not set — unauthenticated (60 req/hr limit)"); +} + +const enriched = await withConcurrency(projects, CONCURRENCY, enrichProject); + +writeJSON(ENRICHED_PATH, enriched); + +const errors = enriched.filter((p) => p.computed?.error).length; +console.log(`\n✓ Enriched ${enriched.length} projects → data/projects.enriched.json`); +if (errors > 0) console.warn(` ${errors} errors (kept original data for those)`); diff --git a/scripts/generate-readme.mjs b/scripts/generate-readme.mjs new file mode 100644 index 00000000..2dfc1626 --- /dev/null +++ b/scripts/generate-readme.mjs @@ -0,0 +1,65 @@ +/** + * Generates README.MD from data/projects.json. + * Usage: node scripts/generate-readme.mjs + */ + +import { writeFileSync } from "fs"; +import { join } from "path"; +import { root, readProjects } from "./utils.mjs"; + +const projects = readProjects(); + +const STATUS_SPANS = { + inactive: ` | 🏁 Inactive `, + archived: ` | 🏁 Archived `, + deprecated: ` | 🏁 Deprecated `, + deleted: ` | 🏁 Deleted `, +}; + +function formatAuthors(authors) { + if (!authors || authors.length === 0) return ""; + return authors.map((a) => (a.link ? `[${a.name}](${a.link})` : a.name)).join(", "); +} + +function buildLine(project) { + const statusSpan = STATUS_SPANS[project.manualStatus] ?? ""; + const authors = formatAuthors(project.authors); + const authorPart = authors ? ` **By ${authors}**` : ""; + return `- [${project.name}](${project.repoUrl}) - ${project.description}${authorPart}${statusSpan}`; +} + +// Group projects by first letter; non-alpha names fall under "#" +const byLetter = {}; +for (const project of projects) { + const letter = project.name[0].toUpperCase(); + const key = letter >= "A" && letter <= "Z" ? letter : "#"; + (byLetter[key] ??= []).push(project); +} + +const letters = Object.keys(byLetter).sort(); + +const navLinks = letters.map((l) => `${l}`).join(" | "); + +let output = `

    + + 🇳🇬Made. In. Nigeria🇳🇬 + +

    +

    A curation of awesome tools and projects built by Nigerian developers :fire:.

    + +

    + ${navLinks} +

    + +`; + +for (const letter of letters) { + output += `## ${letter}\n\n`; + for (const project of byLetter[letter]) { + output += buildLine(project) + "\n"; + } + output += "\n"; +} + +writeFileSync(join(root, "README.MD"), output, "utf8"); +console.log(`✓ README.MD regenerated (${projects.length} projects)`); diff --git a/scripts/migrate-readme.mjs b/scripts/migrate-readme.mjs new file mode 100644 index 00000000..88d19036 --- /dev/null +++ b/scripts/migrate-readme.mjs @@ -0,0 +1,95 @@ +/** + * One-time migration script: parses README.MD and produces data/projects.json + * Usage: node scripts/migrate-readme.mjs + */ + +import { readFileSync, mkdirSync } from "fs"; +import { join } from "path"; +import { marked } from "marked"; +import * as cheerio from "cheerio"; +import { root, PROJECTS_PATH, writeJSON } from "./utils.mjs"; + +const markdown = readFileSync(join(root, "README.MD"), "utf8"); +const html = marked(markdown); +const $ = cheerio.load(html); + +const liItems = $("li") + .map((_, el) => $(el).html()) + .get(); + +function extractManualStatus(spanText) { + if (!spanText) return null; + const lower = spanText.toLowerCase(); + if (lower.includes("inactive")) return "inactive"; + if (lower.includes("archived")) return "archived"; + if (lower.includes("deprecated")) return "deprecated"; + if (lower.includes("deleted")) return "deleted"; + return null; +} + +function extractAuthors(html) { + const $el = cheerio.load(html); + const authors = []; + $el("strong a").each((_, a) => { + const name = $el(a).text().trim(); + const link = $el(a).attr("href") || ""; + if (name) authors.push({ name, link }); + }); + return authors; +} + +const projects = []; +let skipped = 0; + +for (const item of liItems) { + const $el = cheerio.load(item); + + const firstLink = $el("a").first(); + const name = firstLink.text().trim(); + const repoUrl = firstLink.attr("href") || ""; + + if (!name || !repoUrl || repoUrl.startsWith("#")) { + skipped++; + continue; + } + + let description = ""; + try { + const contents = $el("*").contents().toArray(); + for (const node of contents) { + if (node.type === "text" && node.data) { + const text = node.data.replace(/^ - /, "").trim(); + if (text && text.length > 2) { + description = text; + break; + } + } + } + } catch {} + + const manualStatus = extractManualStatus($el("span").first().text()); + const authors = extractAuthors(item); + + if (authors.length === 0) { + const boldText = $el("strong").text().trim(); + if (boldText) authors.push({ name: boldText, link: "" }); + } + + projects.push({ + name, + repoUrl, + description, + authors, + ...(manualStatus ? { manualStatus } : {}), + }); +} + +projects.sort((a, b) => + a.name.localeCompare(b.name, undefined, { sensitivity: "base" }) +); + +mkdirSync(join(root, "data"), { recursive: true }); +writeJSON(PROJECTS_PATH, projects); + +console.log(`✓ Migrated ${projects.length} projects to data/projects.json`); +if (skipped > 0) console.log(` (skipped ${skipped} malformed entries)`); diff --git a/scripts/utils.mjs b/scripts/utils.mjs new file mode 100644 index 00000000..e218593e --- /dev/null +++ b/scripts/utils.mjs @@ -0,0 +1,16 @@ +import { readFileSync, writeFileSync } from "fs"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; + +export const root = join(dirname(fileURLToPath(import.meta.url)), ".."); + +export const PROJECTS_PATH = join(root, "data", "projects.json"); +export const ENRICHED_PATH = join(root, "data", "projects.enriched.json"); + +export function readProjects() { + return JSON.parse(readFileSync(PROJECTS_PATH, "utf8")); +} + +export function writeJSON(filePath, data) { + writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf8"); +} diff --git a/scripts/validate-projects.mjs b/scripts/validate-projects.mjs new file mode 100644 index 00000000..a663c632 --- /dev/null +++ b/scripts/validate-projects.mjs @@ -0,0 +1,83 @@ +/** + * Validates data/projects.json for use in CI (PR checks). + * Exits with code 1 if any issues are found. + * Usage: node scripts/validate-projects.mjs + */ + +import { PROJECTS_PATH } from "./utils.mjs"; +import { readFileSync } from "fs"; + +const VALID_MANUAL_STATUSES = new Set(["inactive", "archived", "deprecated", "deleted"]); +const URL_RE = /^https?:\/\/.+/; +const isBlankString = (v) => !v || typeof v !== "string" || v.trim() === ""; +const isNonNullObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v); + +let projects; +try { + projects = JSON.parse(readFileSync(PROJECTS_PATH, "utf8")); +} catch (err) { + console.error(`✗ Could not parse data/projects.json: ${err.message}`); + process.exit(1); +} + +if (!Array.isArray(projects)) { + console.error("✗ data/projects.json must be a JSON array"); + process.exit(1); +} + +const errors = []; +const seenUrls = new Map(); + +for (let i = 0; i < projects.length; i++) { + const p = projects[i]; + + if (!isNonNullObject(p)) { + errors.push(`[${i}]: project entry must be an object`); + continue; + } + + const label = `[${i}] "${p.name || "(no name)"}"`; + + if (isBlankString(p.name)) errors.push(`${label}: missing or empty "name"`); + + if (!p.repoUrl || !URL_RE.test(p.repoUrl)) { + errors.push(`${label}: missing or invalid "repoUrl" (must start with http:// or https://)`); + } else if (seenUrls.has(p.repoUrl)) { + errors.push(`${label}: duplicate repoUrl — already used by ${seenUrls.get(p.repoUrl)}`); + } else { + seenUrls.set(p.repoUrl, label); + } + + if (isBlankString(p.description)) errors.push(`${label}: missing or empty "description"`); + + if (!Array.isArray(p.authors) || p.authors.length === 0) { + errors.push(`${label}: "authors" must be a non-empty array`); + } else { + for (const [j, author] of p.authors.entries()) { + if (!isNonNullObject(author)) { + errors.push(`${label}: authors[${j}] must be an object`); + continue; + } + + if (isBlankString(author.name)) errors.push(`${label}: authors[${j}] missing "name"`); + } + } + + if (p.manualStatus !== undefined && !VALID_MANUAL_STATUSES.has(p.manualStatus)) { + errors.push( + `${label}: invalid "manualStatus" "${p.manualStatus}" — must be one of: ${[...VALID_MANUAL_STATUSES].join(", ")}` + ); + } + + if (p.computed !== undefined) { + errors.push(`${label}: "computed" must not appear in projects.json — it belongs in projects.enriched.json`); + } +} + +if (errors.length > 0) { + console.error(`✗ Validation failed with ${errors.length} error(s):\n`); + errors.forEach((e) => console.error(` • ${e}`)); + process.exit(1); +} + +console.log(`✓ data/projects.json is valid (${projects.length} projects)`);