Fix errors

This commit is contained in:
Plumf 2020-04-16 12:34:36 +02:00
parent f22fddf9bc
commit f9a6007e55
14 changed files with 2166 additions and 3 deletions

View file

@ -6,7 +6,7 @@
- [Useful links](#useful-links) - [Useful links](#useful-links)
Because sometimes you have to know how to relax. Host your own fork of the famous Tetris and become the master of this infernal hexagon hexagon? Because sometimes you have to know how to relax. Host your own fork of the famous Tetris and become the master of this infernal hexagon ?
Who will tame this infernal. Who will tame this infernal.
## Useful links ## Useful links

View file

@ -4,7 +4,7 @@
### Index ### Index
- [Configuration](#Configuration) - [Configuration](#configuration)
- [Changing the conditions of use of the service](#changing-the-conditions-of-use-of-the-service) - [Changing the conditions of use of the service](#changing-the-conditions-of-use-of-the-service)
- [Administration](#administration) - [Administration](#administration)
- [Useful links](#useful-links) - [Useful links](#useful-links)

View file

@ -5,7 +5,7 @@
### Index ### Index
- [Configuration](#configuration) - [Configuration](#configuration)
- [Changer les conditions d'utilisation du service](#changer-les-conditions-d-utilisation-du-service) - [Changer les conditions d'utilisation du service](#changer-les-conditions-d'utilisation-du-service)
- [Administration](#administration) - [Administration](#administration)
- [Liens utiles](#liens-utiles) - [Liens utiles](#liens-utiles)

368
apps.md Normal file
View file

@ -0,0 +1,368 @@
# Application catalog
<span class="javascriptDisclaimer">
This page requires Javascript enabled to display properly :s.
<br/>
<br/>
</span>
<!--
Search bar
-->
<div class="input-group">
<span id="basic-addon1" class="input-group-addon" ><span class="glyphicon glyphicon-search"></span></span>
<input id="filter-app-cards" type="text" class="form-control" placeholder="Search for apps..." aria-describedby="basic-addon1"/>
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span id="current-quality-filter" data-filter="decent">Only decent quality apps</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#" data-quality-filter="high">Only high quality apps</a></li>
<li><a href="#" data-quality-filter="decent">Only decent quality apps</a></li>
<li><a href="#" data-quality-filter="working">Only working apps</a></li>
<li><a href="#" data-quality-filter="none">All apps</a></li>
</ul>
</div>
</div>
<br />
<!--
Disclaimers
-->
<div class="alert alert-info">The application packaging team will welcome your feedback! If you install an app and find issues or possible improvements, do not hesitate to contribute by reporting your issues directly on the code repositories.</div>
<div id="bad-quality-apps-disclaimer" class="alert alert-warning">
Applications with a level below or equal to 4 may be working, but they might be not well-integrated with YunoHost, or they do not respect the recommended packaging practices.
</div>
<div id="broken-apps-disclaimer" class="alert alert-danger">
Applications with level 0, or flagged as <span class="label label-warning label-as-badge">inprogress</span>, <span class="label label-danger label-as-badge">notworking</span> are still in development or are know to not be working. **Do not install them** in a production environment!
</div>
<div id="app-cards-list" class="app-cards-list"></div>
<div class="alert alert-warning">If you don't find the app you are looking for, you can try to look for a appname_ynh repository on Github or on the internet, or add it to the <a href="/apps_wishlist">apps wishlist</a>.</div>
<!--
Custom CSS for this page
-->
<style>
/*=================================================
Search bar
=================================================*/
#filter-app-cards, #app-cards-list {
width:100%;
}
/*===============================================*/
/*=================================================
Force return space after card list
=================================================*/
#app-cards-list:after {
content:'';
display:block;
clear: both;
}
/*===============================================*/
/*=================================================
App card
=================================================*/
.app-card {
margin-bottom:20px;
width:270px;
float:left;
min-height: 1px;
margin-right: 10px;
margin-left: 10px;
border-radius: 3px;
}
/*===============================================*/
/*=================================================
App card body
=================================================*/
.app-card .panel-body > h3 {
margin-top:0;
margin-bottom:5px;
font-size:1.2em;
}
.app-card .app-badges {
height:35px;
}
.app-card .app-badges .label, .app-card-date-maintainer {
font-size:0.6em;
}
.label-epic {
background-color: darkorchid;
}
.app-card-date-maintainer {
text-align:right;
max-height: 18px;
margin-bottom: 3px;
margin-right: 7px;
margin-top: -5px;
}
.app-card .unmaintained {
color: #e0aa33;
}
.app-card-desc {
height:100px;
overflow: hidden;
}
/*===============================================*/
/*=================================================
App card footer
=================================================*/
.app-card .btn-group {
width:100%;
margin-left: 0px;
}
.app-card > .btn-group > .btn{
border-bottom:0;
font-size: 0.9em;
line-height: 1.58;
}
.app-card > .btn-group > .btn:first-child {
border-left:0;
border-top-left-radius:0;
}
.app-card > .btn-group > .btn:last-child {
border-right:0;
border-top-right-radius:0;
margin-left: 0px;
width: 33.6%;
}
/*===============================================*/
</style>
<!--
App card template
-->
<script type="text/template" id="app-template2">
<div class="app-card_{app_id} app-card panel panel-default" data-quality="{app_quality}">
<div class="panel-body">
<h3>{app_name}</h3>
<div class="app-badges"></div>
<div class="app-card-desc">{app_description}</div>
</div>
<div class="app-card-date-maintainer">
<span class="glyphicon glyphicon-refresh"></span> {app_update} -
<span title="{maintained_help}" class="{maintained_state}"><span class="glyphicon glyphicon-{maintained_icon}"></span> {app_maintainer}</span>
</div>
<div class="btn-group" role="group">
<a href="{app_git}" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-globe" aria-hidden="true"></span> Code</a>
<a href="#/app_{app_id}_en" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-book" aria-hidden="true"></span> Doc</a>
<a href="https://install-app.yunohost.org/?app={app_id}" target="_BLANK" type="button" class="btn btn-{app_install_css_style} col-sm-4 active"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Install</a>
</div>
</div>
</script>
<!--
Javascript helpers
-->
<script>
function timeConverter(UNIX_timestamp) {
var a = new Date(UNIX_timestamp*1000);
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
if (hour < 10) { hour = '0' + hour; }
if (min < 10) { min = '0' + min; }
var time = date+' '+month+' '+year;//+' at '+hour+':'+min
return time;
}
$(document).ready(function () {
// Hide warrant about states when we're using the default filter
$('#state-disclaimer').hide();
var quality_filters = "decent";
function filter(){
var current_quality_filter = $('#current-quality-filter').data("filter");
var user_input_in_search_field = $('#filter-app-cards').val().toLowerCase();
$('.app-card').each(function() {
// This is where we actually define how apps are filtered:
// we look for the name of the app (h3) and try to find the user input
// + we check this app match the current quality filter
var app_name = $(this).find('h3').text().toLowerCase();
if (app_name.indexOf(user_input_in_search_field) >= 0 && $(this).data("quality").indexOf(current_quality_filter) >= 0)
{
$(this).show();
}
else
{
$(this).hide();
}
});
// Display or hide the disclaimers depending on the current filter...
((current_quality_filter == "working") || (current_quality_filter == "none")) ? $("#bad-quality-apps-disclaimer").show() : $("#bad-quality-apps-disclaimer").hide();
((current_quality_filter == "none")) ? $("#broken-apps-disclaimer").show() : $("#broken-apps-disclaimer").hide();
}
//=================================================
// Search & filter bar event
//=================================================
$('#filter-app-cards').keyup(filter);
$('a[data-quality-filter]').on("click", function(){
$('#current-quality-filter').text($(this).text());
$('#current-quality-filter').data("filter", $(this).data("quality-filter"));
filter();
});
filter();
//=================================================
// Upload apps lists
//=================================================
var catalog = undefined;
// Fetch application catalog
$.getJSON('https://app.yunohost.org/apps.json', {}, function(data) {
catalog = $.map(data, function(el) { return el; });
// Clarify high quality state, and level if undefined or inprogress or notworking...
$.each(catalog, function(k, infos) {
if ((infos.level === undefined) || (infos.state === "inprogress") || (infos.state === "notworking")) {
infos.level = null;
}
if ((infos.high_quality === true) && (infos.level === 8)) {
infos.state = "high quality";
}
});
// Sort apps according to their state and level...
catalog.sort(function(a, b){
a_state = (a.state === "high quality")?4:(a.level > 4)?3:(a.state > 0)?2:1;
b_state = (b.state === "high quality")?4:(b.level > 4)?3:(b.state > 0)?2:1;
if (a_state < b_state || a_state == b_state && a.level < b.level || a_state == b_state && a.level == b.level && a.manifest.id > b.manifest.id) {return 1;}
else if (a.manifest.id == b.manifest.id) {return 0;}
return -1;
});
// Add the card for each app
$.each(catalog, function(k, infos) {
app_id = infos.manifest.id;
// Define what style to use for state, level and install button
// according to the app quality ....
if (infos.state === "high quality") {
app_quality = "high,decent,working,none";
app_state_css_style = "epic";
app_install_css_style = "success";
app_level_css_style = "epic";
} else if (infos.level > 4) {
app_quality = "decent,working,none";
app_state_css_style = "success";
app_install_css_style = "success";
app_level_css_style = "success";
} else if (infos.level > 0) {
app_quality = "working,none";
app_state_css_style = "success";
app_install_css_style = "warning";
app_level_css_style = "warning";
} else {
app_quality = "none";
if (infos.state === "working") {
app_state_css_style = "success";
}
else if (infos.state === "inprogress") {
app_state_css_style = "warning";
}
else {
app_state_css_style = "danger";
}
app_install_css_style = "danger";
app_level_css_style = "danger";
}
// If level is null, we wanna display '?'
if (infos.level == null) {
infos.level = '?';
}
// Fill the template
html = $('#app-template2').html()
.replace(/{app_id}/g, app_id)
.replace(/{app_name}/g, infos.manifest.name)
.replace('{app_description}', infos.manifest.description.en)
.replace(/{app_git}/g, infos.git.url)
.replace('{app_branch}', infos.git.branch)
.replace('{app_level}', infos.level)
.replace('{app_quality}', app_quality)
.replace('{app_update}', timeConverter(infos.lastUpdate))
.replace('{app_state_css_style}', app_state_css_style)
.replace('{app_install_css_style}', app_install_css_style);
// Handle the maintainer info
if (infos.maintained == false)
{
html = html
.replace('{maintained_state}', 'unmaintained')
.replace('{maintained_icon}', 'warning-sign')
.replace('{app_maintainer}', "Unmaintained")
.replace('{maintained_help}', "This package is currently unmaintained. Feel free to propose yourself as the new maintainer !");
}
else {
html = html
.replace('{maintained_state}', 'maintained')
.replace('{maintained_icon}', 'user')
.replace('{maintained_help}', "Current maintainer of this package");
if ((infos.manifest.developer) && (infos.manifest.developer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.developer.name);
}
else if ((infos.manifest.maintainer) && (infos.manifest.maintainer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.maintainer.name);
}
else {
html = html.replace('{app_maintainer}', "???");
}
}
// Fill the template
$('#app-cards-list').append(html);
$('.app-card_'+ app_id).attr('id', 'app-card_'+ app_id);
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_state_css_style+' label-as-badge app-'+infos.state+'">'+infos.state+'</span>');
if ((infos.state === "high quality") || (infos.state === "working")) {
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_level_css_style+' label-as-badge">level '+infos.level+'</span>');
}
});
filter();
});
//=================================================
});
</script>

368
apps_ar.md Normal file
View file

@ -0,0 +1,368 @@
# Application catalog
<span class="javascriptDisclaimer">
This page requires Javascript enabled to display properly :s.
<br/>
<br/>
</span>
<!--
Search bar
-->
<div class="input-group">
<span id="basic-addon1" class="input-group-addon" ><span class="glyphicon glyphicon-search"></span></span>
<input id="filter-app-cards" type="text" class="form-control" placeholder="Search for apps..." aria-describedby="basic-addon1"/>
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span id="current-quality-filter" data-filter="decent">Only decent quality apps</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#" data-quality-filter="high">Only high quality apps</a></li>
<li><a href="#" data-quality-filter="decent">Only decent quality apps</a></li>
<li><a href="#" data-quality-filter="working">Only working apps</a></li>
<li><a href="#" data-quality-filter="none">All apps</a></li>
</ul>
</div>
</div>
<br />
<!--
Disclaimers
-->
<div class="alert alert-info">The application packaging team will welcome your feedback! If you install an app and find issues or possible improvements, do not hesitate to contribute by reporting your issues directly on the code repositories.</div>
<div id="bad-quality-apps-disclaimer" class="alert alert-warning">
Applications with a level below or equal to 4 may be working, but they might be not well-integrated with YunoHost, or they do not respect the recommended packaging practices.
</div>
<div id="broken-apps-disclaimer" class="alert alert-danger">
Applications with level 0, or flagged as <span class="label label-warning label-as-badge">inprogress</span>, <span class="label label-danger label-as-badge">notworking</span> are still in development or are know to not be working. **Do not install them** in a production environment!
</div>
<div id="app-cards-list" class="app-cards-list"></div>
<div class="alert alert-warning">If you don't find the app you are looking for, you can try to look for a appname_ynh repository on Github or on the internet, or add it to the <a href="/apps_wishlist">apps wishlist</a>.</div>
<!--
Custom CSS for this page
-->
<style>
/*=================================================
Search bar
=================================================*/
#filter-app-cards, #app-cards-list {
width:100%;
}
/*===============================================*/
/*=================================================
Force return space after card list
=================================================*/
#app-cards-list:after {
content:'';
display:block;
clear: both;
}
/*===============================================*/
/*=================================================
App card
=================================================*/
.app-card {
margin-bottom:20px;
width:270px;
float:left;
min-height: 1px;
margin-right: 10px;
margin-left: 10px;
border-radius: 3px;
}
/*===============================================*/
/*=================================================
App card body
=================================================*/
.app-card .panel-body > h3 {
margin-top:0;
margin-bottom:5px;
font-size:1.2em;
}
.app-card .app-badges {
height:35px;
}
.app-card .app-badges .label, .app-card-date-maintainer {
font-size:0.6em;
}
.label-epic {
background-color: darkorchid;
}
.app-card-date-maintainer {
text-align:right;
max-height: 18px;
margin-bottom: 3px;
margin-right: 7px;
margin-top: -5px;
}
.app-card .unmaintained {
color: #e0aa33;
}
.app-card-desc {
height:100px;
overflow: hidden;
}
/*===============================================*/
/*=================================================
App card footer
=================================================*/
.app-card .btn-group {
width:100%;
margin-left: 0px;
}
.app-card > .btn-group > .btn{
border-bottom:0;
font-size: 0.9em;
line-height: 1.58;
}
.app-card > .btn-group > .btn:first-child {
border-left:0;
border-top-left-radius:0;
}
.app-card > .btn-group > .btn:last-child {
border-right:0;
border-top-right-radius:0;
margin-left: 0px;
width: 33.6%;
}
/*===============================================*/
</style>
<!--
App card template
-->
<script type="text/template" id="app-template2">
<div class="app-card_{app_id} app-card panel panel-default" data-quality="{app_quality}">
<div class="panel-body">
<h3>{app_name}</h3>
<div class="app-badges"></div>
<div class="app-card-desc">{app_description}</div>
</div>
<div class="app-card-date-maintainer">
<span class="glyphicon glyphicon-refresh"></span> {app_update} -
<span title="{maintained_help}" class="{maintained_state}"><span class="glyphicon glyphicon-{maintained_icon}"></span> {app_maintainer}</span>
</div>
<div class="btn-group" role="group">
<a href="{app_git}" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-globe" aria-hidden="true"></span> Code</a>
<a href="#/app_{app_id}_en" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-book" aria-hidden="true"></span> Doc</a>
<a href="https://install-app.yunohost.org/?app={app_id}" target="_BLANK" type="button" class="btn btn-{app_install_css_style} col-sm-4 active"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Install</a>
</div>
</div>
</script>
<!--
Javascript helpers
-->
<script>
function timeConverter(UNIX_timestamp) {
var a = new Date(UNIX_timestamp*1000);
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
if (hour < 10) { hour = '0' + hour; }
if (min < 10) { min = '0' + min; }
var time = date+' '+month+' '+year;//+' at '+hour+':'+min
return time;
}
$(document).ready(function () {
// Hide warrant about states when we're using the default filter
$('#state-disclaimer').hide();
var quality_filters = "decent";
function filter(){
var current_quality_filter = $('#current-quality-filter').data("filter");
var user_input_in_search_field = $('#filter-app-cards').val().toLowerCase();
$('.app-card').each(function() {
// This is where we actually define how apps are filtered:
// we look for the name of the app (h3) and try to find the user input
// + we check this app match the current quality filter
var app_name = $(this).find('h3').text().toLowerCase();
if (app_name.indexOf(user_input_in_search_field) >= 0 && $(this).data("quality").indexOf(current_quality_filter) >= 0)
{
$(this).show();
}
else
{
$(this).hide();
}
});
// Display or hide the disclaimers depending on the current filter...
((current_quality_filter == "working") || (current_quality_filter == "none")) ? $("#bad-quality-apps-disclaimer").show() : $("#bad-quality-apps-disclaimer").hide();
((current_quality_filter == "none")) ? $("#broken-apps-disclaimer").show() : $("#broken-apps-disclaimer").hide();
}
//=================================================
// Search & filter bar event
//=================================================
$('#filter-app-cards').keyup(filter);
$('a[data-quality-filter]').on("click", function(){
$('#current-quality-filter').text($(this).text());
$('#current-quality-filter').data("filter", $(this).data("quality-filter"));
filter();
});
filter();
//=================================================
// Upload apps lists
//=================================================
var catalog = undefined;
// Fetch application catalog
$.getJSON('https://app.yunohost.org/apps.json', {}, function(data) {
catalog = $.map(data, function(el) { return el; });
// Clarify high quality state, and level if undefined or inprogress or notworking...
$.each(catalog, function(k, infos) {
if ((infos.level === undefined) || (infos.state === "inprogress") || (infos.state === "notworking")) {
infos.level = null;
}
if ((infos.high_quality === true) && (infos.level === 8)) {
infos.state = "high quality";
}
});
// Sort apps according to their state and level...
catalog.sort(function(a, b){
a_state = (a.state === "high quality")?4:(a.level > 4)?3:(a.state > 0)?2:1;
b_state = (b.state === "high quality")?4:(b.level > 4)?3:(b.state > 0)?2:1;
if (a_state < b_state || a_state == b_state && a.level < b.level || a_state == b_state && a.level == b.level && a.manifest.id > b.manifest.id) {return 1;}
else if (a.manifest.id == b.manifest.id) {return 0;}
return -1;
});
// Add the card for each app
$.each(catalog, function(k, infos) {
app_id = infos.manifest.id;
// Define what style to use for state, level and install button
// according to the app quality ....
if (infos.state === "high quality") {
app_quality = "high,decent,working,none";
app_state_css_style = "epic";
app_install_css_style = "success";
app_level_css_style = "epic";
} else if (infos.level > 4) {
app_quality = "decent,working,none";
app_state_css_style = "success";
app_install_css_style = "success";
app_level_css_style = "success";
} else if (infos.level > 0) {
app_quality = "working,none";
app_state_css_style = "success";
app_install_css_style = "warning";
app_level_css_style = "warning";
} else {
app_quality = "none";
if (infos.state === "working") {
app_state_css_style = "success";
}
else if (infos.state === "inprogress") {
app_state_css_style = "warning";
}
else {
app_state_css_style = "danger";
}
app_install_css_style = "danger";
app_level_css_style = "danger";
}
// If level is null, we wanna display '?'
if (infos.level == null) {
infos.level = '?';
}
// Fill the template
html = $('#app-template2').html()
.replace(/{app_id}/g, app_id)
.replace(/{app_name}/g, infos.manifest.name)
.replace('{app_description}', infos.manifest.description.en)
.replace(/{app_git}/g, infos.git.url)
.replace('{app_branch}', infos.git.branch)
.replace('{app_level}', infos.level)
.replace('{app_quality}', app_quality)
.replace('{app_update}', timeConverter(infos.lastUpdate))
.replace('{app_state_css_style}', app_state_css_style)
.replace('{app_install_css_style}', app_install_css_style);
// Handle the maintainer info
if (infos.maintained == false)
{
html = html
.replace('{maintained_state}', 'unmaintained')
.replace('{maintained_icon}', 'warning-sign')
.replace('{app_maintainer}', "Unmaintained")
.replace('{maintained_help}', "This package is currently unmaintained. Feel free to propose yourself as the new maintainer !");
}
else {
html = html
.replace('{maintained_state}', 'maintained')
.replace('{maintained_icon}', 'user')
.replace('{maintained_help}', "Current maintainer of this package");
if ((infos.manifest.developer) && (infos.manifest.developer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.developer.name);
}
else if ((infos.manifest.maintainer) && (infos.manifest.maintainer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.maintainer.name);
}
else {
html = html.replace('{app_maintainer}', "???");
}
}
// Fill the template
$('#app-cards-list').append(html);
$('.app-card_'+ app_id).attr('id', 'app-card_'+ app_id);
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_state_css_style+' label-as-badge app-'+infos.state+'">'+infos.state+'</span>');
if ((infos.state === "high quality") || (infos.state === "working")) {
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_level_css_style+' label-as-badge">level '+infos.level+'</span>');
}
});
filter();
});
//=================================================
});
</script>

368
apps_es.md Normal file
View file

@ -0,0 +1,368 @@
# Application catalog
<span class="javascriptDisclaimer">
This page requires Javascript enabled to display properly :s.
<br/>
<br/>
</span>
<!--
Search bar
-->
<div class="input-group">
<span id="basic-addon1" class="input-group-addon" ><span class="glyphicon glyphicon-search"></span></span>
<input id="filter-app-cards" type="text" class="form-control" placeholder="Search for apps..." aria-describedby="basic-addon1"/>
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span id="current-quality-filter" data-filter="decent">Only decent quality apps</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#" data-quality-filter="high">Only high quality apps</a></li>
<li><a href="#" data-quality-filter="decent">Only decent quality apps</a></li>
<li><a href="#" data-quality-filter="working">Only working apps</a></li>
<li><a href="#" data-quality-filter="none">All apps</a></li>
</ul>
</div>
</div>
<br />
<!--
Disclaimers
-->
<div class="alert alert-info">The application packaging team will welcome your feedback! If you install an app and find issues or possible improvements, do not hesitate to contribute by reporting your issues directly on the code repositories.</div>
<div id="bad-quality-apps-disclaimer" class="alert alert-warning">
Applications with a level below or equal to 4 may be working, but they might be not well-integrated with YunoHost, or they do not respect the recommended packaging practices.
</div>
<div id="broken-apps-disclaimer" class="alert alert-danger">
Applications with level 0, or flagged as <span class="label label-warning label-as-badge">inprogress</span>, <span class="label label-danger label-as-badge">notworking</span> are still in development or are know to not be working. **Do not install them** in a production environment!
</div>
<div id="app-cards-list" class="app-cards-list"></div>
<div class="alert alert-warning">If you don't find the app you are looking for, you can try to look for a appname_ynh repository on Github or on the internet, or add it to the <a href="/apps_wishlist">apps wishlist</a>.</div>
<!--
Custom CSS for this page
-->
<style>
/*=================================================
Search bar
=================================================*/
#filter-app-cards, #app-cards-list {
width:100%;
}
/*===============================================*/
/*=================================================
Force return space after card list
=================================================*/
#app-cards-list:after {
content:'';
display:block;
clear: both;
}
/*===============================================*/
/*=================================================
App card
=================================================*/
.app-card {
margin-bottom:20px;
width:270px;
float:left;
min-height: 1px;
margin-right: 10px;
margin-left: 10px;
border-radius: 3px;
}
/*===============================================*/
/*=================================================
App card body
=================================================*/
.app-card .panel-body > h3 {
margin-top:0;
margin-bottom:5px;
font-size:1.2em;
}
.app-card .app-badges {
height:35px;
}
.app-card .app-badges .label, .app-card-date-maintainer {
font-size:0.6em;
}
.label-epic {
background-color: darkorchid;
}
.app-card-date-maintainer {
text-align:right;
max-height: 18px;
margin-bottom: 3px;
margin-right: 7px;
margin-top: -5px;
}
.app-card .unmaintained {
color: #e0aa33;
}
.app-card-desc {
height:100px;
overflow: hidden;
}
/*===============================================*/
/*=================================================
App card footer
=================================================*/
.app-card .btn-group {
width:100%;
margin-left: 0px;
}
.app-card > .btn-group > .btn{
border-bottom:0;
font-size: 0.9em;
line-height: 1.58;
}
.app-card > .btn-group > .btn:first-child {
border-left:0;
border-top-left-radius:0;
}
.app-card > .btn-group > .btn:last-child {
border-right:0;
border-top-right-radius:0;
margin-left: 0px;
width: 33.6%;
}
/*===============================================*/
</style>
<!--
App card template
-->
<script type="text/template" id="app-template2">
<div class="app-card_{app_id} app-card panel panel-default" data-quality="{app_quality}">
<div class="panel-body">
<h3>{app_name}</h3>
<div class="app-badges"></div>
<div class="app-card-desc">{app_description}</div>
</div>
<div class="app-card-date-maintainer">
<span class="glyphicon glyphicon-refresh"></span> {app_update} -
<span title="{maintained_help}" class="{maintained_state}"><span class="glyphicon glyphicon-{maintained_icon}"></span> {app_maintainer}</span>
</div>
<div class="btn-group" role="group">
<a href="{app_git}" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-globe" aria-hidden="true"></span> Code</a>
<a href="#/app_{app_id}_en" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-book" aria-hidden="true"></span> Doc</a>
<a href="https://install-app.yunohost.org/?app={app_id}" target="_BLANK" type="button" class="btn btn-{app_install_css_style} col-sm-4 active"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Install</a>
</div>
</div>
</script>
<!--
Javascript helpers
-->
<script>
function timeConverter(UNIX_timestamp) {
var a = new Date(UNIX_timestamp*1000);
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
if (hour < 10) { hour = '0' + hour; }
if (min < 10) { min = '0' + min; }
var time = date+' '+month+' '+year;//+' at '+hour+':'+min
return time;
}
$(document).ready(function () {
// Hide warrant about states when we're using the default filter
$('#state-disclaimer').hide();
var quality_filters = "decent";
function filter(){
var current_quality_filter = $('#current-quality-filter').data("filter");
var user_input_in_search_field = $('#filter-app-cards').val().toLowerCase();
$('.app-card').each(function() {
// This is where we actually define how apps are filtered:
// we look for the name of the app (h3) and try to find the user input
// + we check this app match the current quality filter
var app_name = $(this).find('h3').text().toLowerCase();
if (app_name.indexOf(user_input_in_search_field) >= 0 && $(this).data("quality").indexOf(current_quality_filter) >= 0)
{
$(this).show();
}
else
{
$(this).hide();
}
});
// Display or hide the disclaimers depending on the current filter...
((current_quality_filter == "working") || (current_quality_filter == "none")) ? $("#bad-quality-apps-disclaimer").show() : $("#bad-quality-apps-disclaimer").hide();
((current_quality_filter == "none")) ? $("#broken-apps-disclaimer").show() : $("#broken-apps-disclaimer").hide();
}
//=================================================
// Search & filter bar event
//=================================================
$('#filter-app-cards').keyup(filter);
$('a[data-quality-filter]').on("click", function(){
$('#current-quality-filter').text($(this).text());
$('#current-quality-filter').data("filter", $(this).data("quality-filter"));
filter();
});
filter();
//=================================================
// Upload apps lists
//=================================================
var catalog = undefined;
// Fetch application catalog
$.getJSON('https://app.yunohost.org/apps.json', {}, function(data) {
catalog = $.map(data, function(el) { return el; });
// Clarify high quality state, and level if undefined or inprogress or notworking...
$.each(catalog, function(k, infos) {
if ((infos.level === undefined) || (infos.state === "inprogress") || (infos.state === "notworking")) {
infos.level = null;
}
if ((infos.high_quality === true) && (infos.level === 8)) {
infos.state = "high quality";
}
});
// Sort apps according to their state and level...
catalog.sort(function(a, b){
a_state = (a.state === "high quality")?4:(a.level > 4)?3:(a.state > 0)?2:1;
b_state = (b.state === "high quality")?4:(b.level > 4)?3:(b.state > 0)?2:1;
if (a_state < b_state || a_state == b_state && a.level < b.level || a_state == b_state && a.level == b.level && a.manifest.id > b.manifest.id) {return 1;}
else if (a.manifest.id == b.manifest.id) {return 0;}
return -1;
});
// Add the card for each app
$.each(catalog, function(k, infos) {
app_id = infos.manifest.id;
// Define what style to use for state, level and install button
// according to the app quality ....
if (infos.state === "high quality") {
app_quality = "high,decent,working,none";
app_state_css_style = "epic";
app_install_css_style = "success";
app_level_css_style = "epic";
} else if (infos.level > 4) {
app_quality = "decent,working,none";
app_state_css_style = "success";
app_install_css_style = "success";
app_level_css_style = "success";
} else if (infos.level > 0) {
app_quality = "working,none";
app_state_css_style = "success";
app_install_css_style = "warning";
app_level_css_style = "warning";
} else {
app_quality = "none";
if (infos.state === "working") {
app_state_css_style = "success";
}
else if (infos.state === "inprogress") {
app_state_css_style = "warning";
}
else {
app_state_css_style = "danger";
}
app_install_css_style = "danger";
app_level_css_style = "danger";
}
// If level is null, we wanna display '?'
if (infos.level == null) {
infos.level = '?';
}
// Fill the template
html = $('#app-template2').html()
.replace(/{app_id}/g, app_id)
.replace(/{app_name}/g, infos.manifest.name)
.replace('{app_description}', infos.manifest.description.en)
.replace(/{app_git}/g, infos.git.url)
.replace('{app_branch}', infos.git.branch)
.replace('{app_level}', infos.level)
.replace('{app_quality}', app_quality)
.replace('{app_update}', timeConverter(infos.lastUpdate))
.replace('{app_state_css_style}', app_state_css_style)
.replace('{app_install_css_style}', app_install_css_style);
// Handle the maintainer info
if (infos.maintained == false)
{
html = html
.replace('{maintained_state}', 'unmaintained')
.replace('{maintained_icon}', 'warning-sign')
.replace('{app_maintainer}', "Unmaintained")
.replace('{maintained_help}', "This package is currently unmaintained. Feel free to propose yourself as the new maintainer !");
}
else {
html = html
.replace('{maintained_state}', 'maintained')
.replace('{maintained_icon}', 'user')
.replace('{maintained_help}', "Current maintainer of this package");
if ((infos.manifest.developer) && (infos.manifest.developer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.developer.name);
}
else if ((infos.manifest.maintainer) && (infos.manifest.maintainer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.maintainer.name);
}
else {
html = html.replace('{app_maintainer}', "???");
}
}
// Fill the template
$('#app-cards-list').append(html);
$('.app-card_'+ app_id).attr('id', 'app-card_'+ app_id);
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_state_css_style+' label-as-badge app-'+infos.state+'">'+infos.state+'</span>');
if ((infos.state === "high quality") || (infos.state === "working")) {
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_level_css_style+' label-as-badge">level '+infos.level+'</span>');
}
});
filter();
});
//=================================================
});
</script>

367
apps_fr.md Normal file
View file

@ -0,0 +1,367 @@
# Application catalog
<span class="javascriptDisclaimer">
Cette page requiert que Javascript soit activé pour s'afficher correctement :s.
<br/>
<br/>
</span>
<!--
Search bar
-->
<div class="input-group">
<span id="basic-addon1" class="input-group-addon" ><span class="glyphicon glyphicon-search"></span></span>
<input id="filter-app-cards" type="text" class="form-control" placeholder="Rechercher des apps..." aria-describedby="basic-addon1"/>
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span id="current-quality-filter" data-filter="decent">Seulement les apps de qualité décente</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#" data-quality-filter="high">Seulement les apps haute-qualité</a></li>
<li><a href="#" data-quality-filter="decent">Seulement les apps de qualité décente</a></li>
<li><a href="#" data-quality-filter="working">Seulement les apps fonctionelles</a></li>
<li><a href="#" data-quality-filter="none">Toutes les apps</a></li>
</ul>
</div>
</div>
<br />
<!--
Disclaimers
-->
<div class="alert alert-info">L'équipe de packaging d'applications sera heureuse de recevoir vos commentaires! Si vous trouvez des problèmes ou des améliorations possibles en installant une app, n'hésitez pas à contribuer en créant un ticket (issue) directement sur le dépôt de code.</div>
<div id="bad-quality-apps-disclaimer" class="alert alert-warning">
Les applications avec un niveau inférieur ou égal à 4 peuvent fonctionner, mais ne seront pas forcément bien intégrées avec YunoHost, ou bien ne respectent pas les bonnes pratiques de packaging.
</div>
<div id="broken-apps-disclaimer" class="alert alert-danger">
Les applications niveau 0, ou étiquettées <span class="label label-warning label-as-badge">inprogress</span>, <span class="label label-danger label-as-badge">notworking</span> sont toujours en cours de packaging ou sont connues pour être cassées. **Ne les installez pas** sur un serveur de production!
</div>
<div id="app-cards-list" class="app-cards-list"></div>
<div class="alert alert-warning">Si vous ne trouvez pas une application précise que vous recherchez, vous pouvez chercher un dépôt nommé nomdelapp_ynh sur Github ou internet, ou bien l'ajouter à la <a href="/apps_wishlist">liste d'apps souhaitées</a>.</div>
<!--
Custom CSS for this page
-->
<style>
/*=================================================
Search bar
=================================================*/
#filter-app-cards, #app-cards-list {
width:100%;
}
/*===============================================*/
/*=================================================
Force return space after card list
=================================================*/
#app-cards-list:after {
content:'';
display:block;
clear: both;
}
/*===============================================*/
/*=================================================
App card
=================================================*/
.app-card {
margin-bottom:20px;
width:270px;
float:left;
min-height: 1px;
margin-right: 10px;
margin-left: 10px;
border-radius: 3px;
}
/*===============================================*/
/*=================================================
App card body
=================================================*/
.app-card .panel-body > h3 {
margin-top:0;
margin-bottom:5px;
font-size:1.2em;
}
.app-card .app-badges {
height:35px;
}
.app-card .app-badges .label, .app-card-date-maintainer {
font-size:0.6em;
}
.label-epic {
background-color: darkorchid;
}
.app-card-date-maintainer {
text-align:right;
max-height: 18px;
margin-bottom: 3px;
margin-right: 7px;
margin-top: -5px;
}
.app-card .unmaintained {
color: #e0aa33;
}
.app-card-desc {
height:100px;
overflow: hidden;
}
/*===============================================*/
/*=================================================
App card footer
=================================================*/
.app-card .btn-group {
width:100%;
margin-left: 0px;
}
.app-card > .btn-group > .btn{
border-bottom:0;
font-size: 0.9em;
line-height: 1.58;
}
.app-card > .btn-group > .btn:first-child {
border-left:0;
border-top-left-radius:0;
}
.app-card > .btn-group > .btn:last-child {
border-right:0;
border-top-right-radius:0;
margin-left: 0px;
width: 33.6%;
}
/*===============================================*/
</style>
<!--
App card template
-->
<script type="text/template" id="app-template2">
<div class="app-card_{app_id} app-card panel panel-default" data-quality="{app_quality}">
<div class="panel-body">
<h3>{app_name}</h3>
<div class="app-badges"></div>
<div class="app-card-desc">{app_description}</div>
</div>
<div class="app-card-date-maintainer">
<span class="glyphicon glyphicon-refresh"></span> {app_update} -
<span title="{maintained_help}" class="{maintained_state}"><span class="glyphicon glyphicon-{maintained_icon}"></span> {app_maintainer}</span>
</div>
<div class="btn-group" role="group">
<a href="{app_git}" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-globe" aria-hidden="true"></span> Code</a>
<a href="#/app_{app_id}_en" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-book" aria-hidden="true"></span> Doc</a>
<a href="https://install-app.yunohost.org/?app={app_id}" target="_BLANK" type="button" class="btn btn-{app_install_css_style} col-sm-4 active"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Installer</a>
</div>
</div>
</script>
<!--
Javascript helpers
-->
<script>
function timeConverter(UNIX_timestamp) {
var a = new Date(UNIX_timestamp*1000);
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
if (hour < 10) { hour = '0' + hour; }
if (min < 10) { min = '0' + min; }
var time = date+' '+month+' '+year;//+' at '+hour+':'+min
return time;
}
$(document).ready(function () {
// Hide warrant about states when we're using the default filter
$('#state-disclaimer').hide();
var quality_filters = "decent";
function filter(){
var current_quality_filter = $('#current-quality-filter').data("filter");
var user_input_in_search_field = $('#filter-app-cards').val().toLowerCase();
$('.app-card').each(function() {
// This is where we actually define how apps are filtered:
// we look for the name of the app (h3) and try to find the user input
// + we check this app match the current quality filter
var app_name = $(this).find('h3').text().toLowerCase();
if (app_name.indexOf(user_input_in_search_field) >= 0 && $(this).data("quality").indexOf(current_quality_filter) >= 0)
{
$(this).show();
}
else
{
$(this).hide();
}
});
// Display or hide the disclaimers depending on the current filter...
((current_quality_filter == "working") || (current_quality_filter == "none")) ? $("#bad-quality-apps-disclaimer").show() : $("#bad-quality-apps-disclaimer").hide();
((current_quality_filter == "none")) ? $("#broken-apps-disclaimer").show() : $("#broken-apps-disclaimer").hide();
}
//=================================================
// Search & filter bar event
//=================================================
$('#filter-app-cards').keyup(filter);
$('a[data-quality-filter]').on("click", function(){
$('#current-quality-filter').text($(this).text());
$('#current-quality-filter').data("filter", $(this).data("quality-filter"));
filter();
});
filter();
//=================================================
// Upload apps lists
//=================================================
var catalog = undefined;
// Fetch application catalog
$.getJSON('https://app.yunohost.org/apps.json', {}, function(data) {
catalog = $.map(data, function(el) { return el; });
// Clarify high quality state, and level if undefined or inprogress or notworking...
$.each(catalog, function(k, infos) {
if ((infos.level === undefined) || (infos.state === "inprogress") || (infos.state === "notworking")) {
infos.level = null;
}
if ((infos.high_quality === true) && (infos.level === 8)) {
infos.state = "high quality";
}
});
// Sort apps according to their state and level...
catalog.sort(function(a, b){
a_state = (a.state === "high quality")?4:(a.level > 4)?3:(a.state > 0)?2:1;
b_state = (b.state === "high quality")?4:(b.level > 4)?3:(b.state > 0)?2:1;
if (a_state < b_state || a_state == b_state && a.level < b.level || a_state == b_state && a.level == b.level && a.manifest.id > b.manifest.id) {return 1;}
else if (a.manifest.id == b.manifest.id) {return 0;}
return -1;
});
// Add the card for each app
$.each(catalog, function(k, infos) {
app_id = infos.manifest.id;
// Define what style to use for state, level and install button
// according to the app quality ....
if (infos.state === "high quality") {
app_quality = "high,decent,working,none";
app_state_css_style = "epic";
app_install_css_style = "success";
app_level_css_style = "epic";
} else if (infos.level > 4) {
app_quality = "decent,working,none";
app_state_css_style = "success";
app_install_css_style = "success";
app_level_css_style = "success";
} else if (infos.level > 0) {
app_quality = "working,none";
app_state_css_style = "success";
app_install_css_style = "warning";
app_level_css_style = "warning";
} else {
app_quality = "none";
if (infos.state === "working") {
app_state_css_style = "success";
}
else if (infos.state === "inprogress") {
app_state_css_style = "warning";
}
else {
app_state_css_style = "danger";
}
app_install_css_style = "danger";
app_level_css_style = "danger";
}
// If level is null, we wanna display '?'
if (infos.level == null) {
infos.level = '?';
}
// Fill the template
html = $('#app-template2').html()
.replace(/{app_id}/g, app_id)
.replace(/{app_name}/g, infos.manifest.name)
.replace('{app_description}', infos.manifest.description.fr)
.replace(/{app_git}/g, infos.git.url)
.replace('{app_branch}', infos.git.branch)
.replace('{app_level}', infos.level)
.replace('{app_quality}', app_quality)
.replace('{app_update}', timeConverter(infos.lastUpdate))
.replace('{app_state_css_style}', app_state_css_style)
.replace('{app_install_css_style}', app_install_css_style);
// Handle the maintainer info
if (infos.maintained == false)
{
html = html
.replace('{maintained_state}', 'unmaintained')
.replace('{maintained_icon}', 'warning-sign')
.replace('{app_maintainer}', "Unmaintained")
.replace('{maintained_help}', "This package is currently unmaintained. Feel free to propose yourself as the new maintainer !");
}
else {
html = html
.replace('{maintained_state}', 'maintained')
.replace('{maintained_icon}', 'user')
.replace('{maintained_help}', "Current maintainer of this package");
if ((infos.manifest.developer) && (infos.manifest.developer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.developer.name);
}
else if ((infos.manifest.maintainer) && (infos.manifest.maintainer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.maintainer.name);
}
else {
html = html.replace('{app_maintainer}', "???");
}
}
// Fill the template
$('#app-cards-list').append(html);
$('.app-card_'+ app_id).attr('id', 'app-card_'+ app_id);
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_state_css_style+' label-as-badge app-'+infos.state+'">'+infos.state+'</span>');
if ((infos.state === "high quality") || (infos.state === "working")) {
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_level_css_style+' label-as-badge">niveau '+infos.level+'</span>');
}
});
filter();
});
//=================================================
});
</script>

1
apps_framasoft.md Normal file
View file

@ -0,0 +1 @@
Unfortunately, this page only exists [in french here](apps_framasoft_fr) for now.

48
apps_framasoft_fr.md Normal file
View file

@ -0,0 +1,48 @@
# Équivalence avec les applications Framasoft
| App Framasoft | Équivalent | Package |
| :---: | :---: | :---: |
| Framabag | Wallabag | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/wallabag2_ynh) ![](https://ci-apps.yunohost.org/ci/badges/wallabag2.status.svg) ![](https://dash.yunohost.org/integration/wallabag2.svg) |
| Framabee | Searx | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/searx_ynh) ![](https://ci-apps.yunohost.org/ci/badges/searx.status.svg) ![](https://dash.yunohost.org/integration/searx.svg) |
| Framabin | PrivateBin | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-apps/zerobin_ynh) ![](https://ci-apps.yunohost.org/ci/badges/zerobin.status.svg) ![](https://dash.yunohost.org/integration/zerobin.svg) |
| Framaboard | Kanboard | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/kanboard_ynh) ![](https://ci-apps.yunohost.org/ci/badges/kanboard.status.svg) ![](https://dash.yunohost.org/integration/kanboard.svg) |
| Framabookin | BicBucStriim | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/bicbucstriim_ynh) ![](https://ci-apps.yunohost.org/ci/badges/bicbucstriim.status.svg) ![](https://dash.yunohost.org/integration/bicbucstriim.svg) |
| Framacalc | Ethercalc | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/ethercalc_ynh) ![](https://ci-apps.yunohost.org/ci/badges/ethercalc.status.svg) ![](https://dash.yunohost.org/integration/ethercalc.svg) |
| Framacarte | uMap | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/umap_ynh) ![](https://ci-apps.yunohost.org/ci/badges/umap.status.svg) ![](https://dash.yunohost.org/integration/umap.svg) |
| Framaclic | Matomo | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/matomo_ynh) ![](https://ci-apps.yunohost.org/ci/badges/matomo.status.svg) ![](https://dash.yunohost.org/integration/matomo.svg) |
| Framadate | OpenSondage | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/opensondage_ynh) ![](https://ci-apps.yunohost.org/ci/badges/opensondage.status.svg) ![](https://dash.yunohost.org/integration/opensondage.svg) |
| Framadrive | Nextcloud | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-apps/nextcloud_ynh) ![](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![](https://dash.yunohost.org/integration/nextcloud.svg) |
| Framadrop | Lufi | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/lufi_ynh) ![](https://ci-apps.yunohost.org/ci/badges/lufi.status.svg) ![](https://dash.yunohost.org/integration/lufi.svg) |
| Framaestro | Framaestro | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/framaestro_ynh) ![](https://ci-apps.yunohost.org/ci/badges/framaestro.status.svg) ![](https://dash.yunohost.org/integration/framaestro.svg) |
| Framaforms | Framaforms | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/framaforms_ynh) ![](https://ci-apps.yunohost.org/ci/badges/framaforms.status.svg) ![](https://dash.yunohost.org/integration/framaforms.svg) |
| Framagames | Framagames | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/framagames_ynh) ![](https://ci-apps.yunohost.org/ci/badges/framagames.status.svg) ![](https://dash.yunohost.org/integration/framagames.svg) |
| Framagenda | (Agenda Nextcloud) | c.f. Nextcloud |
| Framagit | GitLab | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/gitlab_ynh) ![](https://ci-apps.yunohost.org/ci/badges/gitlab.status.svg) ![](https://dash.yunohost.org/integration/gitlab.svg) |
| | Gogs | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/gogs_ynh) ![](https://ci-apps.yunohost.org/ci/badges/gogs.status.svg) ![](https://dash.yunohost.org/integration/gogs.svg) |
| Frama.link | Lstu | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/lstu_ynh) ![](https://ci-apps.yunohost.org/ci/badges/lstu.status.svg) ![](https://dash.yunohost.org/integration/lstu.svg) |
| Framalistes | Mailman | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/mailman_ynh) ![](https://ci-apps.yunohost.org/ci/badges/mailman.status.svg) ![](https://dash.yunohost.org/integration/mailman.svg) |
| | Sympa | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/alexAubin/sympa_ynh) ![](https://ci-apps.yunohost.org/ci/badges/sympa.status.svg) ![](https://dash.yunohost.org/integration/sympa.svg) |
| Framanews | TinyTinyRSS | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-apps/ttrss_ynh) ![](https://ci-apps.yunohost.org/ci/badges/ttrss.status.svg) ![](https://dash.yunohost.org/integration/ttrss.svg) |
| Framanotes | Turtl | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/turtl_ynh) ![](https://ci-apps.yunohost.org/ci/badges/turtl.status.svg) ![](https://dash.yunohost.org/integration/turtl.svg) |
| Framapad | Etherpad + mypads | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/etherpad_mypads_ynh) ![](https://ci-apps.yunohost.org/ci/badges/etherpad_mypads.status.svg) ![](https://dash.yunohost.org/integration/etherpad_mypads.svg) |
| Framapiaf | Mastodon | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/mastodon_ynh) ![](https://ci-apps.yunohost.org/ci/badges/mastodon.status.svg) ![](https://dash.yunohost.org/integration/mastodon.svg) |
| Framapic | Lutim | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/lutim_ynh) ![](https://ci-apps.yunohost.org/ci/badges/lutim.status.svg) ![](https://dash.yunohost.org/integration/lutim.svg) |
| Framasites | Grav | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/grav_ynh) ![](https://ci-apps.yunohost.org/ci/badges/grav.status.svg) ![](https://dash.yunohost.org/integration/grav.svg) |
| Framaslides | Strut | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/strut_ynh) ![](https://ci-apps.yunohost.org/ci/badges/strut.status.svg) ![](https://dash.yunohost.org/integration/strut.svg) |
| Framasphère | Diaspora | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/aymhce/diaspora_ynh) ![](https://ci-apps.yunohost.org/ci/badges/diaspora.status.svg) ![](https://dash.yunohost.org/integration/diaspora.svg) |
| Framatalk | Jitsi Meet | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/jitsi_ynh) ![](https://ci-apps.yunohost.org/ci/badges/jitsi.status.svg) ![](https://dash.yunohost.org/integration/jitsi.svg) |
| Framateam | Mattermost | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/mattermost_ynh) ![](https://ci-apps.yunohost.org/ci/badges/mattermost.status.svg) ![](https://dash.yunohost.org/integration/mattermost.svg) |
| Framatrad | ? | Non packagé |
| Framatube | Peertube | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/peertube_ynh) ![](https://ci-apps.yunohost.org/ci/badges/peertube.status.svg) ![](https://dash.yunohost.org/integration/peertube.svg) |
| Framavectoriel | SVG-Edit | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/svgedit_ynh) ![](https://ci-apps.yunohost.org/ci/badges/svgedit.status.svg) ![](https://dash.yunohost.org/integration/svgedit.svg) |
| Framavox | Loomio | Non packagé |
| Framemo | Scrumblr | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/scrumblr_ynh) ![](https://ci-apps.yunohost.org/ci/badges/scrumblr.status.svg) ![](https://dash.yunohost.org/integration/scrumblr.svg) |
| Framindmap | Wisemapping | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/wisemapping_ynh) ![](https://ci-apps.yunohost.org/ci/badges/wisemapping.status.svg) ![](https://dash.yunohost.org/integration/wisemapping.svg) |
| Framinetest | Minetest | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/minetest_ynh) ![](https://ci-apps.yunohost.org/ci/badges/minetest.status.svg) ![](https://dash.yunohost.org/integration/minetest.svg) |
| MyFrama | Shaarli | [<span class="glyphicon glyphicon-gift"></span>](https://github.com/YunoHost-Apps/shaarli_ynh) ![](https://ci-apps.yunohost.org/ci/badges/shaarli.status.svg) ![](https://dash.yunohost.org/integration/shaarli.svg) |
### Voir aussi
- [Liste complète des applications packagées](/apps)
- [La roadmap 'Dégooglisons'](https://github.com/YunoHost/issues/milestone/13)

368
apps_it.md Normal file
View file

@ -0,0 +1,368 @@
# Application catalog
<span class="javascriptDisclaimer">
This page requires Javascript enabled to display properly :s.
<br/>
<br/>
</span>
<!--
Search bar
-->
<div class="input-group">
<span id="basic-addon1" class="input-group-addon" ><span class="glyphicon glyphicon-search"></span></span>
<input id="filter-app-cards" type="text" class="form-control" placeholder="Search for apps..." aria-describedby="basic-addon1"/>
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span id="current-quality-filter" data-filter="decent">Only decent quality apps</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#" data-quality-filter="high">Only high quality apps</a></li>
<li><a href="#" data-quality-filter="decent">Only decent quality apps</a></li>
<li><a href="#" data-quality-filter="working">Only working apps</a></li>
<li><a href="#" data-quality-filter="none">All apps</a></li>
</ul>
</div>
</div>
<br />
<!--
Disclaimers
-->
<div class="alert alert-info">The application packaging team will welcome your feedback! If you install an app and find issues or possible improvements, do not hesitate to contribute by reporting your issues directly on the code repositories.</div>
<div id="bad-quality-apps-disclaimer" class="alert alert-warning">
Applications with a level below or equal to 4 may be working, but they might be not well-integrated with YunoHost, or they do not respect the recommended packaging practices.
</div>
<div id="broken-apps-disclaimer" class="alert alert-danger">
Applications with level 0, or flagged as <span class="label label-warning label-as-badge">inprogress</span>, <span class="label label-danger label-as-badge">notworking</span> are still in development or are know to not be working. **Do not install them** in a production environment!
</div>
<div id="app-cards-list" class="app-cards-list"></div>
<div class="alert alert-warning">If you don't find the app you are looking for, you can try to look for a appname_ynh repository on Github or on the internet, or add it to the <a href="/apps_wishlist">apps wishlist</a>.</div>
<!--
Custom CSS for this page
-->
<style>
/*=================================================
Search bar
=================================================*/
#filter-app-cards, #app-cards-list {
width:100%;
}
/*===============================================*/
/*=================================================
Force return space after card list
=================================================*/
#app-cards-list:after {
content:'';
display:block;
clear: both;
}
/*===============================================*/
/*=================================================
App card
=================================================*/
.app-card {
margin-bottom:20px;
width:270px;
float:left;
min-height: 1px;
margin-right: 10px;
margin-left: 10px;
border-radius: 3px;
}
/*===============================================*/
/*=================================================
App card body
=================================================*/
.app-card .panel-body > h3 {
margin-top:0;
margin-bottom:5px;
font-size:1.2em;
}
.app-card .app-badges {
height:35px;
}
.app-card .app-badges .label, .app-card-date-maintainer {
font-size:0.6em;
}
.label-epic {
background-color: darkorchid;
}
.app-card-date-maintainer {
text-align:right;
max-height: 18px;
margin-bottom: 3px;
margin-right: 7px;
margin-top: -5px;
}
.app-card .unmaintained {
color: #e0aa33;
}
.app-card-desc {
height:100px;
overflow: hidden;
}
/*===============================================*/
/*=================================================
App card footer
=================================================*/
.app-card .btn-group {
width:100%;
margin-left: 0px;
}
.app-card > .btn-group > .btn{
border-bottom:0;
font-size: 0.9em;
line-height: 1.58;
}
.app-card > .btn-group > .btn:first-child {
border-left:0;
border-top-left-radius:0;
}
.app-card > .btn-group > .btn:last-child {
border-right:0;
border-top-right-radius:0;
margin-left: 0px;
width: 33.6%;
}
/*===============================================*/
</style>
<!--
App card template
-->
<script type="text/template" id="app-template2">
<div class="app-card_{app_id} app-card panel panel-default" data-quality="{app_quality}">
<div class="panel-body">
<h3>{app_name}</h3>
<div class="app-badges"></div>
<div class="app-card-desc">{app_description}</div>
</div>
<div class="app-card-date-maintainer">
<span class="glyphicon glyphicon-refresh"></span> {app_update} -
<span title="{maintained_help}" class="{maintained_state}"><span class="glyphicon glyphicon-{maintained_icon}"></span> {app_maintainer}</span>
</div>
<div class="btn-group" role="group">
<a href="{app_git}" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-globe" aria-hidden="true"></span> Code</a>
<a href="#/app_{app_id}_en" target="_BLANK" type="button" class="btn btn-default col-sm-4"><span class="glyphicon glyphicon-book" aria-hidden="true"></span> Doc</a>
<a href="https://install-app.yunohost.org/?app={app_id}" target="_BLANK" type="button" class="btn btn-{app_install_css_style} col-sm-4 active"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Install</a>
</div>
</div>
</script>
<!--
Javascript helpers
-->
<script>
function timeConverter(UNIX_timestamp) {
var a = new Date(UNIX_timestamp*1000);
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
if (hour < 10) { hour = '0' + hour; }
if (min < 10) { min = '0' + min; }
var time = date+' '+month+' '+year;//+' at '+hour+':'+min
return time;
}
$(document).ready(function () {
// Hide warrant about states when we're using the default filter
$('#state-disclaimer').hide();
var quality_filters = "decent";
function filter(){
var current_quality_filter = $('#current-quality-filter').data("filter");
var user_input_in_search_field = $('#filter-app-cards').val().toLowerCase();
$('.app-card').each(function() {
// This is where we actually define how apps are filtered:
// we look for the name of the app (h3) and try to find the user input
// + we check this app match the current quality filter
var app_name = $(this).find('h3').text().toLowerCase();
if (app_name.indexOf(user_input_in_search_field) >= 0 && $(this).data("quality").indexOf(current_quality_filter) >= 0)
{
$(this).show();
}
else
{
$(this).hide();
}
});
// Display or hide the disclaimers depending on the current filter...
((current_quality_filter == "working") || (current_quality_filter == "none")) ? $("#bad-quality-apps-disclaimer").show() : $("#bad-quality-apps-disclaimer").hide();
((current_quality_filter == "none")) ? $("#broken-apps-disclaimer").show() : $("#broken-apps-disclaimer").hide();
}
//=================================================
// Search & filter bar event
//=================================================
$('#filter-app-cards').keyup(filter);
$('a[data-quality-filter]').on("click", function(){
$('#current-quality-filter').text($(this).text());
$('#current-quality-filter').data("filter", $(this).data("quality-filter"));
filter();
});
filter();
//=================================================
// Upload apps lists
//=================================================
var catalog = undefined;
// Fetch application catalog
$.getJSON('https://app.yunohost.org/apps.json', {}, function(data) {
catalog = $.map(data, function(el) { return el; });
// Clarify high quality state, and level if undefined or inprogress or notworking...
$.each(catalog, function(k, infos) {
if ((infos.level === undefined) || (infos.state === "inprogress") || (infos.state === "notworking")) {
infos.level = null;
}
if ((infos.high_quality === true) && (infos.level === 8)) {
infos.state = "high quality";
}
});
// Sort apps according to their state and level...
catalog.sort(function(a, b){
a_state = (a.state === "high quality")?4:(a.level > 4)?3:(a.state > 0)?2:1;
b_state = (b.state === "high quality")?4:(b.level > 4)?3:(b.state > 0)?2:1;
if (a_state < b_state || a_state == b_state && a.level < b.level || a_state == b_state && a.level == b.level && a.manifest.id > b.manifest.id) {return 1;}
else if (a.manifest.id == b.manifest.id) {return 0;}
return -1;
});
// Add the card for each app
$.each(catalog, function(k, infos) {
app_id = infos.manifest.id;
// Define what style to use for state, level and install button
// according to the app quality ....
if (infos.state === "high quality") {
app_quality = "high,decent,working,none";
app_state_css_style = "epic";
app_install_css_style = "success";
app_level_css_style = "epic";
} else if (infos.level > 4) {
app_quality = "decent,working,none";
app_state_css_style = "success";
app_install_css_style = "success";
app_level_css_style = "success";
} else if (infos.level > 0) {
app_quality = "working,none";
app_state_css_style = "success";
app_install_css_style = "warning";
app_level_css_style = "warning";
} else {
app_quality = "none";
if (infos.state === "working") {
app_state_css_style = "success";
}
else if (infos.state === "inprogress") {
app_state_css_style = "warning";
}
else {
app_state_css_style = "danger";
}
app_install_css_style = "danger";
app_level_css_style = "danger";
}
// If level is null, we wanna display '?'
if (infos.level == null) {
infos.level = '?';
}
// Fill the template
html = $('#app-template2').html()
.replace(/{app_id}/g, app_id)
.replace(/{app_name}/g, infos.manifest.name)
.replace('{app_description}', infos.manifest.description.en)
.replace(/{app_git}/g, infos.git.url)
.replace('{app_branch}', infos.git.branch)
.replace('{app_level}', infos.level)
.replace('{app_quality}', app_quality)
.replace('{app_update}', timeConverter(infos.lastUpdate))
.replace('{app_state_css_style}', app_state_css_style)
.replace('{app_install_css_style}', app_install_css_style);
// Handle the maintainer info
if (infos.maintained == false)
{
html = html
.replace('{maintained_state}', 'unmaintained')
.replace('{maintained_icon}', 'warning-sign')
.replace('{app_maintainer}', "Unmaintained")
.replace('{maintained_help}', "This package is currently unmaintained. Feel free to propose yourself as the new maintainer !");
}
else {
html = html
.replace('{maintained_state}', 'maintained')
.replace('{maintained_icon}', 'user')
.replace('{maintained_help}', "Current maintainer of this package");
if ((infos.manifest.developer) && (infos.manifest.developer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.developer.name);
}
else if ((infos.manifest.maintainer) && (infos.manifest.maintainer.name)) {
html = html.replace('{app_maintainer}', infos.manifest.maintainer.name);
}
else {
html = html.replace('{app_maintainer}', "???");
}
}
// Fill the template
$('#app-cards-list').append(html);
$('.app-card_'+ app_id).attr('id', 'app-card_'+ app_id);
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_state_css_style+' label-as-badge app-'+infos.state+'">'+infos.state+'</span>');
if ((infos.state === "high quality") || (infos.state === "working")) {
$('.app-card_'+ app_id + ' .app-badges').append(' <span class="label label-'+app_level_css_style+' label-as-badge">level '+infos.level+'</span>');
}
});
filter();
});
//=================================================
});
</script>

45
apps_overview.md Normal file
View file

@ -0,0 +1,45 @@
Applications
============
One of the key feature of YunoHost is the ability to easily install applications which are then immediately usable. Example of applications include a blog system, a "cloud" (to host and sync files), a website, an RSS reader, ...
Applications must be packaged manually by application packagers/maintainers. Apps can be integrated with YunoHost to support upgrades, backup/restore and LDAP/SSO integration among other things.
Applications can be installed and managed through the webadmin interface in 'Applications' or through commands of the `yunohost app` category.
Application lists
-----------------
From the technical point of view, applications are public code repository (such as [this one](https://github.com/YunoHost-Apps/wordpress_ynh)). Existing applications are indexed using "application lists". Those lists can be managed in Applications > Install > Manage applications lists or with commands such as `yunohost app fetchlist`.
By default, YunoHost only knows about the official application list. Those are applications which have been carefully packaged, integrated, reviewed and shall be maintained by the YunoHost team.
Nevertheless, you might want to have access to the larger catalog of the community list. It can easily be added through the 'Manage applications lists' view of the webadmin, or with the command `yunohost app fetchlist -n community -u https://app.yunohost.org/community.json`. Just be aware that apps in this list offer less guarantees than the official apps and the YunoHost team is not responsible for them !
The full list of application (official and community) can be browsed at [this page](/apps).
Integration and quality levels
------------------------------
Automated tests are being ran regularly to test the integration and quality of all official apps, as well as community apps who were declared to be 'working'. The result is a level between 0 and 7, whose meaning is detailed on [this page](/packaging_apps_levels). Some tests results may also be available [on this dashboard](https://dash.yunohost.org/appci/branch/stable).
LDAP / SSO integration
----------------------
Applications may support integration with the LDAP / Single Sign On system, such that users who connects to the user portal can be automatically logged in all those apps. Some applications however do not support this as it can be either not implemented in the upstream, or the package didn't work on this part yet.
Multi-instance applications
---------------------------
Some applications support the ability to be installed several times (at different locations) ! To do so, just go another time in Applications > Install, and select again the application to install.
User access management
----------------------
Access to apps can be restricted to some users only. This can be configured via the webadmin in Applications > (choose an app) > Access, or similarly via the command line `yunohost app addaccess`, `removeaccess` and `clearaccess`.
Packaging applications
----------------------
If you want to learn or contribute to app packaging, please check the [contributor documentation](contributordoc).

46
apps_overview_fr.md Normal file
View file

@ -0,0 +1,46 @@
Applications
============
L'une des fonctionnalités principales de YunoHost est la possibilité d'installer facilement des applications immédiatement utilisables. Pour donner des exemples d'application, il est possible d'installer un système de blog, un "cloud" (pour héberger et synchroniser des fichiers), un site web, un lecteur RSS, ....
Les applications doivent être packagées manuellement par les packageurs/mainteneurs d'applications. Les applications peuvent être intégrées avec YunoHost pour gérer les mise à jour, la sauvegarde/restauration et l'intégration LDAP/SSO, entre autres.
Les applications peuvent être installées et gérées via l'interface webadmin dans la partie 'Applications', ou via les commandes de la catégorie `yunohost app`.
Listes d'applications
-----------------
Du point de vue technique, les applications sont des dépôts de code public (comme [celui-ci](https://github.com/YunoHost-Apps/wordpress_ynh)). Les applications existantes sont indexées à l'aide de "listes d'applications". Ces listes peuvent être gérées dans Applications > Installer > Gérer les listes d'applications, ou avec des commandes telles que `yunohost app fetchlist`.
Par défaut, YunoHost ne connaît que la liste officielle des applications. Il s'agit d'applications qui ont été soigneusement packagées, intégrées, revues et doivent être maintenues par l'équipe YunoHost.
Néanmoins, vous souhaiterez peut-être avoir accès au catalogue plus fourni de la liste communautaire. Cette liste peut facilement être ajouté via la vue 'Gérer les listes d'applications' de l'administrateur web, ou avec la commande `yunohost app fetchlist -n community -u https://app.yunohost.org/community.json`. Sachez simplement que les applications de cette liste offrent moins de garanties que les applications officielles et que l'équipe YunoHost n'en est pas responsable !
La liste des applications existantes (officielles et communautaires) peut être consultée sur [cette page](/apps).
Niveaux d'intégration et de qualité
------------------------------
Des tests automatisés sont exécutés régulièrement pour tester l'intégration et la qualité de toutes les applications officielles, ainsi que les applications communautaires qui ont été déclarées "working". Le résultat est un niveau entre 0 et 7, dont la signification est détaillée sur [cette page](/packaging_apps_levels). Certains résultats de tests peuvent également être disponibles sur [ce tableau de bord](https://dash.yunohost.org/appci/branch/stable).
Intégration LDAP / SSO
----------------------
Les applications peuvent prendre en charge l'intégration avec le système LDAP / Single Sign On, de sorte que les utilisateurs qui se connectent au portail utilisateur peuvent être automatiquement authentifiés sur toutes ces applications. Certaines applications ne le supportent pas car cette fonctionnalité n'est, soit pas implémentée en amont du logiciel de l'application, soit le mainteneur n'a pas encore travaillé sur cette partie.
Applications multi-instances
---------------------------
Certaines applications peuvent être installées plusieurs fois (à différents endroits) ! Pour ce faire, il suffit de retourner dans Applications > Installer, et de sélectionner à nouveau l'application à installer.
Gestion de l'accès des utilisateurs
----------------------
L'accès aux applications peut être limité à certains utilisateurs seulement. Ceci peut être configuré via la webadmin dans Applications > (une application) > Accès, ou de la même manière via les commandes `yunohost app addaccess`, `removeaccess` et `clearaccess`.
Packaging d'applications
------------------------
Si vous voulez apprendre ou contribuer à l'empaquetage des applications, veuillez consulter la [documentation des contributeurs](contributordoc).

151
apps_wishlist.md Normal file
View file

@ -0,0 +1,151 @@
# Apps wishlist
<div class="alert alert-info">Before to add an app in wishlist please check your app is not already in official or community list: see the <a href="/apps">apps list</a></div>
The following list is a compiled wishlist of applications that would be nice-to-have.
[Edit this list](/write_documentation) to add your own favorite app, or learn to [package apps](/packaging_apps) yourself.
- [List of awesome selfhosted apps](https://github.com/Kickball/awesome-selfhosted)
- [List of awesome sysadmin apps](https://github.com/kahun/awesome-sysadmin)
- [List of awesome Node.js projects](https://github.com/sqreen/awesome-nodejs-projects)
- [List of SIP softwares/applications](https://en.wikipedia.org/wiki/List_of_SIP_software#Free_and_open-source_license)
- [10er10](https://github.com/dready92/10er10)
- [Ajenti](http://ajenti.org) / [github](https://github.com/ajenti/ajenti/)
- [Akaunting](https://akaunting.com) Everything you need to manage your finances. Keep track of all of your payments, invoices, expenses, etc. / [github](https://github.com/akaunting/akaunting)
- [Auth0 SSO Dashboard](https://github.com/auth0-extensions/auth0-sso-dashboard-extension)
- [Bitmessage](https://bitmessage.org/wiki/Compiling_instructions) / [github](https://github.com/Bitmessage/PyBitmessage)
- [Beehive](https://github.com/muesli/beehive)
- [Bludit](https://www.bludit.com) / [github](https://github.com/bludit/bludit)
- [Blynk](https://github.com/blynkkk/blynk-library)
- [Bookstack](https://www.bookstackapp.com/) / [github](https://github.com/BookStackApp/BookStack)
- [btcpayserver](https://github.com/btcpayserver/btcpayserver)
- [cgit](http://git.zx2c4.com/cgit/about)
- [CheckUp](https://sourcegraph.github.io/checkup) / [github](https://github.com/sourcegraph/checkup)
- [citadel-suite - Debian](https://packages.debian.org/stretch/citadel-suite) / [citadel easyinstall - citadel.org](http://www.citadel.org/doku.php?id=installation:easyinstall:easyinstall) Citadel is a complete and feature-rich open source groupware platform. Directly descending from a well known C/PM BBS system, it has a venerable [history](http://www.citadel.org/doku.php?id=documentation:citadel_past_present_and_future#citadel.past.present.and.future)
- [Cockpit](http://cockpit-project.org/)
- [Commafeed](https://github.com/Athou/commafeed)
- [Converse.js](https://conversejs.org) / [github](https://github.com/jcbrand/converse.js)
- [Couchdb](https://couchdb.apache.org/) databases creation and management
- [Cozy](https://github.com/cozy)
- [Croodle](https://github.com/jelhan/croodle) Schedule a date or to do a poll on a general topics, with client-side encryption.
- [Darkwire.io](https://github.com/seripap/darkwire.io)
- [DirectoryLister](https://github.com/DirectoryLister/DirectoryLister)
- [Draw.io](https://github.com/jgraph/drawio) : a diagram online creator
- [EasyAppointments](https://easyappointments.org/) Online appointment booker (similar to Doodle)
- [eLabFTW](https://www.elabftw.net/) electronic lab notebook / [github](https://github.com/elabftw/elabftw)
- [Emoncms](https://github.com/emoncms/emoncms)
- [ERPnext](https://erpnext.com/download) / [github](https://github.com/frappe/erpnext)
- [EteSync](https://www.etesync.com/) / [github](https://github.com/etesync)
- [Epicyon](https://epicyon.net/) / [gitlab](https://gitlab.com/bashrc2/epicyon)
- [FEX](http://fex.rus.uni-stuttgart.de/)
- [FitTrackee](https://github.com/SamR1/FitTrackee)
- [Fossil](http://www.fossil-scm.org)
- [WebThings Gateway](https://iot.mozilla.org/gateway/) [github](https://github.com/mozilla-iot/)
- [Gancio](https://gancio.org/) / [framagit](https://framagit.org/les/gancio)
- [Geneweb](https://geneweb.tuxfamily.org) / [github](https://github.com/geneweb/geneweb)
- [GetSimple CMS](http://get-simple.info) / [github](https://github.com/GetSimpleCMS/GetSimpleCMS)
- [Goaccess](https://goaccess.io) Web log analyser (replaces piwik without js tracking scripts) / [github](https://github.com/allinurl/goaccess)
- [Gollum](https://github.com/gollum/gollum)
- [Goploader](https://github.com/Depado/goploader)
- [Granary](https://github.com/snarfed/granary)
- [Guacamole](http://guacamole.apache.org/)
- [Habitica](https://habitica.com/) / [github](https://github.com/HabitRPG/habitica)
- [HackMD CE](https://github.com/hackmdio/hackmd)
- [Helpy](https://github.com/helpyio/helpy)
- [Hexo](https://hexo.io/) / [github](https://github.com/hexojs/hexo)
- [Icecast 2](http://www.icecast.org) / [gitlab](https://gitlab.xiph.org/xiph/icecast-server/)
- [ikiwiki](http://ikiwiki.info)
- [Invidious](https://github.com/omarroth/invidious)
- [Invoice Ninja](https://www.invoiceninja.com) / [github](https://github.com/invoiceninja/invoiceninja)
- [InvoicePlane](https://invoiceplane.com) / [github](https://github.com/InvoicePlane/InvoicePlane)
- [IPFS](https://ipfs.io) / [github](https://github.com/ipfs/ipfs)
- [Jellyfin](https://github.com/jellyfin)
- [JS Bin](http://jsbin.com/help/2-second-setup) / [github](https://github.com/jsbin/)
- [Joplin](http://joplin.cozic.net/) / [github](https://github.com/laurent22/joplin)
- [Joplin-web](https://github.com/foxmask/joplin-web) / [github](https://github.com/foxmask/joplin-web)
- [Kiwix](http://www.kiwix.org/) Offline wikipedia / [github](https://github.com/kiwix/)
- [Known](https://withknown.com) / [github](https://github.com/idno/known)
- [Koel](http://koel.phanan.net) / [github](https://github.com/phanan/koel)
- [Kontalk](https://kontalk.org) / [github](https://github.com/kontalk)
- [Koozip](http://koozic.net) / [github](https://github.com/DocMarty84/koozic)
- [L'atelier](https://github.com/jbl2024/latelier)
- [Lemmy](https://dev.lemmy.ml) / [github](https://github.com/dessalines/lemmy) A federated alternative to reddit.
- [Lessy](https://lessy.io) / [github](https://github.com/lessy-community/lessy)
- [LibreOffice Online](https://wiki.documentfoundation.org/ReleaseNotes/5.3/fr#LibreOffice_Online)
- [LiquidSoap](http://savonet.sourceforge.net/) / [github](https://github.com/savonet/liquidsoap)
- [LocomotiveCMS](https://github.com/locomotivecms/engine)
- [Loomio](https://www.loomio.org) / [github](https://github.com/loomio/loomio/)
- [MaidSafe](http://maidsafe.net) / [github](https://github.com/maidsafe)
- [Mailpile](https://www.mailpile.is) / [github](https://github.com/mailpile/Mailpile)
- [Mailtrain](https://mailtrain.org/) / [github](https://github.com/Mailtrain-org/mailtrain)
- [Mautic](https://github.com/mautic/mautic)
- [microblog.pub](https://microblog.pub) / [github](https://github.com/tsileo/microblog.pub)
- [Mirakel](http://mirakel.azapps.de/taskwarrior.html) / [github](https://github.com/GothenburgBitFactory/taskwarrior) (/!\ SSL-Warning)
- [Modoboa](http://modoboa.org) / [github](https://github.com/modoboa/)
- [MotionEye](https://github.com/ccrisan/motioneye)
- [MPD](http://www.musicpd.org)
- [MyBB](https://mybb.com/) / [github](https://github.com/mybb)
- [Museek+](https://github.com/eLvErDe/museek-plus)
- [N8n.io](https://n8n.io)
- [Netrunner](https://github.com/mtgred/netrunner)
- [Nibbleblog](http://www.nibbleblog.com)/ [github](https://github.com/dignajar/nibbleblog)
- [Nuage](https://nuage.kerjean.me/login) / [github](https://github.com/mickael-kerjean/filestash)
- [Ombi](https://github.com/tidusjar/Ombi)
- [OpenBazaar](https://openbazaar.org) / [github](https://github.com/openbazaar)
- [OpenCart](https://www.opencart.com) / [github](https://github.com/opencart/opencart)
- [openHAB](https://www.openhab.org/) - Smart home platform. / [github](https://github.com/openhab)
- [OpenProject](https://github.com/opf/openproject)
- [OpenSourceBilling](https://github.com/vteams/open-source-billing)
- [OX Open-Xchange](https://www.open-xchange.com) Linux groupware solution / [github](https://github.com/open-xchange/)
- [Paperless](https://github.com/danielquinn/paperless)
- [Paperwork](http://paperwork.rocks)
- [Passbolt](https://www.passbolt.com) Passwords manager / [github](https://github.com/passbolt)
- [Pelias](https://github.com/pelias/pelias))
- [PHPList](http://www.phplist.com) / [github](https://github.com/phpList)
- [Phraseanet](https://docs.phraseanet.com/3.8/fr/index.html#) / [github](https://github.com/alchemy-fr/Phraseanet-Docs)
- [Pico](http://picocms.org) / [github](https://github.com/picocms/Pico)
- [Playmaker](https://github.com/NoMore201/playmaker)
- [Presentator](https://presentator.io/) A design presentation and collaboration platform.
- [Privoxy](http://www.privoxy.org)
- [ProcessMaker](http://www.processmaker.com)
- [ProtonMails WebClient](https://github.com/ProtonMail/WebClient)
- [PyLoad](https://github.com/pyload/pyload)
- [Pump.io](http://pump.io) / [github](https://github.com/pump-io/pump.io)
- [qBittorrent](https://github.com/qbittorrent/qBittorrent)
- [racktables](http://racktables.org) / [github](https://github.com/RackTables/racktables)
- [Radarr](https://github.com/Radarr/Radarr)
- [Request Tracker](https://bestpractical.com) / [github](https://github.com/bestpractical/rt)
- [Restya](http://restya.com) / [github](https://github.com/RestyaPlatform/board/)
- [Retroshare](https://retroshare.cc/) / [github](https://github.com/RetroShare/RetroShare)
- [ScenariChain-server](https://download.scenari.software/SCENARIchain-server/)
- [Scuttlebutt Pub](https://www.scuttlebutt.nz/contributing)
- [ShareLatex](https://www.sharelatex.com) / [github](https://github.com/overleaf/overleaf)
- [Schleuder](https://schleuder.org/schleuder/docs/concept.html)(Schleuder is a gpg-enabled mailing list manager with resending capabilities.)
- [SocialHome](https://github.com/jaywink/socialhome) (Socialhome is best described as a federated personal profile with social networking functionality) (https://socialhome.network)
- [smokeping](https://packages.debian.org/buster/smokeping) / [github](https://github.com/oetiker/SmokePing)
- [Sonarr](https://sonarr.tv) / [github](https://github.com/Sonarr/Sonarr)
- [Stackedit](https://stackedit.io) / [github](https://github.com/benweet/stackedit)
- [StandardNotes](https://standardnotes.org) (a clean, simple, E2E-encrypted notes app) -- specifically, the server-side [StandardFile](https://standardfile.org) portion / [github](https://github.com/standardnotes/web)
- [Streisand](https://github.com/jlund/streisand)
- [Subspace](https://github.com/subspacecloud/subspace) (A simple WireGuard VPN server GUI)
- [Syspass](http://www.syspass.org/) / [github](https://github.com/nuxsmin/sysPass)
- [Taiga](https://taiga.io) / [github](https://github.com/taigaio/)
- [Taskwarrior](https://taskwarrior.org) / [github](https://github.com/GothenburgBitFactory/taskwarrior)
- [TMate](https://tmate.io/) / [github](https://github.com/tmate-io/tmate)
- [Tracim](https://github.com/tracim/tracim)
- [Thredded](https://thredded.org/) / [github](https://github.com/thredded/thredded)
- [Twister](http://twister.net.co) / [github](https://github.com/miguelfreitas/twister-core/)
- [TwitRSS.me](http://twitrss.me/) / [Github](https://github.com/ciderpunx/twitrssme) Scrapes Twitter to create RSS feeds.
- [Volumio](https://volumio.org) / [github](https://github.com/volumio)
- [WebODF](http://webodf.org) / [github](https://github.com/webodf/WebODF)
- [Webhook.site](https://docs.webhook.site/) / [github](https://github.com/fredsted/webhook.site)
- [Wireguard](https://www.wireguard.com/) / [git](https://git.zx2c4.com/WireGuard/)
- [Xibo](https://github.com/xibosignage) - A FLOSS digital signage solution (CMS?)
- [Xonotic](http://xonotic.org) / [gitlab](https://gitlab.com/xonotic)
- [YesWiki](https://yeswiki.net) / [github](https://github.com/YesWiki/yeswiki)
- [Zammad](https://github.com/zammad/zammad)
- [ZeroTier](https://github.com/zerotier/ZeroTierOne)
- [Zoneminder](https://github.com/ZoneMinder/zoneminder)
- [Zulip](https://zulipchat.com/) / [github](https://github.com/zulip/zulip)
- [Yggdrasil](https://yggdrasil-network.github.io/) / [github](https://github.com/yggdrasil-network/yggdrasil-go)

33
appsdoc.md Normal file
View file

@ -0,0 +1,33 @@
- [Baikal](app_baikal)
- [Blogotext](app_blogotext)
- [Collabora (Docker)](app_collaboradocker)
- [Custom Webapp](app_my_webapp)
- [Dokuwiki](app_dokuwiki)
- [FirefoxSync](app_ffsync)
- [Fireflyiii](app_firefly_iii)
- [FluxBB](app_fluxbb)
- [Gogs](app_gogs)
- [Hextris](app_hextris)
- [Jappix](app_jappix)
- [Limesurvey](app_limesurvey)
- [Mediawiki](app_mediawiki)
- [Minidlna](app_minidlna)
- [Netdata](app_netdata)
- [Nextcloud](app_nextcloud)
- [Noalyss](app_noalyss)
- [Peertube](app_peertube)
- [Pihole](app_pihole)
- [Piwigo](app_piwigo)
- [Pleroma](app_pleroma)
- [Pluxml](app_pluxml)
- [Radicale](app_radicale)
- [Rainloop](app_rainloop)
- [Sogo](app_sogo)
- [Spip](app_spip)
- [Transmission](app_transmission)
- [TinyTinyRSS](app_ttrss)
- [Wallabag2](app_wallabag2)
- [Webtrees](app_webtrees)
- [Yunofav](app_yunofav)
- (Note that you can add a new page here if you want to start document in another `app...))