<h1 align="center">
  <img src="assets/other/banner.png" />
</h1>

<p align="center">
  <b>Linkdy</b> is a <a href="https://github.com/sissbruecker/linkding" target="_blank" rel="noopener noreferrer"><b>Linkding</b></a> client created with Flutter. <a href="https://github.com/sissbruecker/linkding" target="_blank" rel="noopener noreferrer">Linkding</a> is a self hosted bookmark manager. The objective of this project is to give all it's users an application to manage the bookmarks from a mobile device.
</p>

<p align="center">
  <a href="https://play.google.com/store/apps/details?id=com.jgeek00.linkdy" target="_blank" rel="noopener noreferrer">
    <img src="/assets/other/get_google_play.png" width="300px">
  </a>
  <a href="https://apps.apple.com/us/app/linkdy/id6479930976" target="_blank" rel="noopener noreferrer">
    <img src="/assets/other/get-appstore.png" width="300px">
  </a>
</p>

### Main features
<ul>
  <li>List your bookmarks.</li>
  <li>Open the links on an internal browser.</li>
  <li>Search bookmarks.</li>
  <li>Create new bookmarks.</li>
  <li>Create new tags.</li>
  <li>List the bookmarks associated with each tag.</li>
  <li>Material You interface with dynamic theming (only Android 12+).</li>
</ul>

## Privacy policy
Check the privacy policy [here](https://pastebin.com/raw/Yiw4h6KK).

### Development
1. Clone this repository.
2. Run ``flutter pub get`` to install all the dependencies.
3. Run the application on the desired virtual or physical device.

<p>
  <b>State manager</b> 
  <br>
  Linkdy uses Riverpod as the state management system. Files ended on <code>.g.dart</code> are auto generated by Riverpod's code generator and shouldn't be edited manually.
  The code generator can be started by running <code>dart run build_runner watch</code>. Then, the process will start on the terminal.
</p>
<p>
  <b>Translations</b>
  <br>
  Linkdy uses <a href="https://pub.dev/packages/slang">slang</a> to manage the translations of the application. To add a new translation, create a new file on <code>lib/i18n</code>, with the structure <code>strings_[lang_code].i18n.json</code>. When adding a new string, make sure to add the translation on all <code>.i18n.json</code> files. Then, run <code>dart run slang</code> to generate the translations.
</p>

### Android signing
1. Clone ``android/key.properties.sample`` and rename it to ``key.properties``.
2. Fill the variables with the values.
3. Put your ``keystore.jks`` file inside ``android/app/``.
4. Run ``flutter build apk --release`` or ``flutter build appbundle --release`` to compile and sign the production build.

<br>
<br>
<br>
<br>
<br>

##### Created by JGeek00