mirror of
https://github.com/jlengrand/open-source-mac-os-apps.git
synced 2026-03-10 08:31:19 +00:00
Merge branch 'master' into feat/add_metal_icon
This commit is contained in:
30
.github/deploy.sh
vendored
30
.github/deploy.sh
vendored
@@ -1,30 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo ${TRAVIS_EVENT_TYPE}
|
|
||||||
echo ${TRAVIS_BRANCH}
|
|
||||||
|
|
||||||
if [[ ${TRAVIS_EVENT_TYPE} != 'push' ]]
|
|
||||||
then
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${TRAVIS_BRANCH} != 'master' ]]
|
|
||||||
then
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
git checkout master
|
|
||||||
|
|
||||||
git config user.name "serhii-londar"
|
|
||||||
git config user.email "serhii.londar@gmail.com"
|
|
||||||
|
|
||||||
echo add readme
|
|
||||||
git add README.md
|
|
||||||
|
|
||||||
echo commit
|
|
||||||
git commit -m "Generate README"
|
|
||||||
|
|
||||||
echo push
|
|
||||||
git push --quiet "https://${DANGER_GITHUB_API_TOKEN}@github.com/serhii-londar/open-source-mac-os-apps.git" master:master > /dev/null 2>&1
|
|
||||||
413
.github/main.swift
vendored
413
.github/main.swift
vendored
@@ -8,18 +8,49 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
let header = """
|
// MARK: - Dynamic Header Generator
|
||||||
[](https://vshymanskyy.github.io/StandWithUkraine)
|
func generateHeader(totalApps: Int, categoriesCount: Int, languageStats: [String: Int]) -> String {
|
||||||
|
let dateFormatter = DateFormatter()
|
||||||
|
dateFormatter.dateFormat = "MMMM d, yyyy"
|
||||||
|
let lastUpdated = dateFormatter.string(from: Date())
|
||||||
|
|
||||||
|
// Get top 5 languages
|
||||||
|
let topLanguages = languageStats.sorted { $0.value > $1.value }.prefix(5)
|
||||||
|
let languagesSummary = topLanguages.map { "\($0.key): \($0.value)" }.joined(separator: " • ")
|
||||||
|
|
||||||
|
return """
|
||||||
|
<div align="center">
|
||||||
|
<a href="https://vshymanskyy.github.io/StandWithUkraine">
|
||||||
|
<img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg" alt="Stand With Ukraine" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<img src="./icons/icon.png">
|
||||||
|
<h1>Awesome macOS Open Source Applications</h1>
|
||||||
|
<p>A curated list of open source applications for macOS</p>
|
||||||
|
<p>
|
||||||
|
<a href="https://github.com/sindresorhus/awesome"><img alt="Awesome" src="https://awesome.re/badge.svg" /></a>
|
||||||
|
<a href="https://gitter.im/open-source-mac-os-apps/Lobby"><img alt="Join the chat at gitter" src="https://badges.gitter.im/Join%20Chat.svg" /></a>
|
||||||
|
<a href="https://t.me/opensourcemacosapps"><img alt="Telegram Channel" src="https://img.shields.io/badge/Telegram-Channel-blue.svg" /></a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<img src="https://img.shields.io/badge/Total%20Apps-\(totalApps)-blue" alt="Total Apps"/>
|
||||||
|
<img src="https://img.shields.io/badge/Categories-\(categoriesCount)-green" alt="Categories"/>
|
||||||
|
<img src="https://img.shields.io/badge/Last%20Updated-\(lastUpdated.replacingOccurrences(of: " ", with: "%20"))-orange" alt="Last Updated"/>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="./icons/icon.png">
|
<a href="#audio">Audio</a> •
|
||||||
</p>
|
<a href="#backup">Backup</a> •
|
||||||
|
<a href="#browser">Browser</a> •
|
||||||
# Awesome macOS open source applications
|
<a href="#chat">Chat</a> •
|
||||||
|
<a href="#cryptocurrency">Crypto</a> •
|
||||||
<p align="left">
|
<a href="#database">Database</a> •
|
||||||
<a href="https://github.com/sindresorhus/awesome"><img alt="Awesome" src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" /></a>
|
<a href="#development">Dev</a> •
|
||||||
<a href="https://gitter.im/open-source-mac-os-apps/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link"><img alt="Join the chat at gitter" src="https://badges.gitter.im/Join%20Chat.svg" /></a>
|
<a href="#editors">Editors</a> •
|
||||||
|
<a href="#graphics">Graphics</a> •
|
||||||
|
<a href="#productivity">Productivity</a> •
|
||||||
|
<a href="#utilities">Utilities</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
List of awesome open source applications for macOS. This list contains a lot of native, and cross-platform apps. The main goal of this repository is to find free open source apps and start contributing. Feel free to [contribute](CONTRIBUTING.md) to the list, any suggestions are welcome!
|
List of awesome open source applications for macOS. This list contains a lot of native, and cross-platform apps. The main goal of this repository is to find free open source apps and start contributing. Feel free to [contribute](CONTRIBUTING.md) to the list, any suggestions are welcome!
|
||||||
@@ -30,30 +61,40 @@ To receive all new or popular applications you can join our [telegram channel](h
|
|||||||
|
|
||||||
Hey friend! Help me out for a couple of :beers:! <span class="badge-patreon"><a href="https://www.patreon.com/serhiilondar" title="Donate to this project using Patreon"><img src="https://img.shields.io/badge/patreon-donate-yellow.svg" alt="Patreon donate button" /></a></span>
|
Hey friend! Help me out for a couple of :beers:! <span class="badge-patreon"><a href="https://www.patreon.com/serhiilondar" title="Donate to this project using Patreon"><img src="https://img.shields.io/badge/patreon-donate-yellow.svg" alt="Patreon donate button" /></a></span>
|
||||||
|
|
||||||
|
## 📊 Statistics
|
||||||
|
|
||||||
|
| Metric | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| 📱 Total Applications | \(totalApps) |
|
||||||
|
| 📂 Categories | \(categoriesCount) |
|
||||||
|
| 🔝 Top Languages | \(languagesSummary) |
|
||||||
|
|
||||||
## Languages
|
## Languages
|
||||||
|
|
||||||
You can see in which language an app is written. Currently there are following languages:
|
You can see in which language an app is written. Currently there are following languages:
|
||||||
|
|
||||||
- ![c_icon] - C language.
|
| Language | Icon |
|
||||||
- ![cpp_icon] - C++ language.
|
|----------|------|
|
||||||
- ![c_sharp_icon] - C# language.
|
| C | <img src='./icons/c-16.png' alt='C' height='16'/> |
|
||||||
- ![clojure_icon] - Clojure language.
|
| C++ | <img src='./icons/cpp-16.png' alt='C++' height='16'/> |
|
||||||
- ![coffee_script_icon] - CoffeeScript language.
|
| C# | <img src='./icons/csharp-16.png' alt='C#' height='16'/> |
|
||||||
- ![css_icon] - CSS language.
|
| Clojure | <img src='./icons/clojure-16.png' alt='Clojure' height='16'/> |
|
||||||
- ![go_icon] - Go language.
|
| CoffeeScript | <img src='./icons/coffeescript-16.png' alt='CoffeeScript' height='16'/> |
|
||||||
- ![elm_icon] - Elm language.
|
| CSS | <img src='./icons/css-16.png' alt='CSS' height='16'/> |
|
||||||
- ![haskell_icon] - Haskell language.
|
| Elm | <img src='./icons/elm-16.png' alt='Elm' height='16'/> |
|
||||||
- ![javascript_icon] - JavaScript language.
|
| Go | <img src='./icons/golang-16.png' alt='Go' height='16'/> |
|
||||||
- ![lua_icon] - Lua language.
|
| Haskell | <img src='./icons/haskell-16.png' alt='Haskell' height='16'/> |
|
||||||
- ![metal_icon] - Metal language.
|
| Java | <img src='./icons/java-16.png' alt='Java' height='16'/> |
|
||||||
- ![objective_c_icon] - Objective-C language.
|
| JavaScript | <img src='./icons/javascript-16.png' alt='JavaScript' height='16'/> |
|
||||||
- ![python_icon] - Python language.
|
| Lua | <img src='./icons/Lua-16.png' alt='Lua' height='16'/> |
|
||||||
- ![ruby_icon] - Ruby language.
|
| Objective-C | <img src='./icons/objective-c-16.png' alt='Objective-C' height='16'/> |
|
||||||
- ![rust_icon] - Rust language.
|
| Python | <img src='./icons/python-16.png' alt='Python' height='16'/> |
|
||||||
- ![shell_icon] - Shell language.
|
| Ruby | <img src='./icons/ruby-16.png' alt='Ruby' height='16'/> |
|
||||||
- ![swift_icon] - Swift language.
|
| Rust | <img src='./icons/rust-16.png' alt='Rust' height='16'/> |
|
||||||
- ![typescript_icon] - TypeScript language.
|
| Shell | <img src='./icons/shell-16.png' alt='Shell' height='16'/> |
|
||||||
|
| Swift | <img src='./icons/swift-16.png' alt='Swift' height='16'/> |
|
||||||
|
| TypeScript | <img src='./icons/typescript-16.png' alt='TypeScript' height='16'/> |
|
||||||
|
| Metal | <img src='./icons/metal-16.png' alt='Metal' height='16'/> |
|
||||||
|
|
||||||
## Contents
|
## Contents
|
||||||
- [Audio](#audio)
|
- [Audio](#audio)
|
||||||
@@ -107,9 +148,12 @@ You can see in which language an app is written. Currently there are following l
|
|||||||
## Applications
|
## Applications
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
let footer = """
|
let footer = """
|
||||||
|
|
||||||
|
<div align="right"><a href="#contents">⬆️ Back to Top</a></div>
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
Thanks to all the people who contribute:
|
Thanks to all the people who contribute:
|
||||||
@@ -165,6 +209,11 @@ class JSONApplication: Codable {
|
|||||||
var screenshots: [String]
|
var screenshots: [String]
|
||||||
var categories: [String]
|
var categories: [String]
|
||||||
var officialSite: String
|
var officialSite: String
|
||||||
|
// Optional metadata for richer README rendering
|
||||||
|
var homebrewCask: String?
|
||||||
|
var macOSVersion: String? // Minimum macOS version required
|
||||||
|
var appStoreID: String? // Mac App Store ID for direct linking
|
||||||
|
var deprecated: Bool? // Mark if app is no longer maintained
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey {
|
enum CodingKeys: String, CodingKey {
|
||||||
case title
|
case title
|
||||||
@@ -175,9 +224,13 @@ class JSONApplication: Codable {
|
|||||||
case screenshots
|
case screenshots
|
||||||
case categories
|
case categories
|
||||||
case officialSite = "official_site"
|
case officialSite = "official_site"
|
||||||
|
case homebrewCask = "homebrew_cask"
|
||||||
|
case macOSVersion = "macos_version"
|
||||||
|
case appStoreID = "app_store_id"
|
||||||
|
case deprecated
|
||||||
}
|
}
|
||||||
|
|
||||||
init(title: String, iconURL: String, repoURL: String, shortDescription: String, languages: [String], screenshots: [String], categories: [String], officialSite: String) {
|
init(title: String, iconURL: String, repoURL: String, shortDescription: String, languages: [String], screenshots: [String], categories: [String], officialSite: String, homebrewCask: String? = nil, macOSVersion: String? = nil, appStoreID: String? = nil, deprecated: Bool? = nil) {
|
||||||
self.title = title
|
self.title = title
|
||||||
self.iconURL = iconURL
|
self.iconURL = iconURL
|
||||||
self.repoURL = repoURL
|
self.repoURL = repoURL
|
||||||
@@ -186,6 +239,10 @@ class JSONApplication: Codable {
|
|||||||
self.screenshots = screenshots
|
self.screenshots = screenshots
|
||||||
self.categories = categories
|
self.categories = categories
|
||||||
self.officialSite = officialSite
|
self.officialSite = officialSite
|
||||||
|
self.homebrewCask = homebrewCask
|
||||||
|
self.macOSVersion = macOSVersion
|
||||||
|
self.appStoreID = appStoreID
|
||||||
|
self.deprecated = deprecated
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,6 +295,26 @@ class ReadmeGenerator {
|
|||||||
let subcategories = categories.filter({ $0.parent != nil && !$0.parent!.isEmpty })
|
let subcategories = categories.filter({ $0.parent != nil && !$0.parent!.isEmpty })
|
||||||
let applications = applicationsObject.applications
|
let applications = applicationsObject.applications
|
||||||
|
|
||||||
|
// Validate applications
|
||||||
|
let validApplications = applications.filter { app in
|
||||||
|
let isValid = !app.title.isEmpty && !app.repoURL.isEmpty
|
||||||
|
if !isValid {
|
||||||
|
print("⚠️ Warning: Skipping invalid app - Title: '\(app.title)', URL: '\(app.repoURL)'")
|
||||||
|
}
|
||||||
|
return isValid
|
||||||
|
}
|
||||||
|
|
||||||
|
print("📊 Total apps: \(validApplications.count), Invalid/skipped: \(applications.count - validApplications.count)")
|
||||||
|
|
||||||
|
// Calculate language statistics
|
||||||
|
var languageStats: [String: Int] = [:]
|
||||||
|
for app in validApplications {
|
||||||
|
for lang in app.languages {
|
||||||
|
let normalizedLang = normalizeLanguageName(lang)
|
||||||
|
languageStats[normalizedLang, default: 0] += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for subcategory in subcategories {
|
for subcategory in subcategories {
|
||||||
if let index = categories.lastIndex(where: { $0.parent != subcategory.id }) {
|
if let index = categories.lastIndex(where: { $0.parent != subcategory.id }) {
|
||||||
categories.remove(at: index)
|
categories.remove(at: index)
|
||||||
@@ -246,41 +323,109 @@ class ReadmeGenerator {
|
|||||||
|
|
||||||
categories = categories.sorted(by: { $0.title < $1.title })
|
categories = categories.sorted(by: { $0.title < $1.title })
|
||||||
|
|
||||||
|
// Generate header with statistics
|
||||||
|
let header = generateHeader(
|
||||||
|
totalApps: validApplications.count,
|
||||||
|
categoriesCount: categories.count + subcategories.count,
|
||||||
|
languageStats: languageStats
|
||||||
|
)
|
||||||
|
|
||||||
readmeString.append(header)
|
readmeString.append(header)
|
||||||
print("Start iteration....")
|
print("Start iteration....")
|
||||||
|
|
||||||
for category in categories {
|
for category in categories {
|
||||||
readmeString.append(String.enter + String.section + String.space + category.title + String.enter)
|
// Add category header with emoji and count
|
||||||
var categoryApplications = applications.filter({ $0.categories.contains(category.id) })
|
let categoryApps = validApplications.filter({ $0.categories.contains(category.id) })
|
||||||
categoryApplications = categoryApplications.sorted(by: { $0.title < $1.title })
|
let categoryCount = categoryApps.count
|
||||||
|
let categoryEmoji = getCategoryEmoji(category.id)
|
||||||
|
// Add explicit anchor for TOC linking
|
||||||
|
let anchorId = generateAnchorId(category.title)
|
||||||
|
readmeString.append(String.enter + "<a id=\"\(anchorId)\"></a>" + String.enter)
|
||||||
|
readmeString.append(String.section + String.space + categoryEmoji + String.space + category.title + String.space + "(\(categoryCount))" + String.enter)
|
||||||
|
|
||||||
|
var categoryApplications = categoryApps
|
||||||
|
categoryApplications = categoryApplications.sorted(by: { $0.title.lowercased() < $1.title.lowercased() })
|
||||||
|
|
||||||
for application in categoryApplications {
|
for application in categoryApplications {
|
||||||
readmeString.append(application.markdownDescription())
|
readmeString.append(application.markdownDescription())
|
||||||
readmeString.append(String.enter)
|
readmeString.append(String.enter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add "Back to Top" link at the end of each category
|
||||||
|
readmeString.append("<div align=\"right\"><a href=\"#contents\">⬆️ Back to Top</a></div>" + String.enter)
|
||||||
|
|
||||||
var subcategories = subcategories.filter({ $0.parent == category.id })
|
var subcategories = subcategories.filter({ $0.parent == category.id })
|
||||||
guard subcategories.count > 0 else { continue }
|
guard subcategories.count > 0 else { continue }
|
||||||
subcategories = subcategories.sorted(by: { $0.title < $1.title })
|
subcategories = subcategories.sorted(by: { $0.title < $1.title })
|
||||||
for subcategory in subcategories {
|
for subcategory in subcategories {
|
||||||
readmeString.append(String.enter + String.subsection + String.space + subcategory.title + String.enter)
|
// Add subcategory header with emoji and count
|
||||||
var categoryApplications = applications.filter({ $0.categories.contains(subcategory.id) })
|
let subcategoryApps = validApplications.filter({ $0.categories.contains(subcategory.id) })
|
||||||
categoryApplications = categoryApplications.sorted(by: { $0.title < $1.title })
|
let subcategoryCount = subcategoryApps.count
|
||||||
|
let subcategoryEmoji = getCategoryEmoji(subcategory.id)
|
||||||
|
// Add explicit anchor for TOC linking
|
||||||
|
let subAnchorId = generateAnchorId(subcategory.title)
|
||||||
|
readmeString.append(String.enter + "<a id=\"\(subAnchorId)\"></a>" + String.enter)
|
||||||
|
readmeString.append(String.subsection + String.space + subcategoryEmoji + String.space + subcategory.title + String.space + "(\(subcategoryCount))" + String.enter)
|
||||||
|
|
||||||
|
var categoryApplications = subcategoryApps
|
||||||
|
categoryApplications = categoryApplications.sorted(by: { $0.title.lowercased() < $1.title.lowercased() })
|
||||||
|
|
||||||
for application in categoryApplications {
|
for application in categoryApplications {
|
||||||
readmeString.append(application.markdownDescription())
|
readmeString.append(application.markdownDescription())
|
||||||
readmeString.append(String.enter)
|
readmeString.append(String.enter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add "Back to Top" link at the end of each subcategory
|
||||||
|
readmeString.append("<div align=\"right\"><a href=\"#contents\">⬆️ Back to Top</a></div>" + String.enter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
print("Finish iteration...")
|
print("Finish iteration...")
|
||||||
readmeString.append(footer)
|
readmeString.append(footer)
|
||||||
try readmeString.data(using: .utf8)?.write(to: url.appendingPathComponent(FilePaths.readme.rawValue))
|
try readmeString.data(using: .utf8)?.write(to: url.appendingPathComponent(FilePaths.readme.rawValue))
|
||||||
print("Finish")
|
|
||||||
|
// Generate JSON API file for external consumers
|
||||||
|
try generateAPIFile(applications: validApplications, categories: categoriesObject.categories, to: url)
|
||||||
|
|
||||||
|
print("✅ Finish - Generated README.md and api.json")
|
||||||
} catch {
|
} catch {
|
||||||
print(error)
|
print("❌ Error: \(error)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate a JSON API file for external consumers
|
||||||
|
private func generateAPIFile(applications: [JSONApplication], categories: [Category], to baseURL: URL) throws {
|
||||||
|
let apiData: [String: Any] = [
|
||||||
|
"generated_at": ISO8601DateFormatter().string(from: Date()),
|
||||||
|
"total_apps": applications.count,
|
||||||
|
"total_categories": categories.count,
|
||||||
|
"apps_by_category": Dictionary(grouping: applications, by: { $0.categories.first ?? "other" })
|
||||||
|
.mapValues { $0.count }
|
||||||
|
]
|
||||||
|
|
||||||
|
let jsonData = try JSONSerialization.data(withJSONObject: apiData, options: [.prettyPrinted, .sortedKeys])
|
||||||
|
try jsonData.write(to: baseURL.appendingPathComponent("api.json"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to normalize language names for statistics
|
||||||
|
func normalizeLanguageName(_ lang: String) -> String {
|
||||||
|
switch lang.lowercased() {
|
||||||
|
case "objective_c": return "Objective-C"
|
||||||
|
case "cpp": return "C++"
|
||||||
|
case "c_sharp": return "C#"
|
||||||
|
case "coffee_script": return "CoffeeScript"
|
||||||
|
default: return lang.capitalized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to generate GitHub-compatible anchor IDs from titles
|
||||||
|
func generateAnchorId(_ title: String) -> String {
|
||||||
|
return title.lowercased()
|
||||||
|
.replacingOccurrences(of: " / ", with: "--") // Handle " / " like GitHub does
|
||||||
|
.replacingOccurrences(of: "/", with: "-")
|
||||||
|
.replacingOccurrences(of: " & ", with: "--") // Handle " & " like GitHub does
|
||||||
|
.replacingOccurrences(of: "&", with: "-")
|
||||||
|
.replacingOccurrences(of: " ", with: "-")
|
||||||
}
|
}
|
||||||
|
|
||||||
extension String {
|
extension String {
|
||||||
@@ -297,25 +442,189 @@ extension JSONApplication {
|
|||||||
var markdownDescription = String.empty
|
var markdownDescription = String.empty
|
||||||
var languages: String = String.empty
|
var languages: String = String.empty
|
||||||
for lang in self.languages {
|
for lang in self.languages {
|
||||||
languages.append("![\(lang)\(String.iconPrefix)] ")
|
languages.append(languageIconHTML(for: lang) + " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
markdownDescription.append("- [\(self.title)](\(self.repoURL)) - \(self.shortDescription) \(languages)")
|
// Header line with a standard Markdown link so it's always clickable
|
||||||
/*
|
// Add deprecated indicator if the app is marked as deprecated
|
||||||
if self.screenshots.count > 0 {
|
let deprecatedIndicator = (self.deprecated ?? false) ? " ⚠️ **[Deprecated]**" : ""
|
||||||
var screenshotsString = String.empty
|
let macOSBadge = self.macOSVersion.map { " %2B-blue)" } ?? ""
|
||||||
screenshotsString += (String.space + Constants.detailsBeginString + String.space)
|
markdownDescription.append("- [\(self.title)](\(self.repoURL))\(deprecatedIndicator)\(macOSBadge) - \(self.shortDescription)\n")
|
||||||
self.screenshots.forEach({
|
|
||||||
screenshotsString += (String.space + (NSString(format: Constants.srcLinePattern as NSString, $0 as CVarArg) as String) + String.space)
|
// Collapsible extra details (languages, links, screenshots) indented to belong to the list item
|
||||||
})
|
let indent = " "
|
||||||
screenshotsString += (String.space + Constants.detailsEndString + String.space)
|
markdownDescription.append("\n" + indent + "<details>\n")
|
||||||
markdownDescription.append(screenshotsString)
|
markdownDescription.append(indent + "<summary>More</summary>\n")
|
||||||
}
|
markdownDescription.append(indent + "<p>\n\n")
|
||||||
*/
|
|
||||||
|
// Add languages
|
||||||
|
markdownDescription.append(" **Languages:** \(languages)\n\n")
|
||||||
|
|
||||||
|
// Add download/badge section
|
||||||
|
let ownerRepo = githubOwnerRepo(from: self.repoURL)
|
||||||
|
var badges = [String]()
|
||||||
|
// App Store button if appStoreID is set or if officialSite points to App Store
|
||||||
|
if let appStoreID = self.appStoreID, !appStoreID.isEmpty {
|
||||||
|
let appStoreURL = "https://apps.apple.com/app/id\(appStoreID)"
|
||||||
|
let appStoreButton = "<a href='\(appStoreURL)'><img src='./icons/app_store-16.png' alt='App Store' title='Download on the Mac App Store' height='16'/> App Store</a>"
|
||||||
|
badges.append(appStoreButton)
|
||||||
|
} else if isAppStoreURL(self.officialSite) {
|
||||||
|
let appStoreButton = "<a href='\(self.officialSite)'><img src='./icons/app_store-16.png' alt='App Store' title='Download on the Mac App Store' height='16'/> App Store</a>"
|
||||||
|
badges.append(appStoreButton)
|
||||||
|
}
|
||||||
|
// GitHub Releases badge
|
||||||
|
if let (owner, repo) = ownerRepo {
|
||||||
|
let releasesURL = "https://github.com/\(owner)/\(repo)/releases/latest"
|
||||||
|
let releaseBadge = "<a href='\(releasesURL)'><img src='https://img.shields.io/github/v/release/\(owner)/\(repo)?display_name=tag&sort=semver' alt='Latest Release'/></a>"
|
||||||
|
badges.append(releaseBadge)
|
||||||
|
// Stars and license badges as additional improvements
|
||||||
|
let starsBadge = "<a href='\(self.repoURL)'><img src='https://img.shields.io/github/stars/\(owner)/\(repo)?style=social' alt='GitHub stars'/></a>"
|
||||||
|
let licenseBadge = "<img src='https://img.shields.io/github/license/\(owner)/\(repo)' alt='License'/>"
|
||||||
|
badges.append(starsBadge)
|
||||||
|
badges.append(licenseBadge)
|
||||||
|
}
|
||||||
|
// Homebrew availability badge if provided
|
||||||
|
if let cask = self.homebrewCask, !cask.isEmpty {
|
||||||
|
let brewURL = "https://formulae.brew.sh/cask/\(cask)"
|
||||||
|
let brewBadge = "<a href='\(brewURL)'><img src='https://img.shields.io/badge/Homebrew-available-ebb000?logo=homebrew&logoColor=white' alt='Homebrew cask'/></a>"
|
||||||
|
badges.append(brewBadge)
|
||||||
|
}
|
||||||
|
if badges.isEmpty == false {
|
||||||
|
markdownDescription.append(" **Links:** \(badges.joined(separator: " "))\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add official site if available
|
||||||
|
if !self.officialSite.isEmpty {
|
||||||
|
markdownDescription.append(" **Website:** [\(self.officialSite)](\(self.officialSite))\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add screenshots with lazy loading to improve page load performance
|
||||||
|
if self.screenshots.count > 0 {
|
||||||
|
markdownDescription.append(" **Screenshots:**\n\n")
|
||||||
|
|
||||||
|
// Limit to first 3 screenshots to reduce load time
|
||||||
|
let limitedScreenshots = self.screenshots.count > 3 ? Array(self.screenshots.prefix(3)) : self.screenshots
|
||||||
|
|
||||||
|
limitedScreenshots.forEach({
|
||||||
|
markdownDescription.append(" <img src='\($0)' width='400' loading='lazy'/>\n\n")
|
||||||
|
})
|
||||||
|
|
||||||
|
// Add a note if there are more screenshots
|
||||||
|
if self.screenshots.count > 3 {
|
||||||
|
markdownDescription.append(" *(\(self.screenshots.count - 3) more screenshots available in the repository)*\n\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
markdownDescription.append(indent + "</p>\n")
|
||||||
|
markdownDescription.append(indent + "</details>\n")
|
||||||
|
|
||||||
return markdownDescription
|
return markdownDescription
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Build HTML <img> tags for language icons to ensure rendering inside HTML blocks
|
||||||
|
private func languageIconHTML(for languageKey: String) -> String {
|
||||||
|
struct LanguageIcon { let fileName: String; let label: String }
|
||||||
|
let icons: [String: LanguageIcon] = [
|
||||||
|
"c": .init(fileName: "c-16.png", label: "C"),
|
||||||
|
"cpp": .init(fileName: "cpp-16.png", label: "C++"),
|
||||||
|
"c_sharp": .init(fileName: "csharp-16.png", label: "C#"),
|
||||||
|
"clojure": .init(fileName: "clojure-16.png", label: "Clojure"),
|
||||||
|
"coffee_script": .init(fileName: "coffeescript-16.png", label: "CoffeeScript"),
|
||||||
|
"css": .init(fileName: "css-16.png", label: "CSS"),
|
||||||
|
"elm": .init(fileName: "elm-16.png", label: "Elm"),
|
||||||
|
"go": .init(fileName: "golang-16.png", label: "Go"),
|
||||||
|
"haskell": .init(fileName: "haskell-16.png", label: "Haskell"),
|
||||||
|
"java": .init(fileName: "java-16.png", label: "Java"),
|
||||||
|
"javascript": .init(fileName: "javascript-16.png", label: "JavaScript"),
|
||||||
|
"lua": .init(fileName: "Lua-16.png", label: "Lua"),
|
||||||
|
"objective_c": .init(fileName: "objective-c-16.png", label: "Objective-C"),
|
||||||
|
"python": .init(fileName: "python-16.png", label: "Python"),
|
||||||
|
"ruby": .init(fileName: "ruby-16.png", label: "Ruby"),
|
||||||
|
"rust": .init(fileName: "rust-16.png", label: "Rust"),
|
||||||
|
"shell": .init(fileName: "shell-16.png", label: "Shell"),
|
||||||
|
"swift": .init(fileName: "swift-16.png", label: "Swift"),
|
||||||
|
"typescript": .init(fileName: "typescript-16.png", label: "TypeScript")
|
||||||
|
]
|
||||||
|
let key = languageKey.lowercased()
|
||||||
|
if let icon = icons[key] {
|
||||||
|
return "<img src='./icons/\(icon.fileName)' alt='\(icon.label) icon' title='\(icon.label)' height='16'/>"
|
||||||
|
} else {
|
||||||
|
return "<code>\(languageKey)</code>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Helpers
|
||||||
|
private func githubOwnerRepo(from repoURL: String) -> (String, String)? {
|
||||||
|
guard repoURL.contains("github.com") else { return nil }
|
||||||
|
let parts = repoURL.split(separator: "/").map(String.init)
|
||||||
|
guard let owner = parts.drop(while: { $0 != "github.com" }).dropFirst().first,
|
||||||
|
let repoRaw = parts.drop(while: { $0 != "github.com" }).dropFirst(2).first else { return nil }
|
||||||
|
let repo = repoRaw.replacingOccurrences(of: ".git", with: "")
|
||||||
|
return (owner, repo)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func isAppStoreURL(_ string: String) -> Bool {
|
||||||
|
return string.contains("apps.apple.com") || string.contains("itunes.apple.com")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to get emoji for categories
|
||||||
|
func getCategoryEmoji(_ categoryId: String) -> String {
|
||||||
|
switch categoryId {
|
||||||
|
case "audio": return "🎵"
|
||||||
|
case "backup": return "💾"
|
||||||
|
case "browser": return "🌐"
|
||||||
|
case "chat": return "💬"
|
||||||
|
case "cryptocurrency": return "💰"
|
||||||
|
case "database": return "🗄️"
|
||||||
|
case "development": return "👨💻"
|
||||||
|
case "downloader": return "⬇️"
|
||||||
|
case "editors": return "📝"
|
||||||
|
case "extensions": return "🧩"
|
||||||
|
case "finder": return "🔍"
|
||||||
|
case "games": return "🎮"
|
||||||
|
case "graphics": return "🎨"
|
||||||
|
case "ide": return "💻"
|
||||||
|
case "images": return "🖼️"
|
||||||
|
case "keyboard": return "⌨️"
|
||||||
|
case "mail": return "📧"
|
||||||
|
case "medical": return "🏥"
|
||||||
|
case "menubar": return "📊"
|
||||||
|
case "music": return "🎧"
|
||||||
|
case "news": return "📰"
|
||||||
|
case "notes": return "📔"
|
||||||
|
case "other": return "📦"
|
||||||
|
case "player": return "▶️"
|
||||||
|
case "podcast": return "🎙️"
|
||||||
|
case "productivity": return "⏱️"
|
||||||
|
case "screensaver": return "🌙"
|
||||||
|
case "security": return "🔒"
|
||||||
|
case "sharing-files": return "📤"
|
||||||
|
case "social-networking": return "👥"
|
||||||
|
case "streaming": return "📡"
|
||||||
|
case "system": return "⚙️"
|
||||||
|
case "terminal": return "📺"
|
||||||
|
case "touch-bar": return "🎚️"
|
||||||
|
case "utilities": return "🛠️"
|
||||||
|
case "video": return "🎬"
|
||||||
|
case "vpn--proxy": return "🔐"
|
||||||
|
case "wallpaper": return "🖥️"
|
||||||
|
case "window-management": return "🪟"
|
||||||
|
// Subcategories
|
||||||
|
case "git": return "📦"
|
||||||
|
case "ios--macos": return "📱"
|
||||||
|
case "json-parsing": return "🔄"
|
||||||
|
case "web-development": return "🌍"
|
||||||
|
case "other-development": return "🔧"
|
||||||
|
case "csv": return "📊"
|
||||||
|
case "json": return "📋"
|
||||||
|
case "markdown": return "📝"
|
||||||
|
case "tex": return "📐"
|
||||||
|
case "text": return "✏️"
|
||||||
|
default: return "📦"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum FilePaths: String {
|
enum FilePaths: String {
|
||||||
case readme = "./README.md"
|
case readme = "./README.md"
|
||||||
case applications = "./applications.json"
|
case applications = "./applications.json"
|
||||||
|
|||||||
7
.github/weekly-digest.yml
vendored
7
.github/weekly-digest.yml
vendored
@@ -1,7 +0,0 @@
|
|||||||
# Configuration for weekly-digest - https://github.com/apps/weekly-digest
|
|
||||||
publishDay: mon
|
|
||||||
canPublishIssues: true
|
|
||||||
canPublishPullRequests: true
|
|
||||||
canPublishContributors: true
|
|
||||||
canPublishStargazers: true
|
|
||||||
canPublishCommits: true
|
|
||||||
3
.github/workflows/main.yml
vendored
3
.github/workflows/main.yml
vendored
@@ -7,9 +7,8 @@ jobs:
|
|||||||
generate-readme:
|
generate-readme:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v6
|
||||||
- run: swift ./.github/main.swift
|
- run: swift ./.github/main.swift
|
||||||
- run: chmod +x ./.github/deploy.sh
|
|
||||||
- run: git config user.name "serhii-londar"
|
- run: git config user.name "serhii-londar"
|
||||||
- run: git config user.email "serhii.londar@gmail.com"
|
- run: git config user.email "serhii.londar@gmail.com"
|
||||||
- run: git add README.md
|
- run: git add README.md
|
||||||
|
|||||||
2
.github/workflows/pr.yml
vendored
2
.github/workflows/pr.yml
vendored
@@ -10,5 +10,5 @@ jobs:
|
|||||||
- run: gem install awesome_bot
|
- run: gem install awesome_bot
|
||||||
- run: gem install bundler
|
- run: gem install bundler
|
||||||
- run: gem install danger
|
- run: gem install danger
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v6
|
||||||
- run: awesome_bot applications.json -w https://matrix.org,https://camo.githubusercontent.com,http://joshparnham.com,https://pock.pigigaldi.com,https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-6,https://adequate.systems/ --allow 429
|
- run: awesome_bot applications.json -w https://matrix.org,https://camo.githubusercontent.com,http://joshparnham.com,https://pock.pigigaldi.com,https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-6,https://adequate.systems/ --allow 429
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"sweetpad.build.xcodeWorkspacePath": ".github/ReadmeGenerator.xcodeproj/project.xcworkspace"
|
||||||
|
}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
<!--- Provide a general summary of your changes in the Title above -->
|
<!--- Provide a general summary of your changes in the Title above -->
|
||||||
|
|
||||||
## Project URL
|
## Project URL
|
||||||
<!--- The project URL -->
|
https://github.com/maxnd/mxMarkEdit
|
||||||
|
|
||||||
## Category
|
## Category
|
||||||
<!--- Category in Awesome macOS open source applications where the project will be added -->
|
markdown, text, editors
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
<!--- Describe your changes in detail -->
|
mxMarkEdit is a free software for Mac for writing texts and todo items in Markdown format and easily exporting them to other formats with Pandoc. In each document, it’s available an Excel-like grid useful to manage various sets of data. Some Markdown markers are hidden, as the text that follows them or is contained within them is properly formatted. At the left of the text, there’s a list of the titles and todo items. By clicking on an item in this list, the cursor moves to the corresponding title or todo item. While moving the cursor in the text, the corresponding title or todo item is highlighted. The app has many functionalities and shortcuts to manage easily a document.
|
||||||
|
|
||||||
## Why it should be included to `Awesome macOS open source applications ` (optional)
|
## Why it should be included to `Awesome macOS open source applications ` (optional)
|
||||||
|
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
## Checklist
|
## Checklist
|
||||||
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
|
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
|
||||||
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
||||||
- [ ] Edit [applications.json](https://github.com/serhii-londar/open-source-mac-os-apps/blob/master/applications.json) instead of [README.md](https://github.com/serhii-londar/open-source-mac-os-apps/blob/master/README.md).
|
- [X] Edit [applications.json](https://github.com/serhii-londar/open-source-mac-os-apps/blob/master/applications.json) instead of [README.md](https://github.com/serhii-londar/open-source-mac-os-apps/blob/master/README.md).
|
||||||
- [ ] Only one project/change is in this pull request
|
- [X] Only one project/change is in this pull request
|
||||||
- [ ] Screenshots(s) added if any
|
- [X] Screenshots(s) added if any
|
||||||
- [ ] Has a commit from less than 2 years ago
|
- [X] Has a commit from less than 2 years ago
|
||||||
- [ ] Has a **clear** README in English
|
- [X] Has a **clear** README in English
|
||||||
|
|||||||
58
api.json
Normal file
58
api.json
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"apps_by_category" : {
|
||||||
|
"audio" : 35,
|
||||||
|
"backup" : 5,
|
||||||
|
"browser" : 11,
|
||||||
|
"chat" : 18,
|
||||||
|
"cryptocurrency" : 5,
|
||||||
|
"csv" : 1,
|
||||||
|
"database" : 18,
|
||||||
|
"development" : 7,
|
||||||
|
"downloader" : 7,
|
||||||
|
"editors" : 1,
|
||||||
|
"Editors" : 1,
|
||||||
|
"extensions" : 11,
|
||||||
|
"finder" : 11,
|
||||||
|
"games" : 11,
|
||||||
|
"git" : 19,
|
||||||
|
"graphics" : 14,
|
||||||
|
"ide" : 12,
|
||||||
|
"images" : 15,
|
||||||
|
"ios--macos" : 39,
|
||||||
|
"json" : 2,
|
||||||
|
"json-parsing" : 4,
|
||||||
|
"keyboard" : 9,
|
||||||
|
"mail" : 7,
|
||||||
|
"markdown" : 9,
|
||||||
|
"medical" : 1,
|
||||||
|
"menubar" : 32,
|
||||||
|
"music" : 11,
|
||||||
|
"news" : 5,
|
||||||
|
"notes" : 13,
|
||||||
|
"other" : 21,
|
||||||
|
"other-development" : 5,
|
||||||
|
"player" : 4,
|
||||||
|
"podcast" : 6,
|
||||||
|
"productivity" : 44,
|
||||||
|
"screensaver" : 10,
|
||||||
|
"security" : 6,
|
||||||
|
"sharing-files" : 9,
|
||||||
|
"social-networking" : 9,
|
||||||
|
"streaming" : 2,
|
||||||
|
"subtitles" : 3,
|
||||||
|
"system" : 21,
|
||||||
|
"terminal" : 8,
|
||||||
|
"tex" : 1,
|
||||||
|
"text" : 8,
|
||||||
|
"touch-bar" : 6,
|
||||||
|
"utilities" : 57,
|
||||||
|
"video" : 17,
|
||||||
|
"vpn--proxy" : 6,
|
||||||
|
"wallpaper" : 11,
|
||||||
|
"web-development" : 14,
|
||||||
|
"window-management" : 11
|
||||||
|
},
|
||||||
|
"generated_at" : "2025-12-04T16:11:30Z",
|
||||||
|
"total_apps" : 613,
|
||||||
|
"total_categories" : 49
|
||||||
|
}
|
||||||
@@ -1,5 +1,78 @@
|
|||||||
{
|
{
|
||||||
"applications": [
|
"applications": [
|
||||||
|
{
|
||||||
|
"short_description": "Blazingly fast, customisable multi tool, application launcher",
|
||||||
|
"categories": [
|
||||||
|
"productivity",
|
||||||
|
"utilities",
|
||||||
|
"menubar"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/unsecretised/rustcast",
|
||||||
|
"title": "RustCast",
|
||||||
|
"icon_url": "https://rustcast.umangsurana.com/icon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://rustcast.umangsurana.com/rustcast-v0-5-0.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://rustcast.umangsurana.com",
|
||||||
|
"languages": [
|
||||||
|
"rust"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Three-finger trackpad gestures for middle-click and middle-drag.",
|
||||||
|
"categories": [
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/NullPointerDepressiveDisorder/MiddleDrag",
|
||||||
|
"title": "MiddleDrag",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/NullPointerDepressiveDisorder/MiddleDrag/main/Assets.xcassets/AppIcon.appiconset/Icon-256.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/NullPointerDepressiveDisorder/MiddleDrag/main/Screenshots/MiddleDrag-Demo.gif"
|
||||||
|
],
|
||||||
|
"official_site": "",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description":"Take handwritten notes with ease",
|
||||||
|
"categories":[
|
||||||
|
"productivity",
|
||||||
|
"macos",
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url":"https://github.com/xournalpp/xournalpp/",
|
||||||
|
"title":"Xournal++",
|
||||||
|
"icon_url":"https://github.com/xournalpp/xournalpp/blob/master/mac-setup/icon/Icon1024.png",
|
||||||
|
"screenshots":[],
|
||||||
|
"official_site":"",
|
||||||
|
"languages":[
|
||||||
|
"cpp",
|
||||||
|
"lua",
|
||||||
|
"c",
|
||||||
|
"python"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "A visual editor of Markdown document, tasks and tables.",
|
||||||
|
"categories": [
|
||||||
|
"markdown",
|
||||||
|
"editors",
|
||||||
|
"text" ],
|
||||||
|
"repo_url": "https://github.com/maxnd/mxMarkEdit",
|
||||||
|
"title": "mxMarkEdit",
|
||||||
|
"icon_url": "https://github.com/maxnd/mxMarkEdit/blob/main/icon128.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://github.com/maxnd/mxMarkEdit/blob/main/screenshots/screenshot1.png",
|
||||||
|
"https://github.com/maxnd/mxMarkEdit/blob/main/screenshots/screenshot2.png",
|
||||||
|
"https://github.com/maxnd/mxMarkEdit/blob/main/screenshots/screenshot3.png",
|
||||||
|
"https://github.com/maxnd/mxMarkEdit/blob/main/screenshots/screenshot4.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://github.com/maxnd/mxMarkEdit",
|
||||||
|
"languages": [
|
||||||
|
"free-pascal"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"short_description": "A handy menu bar translator app that supports DeepL and Google Translate.",
|
"short_description": "A handy menu bar translator app that supports DeepL and Google Translate.",
|
||||||
"categories": [
|
"categories": [
|
||||||
@@ -15,6 +88,44 @@
|
|||||||
"languages": [
|
"languages": [
|
||||||
"typescript"
|
"typescript"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "A minimal native macOS app to quickly view and Bulk kill running processes.",
|
||||||
|
"categories": [
|
||||||
|
"menubar",
|
||||||
|
"utilities",
|
||||||
|
"productivity"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/designsbymuzeer/Bye-Mac-App",
|
||||||
|
"title": "Bye-AppQuit",
|
||||||
|
"icon_url": "https://github.com/user-attachments/assets/33bfcf78-0bd0-42b1-999b-a5b09b729526",
|
||||||
|
"screenshots": [
|
||||||
|
"https://github.com/user-attachments/assets/63dade24-d967-4946-89e5-f8ae44097b31"
|
||||||
|
|
||||||
|
],
|
||||||
|
"official_site": "https://github.com/designsbymuzeer/Bye-Mac-App",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description":"Locally hosted web application that allows you to perform various operations on PDF files",
|
||||||
|
"categories":[
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url":"https://github.com/Stirling-Tools/Stirling-PDF",
|
||||||
|
"title":"Stirling-PDF",
|
||||||
|
"icon_url":"https://github.com/Stirling-Tools/Stirling-PDF/blob/main/app/core/src/main/resources/static/favicon.png",
|
||||||
|
"screenshots":[
|
||||||
|
|
||||||
|
],
|
||||||
|
"official_site":"stirlingpdf.com",
|
||||||
|
"languages":[
|
||||||
|
"java",
|
||||||
|
"html",
|
||||||
|
"javascript",
|
||||||
|
"html"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"short_description": "Keka is a full featured file archiver, as easy as it can be.",
|
"short_description": "Keka is a full featured file archiver, as easy as it can be.",
|
||||||
@@ -31,6 +142,20 @@
|
|||||||
"languages": [
|
"languages": [
|
||||||
"swift"
|
"swift"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "OpenCore Legacy Patcher is a tool for installing new MacOS versions on legacy macs.",
|
||||||
|
"categories": [
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/dortania/OpenCore-Legacy-Patcher",
|
||||||
|
"title": "OpenCore Legacy Patcher",
|
||||||
|
"icon_url": "",
|
||||||
|
"screenshots": [],
|
||||||
|
"official_site": "https://dortania.github.io/OpenCore-Legacy-Patcher/",
|
||||||
|
"languages": [
|
||||||
|
"python"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"short_description": "A lightweight and powerful editor for localizing iOS, macOS, tvOS, and watchOS applications.",
|
"short_description": "A lightweight and powerful editor for localizing iOS, macOS, tvOS, and watchOS applications.",
|
||||||
@@ -452,6 +577,24 @@
|
|||||||
"swift"
|
"swift"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"short_description": "macOS application displaying synchronized lyrics with animated word-by-word glow effects for Spotify, Apple Music, and YouTube Music.",
|
||||||
|
"categories": [
|
||||||
|
"audio"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/ateymoori/lyricglow",
|
||||||
|
"title": "LyricGlow",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/ateymoori/lyricglow/main/build/icon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/ateymoori/lyricglow/main/screenshots/lyricglow-synchronized-lyrics-english.png",
|
||||||
|
"https://raw.githubusercontent.com/ateymoori/lyricglow/main/screenshots/lyricglow-artist-images-album-covers.png",
|
||||||
|
"https://raw.githubusercontent.com/ateymoori/lyricglow/main/screenshots/lyricglow-rtl-lyrics-persian.png"
|
||||||
|
],
|
||||||
|
"official_site": "",
|
||||||
|
"languages": [
|
||||||
|
"javascript"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"repo_url": "https://github.com/LumingYin/macOSLucidaGrande",
|
"repo_url": "https://github.com/LumingYin/macOSLucidaGrande",
|
||||||
"official_site": "https://github.com/LumingYin/macOSLucidaGrande/releases",
|
"official_site": "https://github.com/LumingYin/macOSLucidaGrande/releases",
|
||||||
@@ -1099,22 +1242,26 @@
|
|||||||
"javascript"
|
"javascript"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"short_description": "App for all the world’s currencies. ",
|
"short_description": "Official Bitcoin Core software for running a full Bitcoin node.",
|
||||||
"categories": [
|
"categories": [
|
||||||
"cryptocurrency"
|
"cryptocurrency",
|
||||||
],
|
"blockchain",
|
||||||
"repo_url": "https://github.com/balance-io/balance-open",
|
"finance"
|
||||||
"title": "Balance Open",
|
],
|
||||||
"icon_url": "",
|
"repo_url": "https://github.com/bitcoin/bitcoin",
|
||||||
"screenshots": [
|
"title": "Bitcoin Core",
|
||||||
"https://d3vv6lp55qjaqc.cloudfront.net/items/2840292G3j1g102Q3s21/balance-open.png"
|
"icon_url": "https://github.com/bitcoin-core/bitcoincore.org/blob/master/assets/images/bitcoin_core_logo_colored_reversed.png",
|
||||||
],
|
"screenshots": [
|
||||||
"official_site": "",
|
"https://github.com/bitcoin-core/bitcoincore.org/blob/master/assets/images/releases/fee-bump-menu.png"
|
||||||
"languages": [
|
],
|
||||||
"swift"
|
"official_site": "https://bitcoincore.org/",
|
||||||
]
|
"languages": [
|
||||||
},
|
"C++",
|
||||||
|
"Python",
|
||||||
|
"Shell"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"short_description": "macOS menu bar application for tracking crypto coin prices. ",
|
"short_description": "macOS menu bar application for tracking crypto coin prices. ",
|
||||||
"categories": [
|
"categories": [
|
||||||
@@ -1623,20 +1770,6 @@
|
|||||||
"swift"
|
"swift"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"short_description": "Trace tool for iOS/macOS. ",
|
|
||||||
"categories": [
|
|
||||||
"ios--macos"
|
|
||||||
],
|
|
||||||
"repo_url": "https://github.com/everettjf/AppleTrace",
|
|
||||||
"title": "AppleTrace",
|
|
||||||
"icon_url": "",
|
|
||||||
"screenshots": [],
|
|
||||||
"official_site": "",
|
|
||||||
"languages": [
|
|
||||||
"objective_c"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"short_description": "Gives you indication about the average iOS / macOS app stores review times. ",
|
"short_description": "Gives you indication about the average iOS / macOS app stores review times. ",
|
||||||
"categories": [
|
"categories": [
|
||||||
@@ -2340,6 +2473,23 @@
|
|||||||
"typescript"
|
"typescript"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"short_description": "A lightweight open-source API Development, Testing & Mocking platform",
|
||||||
|
"categories": [
|
||||||
|
"web-development"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/requestly/requestly",
|
||||||
|
"title": "Requestly",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/requestly/requestly/master/app/public/favicon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://github.com/user-attachments/assets/a962b213-8744-4ffc-bd04-fcf891f48914",
|
||||||
|
"https://github.com/user-attachments/assets/7bc00c7e-c280-40eb-9a2a-c070ecdea662"
|
||||||
|
],
|
||||||
|
"official_site": "https://requestly.com",
|
||||||
|
"languages": [
|
||||||
|
"javascript"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"short_description": "Insomnia is a cross-platform REST client, built on top of Electron. ",
|
"short_description": "Insomnia is a cross-platform REST client, built on top of Electron. ",
|
||||||
"categories": [
|
"categories": [
|
||||||
@@ -6000,6 +6150,24 @@
|
|||||||
"languages": [
|
"languages": [
|
||||||
"cpp"
|
"cpp"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Free Advanced Android File Transfer Application for macOS",
|
||||||
|
"categories": [
|
||||||
|
"Android",
|
||||||
|
"File Transfare"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/ganeshrvel/openmtp",
|
||||||
|
"title": "Open mtp",
|
||||||
|
"icon_url": "https://github.com/ganeshrvel/openmtp/blob/master/app/app.icns",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/ganeshrvel/openmtp/master/blobs/images/file-explorer-bluebg.jpg",
|
||||||
|
"https://raw.githubusercontent.com/ganeshrvel/openmtp/master/blobs/images/file-transfer-bluebg.jpg"
|
||||||
|
],
|
||||||
|
"official_site": "https://openmtp.ganeshrvel.com/",
|
||||||
|
"languages": [
|
||||||
|
"English"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"short_description": "Make your battery information a bit more interesting. ",
|
"short_description": "Make your battery information a bit more interesting. ",
|
||||||
@@ -8044,6 +8212,22 @@
|
|||||||
"cpp"
|
"cpp"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Open-source macOS menu bar app to monitor Vercel deployment status in real time.",
|
||||||
|
"categories": [
|
||||||
|
"menubar"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/andrewk17/vercel-deployment-menu-bar",
|
||||||
|
"title": "Vercel Deployment Menu Bar",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/andrewk17/vercel-deployment-menu-bar/main/app-icon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/andrewk17/vercel-deployment-menu-bar/main/vercel-menu-bar-deployment-status-macos.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://vercel-deployment-menu-bar.vercel.app/",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"short_description": "Free to do list & time tracker for programmers & designers with Jira integration.",
|
"short_description": "Free to do list & time tracker for programmers & designers with Jira integration.",
|
||||||
"categories": [
|
"categories": [
|
||||||
@@ -9645,6 +9829,26 @@
|
|||||||
"typescript"
|
"typescript"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Readest is a modern, feature-rich ebook reader designed for avid readers.",
|
||||||
|
"categories": [
|
||||||
|
"productivity"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/readest/readest",
|
||||||
|
"title": "Readest",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/readest/readest/main/apps/readest-app/public/icon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/readest/readest/main/data/screenshots/annotations.png",
|
||||||
|
"https://raw.githubusercontent.com/readest/readest/main/data/screenshots/tts_control.png",
|
||||||
|
"https://raw.githubusercontent.com/readest/readest/main/data/screenshots/wikipedia_vertical.png",
|
||||||
|
"https://raw.githubusercontent.com/readest/readest/main/data/screenshots/dark_mode.png",
|
||||||
|
"https://raw.githubusercontent.com/readest/readest/main/data/screenshots/theming_dark_mode.png",
|
||||||
|
],
|
||||||
|
"official_site": "https://readest.com",
|
||||||
|
"languages": [
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"short_description": "A Hex Editor for Reverse Engineers.",
|
"short_description": "A Hex Editor for Reverse Engineers.",
|
||||||
"categories": [
|
"categories": [
|
||||||
@@ -9710,6 +9914,305 @@
|
|||||||
"languages": [
|
"languages": [
|
||||||
"python"
|
"python"
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Video editing software designed for motion effects and versatility.",
|
||||||
|
"categories": ["graphics"],
|
||||||
|
"repo_url": "https://github.com/cartesiancs/nugget-app",
|
||||||
|
"title": "Nugget",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/cartesiancs/nugget-app/refs/heads/main/assets/icons/png/512x512.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/cartesiancs/nugget-app/refs/heads/main/.github/screenshotv1.png"
|
||||||
|
],
|
||||||
|
"official_site": "",
|
||||||
|
"languages": ["typescript"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Replace the Git CLI with a clear UI and AI assist.",
|
||||||
|
"categories": [
|
||||||
|
"git"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/maoyama/Tempo",
|
||||||
|
"title": "Tempo",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/maoyama/Tempo/refs/heads/main/GitClient/Assets.xcassets/AppIcon.appiconset/icon1024.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/maoyama/Tempo/refs/heads/main/Screenshots/Screenshot.png",
|
||||||
|
"https://raw.githubusercontent.com/maoyama/Tempo/refs/heads/main/Screenshots/Screenshot2.png"
|
||||||
|
],
|
||||||
|
"official_site": "",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description":"Simple and free working time recording.",
|
||||||
|
"categories":[
|
||||||
|
"menubar",
|
||||||
|
"productivity"
|
||||||
|
],
|
||||||
|
"repo_url":"https://github.com/WINBIGFOX/timescribe",
|
||||||
|
"title":"TimeScribe",
|
||||||
|
"icon_url":"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/public/icon.png",
|
||||||
|
"screenshots":[
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/menubar_light.png",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/dayview_en_light.webp",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/app_activity_en_light.webp",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/absences_en_light.webp",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/start_break_en_light.webp"
|
||||||
|
],
|
||||||
|
"official_site":"https://timescribe.app",
|
||||||
|
"languages":[
|
||||||
|
"css",
|
||||||
|
"javascript",
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description":"A lightweight app for formatting and correcting Swift syntax.",
|
||||||
|
"categories":[
|
||||||
|
"development",
|
||||||
|
"editors",
|
||||||
|
"ios--macos"
|
||||||
|
],
|
||||||
|
"repo_url":"https://github.com/csprasad/DevLint",
|
||||||
|
"title":"DevLint",
|
||||||
|
"icon_url":"https://raw.githubusercontent.com/csprasad/DevLint/main/.github/images/Icon.png",
|
||||||
|
"screenshots":[
|
||||||
|
"https://raw.githubusercontent.com/csprasad/DevLint/main/.github/images/App_screen_light.png",
|
||||||
|
"https://raw.githubusercontent.com/csprasad/DevLint/main/.github/images/App_screen_light.png"
|
||||||
|
],
|
||||||
|
"official_site":"",
|
||||||
|
"languages":[
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Simple and free working time recording.",
|
||||||
|
"categories": [
|
||||||
|
"menubar",
|
||||||
|
"productivity"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/WINBIGFOX/timescribe",
|
||||||
|
"title": "TimeScribe",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/public/icon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/menubar_light.png",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/dayview_en_light.webp",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/app_activity_en_light.webp",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/absences_en_light.webp",
|
||||||
|
"https://raw.githubusercontent.com/WINBIGFOX/timescribe/refs/heads/main/.github/images/start_break_en_light.webp"
|
||||||
|
],
|
||||||
|
"official_site": "https://timescribe.app",
|
||||||
|
"languages": [
|
||||||
|
"css",
|
||||||
|
"javascript",
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Quickly calculate column widths and get correct results for your grid.",
|
||||||
|
"categories": [
|
||||||
|
"utilities",
|
||||||
|
"development"
|
||||||
|
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/Slllava/gridfy",
|
||||||
|
"title": "Gridfy",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/Slllava/gridfy/refs/heads/main/Gridfy/Assets.xcassets/Icons/AppIcon.appiconset/Icon-512.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/Slllava/gridfy/refs/heads/main/media/pr-01.png",
|
||||||
|
"https://raw.githubusercontent.com/Slllava/gridfy/refs/heads/main/media/pr-02.png",
|
||||||
|
"https://raw.githubusercontent.com/Slllava/gridfy/refs/heads/main/media/pr-03.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://gridfy.astroon.pro/",
|
||||||
|
"languages": [
|
||||||
|
"javascript",
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Archive manager for macOS. Preview (nested) archives without extracting them. Extract single files.",
|
||||||
|
"categories": [
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/sarensw/MacPacker/",
|
||||||
|
"title": "MacPacker",
|
||||||
|
"icon_url": "https://macpacker.app/icon_512x512@2x.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://macpacker.app/main.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://macpacker.app/",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Remote pair programming app.",
|
||||||
|
"categories": [
|
||||||
|
"Other"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/gethopp/hopp",
|
||||||
|
"title": "Hopp",
|
||||||
|
"icon_url": "https://dlh49gjxx49i3.cloudfront.net/logo-light.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://docs.gethopp.app/_astro/screenshare.w05eQI3z_7tfaK.webp"
|
||||||
|
],
|
||||||
|
"official_site": "https://gethopp.app/",
|
||||||
|
"languages": [
|
||||||
|
"rust",
|
||||||
|
"typescript",
|
||||||
|
"go"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Switch between open applications on macOS with a Windows-like Alt+Tab experience.",
|
||||||
|
"categories": [
|
||||||
|
"window-management"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/lwouis/alt-tab-macos",
|
||||||
|
"title": "AltTab",
|
||||||
|
"icon_url": "https://github.com/lwouis/alt-tab-macos/blob/master/resources/icons/app/app.svg",
|
||||||
|
"screenshots": [
|
||||||
|
"https://github.com/lwouis/alt-tab-macos/raw/master/docs/public/demo/frontpage.jpg"
|
||||||
|
],
|
||||||
|
"official_site": "https://alt-tab-macos.netlify.app/",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Ice is a versatile menu bar manager that goes beyond hiding and showing items to offer a rich set of productivity features.",
|
||||||
|
"categories": [
|
||||||
|
"productivity",
|
||||||
|
"utilities",
|
||||||
|
"window-management"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/jordanbaird/Ice",
|
||||||
|
"title": "Ice",
|
||||||
|
"icon_url": "https://icemenubar.app/gallery/Ice%20Cube.png?ts=1737648866",
|
||||||
|
"screenshots": [
|
||||||
|
"https://icemenubar.app/gallery/ice-bar.png",
|
||||||
|
"https://icemenubar.app/gallery/menu-bar-item-search.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://icemenubar.app/",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "LibreCAD is a free Open Source CAD application for Windows, Apple and Linux. Support and documentation are free from our large, dedicated community of users, contributors and developers.",
|
||||||
|
"categories": [
|
||||||
|
"graphics"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/LibreCAD/LibreCAD",
|
||||||
|
"title": "LibreCAD",
|
||||||
|
"icon_url": "https://github.com/LibreCAD/LibreCAD/blob/master/desktop/media/logo/librecad_logo.svg",
|
||||||
|
"screenshots": [
|
||||||
|
"https://librecad.org/img/welcome.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://librecad.org",
|
||||||
|
"languages": [
|
||||||
|
"c++",
|
||||||
|
"c"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Create file and folder structures from plain text descriptions.",
|
||||||
|
"categories": [
|
||||||
|
"productivity",
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/filearchitect/app",
|
||||||
|
"title": "File Architect",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/filearchitect/app/main/app-icon.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://raw.githubusercontent.com/filearchitect/app/main/docs/screenshots/filearchitect-main.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://filearchitect.com",
|
||||||
|
"languages": [
|
||||||
|
"typescript",
|
||||||
|
"rust"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Instant thought capture for macOS. Global hotkey summons a post-it note, type and close. Notes stored as plain markdown files.",
|
||||||
|
"categories": [
|
||||||
|
"notes"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/0xMassi/stik_app",
|
||||||
|
"title": "Stik",
|
||||||
|
"icon_url": "",
|
||||||
|
"screenshots": [],
|
||||||
|
"official_site": "https://stik.ink",
|
||||||
|
"languages": [
|
||||||
|
"rust",
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "24/7 screen and audio recording with AI-powered search. Local-first, privacy-focused rewind alternative.",
|
||||||
|
"categories": [
|
||||||
|
"productivity",
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/screenpipe/screenpipe",
|
||||||
|
"title": "Screenpipe",
|
||||||
|
"icon_url": "https://raw.githubusercontent.com/screenpipe/screenpipe/main/apps/screenpipe-app-tauri/src-tauri/icons/128x128.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://screenpi.pe/og-image.png"
|
||||||
|
],
|
||||||
|
"official_site": "https://screenpi.pe",
|
||||||
|
"languages": [
|
||||||
|
"rust",
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "A simple macOS menu bar utility that lets you glue two windows together so that they behave (mostly) as one.",
|
||||||
|
"categories": [
|
||||||
|
"window-management"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/Conxt/WindowGlue",
|
||||||
|
"title": "Window Glue",
|
||||||
|
"icon_url": "https://github.com/Conxt/WindowGlue/raw/main/Assets/Icon-MacOS-256x256.png",
|
||||||
|
"screenshots": [
|
||||||
|
"https://github.com/Conxt/WindowGlue/raw/main/Assets/Screen.gif"
|
||||||
|
],
|
||||||
|
"official_site": "",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "An application that can dock any window to the edge of the screen.",
|
||||||
|
"categories": [
|
||||||
|
"window-management",
|
||||||
|
"productivity"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/xicheng148/Dockit",
|
||||||
|
"title": "Dockit",
|
||||||
|
"icon_url": "https://github.com/XiCheng148/Dockit/blob/main/Resources/dmg-icon.svg?raw=true",
|
||||||
|
"screenshots": [
|
||||||
|
"https://github.com/XiCheng148/Dockit/blob/main/Resources/preview.gif?raw=true"
|
||||||
|
],
|
||||||
|
"official_site": "[official site](https://dockit-docs.pages.dev/?s=open-sourse-mac-os-apps)",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"short_description": "Input Source Pro is macOS utility designed for multilingual users who frequently switch input sources.",
|
||||||
|
"categories": [
|
||||||
|
"keyboard", "utilities", "ios--macos"
|
||||||
|
],
|
||||||
|
"repo_url": "https://github.com/runjuu/InputSourcePro/",
|
||||||
|
"title": "Input Source Pro",
|
||||||
|
"icon_url": "https://camo.githubusercontent.com/858c5c213d9937d100e0837f6f37f67652457acada5fd1f17253060da568e5e1/68747470733a2f2f696e707574736f757263652e70726f2f696d672f6170702d69636f6e2e706e67",
|
||||||
|
"screenshots": [],
|
||||||
|
"official_site": "https://inputsource.pro",
|
||||||
|
"languages": [
|
||||||
|
"swift"
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
19
buildServer.json
Normal file
19
buildServer.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "xcode build server",
|
||||||
|
"version": "0.2",
|
||||||
|
"bspVersion": "2.0",
|
||||||
|
"languages": [
|
||||||
|
"c",
|
||||||
|
"cpp",
|
||||||
|
"objective-c",
|
||||||
|
"objective-cpp",
|
||||||
|
"swift"
|
||||||
|
],
|
||||||
|
"argv": [
|
||||||
|
"/usr/local/bin/xcode-build-server"
|
||||||
|
],
|
||||||
|
"workspace": "/Users/serhii.londar/Documents/GitHub/open-source-mac-os-apps/.github/ReadmeGenerator.xcodeproj/project.xcworkspace",
|
||||||
|
"build_root": "/Users/serhii.londar/Library/Developer/Xcode/DerivedData/ReadmeGenerator-gmebhtnoakzlbseqgzuedvuuxjxb",
|
||||||
|
"scheme": "ReadmeGenerator",
|
||||||
|
"kind": "xcode"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user