39aldo39 / decsync Goto Github PK
View Code? Open in Web Editor NEWSynchronize RSS, contacts, calendars, tasks and more without a server
Synchronize RSS, contacts, calendars, tasks and more without a server
I've been using the radicale plugin with Thunderbird to sync with the android app, but only recently I've realized that basically none fo the changes are reflected on mobile. I've tried copying, changing details, creating a new event, etc. I've tried both with the stock apps and third party apps, none show anything. I removed the authentication from the radicale server too.
Only erasing an event created on mobile is reflected.
Same with tasks, no idea with contacts.
Have you thought at all about syncing podcast subscriptions? Perhaps with antennapod on android and gpodder on linux? I think podcast subscriptions are just rss feeds so it might not be too hard?
I want to share calendars and contacts to friends without ask them to setup something like syncthing.
So i think is needed an android server.
I did a little research but I didn't understand what I could do.
Thanks in advance.
Hi!
First, apologies if this is not the right place. This is the "main" repo, so a suggestion for yet-another-bridge may fit here.
As there is already an Evolution plugin, having a plugin for Thunderbird may seem redundant. However, Thunderbird is a multi-platform application, unlike Evolution. While I have Evolution on my home Linux box, working on a Windows workstation leaves me hanging.
Radicale plugin may be a solution but I have experienced some weird issues with spewing (binary) parts on an SQLite database into the DecSync files.
Anyways, this is just to check how difficult do you find creating a Thunderbird plugin. Otherwise, going through the standard (DAV) interface is probably a better idea, anyways.
Cheers and thanks for implementing this great idea of allowing the personal information to be serverless again!
Adding my 10000++ contact to the app one by one is impossible.
If there a way to import contact / calendar from text / vcard / vcf files or from mobile / google contact is highly appreciated.
(´ ∀ ` *)
Renan
I want a record of when I read each feed entry, not just a boolean indicating that I have read it, and I want that record synchronized between readers. Could you add that to your spec?
Feature suggestion. A generic solution to enable DecSync for more applications would be a bridge to vcard/ical files and/or folders of vcards/icals.
This would address the apps that leverage those formats but don't have a CalDAV/CardDAV capability and would be an alternative to Radicale for applications like Thunderbird. The trick would be to ensure each local application has it's own dry of files/folders.
The negative of Radicale for me is multiple local apps on my PC are seen as a single instance on DecSync leading to possible sync conflicts between those apps in Radicale. It hasn't been a problem yet, but this was a reason I'm looking to move away from DAV servers.
If this is interesting, it will probably need support for a single file per calendar/addressbook for some apps (Thunderbird, Orage), and a folder with a file per event/contact for other apps (khal, khard). That in itself would be useful on a single PC to synchronize between the two storage types.
Negative would be the amount of duplication - but the files are relatively small.
Thanks
Hi @39aldo39
I really really enjoy DecSync and I think there are great privacy advantages over any other solution to sync calendar and contacts.
To gain more traction, it might be worse investing time in present the project to privacytools.io, they are certainly open to it: https://github.com/privacytoolsIO/privacytools.io/issues/1416
My contacts collection got wiped after moving to a new device - I notice that the encrypted data from another device is still there, can I recover that data?
First congrats on an awesome app you made!
I dont know if this is the right place, i would like to ask if its in the future an implementation with a windows or ios rss reader.
There are a few of us that would love Thunderbird support.
First off, thanks for creating this amazing way to sync contacts and calendars all locally. It's very convenient to be able to do that, but it could be improved. Currently your only option for using DecSync across all desktop platforms is by using a Radicale plugin. This is not a good user experience since you have to use a third-party piece of software to get your contacts and calendars syncing. It would be nice if DecSync had an independent bridge for desktop either inspired by or forked from EteSync, that would run in the background and simply output CalDAV and CardDAV URLs to use in your apps. I mentioned EteSync since they also had a similar approach with a Radicale plugin and then decided to create their own little application instead. Something along the lines of this would be more user friendly and provide a better experience for DecSync as whole. Thanks for your work on this project and I hope it continues to improve!
Many thanks for this app.
By default, at least on my phone, it uses /storage/emulated/0/DecSync, which is stored on the phone built-in memory. I wanted to change it to store on microSD instead, which on my phone appears as /storage/1443-10E3
First problem (apologies if putting multiple problems in one issue is undesired. I can split if required, but wasn't sure whether they might be linked):
I could browse to /storage/1443-10E3 within DecSync CC settings OK, but if I tried to create a folder within there using the top-right button I get an error: "Failed to create folder".
No problem I thought, I'll create a folder using a file manager, then browse to that folder in DecSync CC, which seemed to work.
However, now if I try to create a Calendar or Contacts collection, the app will crash: "DecSync CC has stopped", with a Restart app button. Looking in the folder in a file manager, nothing has been created.
Third problem: I thought "Oh well, seems like the app doesn't want to work with microSD, I'll change it back to default", but in DecSync CC settings I cannot change the folder back to /storage/emulated/0/DecSync. Specifically, I can browse to /storage/emulated but there is no "0" folder in there.
I managed to get round the last problem by deleting the apps settings in Android Settings, Apps, and the app seems to work OK using the internal storage - I can create calendar and contact collections with no errors for example. But still the problem remains of not being able to use microSD.
My phone is a Sony Xperia Z5 Compact running Android 7.1.1.
Many thanks again for this app.
First of all, I want to thank you for this excellent program. I was literally looking for days for something that integrated my calendar and contacts between my Android and computers with Syncthing. I couldn't believe there wasn't something on Android that would let me just live-edit a ics file, but this is literally just what I was looking for. I can't believe how many times I scrolled past it on F-Droid
A suggestion: newsboat is an excellent minimalist RSS reader, personally I find FeedReader to be a bit bloated myself, but it does the job. I'm not sure how difficult implementing it would be, but I feel due to newsboat (seemingly) simple nature it could be easier than other programs. I'm pretty pretty entry level with programming, but I'd be more than happy to do what I could to try and help you out even if it was just testing builds.
Second, I'm having a bit of trouble getting figuring out how to sync between my phone, laptop, and desktop. I can create the calendars in Evolution and get them running on my Android fine, but having an additional computer work with it seems tricky. I can't seem to find a way to import an already existing DecSync calendar into a new instance of Evolution. The only options I can find would create a new calendar entirely, not edit the current one.
Again, thank you for the excellent plugins. I'll be sure to throw you a couple bucks when I can.
Hi, is a Thunderbird version planned for the future?
Great job by the way!
Hi, I hope I'm not interfering too much, but I just wanted to check if this app is still actively worked on (re bug fixes) and if not, if there is any active forks/similar apps?
Thanks. I appreciate all your work so far, it's excellent. :)
I really like this type of sync, but in desktop the only application that support is the Evolution suit, It will be great have a program, for the terminal, to export the calendar in other formats. I know this can be in the android calendar app, but It can't do it automatically.
PD=Sorry Bad English
Dear @39aldo39 ,
I've been looking for this information without success.
I understand that the new protocol version v2 will overcome some shortcomings, namely more efficient data storage with a lower number of files.
I would like to clean my syncing directory.
When all my devices are updated to the new version, can I somehow clean the file structure? I have more than 5000 files to sync and syncthing scales with the number of files...
At the moment I'm using DecSyncCC
and Radicale-DecSync
.
DecSync with Todo-txt specification is possible?
DecSync with Todo-txt
Both work with plain text file
Hi there,
I am using DecSync on Android and Arch Linux. I use Syncthing for two-way synchronization and it works. However, on Evolution side I have duplicates which do not follow the changes on Android. I guess those are perhaps from my early experiments trying to run DecSync. I checked the decsync
folder and there are multiple entries for Evolution such as:
funbox-Evolution-33199 funbox-Evolution-65237 funbox-Evolution-50704
Should I know which folder is relevant and which one I can delete?
Thanks in advance for any tips.
I need DecSync only for automated calendar/contacts backup, not necessarily for synchronization to another app. But due to DecSync's format I have to manually concatenate specific files to have a usable .ics or .vcf file ready to import somewhere. So, I would be grateful if you allowed to also keep standardized, whole .ics and .vcf files in sync directory in addition to only single-entry folder tree.
There is no standard way to encrypt the database. As a result, all applications that have access to the disk can read the data there, even if they don't need to access the database.
This is also required if cloud is used for synchronization, such as Nextcloud, Seafile or Dropbox.
See previous discussion at #3
Hey there, Been using DecSync for a while and i think it has the potential to be a huge game changer in serverless peer to peer computing.
Currently DecSync implementation is focused on implementing the libdecsync library into various applications like spaRSS, Flym, evolution and so on.
My suggestion would be instead to focus instead on bridging microservers. These microservers would basically be background services running locally on desktops and mobile devices. They would connect to a decsync folder and expose standardised or common service APIs that other applications on the device could connect to. This would allow decsync to be supported on any application that supports these APIs without needing to build in specific decsync code into each application.
For example, RSS feeds in DecSync are currently handled by a custom fork of FeedReader and spaRSS (now Flym). What if instead, a microservice app was created for desktop and mobile devices that could connect to the decsync folder and expose a common RSS API, like Fever or NewsBlur or TTRSS instead. Then any RSS application on these devices that support those APIs could connect to the microserver and use DecSync.
This bridge microserver architecture is already used by DecSyncCC and Radicale (both implementing CalDAV). My suggestion would be to focus on this architecture for other services like RSS.
What are your thoughts?
It would be nice if this system will be able to use custom colors for each calendar
I am receiving an error when I try to synchronize on Android 13
Transaction failed on small parcel; the remote process probably died, but th...
I don't know how to get the rest of the error message, but it is preventing me from synchronizing tasks
Can you help with this?
On a raspberry pi 3+ (Linux raspberrypi 5.10.52-v8+ #1441 SMP PREEMPT Tue Aug 3 18:14:03 BST 2021 aarch64 GNU/Linux). Starting radicale-DecSync this error occurs:
[8569] [CRITICAL] An exception occurred during server startup: Failed to load storage module 'radicale_storage_decsync': libdecsync: A 64bit platform is required. Found '32bit'.
Steps to reproduce:
uname -a
Linux raspberrypi 5.10.52-v8+ #1441 SMP PREEMPT Tue Aug 3 18:14:03 BST 2021 aarch64 GNU/Linux
pip3 install radicale_storage_decsync
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting radicale_storage_decsync
Using cached https://www.piwheels.org/simple/radicale-storage-decsync/radicale_storage_decsync-1.2.2-py3-none-any.whl
Collecting radicale>=3 (from radicale_storage_decsync)
Using cached https://files.pythonhosted.org/packages/ca/62/29ba76472b5115affa124945ced26244b32d31e4a102aa7ba824416109ae/Radicale-3.0.6-py3-none-any.whl
Collecting libdecsync>=1.3.1 (from radicale_storage_decsync)
Using cached https://www.piwheels.org/simple/libdecsync/libdecsync-1.7.1-py3-none-any.whl
Collecting defusedxml (from radicale>=3->radicale_storage_decsync)
Using cached https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl
Collecting python-dateutil>=2.7.3 (from radicale>=3->radicale_storage_decsync)
Using cached https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl
Collecting vobject>=0.9.6 (from radicale>=3->radicale_storage_decsync)
Using cached https://www.piwheels.org/simple/vobject/vobject-0.9.6.1-py3-none-any.whl
Collecting passlib (from radicale>=3->radicale_storage_decsync)
Using cached https://files.pythonhosted.org/packages/3b/a4/ab6b7589382ca3df236e03faa71deac88cae040af60c071a78d254a62172/passlib-1.7.4-py2.py3-none-any.whl
Collecting six>=1.5 (from python-dateutil>=2.7.3->radicale>=3->radicale_storage_decsync)
Using cached https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl
Installing collected packages: defusedxml, six, python-dateutil, vobject, passlib, radicale, libdecsync, radicale-storage-decsync
Successfully installed defusedxml-0.7.1 libdecsync-1.7.1 passlib-1.7.4 python-dateutil-2.8.2 radicale-3.0.6 radicale-storage-decsync-1.2.2 six-1.16.0 vobject-0.9.6.1
python3 -m radicale --config "~/.config/radicale/config"
[2021-08-13 14:02:40 +0200] [8569] [CRITICAL] An exception occurred during server startup: Failed to load storage module 'radicale_storage_decsync': libdecsync: A 64bit platform is required.
I have two mobiles, both with DecSync CC and Syncthing. They both use the same DecSync calendar account. Also, they both synchronize on a common server.
Any time I change any item in one of the two calendars it gets synced to my server after some seconds, so this part (automatic sync on outgoing calendar changes) is fine.
However, the calendar of the other mobile doesn't get updated automatically; I have to force it by manually pressing the "refresh" button in DecSync.
Because most file sync protocols can process files in parallel and/or in random order, there is a race condition in the protocal, that might lead data not beeing synchronized.
The protocol specifies (and reference implementation implements): if the sequence file of an application indicates a change of an entry file, then the following will happen:
However, if the sequence file is synchronized and processed, before the corresponding entry file is synchronized the following will happen:
To my understanding this race condition cannot be detected with the current protocol version, because there is no link between entry sequence and entry contents. An extension of the protocol could make this race condition detectable by storing an entry file contents hash togehter with the sequence number in the apps sequence file. In this case the processig can be posponed until the entry files content hash matches the hash stored in the current sequence file.
Howdy!
I'm curious if there's an update about the version two spec. I'm in the process of drafting (no promises, just testing the water atm) a rust implementation of decsync, but I'm not sure how I should handle the version 2 spec. As I see it, my options are:
Since it seems like most other apps use the v1 format, I'd normally lean towards the second option, but it seems like the v2 draft has been stagnant for a considerable amount of time, with most apps not using it.
I'm curious about when you predict the v2 spec will be officiated, and more importantly, implemented in official libs, especially since it seems like apps programmed without v2 support will be unable to read v2 collections, so before any v2 collections can be created, most of the implementations need to be able to read from it.
Thank you for the help!
With a recent update, DecSync appears to have stopped using the directory I've saved all of my stuff to, even though I selected the directory for it to use when it asked. I've added events since then without noticing the issue, and now I'm stuck with trying to juggle those events between either import-exports from calendar apps, or offline calendars so that I can change the directory and move them all back to my actual DecSync folder again. It's a pain in the arse, and I just want to merge folders, but I don't know if just copy-pasting them together will break anything or not.
EDIT: Sorry, I think I created this issue in the wrong place. 39aldo39/DecSyncCC#45
It appears that many/most/all cloud storage solutions are embedded into the file browser in Android. (?) (for example pcloud) This allows you to browse and use the cloud storage like a regular folder on your device.
It would be great if I could set my cloud storage as DecSync directory. This would eliminate the need for a separate sync app for many users, as most cloud storage apps don't allow for mobile sync and in many cases not even backup besides photos and videos.
The password manager Keepass2Android supports this for its password database, if you need a code example https://github.com/PhilippC/keepass2android . I don't know anything about Android development, but it appears one only has to adjust the folder picker code?
Thanks for this app. It's much better than running a separate CardDAV/CalDAV server just to sync a few bits of text.
I'm using SpaRSS DecSync together with FeedReader, connected to the same DecSync folder.
When I mark certain item as read in FeedReader, the same item is still marked as unread in SpaRSS, even after refreshing multiple times.
Is this functionality not implemented, or I misconfigured something?
First of all, thanks a lot for your awesome program, I'm using it to sync RSS feeds between my phone and my Linux desktop. Related to that, I was wondering if you considered supporting the "spiritual successor" to FeedReader, Newsflash. It's made by the same devs, and they are currently looking for services maintainers: https://gitlab.com/news-flash/news_flash_gtk
This is a great idea, thanks for sharing.
I'm mostly worried about the size of new-entries
which, according to my understanding, is always growing, containing the whole history of the database.
Is there a plan to introduce some mitigation of this?
It would be great if decsync could be integrated into Akonadi, that way kde applications could use decsync collections for their data.
I'm having a problem with Android where the DecSync folder will only be updated once. I think the problem may have started because I updated my Chromebook to the latest version. I've attached a folder which was in use when the issue occurred. Sorry about the swearing in some of the entries. I was getting frustrated. :)
I tried upgrading the Android version to the latest, 1.2.3: didn't work.
I tried downgrading both to version 1.2.1, also backing up entries and resetting the folder a few times (also completely obliterating SyncThing pair and creating one under a new ID): didn't work.
Adding entries on the Chromebook side seems to always work. New files get added to the directory on DecSync sync. But Android will not pick them up, and Android won't add new files for its entries, even when manually forced.
I'm thinking it could have to do with the spaces / %20 in the directory name for Android, but I'm not sure where that value comes from so I can change it.
I'm using Etar as my frontend on both systems, and I'm pretty sure it's adding the calendar entries correctly because if I use "Calendar Import / Export" app I can see the number of calendar entries increase.
Hello if I could kindly get some support.
Been using the app for almost a year without an issue but recently it just keeps crashing.
By removing files and putting them back in I've traced it down to the Calendars folder.
within the calendars folder I have 3 folders with: colID12345 (the 12345 are 3 different numbers)
I then have 2 folders with long alpha numeric code; ie. 32fdabc2-f7bf.... etc...
Now when I leave the long alpha-num folders ; decsyncCC from F-Droid; doesn't see any calendars...
and then I add the colID's it just crashes.
I'm really confused how to troubleshoot beyond this point
I can't understand the data structure, why didn't you use a plain data structure as khal and khard with vdirsyncer ?
I expected DecSync to be compatible with those. I wanted to be able to replace vdirsyncer static sync that uses DAV with decsync + syncthing. I like the way khal/khard let me manage plain files, to keep cross compatibility, it just sync ics and vcf files with a simple dir structure.
➜ tree share/docs/decsync
share/docs/decsync
└── calendars
├── colID14643
│ ├── local
│ │ ├── osz-Evolution
│ │ │ └── info
│ │ └── osz-Evolution-96506
│ │ ├── info
│ │ └── sequences
│ └── v2
│ ├── osz-Evolution
│ │ ├── info
│ │ └── sequences
│ └── osz-Evolution-96506
│ ├── 39
│ ├── info
│ └── sequences
└── colID15653
├── local
│ └── osz-Evolution-29453
│ └── info
└── v2
└── osz-Evolution-29453
├── info
└── sequences
13 directories, 11 files
➜ cat share/docs/decsync/calendars/colID14643/v2/osz-Evolution-96506/39
[["resources","4bf1df818e053d2587f14f08da81c18e9764dad2"],"2021-12-28T10:12:53",null,"BEGIN:VCALENDAR\r\nCALSCALE:GREGORIAN\r\nPRODID:-//Ximian//NONSGML Evolution Calendar//EN\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\nUID:4bf1df818e053d2587f14f08da81c18e9764dad2\r\nDTSTAMP:20211228T100737Z\r\nDTSTART;TZID=/freeassociation.sourceforge.net/Europe/Paris:\r\n 20211228T120000\r\nDTEND;TZID=/freeassociation.sourceforge.net/Europe/Paris:20211228T123000\r\nSEQUENCE:2\r\nSUMMARY:Test\r\nTRANSP:OPAQUE\r\nCLASS:PUBLIC\r\nCREATED:20211228T101253Z\r\nLAST-MODIFIED:20211228T101253Z\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"]
➜ tree khal
khal
├── anniversaires
│ ├── a50d49fb-9812-401d-a8c8-584cb0531a08.ics
│ ├── aa6efc11-02a1-4d7c-960c-c62a071594a3.ics
│ └── ffdaf9d2-cc84-444c-bcbc-c274b9b5f646.ics
├── home
│ ├── 004a79fc-72c3-47b0-b21d-ed810457655e.ics
│ ├── fd2b182e-bf75-43a8-a455-4658257a11a1.ics
│ └── FDA6A018-28D1-4447-A026-E7C9031B0F1F.ics
└── tasks
➜ tree khard
khard
└── contacts
├── 02591900-045D-45E3-B3A0-7EBA96565B82.vcf
├── 03A4088F-93F6-480E-8226-56EE138141BE.vcf
└── 066de82a-281b-478b-ad35-510e78877d7f.vcf
Hi!
I create events with Tasks (Tasks.org) and synchronize them with decsync. However, for the past few days I have been constantly getting this error notification "Multiple lines read as text in /DecSync/calendars/...". If I try to delete it (by swiping), it reappears after a few minutes, it's really annoying. I would like to try to fix the problem but I don't understand what the error is.
What is the preferred way to completely remove the traces of a sync node?
Use case: I sometimes create Radicale nodes for desktop. At some point, I'd like to completely remove any references to these nodes from the data files.
So far I've done that manually. Not sure if the stale records, from the nodes which no longer sync, may cause any issues in the future, in case the names are duplicate or something like that.
I got a new Android device with LineageOS 16 with MicroG. I set up SyncThing and synced my folders first. This of course included the DecSync folder.
Then I installed DecSync for Android, but every time I tried to open it it crashed immediately. I did adb logcat
to figure out what was going on and saw that the error was:
AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{org.decsync.cc/org.decsync.cc.MainActivity}: java.io.FileNotFoundException: /storage/emulated/0/DecSync/.decsync-info (Permission denied)
oh, so I hadn't given it storage access permissions yet. I went into the Android settings and gave it those, and it works now. Easy fix, but it was very unclear what the problem was and without my computer and adb I wouldn't have figured it out.
DecSync should probably check for those permissions before crashing like this.
Currently every app that uses DecSync requires storage permission (on Android). If I use DecSyncCC and DecSync-capable RSS reader, the RSS reader is able to access my contacts. Same for every application that can access my storage for whatever reason.
Instead, there should be a "keyring" application, similar to OpenKeychain, which can allow or deny access to various parts of the key-value store to applications. All other applications should use it to request access to a particular namespace.
Only Syncthing and the "keyring" application should have access to the raw storage. Not sure how to achieve it without Syncthing modification, need input from Android developers.
Hello and thank you very much for this awesome APP.
Is it possible to change the file manager to use android's default?
This way it would be possible to store the calendar/contacts inside of veracrypt containers mounted on the system, improving a lot the security.
Some calendar app and caldav support external calendar subscription.
It can save an URL for icalendar resource (.ics
) on web.
for example: webcal://www.calendarlabs.com/ical-calendar/ics/76/US_Holidays.ics
I have two idea for specification.
DecSync
├── webcals
│ └── colID12345
│ ├── local
│ │ ├── appId1
│ │ │ ├── info
│ │ │ └── sequences
│ │ └── appId2
│ │ ├── info
│ │ └── sequences
│ └── v2
│ ├── appId1
│ │ ├── info
│ │ └── sequences
│ └── appId2
│ ├── info
│ └── sequences
["info"]
DecSync
├── webcals
│ ├── local
│ │ ├── appId1
│ │ │ ├── info
│ │ │ └── sequences
│ │ └── appId2
│ │ ├── info
│ │ └── sequences
│ └── v2
│ ├── appId1
│ │ ├── info
│ │ ├── 00
│ │ └── sequences
│ └── appId2
│ ├── info
│ ├── 00
│ └── sequences
["names"]
["subscriptions"]
["color"]
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.