pub / kontra

Der linke Newsaggregator.
git clone src.jayvii.de/pub/kontra.git
Home | Log | Files | Exports | Refs | README | RSS

index.php (33206B)


      1 <?php
      2 
      3 /* SPDX-License-Identifier: AGPL-3.0-or-later
      4  * SPDX-FileCopyrightText: 2025 JayVii <jayvii+kontra[AT]posteo[DOT]de>
      5  */
      6 
      7     /* Loading configuration */
      8     $config = json_decode(
      9         file_get_contents("./news-sources.json"),
     10         true
     11     );
     12 
     13     /* OPML Generator */
     14 
     15     /* Check for user input */
     16     if (!is_null($_POST["action"])) {
     17 
     18         /* Generate OPML */
     19         if ($_POST["action"] === "gen_opml") {
     20 
     21             /* Gather news sources from selection */
     22             $input_keys = preg_grep(
     23                 "/^source-[0-9]+$/",
     24                 array_keys($_POST)
     25             );
     26             $sources = array();
     27             foreach ($input_keys as $key) {
     28                 array_push(
     29                     $sources,
     30                     $config["sources"][$_POST[$key]]
     31                 );
     32             }
     33 
     34             $exp_hash = md5(serialize($sources));
     35             $file_name = "kontra_" . date("Y-m-d") . "_" . $exp_hash . ".opml";
     36 
     37             /* Set Download and content type headers */
     38             header('Content-Type: application/xml; charset=UTF-8');
     39             header(
     40                 'Content-Disposition: Attachment;filename="' . $file_name . '"'
     41             );
     42 
     43             /* Build OPML file */
     44 ?>
     45 
     46 <opml version="2.0">
     47 <head>
     48     <title>
     49         Nachrichten-Export von Kontra -
     50         <?php echo "https://" . $_SERVER["SERVER_NAME"] . PHP_EOL; ?>
     51     </title>
     52 </head>
     53 <body>
     54 
     55 <?php
     56 
     57             /* Cycle through each source and write source entry */
     58             $indexes = array(
     59                 "regions", "languages", "access", "medium", "topics"
     60             );
     61             foreach ($sources as $source) {
     62 
     63                 /* Construct title */
     64                 $title = $config["publisher"][$source["publisher"][0]]["name"] .
     65                     ": " . $source["title"];
     66 
     67                 /* Create category list */
     68                 $categories = array();
     69                 foreach ($indexes as $index) {
     70                     foreach ($source[$index] as $category) {
     71                         array_push(
     72                             $categories,
     73                             $config[$index][$category]["name"]
     74                         );
     75                     }
     76                 }
     77 
     78 ?>
     79 
     80 <outline
     81     title="<?php echo $title; ?>"
     82     text="<?php echo $title; ?>"
     83     category="<?php echo implode(",", $categories); ?>"
     84     xmlUrl="<?php echo $source["rss"]; ?>"
     85     htmlUrl="<?php echo $source["web"]; ?>"
     86 />
     87 
     88 <?php
     89 
     90             } // foreach-source
     91 
     92 ?>
     93 
     94 </body>
     95 </opml>
     96 
     97 <?php
     98 
     99             die();
    100         } // if-action
    101     } // if-input
    102 
    103 ?>
    104 
    105 <!doctype html>
    106 <html>
    107 
    108     <!-- Head -->
    109     <head>
    110         <meta charset=utf-8>
    111         <meta name=viewport content="width=device-width,initial-scale=1">
    112         <link rel=icon href=assets/img/favicon.png type=image/png>
    113         <link rel=icon href=assets/img/favicon.ico type=x-image/ico>
    114         <link rel=stylesheet href=assets/css/simple.min.css media=all>
    115         <link rel=stylesheet href=assets/css/custom.css>
    116         <script async src=assets/js/filter_engines.js></script>
    117         <title>Kontra - Das progressive Nachrichtenarchiv</title>
    118     </head>
    119 
    120     <!-- Body -->
    121     <body>
    122 
    123         <!-- Header -->
    124         <header>
    125             <nav>
    126                 <a href="#sources">
    127                     Nachrichten
    128                 </a>
    129                 <a href="#faqs">
    130                     Was ist das?
    131                 </a>
    132                 <a href="https://src.jayvii.de/pub/kontra/" target="_blank">
    133                     Hilf mit!
    134                 </a>
    135             </nav>
    136             <h1>Kontra</h1>
    137             <p>Das progressive Nachrichtenarchiv</p>
    138         </header>
    139 
    140         <!-- Description -->
    141         <div class="fullheight">
    142             <div class="description">
    143                 <strong style="font-size: 133%;">
    144                     Nachrichten von Links! Ohne Tracking, ohne Tech-Konzerne und
    145                     ohne algorithmisches Framing.
    146                 </strong>
    147                 <p>
    148                     Auf dieser Seite befinden sich viele seriöse Medienquellen
    149                     aus dem <em>progressiven</em> Spektrum von Zeitungen,
    150                     Magazinen und sonstigen journalistischen Veröffentlichungen,
    151                     aus denen sich persönliche Nachrichten-Feeds erstellen
    152                     lassen.
    153                 </p>
    154             </div>
    155             <div class="buttonrow">
    156                 <a href="#usage" class="button c2">
    157                     Wie funktioniert das?
    158                 </a>
    159                 <a href="#sources" class="button c2">
    160                     Zu den Nachrichten!
    161                 </a>
    162             </div>
    163         </div>
    164 
    165         <div class="fullheight screenshots" id="usage">
    166             <h3>Was ist Kontra?</h3>
    167             <figure class="buttonrow">
    168                 <img style="flex:26%;min-width:91px;margin:2.5px;" src="assets/img/applications/gfeeds_mobile.jpg">
    169                 <img style="flex:72%;min-width:252px;margin:2.5px;" src="assets/img/applications/gfeeds_desktop.jpg">
    170                 <figcaption style="width:100%;">
    171                     Nachrichten Feeds aus Kontra in <a href="https://gfeeds.gabmus.org/" target="_blank">Gnome Feeds</a>
    172                 </figcaption>
    173             </figure>
    174             <p>
    175                 Kontra versetzt Nutzer:innen in die Lage, selbstbestimmt
    176                 personalisierte Nachrichten-Feeds von seriösen <em>progressiven</em>
    177                 Quellen zu erstellen, um immer auf dem Laufenden zu bleiben.
    178                 Und das selbstverständlich
    179                 <strong>ohne <a href="https://de.wikipedia.org/wiki/Web_Analytics" target="_blank">Tracking</a></strong>,
    180                 <strong>ohne Datensammelwut</strong>,
    181                 <strong>ohne Konto-Zwang</strong>
    182                 <strong>ohne <a href="https://de.wikipedia.org/wiki/Soziales_Netzwerk_(Internet)#Kritik" target="_blank">Algorithmen</a></strong> und
    183                 <strong>ohne <a href="https://de.wikipedia.org/wiki/Lock-in-Effekt" target="_blank">Lock-In Effekte</a></strong>.
    184                 Wie das funktioniert, erfährst du <a href="#faqs">hier</a>!
    185             </p>
    186             <p>
    187                 Die in Kontra hinterlegten Medien behandeln ein breites Spektrum
    188                 an Themen und mit unterschiedlichen Fokuspunkten. Sie vereint
    189                 eine <em>progressive</em> und politisch <em>linke</em>
    190                 Sichtweise. Die Idee hinter Kontra ist, die Nutzung von Medien
    191                 zu vereinfachen und Menschen in die Lage zu versetzen, selbst
    192                 kuratierte Nachrichtenquellen und Themenbereiche zu verfolgen.
    193             </p>
    194             <p>
    195                 Kontra ist ein Archiv mit aktuell
    196                 <strong><?php echo count($config["sources"]); ?></strong>
    197                 Nachrichten-Feeds aus
    198                 <strong><?php echo count($config["publisher"]); ?></strong>
    199                 unterschiedlichen Quellen, zu
    200                 <strong><?php echo count($config["topics"]); ?></strong>
    201                 Themenbereichen, innerhalb von
    202                 <strong><?php echo count($config["regions"]); ?></strong>
    203                 Regionen, in
    204                 <strong><?php echo count($config["languages"]); ?></strong>
    205                 verschiedenen Sprachen. Nutzer:innen können sich aus diesem
    206                 Katalog eigene Nachrichten-Feeds gänzlich nach ihren Interessen
    207                 zusammenstellen. Die hier herunterladbaren
    208                 <a href="https://de.wikipedia.org/wiki/Outline_Processor_Markup_Language" target="_blank">
    209                     Nachrichten-Feed Dateien</a>
    210                 können in beliebigen
    211                 <a href="https://de.wikipedia.org/wiki/Feedreader" target="_blank">
    212                     Feed-Readern</a>
    213                 eingeladen und sofort genutzt werden!
    214                 Zum Beispiel in diesen
    215                 <a href="https://fsfe.org/freesoftware/freesoftware.de.html" target="_blank">
    216                     Freien</a>
    217                 und kostenlosen Apps für Android und iOS:
    218                 <ul>
    219                     <li><a href="https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210" target="_blank">NetNewsWire (iOS)</a></li>
    220                     <li><a href="https://apps.apple.com/us/app/twine-rss-reader/id6465694958" target="_blank">Twine (iOS)</a></li>
    221                     <li><a href="https://play.google.com/store/apps/details?id=com.nononsenseapps.feeder.play" target="_blank">Feeder (Android)</a></li>
    222                     <li><a href="https://play.google.com/store/apps/details?id=dev.sasikanth.rss.reader" target="_blank">Twine (Android)</a></li>
    223                     <li><a href="https://freshrss.org/" target="_blank">FreshRSS (Web)</a></li>
    224                     <li><a href="https://www.thunderbird.net/de/" target="_blank">Thunderbird (Windows, MacOS, Linux)</a></li>
    225                     <li><a href="https://gfeeds.gabmus.org/" target="_blank">Feeds (Linux)</a></li>
    226                     <li><a href="https://apps.gnome.org/de/NewsFlash/" target="_blank">NewsFlash (Linux)</a></li>
    227                     <li><a href="https://apps.kde.org/de/alligator/" target="_blank">Alligator (Linux)</a></li>
    228                     <li><a href="https://alternativeto.net/browse/search/?q=rss%20reader" target="_blank">und viele weitere</a>...</li>
    229                 </ul>
    230             </p>
    231             <p>
    232                 Ganz einfach in nur <strong>zwei Minuten</strong> loslegen!
    233                 Nachrichtenquellen aussuchen, Feed-Datei herunterladen, in
    234                 den Reader importieren und sofort informiert werden.
    235             </p>
    236             
    237             <div class="buttonrow">
    238                 <a href="#faqs" class="button c2">
    239                     Mehr erfahren
    240                 </a>
    241                 <a href="#sources" class="button c2">
    242                     Zu den Nachrichten!
    243                 </a>
    244             </div>
    245         </div>
    246 
    247         <!-- Search Engine Lists -->
    248         <h3 id="sources" style="margin-top:5em;">
    249             Eigenen Nachrichten-Feed generieren
    250         </h3>
    251         <p>
    252             Wähle beliebig viele Nachrichtenquellen aus der unteren Liste aus
    253             und klicke auf den <strong>Nachrichten-Feed erzeugen</strong> Knopf.
    254             Speichere die darauf angebotene OPML-Datei ab und importiere sie in
    255             deinen RSS-Reader.
    256         </p>
    257         <p>
    258             Kontra bietet zur Zeit Zugriff auf
    259             <strong><?php echo count($config["sources"]); ?></strong>
    260             Nachrichten-Feeds aus
    261             <strong><?php echo count($config["publisher"]); ?></strong>
    262             unterschiedlichen Quellen, zu
    263             <strong><?php echo count($config["topics"]); ?></strong>
    264             Themenbereichen, innerhalb von
    265             <strong><?php echo count($config["regions"]); ?></strong>
    266             Regionen, in
    267             <strong><?php echo count($config["languages"]); ?></strong>
    268             verschiedenen Sprachen. Nutze die Suchfunktion und die
    269             Kategorienliste, um die Auswahl zu erleichtern.
    270         </p>
    271         <!-- Filterbar -->
    272         <input
    273             id="sources_filterbar"
    274             name="sources"
    275             type="text"
    276             placeholder="Suche nach Nachrichtenquellen oder Kategorien..."
    277             oninput="filter_sources('sources_filterbar');"
    278         >
    279         <noscript>
    280             <div class="notice">
    281                 <p>
    282                     Achtung: Die Nutzung der Suchfunktion benötigt aktiviertes
    283                     JavaScript. Entweder unterstützt dein Browser diese
    284                     Funktion nicht, oder du hast sie auf dieser Seite blockiert.
    285                     <strong>
    286                         Du kannst dennoch einen Nachrichten-Feed erzeugen, jedoch
    287                         ohne die Suchfunktion oben dafür nutzen zu können.
    288                     </strong>
    289                 </p>
    290             </div>
    291         </noscript>
    292 
    293         <!-- Category Buttons -->
    294         <details id="categories">
    295             <summary>Kategorien</summary>
    296 
    297             <h4>Themen</h4>
    298             <div class="row">
    299 
    300                 <!-- List all configured regions -->
    301                 <?php
    302                     foreach ($config["topics"] as $topic) {
    303                 ?>
    304                 <button
    305                     onclick="filter_category('<?php echo $topic["name"]; ?>');"
    306                     title="<?php echo $topic["description"]; ?>"
    307                 >
    308                     <?php echo "#" . $topic["name"]; ?>
    309                 </button>
    310                 <?php
    311                     }
    312                 ?>
    313 
    314             </div>
    315 
    316             <h4>Regionen</h4>
    317             <div class="row">
    318 
    319                 <!-- List all configured regions -->
    320                 <?php
    321                     foreach ($config["regions"] as $region) {
    322                 ?>
    323                 <button
    324                     onclick="filter_category('<?php echo $region["name"]; ?>');"
    325                     title="<?php echo $region["description"]; ?>"
    326                 >
    327                     <?php echo "#" . $region["name"]; ?>
    328                 </button>
    329                 <?php
    330                     }
    331                 ?>
    332 
    333             </div>
    334 
    335             <h4>Sprachen</h4>
    336             <div class="row">
    337 
    338                 <!-- List all configured languages -->
    339                 <?php
    340                     foreach ($config["languages"] as $language) {
    341                 ?>
    342                 <button
    343                     onclick="filter_category('<?php echo $language["name"]; ?>');"
    344                     title="<?php echo $language["description"]; ?>"
    345                 >
    346                     <?php echo "#" . $language["name"]; ?>
    347                 </button>
    348                 <?php
    349                     }
    350                 ?>
    351 
    352             </div>
    353 
    354             <h4>Zugriff</h4>
    355             <div class="row">
    356 
    357                 <!-- List all configured access types -->
    358                 <?php
    359                     foreach ($config["access"] as $access) {
    360                 ?>
    361                 <button
    362                     onclick="filter_category('<?php echo $access["name"]; ?>');"
    363                     title="<?php echo $access["description"]; ?>"
    364                 >
    365                     <?php echo "#" . $access["name"]; ?>
    366                 </button>
    367                 <?php
    368                     }
    369                 ?>
    370 
    371             </div>
    372 
    373             <h4>Medium</h4>
    374             <div class="row">
    375 
    376                 <!-- List all configured media -->
    377                 <?php
    378                     foreach ($config["medium"] as $medium) {
    379                 ?>
    380                 <button
    381                     onclick="filter_category('<?php echo $medium["name"]; ?>');"
    382                     title="<?php echo $medium["description"]; ?>"
    383                 >
    384                     <?php echo "#" . $medium["name"]; ?>
    385                 </button>
    386                 <?php
    387                     }
    388                 ?>
    389 
    390             </div>
    391 
    392             <h4>Quellen</h4>
    393             <div class="row">
    394 
    395                 <!-- List all configured sources -->
    396                 <?php
    397                     foreach ($config["publisher"] as $publisher) {
    398                 ?>
    399                 <button
    400                     onclick="filter_category('<?php echo $publisher["button"]; ?>');"
    401                     title="<?php echo $publisher["description"]; ?>"
    402                 >
    403                     <?php echo "#" . $publisher["button"]; ?>
    404                 </button>
    405                 <?php
    406                     }
    407                 ?>
    408 
    409             </div>
    410 
    411         </details>
    412 
    413         <!-- Sources List -->
    414         <form id="sources-selection" method="post">
    415 
    416             <!-- Submit button -->
    417             <div class="submit-container">
    418                 <input type="submit" value="Nachrichten-Feed erzeugen!">
    419                 <a href="#sources" class="button" title="Nach oben">
    420                     &#128070; <stretch class="nomobile">Nach oben</stretch>
    421                 </a>
    422                 <a href="#faqs" class="button" title="Nach unten">
    423                     &#128071; <stretch class="nomobile">Nach unten</stretch>
    424                 </a>
    425             </div>
    426             <input type="hidden" name="action" value="gen_opml">
    427             <?php
    428                 $cnt = 0;
    429                 foreach ($config["sources"] as $id => $source) {
    430                     $cnt++; // increase counter for POST field ID
    431 
    432                     /* Gather publishing medium info */
    433                     $publisher = $config["publisher"][
    434                         array_pop($source["publisher"])
    435                     ];
    436             ?>
    437             <article>
    438                 <!-- Entry-Head -->
    439                 <h3>
    440                     <a href="<?php echo $source["web"]; ?>" target="_blank">
    441                         <?php
    442                             echo $publisher["name"] . ": " . $source["title"];
    443                         ?>
    444                     </a>
    445                 </h3>
    446 
    447                 <!-- Description -->
    448                 <p>
    449                     <?php
    450                         echo $publisher["desc"] . " " . $source["desc"];
    451                     ?>
    452                 </p>
    453 
    454                 <!-- Choose this Button -->
    455                 <input
    456                     type="checkbox"
    457                     name="<?php echo "source-" . $cnt; ?>"
    458                     value="<?php echo $id; ?>"
    459                 >
    460                 <label for="<?php echo $id; ?>">
    461                     Diese Nachrichtenquelle auswählen
    462                 </label>
    463 
    464                 <!-- Entry-Categories -->
    465                 <table style="width:100%;">
    466 
    467                     <tr>
    468                         <th>Quelle:</th>
    469                         <td>
    470                         <mark title="<?php echo $publisher["desc"];?>">
    471                             <?php echo "#" . $publisher["button"]; ?>
    472                         </mark>
    473                         </td>
    474                     </tr>
    475 
    476                     <tr>
    477                         <th>Region:</th>
    478                         <td>
    479                         <?php
    480                             foreach ($source["regions"] as $region) {
    481                                 $catentry = $config["regions"][$region] 
    482                         ?>
    483                         <mark title="<?php echo $catentry["description"];?>">
    484                             <?php echo "#" . $catentry["name"]; ?>
    485                         </mark>
    486                         <?php
    487                             }
    488                         ?>
    489                         </td>
    490                     </tr>
    491 
    492                     <tr>
    493                         <th>Sprachen:</th>
    494                         <td>
    495                         <?php
    496                             foreach ($source["languages"] as $language) {
    497                                 $catentry = $config["languages"][$language] 
    498                         ?>
    499                         <mark title="<?php echo $catentry["description"];?>">
    500                             <?php echo "#" . $catentry["name"]; ?>
    501                         </mark>
    502                         <?php
    503                             }
    504                         ?>
    505                         </td>
    506                     </tr>
    507 
    508                     <tr>
    509                         <th>Zugang:</th>
    510                         <td>
    511                         <?php
    512                             foreach ($source["access"] as $access) {
    513                                 $catentry = $config["access"][$access] 
    514                         ?>
    515                         <mark title="<?php echo $catentry["description"];?>">
    516                             <?php echo "#" . $catentry["name"]; ?>
    517                         </mark>
    518                         <?php
    519                             }
    520                         ?>
    521                         </td>
    522                     </tr>
    523 
    524                     <tr>
    525                         <th>Medium:</th>
    526                         <td>
    527                         <?php
    528                             foreach ($source["medium"] as $medium) {
    529                                 $catentry = $config["medium"][$medium] 
    530                         ?>
    531                         <mark title="<?php echo $catentry["description"];?>">
    532                             <?php echo "#" . $catentry["name"]; ?>
    533                         </mark>
    534                         <?php
    535                             }
    536                         ?>
    537                         </td>
    538                     </tr>
    539 
    540                     <tr>
    541                         <th>Themen:</th>
    542                         <td>
    543                         <?php
    544                             foreach ($source["topics"] as $topic) {
    545                                 $catentry = $config["topics"][$topic] 
    546                         ?>
    547                         <mark title="<?php echo $catentry["description"];?>">
    548                             <?php echo "#" . $catentry["name"]; ?>
    549                         </mark>
    550                         <?php
    551                             }
    552                         ?>
    553                         </td>
    554                     <tr>
    555                 </table>
    556 
    557             </article>
    558             <?php
    559                 }
    560             ?>
    561         </form>
    562 
    563         <!-- FAQs / About-Section -->
    564         <section id="faqs">
    565 
    566             <h3>Was ist <em>Kontra</em>?</h3>
    567 
    568             <details>
    569                 <summary>Was sind Feed-Reader / RSS-Reader?</summary>
    570                 <p>
    571                     Feed- oder RSS-Reader erlauben es, so genannte RSS-Feeds zu
    572                     <em>abonnieren</em>, um regelmäßig Nachrichten von diesen zu
    573                     erhalten. Das Konzept ist vergleichbar mit einem E-Mail
    574                     Newsletter.
    575                 </p>
    576                 <p>
    577                     Der Unterschied besteht darin, dass man, um einen Newsletter
    578                     erhalten zu können, den Versender:innen eine E-Mail Adresse
    579                     hinterlegen muss. Newsletter werden dann aktiv von den
    580                     Versender:innen an bekannte Empfänger:innen verschickt.
    581                 </p>
    582                 <p>
    583                     Bei RSS-Feeds ist es umgekehrt. Empfänger:innen (bzw. von
    584                     ihnen genutzt Feed-Reader) ziehen sich die Nachrichten von
    585                     den Nachrichten-Seiten oder Blogs selbst. Letztere wissen
    586                     dabei gar nicht, wer die Empfänger:innen sind oder wie viele
    587                     es letztendlich sind.
    588                 </p>
    589                 <p>
    590                     Der RSS-Reader ist lediglich die Software, welche die
    591                     Nachrichten empfängt und diese oft in einem Listen-Format
    592                     zum Lesen anzeigt. Es gibt eine Vielzahl wirklich guter
    593                     und zeitgemäßer RSS-Reader für alle möglichen Endgeräte,
    594                     ganz egal ob am PC, Smartphone, Tablet, E-Book-Reader oder
    595                     per Webbrowser.
    596                 </p>
    597                 <p>
    598                     Folgende RSS-Reader sind kostenlos und darüber hinaus noch
    599                     <a href="https://fsfe.org/freesoftware/freesoftware.de.html" target="_blank">
    600                         Freie, Open Source Software
    601                     </a>:
    602                     <ul>
    603                         <li><a href="https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210" target="_blank">NetNewsWire (iOS)</a></li>
    604                         <li><a href="https://apps.apple.com/us/app/twine-rss-reader/id6465694958" target="_blank">Twine (iOS)</a></li>
    605                         <li><a href="https://play.google.com/store/apps/details?id=com.nononsenseapps.feeder.play" target="_blank">Feeder (Android)</a></li>
    606                         <li><a href="https://play.google.com/store/apps/details?id=dev.sasikanth.rss.reader" target="_blank">Twine (Android)</a></li>
    607                         <li><a href="https://freshrss.org/" target="_blank">FreshRSS (Web)</a></li>
    608                         <li><a href="https://www.thunderbird.net/de/" target="_blank">Thunderbird (Windows, MacOS, Linux)</a></li>
    609                         <li><a href="https://gfeeds.gabmus.org/" target="_blank">Feeds (Linux)</a></li>
    610                         <li><a href="https://apps.kde.org/de/alligator/" target="_blank">Alligator (Linux)</a></li>
    611                         <li><a href="https://alternativeto.net/browse/search/?q=rss%20reader" target="_blank">und viele weitere</a>...</li>
    612                     </ul>
    613                 </p>
    614             </details>
    615 
    616             <details>
    617                 <summary>Kann ich weitere Nachrichten-Feeds abonnieren?</summary>
    618                 <p>
    619                     Ja! Gibt es Nachrichtenquellen, die nicht in Kontra
    620                     enthalten sind, kann man diese auch einzeln im eigenen
    621                     Feed-Reader abonnieren. Auch das ist sehr einfach und dauert
    622                     in der Regel nur wenige Sekunden.
    623                 </p>
    624                 <p>
    625                     Fast alle Online-Medien haben eine Unterseite, auf der sie
    626                     ihre RSS-Feeds auflisten. Folgende Medien sind
    627                     beispielsweise wegen des Fokus auf dediziert progressive Medien
    628                     nicht in Kontra enthalten, lassen sich aber sehr einfach
    629                     über einen RSS-Reader abonnieren:
    630                     <ul>
    631                         <li><a href="https://www.tagesschau.de/infoservices/rssfeeds" target="_blank">Tagesschau (ÖRR)</a></li>
    632                         <li><a href="https://www.deutschlandfunk.de/rss-angebot-102.html" target="_blank">Deutschlandfunk (ÖRR)</a></li>
    633                         <li><a href="https://www.sueddeutsche.de/service/updates-mit-rss-uebersicht-aller-rss-feeds-fuer-sz-de-sz-magazin-und-jetzt-de-1.393950" target="_blank">Süddeutsche Zeitung</a></li>
    634                     </ul>
    635                 </p>
    636             </details>
    637 
    638             <details>
    639                 <summary>Ist Kontra kostenlos?</summary>
    640                 <p>
    641                     Ja! Kontra ist und bleibt kostenlos. Es ist lediglich ein
    642                     kleines privates Software-Projekt einer Einzelperson.
    643                 </p>
    644                 <p>
    645                     Zudem wird Kontra als
    646                     <a href="https://fsfe.org/freesoftware/freesoftware.de.html" target="_blank">
    647                         Freie, Open Source Software
    648                     </a>
    649                     entwickelt. Der Programm-Code kann also von allen jederzeit
    650                     eingesehen werden. Verbesserungsvorschläge oder eigene
    651                     Code-Beiträge sind stets willkommen. Es ist auch erlaubt,
    652                     eigene Projekte auf Kontra aufzubauen. Diese müssen jedoch
    653                     ebenfalls unter einer Freien Software-Lizenz stehen.
    654                 </p>
    655                 <p>
    656                     Du möchtest helfen?
    657                     <a href="https://src.jayvii.de/pub/kontra/" target="_blank">
    658                         Hier
    659                     </a> findest du mehr Informationen dazu.
    660                 </p>
    661             </details>
    662 
    663             <details>
    664                 <summary>Ist das <em>Abonnieren</em> eines RSS-Feed kostenlos?</summary>
    665                 <p>
    666                     Ja! Allerdings kann es sein, dass einige der in den
    667                     Nachrichten-Feeds angebotenen Artikel hinter einer
    668                     Bezahlschranke liegen, also oft nicht in voller Länge
    669                     gelesen werden können, ohne ein Abonnement bei der
    670                     jeweiligen Online-Publikation, bzw. ein Zeitungsabonnement
    671                     abzuschließen.
    672                 </p>
    673                 <p>
    674                     Kontra kennzeichnet Nachrichtenquellen, bei denen einige
    675                     Artikel hinter einer Bezahlschranke liegen können.
    676                     Nachrichtenquellen, die niemals eine Bezahlschranke nutzen
    677                     sind ebenfalls in einer eigenen Kategorie.
    678                 </p>
    679             </details>
    680 
    681             <details>
    682                 <summary>Sammelt Kontra meine Daten?</summary>
    683                 <p>
    684                     Nein! Kontra sammelt keinerlei Datein über Personen und
    685                     Geräte, die diese Seite besuchen und Kontra nutzen.
    686                     Technisch bedingt, wird bei jedem Aufruf <em>jeder</em>
    687                     Webseite im Internet mindestens die eigene IP-Adresse und
    688                     oft noch weitere Informationen über das Betriebssystem, den
    689                     Webbrowser, bzw. das verwendete Gerät übermittelt. Kontra
    690                     speichert <strong>keine</strong> dieser Informationen.
    691                 </p>
    692                 <p>
    693                     Zudem stellt Kontra lediglich das Archiv von RSS-Feeds zur
    694                     Verfügung. Kontra speichert außerdem keine Informationen
    695                     darüber, welche Nachrichtenquellen von Nutzer:innen
    696                     ausgewählt werden.
    697                 </p>
    698                 <p>
    699                     Mit dem Herunterladen der Feed-Datei endet der
    700                     Datenaustausch zwischen den Nutzer:innen und Kontra. Kontra
    701                     hat technisch bedingt keinen Einblick darin, ob und welche
    702                     Nachrichten Nutzende in einen Feedreader einlesen oder
    703                     welche Nachrichten tatsächlich von Nutzer:innen gelesen
    704                     werden. Das liegt daran, dass die Nachrichten
    705                     <strong>direkt</strong> und ohne Umwege von den jeweiligen
    706                     Nachrichtenseiten kommen und zu keinem Zeitpunkt über Kontra
    707                     laufen.
    708                 </p>
    709             </details>
    710 
    711             <details>
    712                 <summary>Welche Technik nutzt Kontra?</summary>
    713                 <p>
    714                     Millionen Webseiten und Online-Zeitungen weltweit bieten die
    715                     offene Schnittstelle
    716                     <a href="https://de.wikipedia.org/wiki/RSS_(Web-Feed)" target="_blank">
    717                         RSS
    718                     </a> (zu deutsch: <em>sehr einfache Verbreitung</em>) an.
    719                     Nahezu jeder Blog, jede Nachrichtenseite und
    720                     Online-Veröffentlichungen nutzen einen <em>RSS</em> Feed.
    721                     Das ist eine maschinenlesbare Datei, welche alle dort
    722                     veröffentlichte Nachrichten und einige Zusatzinformationen
    723                     (Veröffentlichungszeitpunkt, Autor:in, Kurzzusammenfassung,
    724                     usw.) enthält. RSS kann als <em>schwarzes Brett</em>
    725                     digitaler Medien verstanden werden.
    726                 </p>
    727                 <p>
    728                     Kontra stellt eben diese RSS-Feeds für alle von Nutzer:innen
    729                     ausgewählte Medien in einer herunterladbaren Datei zusammen,
    730                     die in üblichen Feedreadern (siehe:
    731                     <em><strong>Was sind Feedreader?</strong></em>) importiert
    732                     werden kann. Diese Datei basiert auf dem offenen
    733                     <a href="https://de.wikipedia.org/wiki/Outline_Processor_Markup_Language", target="_blank">
    734                         OPML
    735                     </a> Format und wird von nahezu allen RSS/Feed-Readern
    736                     verstanden. Damit gewährleistet Kontra, dass es keinen
    737                     sogenannten <em>Lock-In</em> Effekt gibt, der Nutzer:innen
    738                     an eine einzige App binden und der Wechsel zu Alternativen
    739                     erschwert.
    740                 </p>
    741                 <p>
    742                     Die angesprochenen OPML-Dateien enthalten nicht nur die
    743                     RSS-Feeds selbst, sondern auch alle Kategorien, die man
    744                     ihnen innerhalb des eigenen Feed-Readers zugewiesen hat. Die
    745                     OPML-Dateien aus Kontra enthalten alle Kategorie-Label, die
    746                     auch in der Liste sichtbar sind.
    747                 </p>
    748                 <p>
    749                     <strong>Kurzum:</strong> RSS und OPML sind die grundlegende
    750                     Technik, auf die <em>Kontra</em> setzt. Nachrichten können
    751                     darüber direkt von Blogs und Zeitungen bezogen werden, ohne
    752                     dass Dritte Einsicht darin haben. Feeds können in nahezu
    753                     allen Feedreadern importiert und exportiert werden. Ein
    754                     Wechsel von einer App zu einer anderen ist also innerhalb
    755                     von Sekunden möglich.
    756                 </p>
    757             </details>
    758 
    759         </section>
    760 
    761         <footer>
    762             <h4>Disclaimer</h4>
    763             <p>
    764                 Die Schlagzeilen, Inhalte oder Einstellungen der Redakteur:innen
    765                 und Autor:innen der hier aufgeführten Nachrichtenagenturen,
    766                 Blogs und Zeitungen spiegeln nicht unbedingt die Meinungen und
    767                 Einstellungen der Entwickler:innen und Betreiber:innen von
    768                 <em>Kontra</em> wider. <em>Kontra</em> ist ein Quellenarchiv für
    769                 Nachrichtenaggregatoren, der Inhalte aus vielen verschiedenen
    770                 Quellen zusammenführt werden. <em>Kontra</em> hat
    771                 selbstverständlich keinen direkten Einfluss auf den
    772                 redaktionellen Inhalt.
    773             </p>
    774             <em>Version:</em> <code><?php echo $config["version"]; ?></code>
    775         </footer>
    776 
    777     </body>
    778 
    779 </html>