├── .all-contributorsrc
├── .eslintrc.json
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── config.yml
│ └── feature_request.yml
├── dependabot.yml
└── workflows
│ ├── build.yml
│ ├── codeql-analysis.yml
│ ├── dependabot-approve.yml
│ ├── issues.yml
│ ├── lock-threads.yml
│ ├── stale.yml
│ └── tests.yml
├── .gitignore
├── .prettierrc
├── CHANGELOG.md
├── CONSIDERATIONS.md
├── LICENSE.txt
├── PRIVACY_POLICY.md
├── README.md
├── _locales
├── cs
│ └── messages.json
├── de
│ └── messages.json
├── en
│ └── messages.json
├── es
│ └── messages.json
├── fi
│ └── messages.json
├── fr
│ └── messages.json
├── gl
│ └── messages.json
├── ja
│ └── messages.json
├── ko_KR
│ └── messages.json
├── nl_NL
│ └── messages.json
├── pl
│ └── messages.json
├── pt
│ └── messages.json
├── pt_BR
│ └── messages.json
├── ru
│ └── messages.json
├── sv
│ └── messages.json
├── tr
│ └── messages.json
├── tr_TR
│ └── messages.json
├── zh
│ └── messages.json
├── zh_CN
│ └── messages.json
└── zh_TW
│ └── messages.json
├── android
├── .gitignore
├── .idea
│ ├── compiler.xml
│ └── jarRepositories.xml
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── capacitor.build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── assets
│ │ ├── capacitor.config.json
│ │ └── capacitor.plugins.json
│ │ ├── java
│ │ └── org
│ │ │ └── handmadeideas
│ │ │ └── floccus
│ │ │ └── MainActivity.java
│ │ └── res
│ │ ├── drawable-land-hdpi
│ │ └── splash.png
│ │ ├── drawable-land-mdpi
│ │ └── splash.png
│ │ ├── drawable-land-xhdpi
│ │ └── splash.png
│ │ ├── drawable-land-xxhdpi
│ │ └── splash.png
│ │ ├── drawable-land-xxxhdpi
│ │ └── splash.png
│ │ ├── drawable-port-hdpi
│ │ └── splash.png
│ │ ├── drawable-port-mdpi
│ │ └── splash.png
│ │ ├── drawable-port-xhdpi
│ │ └── splash.png
│ │ ├── drawable-port-xxhdpi
│ │ └── splash.png
│ │ ├── drawable-port-xxxhdpi
│ │ └── splash.png
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ └── splash.png
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_foreground.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_foreground.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_foreground.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_foreground.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_foreground.png
│ │ └── ic_launcher_round.png
│ │ ├── values
│ │ ├── ic_launcher_background.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ │ └── xml
│ │ ├── config.xml
│ │ ├── file_paths.xml
│ │ └── network_security_config.xml
├── build.gradle
├── capacitor.settings.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── variables.gradle
├── capacitor.config.json
├── doc
└── Adapters.md
├── fastlane
└── metadata
│ └── android
│ └── en-US
│ ├── full_description.txt
│ ├── images
│ ├── featureGraphic.png
│ ├── icon.png
│ └── phoneScreenshots
│ │ ├── 01.png
│ │ ├── 02.png
│ │ ├── 03.png
│ │ └── 04.png
│ └── short_description.txt
├── google-api.credentials.json
├── gulpfile.js
├── html
├── background.html
├── index.html
├── options.html
└── test.html
├── icons
├── disabled_128.png
├── disabled_32.png
├── disabled_64.png
├── error_128.png
├── error_32.png
├── error_64.png
├── logo.png
├── logo.svg
├── logo_128.png
├── logo_128_white.png
├── logo_32.png
├── logo_512.png
├── logo_64.png
├── syncing_128.png
├── syncing_32.png
├── syncing_64.png
└── tree-swing.svg
├── img
├── promotional-tile-marquee.png
├── promotional-tile-medium.png
├── promotional-tile-medium.xcf
├── promotional-tile-medium2.png
├── promotional-tile-medium2.xcf
├── promotional-tile-small.png
├── promotional-tile-small.xcf
├── screen_chrome_account.png
├── screen_chrome_folderpicker.png
├── screen_chrome_options.png
├── screen_chrome_wide.png
├── screen_firefox_account.png
├── screen_firefox_folderpicker.png
└── screen_firefox_options.png
├── ios
├── .gitignore
└── App
│ ├── App.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ ├── Floccus New Bookmark.xcscheme
│ │ └── Floccus.xcscheme
│ ├── App.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
│ ├── App
│ ├── App.entitlements
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── AppIcon-512@2x.png
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── Splash.imageset
│ │ │ ├── Contents.json
│ │ │ ├── splash-2732x2732-1.png
│ │ │ ├── splash-2732x2732-2.png
│ │ │ └── splash-2732x2732.png
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── capacitor.config.json
│ └── config.xml
│ ├── Floccus New Bookmark
│ ├── Base.lproj
│ │ └── MainInterface.storyboard
│ ├── Floccus New Bookmark.entitlements
│ ├── Info.plist
│ └── ShareViewController.swift
│ ├── Floccus.entitlements
│ ├── Podfile
│ ├── Podfile.lock
│ └── PrivacyInfo.xcprivacy
├── lib
└── gulp-crx.js
├── manifest-firefox-override.sh
├── manifest.chrome.json
├── manifest.firefox.json
├── manifest.json
├── package-lock.json
├── package.json
├── src
├── entries
│ ├── background-script.js
│ ├── native.js
│ ├── options.js
│ └── test.js
├── errors
│ └── Error.ts
├── lib
│ ├── Account.ts
│ ├── AdapterFactory.ts
│ ├── CacheTree.ts
│ ├── CachingTreeWrapper.ts
│ ├── Controller.ts
│ ├── Crypto.ts
│ ├── DefunctCrypto.js
│ ├── Diff.ts
│ ├── IndexedDB.ts
│ ├── LocalTabs.ts
│ ├── Logger.js
│ ├── Mappings.ts
│ ├── PathHelper.js
│ ├── Scanner.ts
│ ├── Tree.ts
│ ├── adapters
│ │ ├── Caching.ts
│ │ ├── Fake.js
│ │ ├── Git.ts
│ │ ├── GoogleDrive.ts
│ │ ├── Karakeep.ts
│ │ ├── Linkwarden.ts
│ │ ├── NextcloudBookmarks.ts
│ │ └── WebDav.ts
│ ├── browser-api.js
│ ├── browser
│ │ ├── BrowserAccount.ts
│ │ ├── BrowserAccountStorage.js
│ │ ├── BrowserController.js
│ │ ├── BrowserDetection.ts
│ │ └── BrowserTree.ts
│ ├── getFavicon.js
│ ├── interfaces
│ │ ├── Account.ts
│ │ ├── AccountStorage.ts
│ │ ├── Adapter.ts
│ │ ├── Controller.ts
│ │ ├── Ordering.ts
│ │ ├── Resource.ts
│ │ └── Serializer.ts
│ ├── isTest.ts
│ ├── native
│ │ ├── I18n.ts
│ │ ├── NativeAccount.ts
│ │ ├── NativeAccountStorage.js
│ │ ├── NativeController.js
│ │ └── NativeTree.ts
│ ├── serializers
│ │ ├── Html.ts
│ │ └── Xbel.ts
│ └── strategies
│ │ ├── Default.ts
│ │ ├── Merge.ts
│ │ └── Unidirectional.ts
├── test
│ ├── index.js
│ ├── reporter.js
│ └── test.js
└── ui
│ ├── App.vue
│ ├── NativeApp.vue
│ ├── NativeRouter.js
│ ├── components
│ ├── AccountCard.vue
│ ├── NextcloudLogin.vue
│ ├── OptionAllowRedirects.vue
│ ├── OptionAutoSync.vue
│ ├── OptionClientCert.vue
│ ├── OptionDeleteAccount.vue
│ ├── OptionDownloadLogs.vue
│ ├── OptionExportBookmarks.vue
│ ├── OptionFailsafe.vue
│ ├── OptionFileType.vue
│ ├── OptionNestedSync.vue
│ ├── OptionPassphrase.vue
│ ├── OptionResetCache.vue
│ ├── OptionSyncFolder.vue
│ ├── OptionSyncInterval.vue
│ ├── OptionSyncStrategy.vue
│ ├── OptionsFake.vue
│ ├── OptionsGit.vue
│ ├── OptionsGoogleDrive.vue
│ ├── OptionsKarakeep.vue
│ ├── OptionsLinkwarden.vue
│ ├── OptionsNextcloudBookmarks.vue
│ ├── OptionsNextcloudLegacy.vue
│ ├── OptionsWebdav.vue
│ └── native
│ │ ├── DialogChooseFolder.vue
│ │ ├── DialogEditBookmark.vue
│ │ ├── DialogEditFolder.vue
│ │ ├── DialogImportBookmarks.vue
│ │ ├── Drawer.vue
│ │ ├── FaviconImage.vue
│ │ └── OptionAllowNetwork.vue
│ ├── index.js
│ ├── native-public-path.js
│ ├── native.js
│ ├── plugins
│ ├── capacitor.js
│ ├── i18n.js
│ └── vuetify.js
│ ├── router.js
│ ├── store
│ ├── actions.js
│ ├── definitions.js
│ ├── index.js
│ ├── mutations.js
│ └── native
│ │ ├── actions.js
│ │ ├── index.js
│ │ └── mutations.js
│ └── views
│ ├── AccountOptions.vue
│ ├── Donate.vue
│ ├── ImportExport.vue
│ ├── NewAccount.vue
│ ├── Overview.vue
│ ├── Telemetry.vue
│ ├── Update.vue
│ └── native
│ ├── About.vue
│ ├── AddBookmarkIntent.vue
│ ├── Home.vue
│ ├── ImportExport.vue
│ ├── Options.vue
│ └── Tree.vue
├── test
├── apache-vhost.conf
├── apcu.ini
├── save-stats.js
└── selenium-runner.js
├── transifex.yml
├── tsconfig.json
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: marcelklehr # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: marcelklehr
5 | open_collective: floccus
6 | liberapay: marcelklehr
7 | ko_fi: marcelklehr
8 | custom: https://www.paypal.com/donate/?hosted_button_id=R3SDCC7AFSYZU
9 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.yml:
--------------------------------------------------------------------------------
1 | name: Bug Report
2 | description: Create a bug report for floccus
3 | labels: ['bug']
4 | body:
5 | - type: markdown
6 | attributes:
7 | value: Thanks for taking the time to file a bug report! Please fill out this form as completely as possible.
8 | - type: markdown
9 | attributes:
10 | value: If you leave out sections there is a high likelihood it will be moved to the GitHub Discussions.
11 | - type: input
12 | attributes:
13 | label: Which version of floccus are you using?
14 | description: 'Please specify the exact version instead of "latest". For example: 4.14.0'
15 | validations:
16 | required: true
17 | - type: input
18 | attributes:
19 | label: How many bookmarks do you have, roughly?
20 | description: 'e.g. 10, 300 or 12k'
21 | validations:
22 | required: true
23 | - type: input
24 | attributes:
25 | label: Are you using other means to sync bookmarks in parallel to floccus?
26 | description: 'e.g. "No" or "Yes, I also sync via Mozilla account"'
27 | validations:
28 | required: true
29 | - type: dropdown
30 | attributes:
31 | label: Sync method
32 | description: Which sync method are you using?
33 | multiple: false
34 | options:
35 | - Nextcloud Bookmarks
36 | - Linkwarden
37 | - WebDAV
38 | - Google Drive
39 | - Git
40 | validations:
41 | required: true
42 | - type: input
43 | attributes:
44 | label: Which browser are you using? In case you are using the phone App, specify the Android or iOS version and device please.
45 | description: 'Please specify the exact version instead of "latest". For example: Chrome 100.0.4878.0 or '
46 | - type: input
47 | attributes:
48 | label: Which version of Nextcloud Bookmarks are you using? (if relevant)
49 | description: 'For example: v10.1.0'
50 | - type: input
51 | attributes:
52 | label: Which version of Nextcloud? (if relevant)
53 | description: 'For example: v23.0.1'
54 | - type: textarea
55 | attributes:
56 | label: What kind of WebDAV server are you using? (if relevant)
57 | description: Describe the setup of your WebDAV server
58 | - type: textarea
59 | attributes:
60 | label: Describe the Bug
61 | description: A clear and concise description of what the bug is.
62 | validations:
63 | required: true
64 | - type: textarea
65 | attributes:
66 | label: Expected Behavior
67 | description: A clear and concise description of what you expected to happen.
68 | validations:
69 | required: true
70 | - type: textarea
71 | attributes:
72 | label: To Reproduce
73 | description: Steps to reproduce the behavior, please provide a clear number of steps that always reproduces the issue. Screenshots can be provided in the issue body below.
74 | validations:
75 | required: true
76 | - type: markdown
77 | attributes:
78 | value: Before posting the issue go through the steps you've written down to make sure the steps provided are detailed and clear.
79 | - type: markdown
80 | attributes:
81 | value: Contributors should be able to follow the steps provided in order to reproduce the bug.
82 | - type: markdown
83 | attributes:
84 | value: It is often useful to provide a debug log file along with the issue. You can obtain a (redacted) debug log of the most recent sync run in the account settings of your floccus account.
85 | - type: markdown
86 | attributes:
87 | value: You can also let floccus automatically redact your debug logs.
88 | - type: checkboxes
89 | attributes:
90 | label: Debug log provided
91 | options:
92 | - label: I have provided a debug log file
93 | required: false
94 | - type: markdown
95 | attributes:
96 | value: "Please note: To continue development and maintenance of this project in a sustainable way, I ask that you donate to the project when opening a ticket (or at least once your issue is resolved), if you're not a donor already. You can find donation options at
\n${this._serializeFolder(folder, '')}
\n` 8 | } 9 | 10 | _htmlentities_encode(string) { 11 | return string.replace(/[<>&"']/g, char => '' + char.charCodeAt(0) + ';') 12 | } 13 | 14 | _serializeFolder(folder, indent) { 15 | return folder.children 16 | .map(child => { 17 | if (child instanceof Bookmark) { 18 | return ( 19 | `${indent}
\n${this._serializeFolder( 26 | child, 27 | nextIndent 28 | )}${indent}
\n`
29 | )
30 | }
31 | })
32 | .join('')
33 | }
34 |
35 | deserialize(html): Folder {{ t("DescriptionImportbookmarks") }}
11 |
7 |