[Dovecot] virtual mailbox / INTHREAD use case, issues, questions
For over a year now, I've been trying to acquire the ability to review the thread history of a message in my INBOX while still deleting messages as soon as I believe I'm done with them. Suddenly I'm gratified to see that several approaches have been right under my nose all along!
One is the INTHREAD imap extension, which I see is implemented by dovecot. Another (related) is dovecot's virtual folders. When I saw the
GMail-style "conversation view"
described at http://wiki.dovecot.org/Plugins/Virtual I was elated, so I tried it out, with exactly that configuration (almost -- my separator is '.').
I ran into several problems (using Dovecot 1.2.8 with http://hg.dovecot.org/dovecot-1.2/rev/9cccb8617820 applied):
I had to manually create the virtual folder for all my users or they couldn't access their mail at all. Is this fixed in 2.0?
My users were getting errors when accessing via POP3. The possible meaning of such a virtual folder under POP3 is lost on me, but I had to enable the virtual plugin for that protocol too. I think that should at least be in the documentation, or better yet the requirement should that it be enabled for POP3 should be dropped.
I couldn't get the virtual "conversation view" inbox to show any messages. But maybe that's because of a possible issue I describe below with x-mailbox
At some point I ended up with an empty mailbox called "private.virtual" --- I have no idea how. Probably user error.
The "all" virtual mailbox would only show 89 messages. I switched it to be a mirror of my "archive" mailbox and the number started to look more reasonable. This could be the "lots of mailboxes" bug describe in http://dovecot.org/list/dovecot-news/2009-December/000145.html
I got the impression that looking at the virtual INBOX didn't cause the "all" mailbox to be updated, which I'd guess that it should be.
I tried to create an IMAP search, rather than a virtual folder, that looked for x-mailbox INBOX header like the virtual folder does. It too came up empty. It doesn't exactly surprise me because I don't see an x-mailbox header in any of these messages. In fact, I can't find one in /any/ of my messages. When I look for a description of the x-mailbox header, I don't find much information on where it comes from or what it represents. http://www.dovecot.org/list/dovecot/2009-June/040619.html seems to indicate it's synthesized by the server. If it's really supposed to represent the message's "original" mailbox as implied by http://wiki.dovecot.org/Plugins/Virtual then I'm not sure what that means for messages that are filed twice by sieve and never moved.
Lastly, I want to report that for me, the speed of these IMAP searches doesn't begin to approach what I can do with mairix if I want a message's entire thread. I'm happy to use mairix, although it would be nicer not to duplicate that capability if it's already in the server. But it needs to be fast. Is there something I can do to make it go faster?
Thanks in advance for any advice, hints, fixes, workarounds, etc.
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
On 04/01/2010 18:47, David Abrahams wrote:
For over a year now, I've been trying to acquire the ability to review the thread history of a message in my INBOX while still deleting messages as soon as I believe I'm done with them. Suddenly I'm gratified to see that several approaches have been right under my nose all along!
One is the INTHREAD imap extension, which I see is implemented by dovecot. Another (related) is dovecot's virtual folders. When I saw the
GMail-style "conversation view"
described at http://wiki.dovecot.org/Plugins/Virtual I was elated, so I tried it out, with exactly that configuration (almost -- my separator is '.').
I have recently just switched my Thunderbird to have sent items in the
"Inbox" and "in the same folder as the message you are replying to".
The end result is a fairly workable equivalent of the gmail style thing,
although you also see Sent messages which haven't had a reply (which may
or may not be what you desire, but it's actually my preference for my needs)
No need for virtual folders, but support for this to work well may not be in every mail client...
Ed W
At Mon, 04 Jan 2010 20:11:50 +0000, Ed W wrote:
On 04/01/2010 18:47, David Abrahams wrote:
For over a year now, I've been trying to acquire the ability to review the thread history of a message in my INBOX while still deleting messages as soon as I believe I'm done with them. Suddenly I'm gratified to see that several approaches have been right under my nose all along!
I have recently just switched my Thunderbird to have sent items in the "Inbox" and "in the same folder as the message you are replying to".
The end result is a fairly workable equivalent of the gmail style thing, although you also see Sent messages which haven't had a reply (which may or may not be what you desire, but it's actually my preference for my needs)No need for virtual folders, but support for this to work well may not be in every mail client...
Yeah, I used to do something like that with Gnus. Believe me, I've been through all the simple approaches. The problem is that I really need to practice "Inbox Zero." I need to not see the things I've decided I'm through with (in every mail client I use), and having the client decide I'm through when I've "read" a message is highly prone to accidentally losing things I need to deal with.
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
On 2010-01-04, David Abrahams (dave@boostpro.com) wrote:
The problem is that I really need to practice "Inbox Zero." I need to not see the things I've decided I'm through with (in every mail client I use), and having the client decide I'm through when I've "read" a message is highly prone to accidentally losing things I need to deal with.
I think that would entail the use of the [Delete] key.
At Tue, 05 Jan 2010 06:50:23 -0500, Charles Marcus wrote:
On 2010-01-04, David Abrahams (dave@boostpro.com) wrote:
The problem is that I really need to practice "Inbox Zero." I need to not see the things I've decided I'm through with (in every mail client I use), and having the client decide I'm through when I've "read" a message is highly prone to accidentally losing things I need to deal with.
I think that would entail the use of the [Delete] key.
Precisely! And then, if I need to get back to older messages in the thread, I need an INTHREAD search.
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
On 4.1.2010, at 20.47, David Abrahams wrote:
- I had to manually create the virtual folder for all my users or they couldn't access their mail at all. Is this fixed in 2.0?
No.
- My users were getting errors when accessing via POP3. The possible meaning of such a virtual folder under POP3 is lost on me, but I had to enable the virtual plugin for that protocol too. I think that should at least be in the documentation, or better yet the requirement should that it be enabled for POP3 should be dropped.
I think you could put the virtual namespace inside protocol imap {} section.
I couldn't get the virtual "conversation view" inbox to show any messages. But maybe that's because of a possible issue I describe below with x-mailbox
At some point I ended up with an empty mailbox called "private.virtual" --- I have no idea how. Probably user error.
Dunno.
- The "all" virtual mailbox would only show 89 messages. I switched it to be a mirror of my "archive" mailbox and the number started to look more reasonable. This could be the "lots of mailboxes" bug describe in http://dovecot.org/list/dovecot-news/2009-December/000145.html
"lots of mailboxes" should cause error to be logged.
- I got the impression that looking at the virtual INBOX didn't cause the "all" mailbox to be updated, which I'd guess that it should be.
It should.
- I tried to create an IMAP search, rather than a virtual folder, that looked for x-mailbox INBOX header like the virtual folder does. It too came up empty. It doesn't exactly surprise me because I don't see an x-mailbox header in any of these messages.
x-mailbox doesn't use a header, it uses the actual mailbox name where the message exists.
Lastly, I want to report that for me, the speed of these IMAP searches doesn't begin to approach what I can do with mairix if I want a message's entire thread. I'm happy to use mairix, although it would be nicer not to duplicate that capability if it's already in the server. But it needs to be fast. Is there something I can do to make it go faster?
How slow is it? How many messages do you have? I think it should be pretty fast.
Anyway, dovecot -n output and contents of dovecot-virtual file could help figuring out what your problem is.
At Wed, 6 Jan 2010 14:17:40 +0200, Timo Sirainen wrote:
On 4.1.2010, at 20.47, David Abrahams wrote:
- I had to manually create the virtual folder for all my users or they couldn't access their mail at all. Is this fixed in 2.0?
No.
OK, is it considered a bug that should be addressed? IMO there should at least be a way to tell dovecot to ignore the non-existence of a particular folder.
- My users were getting errors when accessing via POP3. The possible meaning of such a virtual folder under POP3 is lost on me, but I had to enable the virtual plugin for that protocol too. I think that should at least be in the documentation, or better yet the requirement should that it be enabled for POP3 should be dropped.
I think you could put the virtual namespace inside protocol imap {} section.
I'm pretty sure I tried that and it didn't work for some reason. Unfortunately I don't remember the reason, so I could be mistaken.
- I couldn't get the virtual "conversation view" inbox to show any messages. But maybe that's because of a possible issue I describe below with x-mailbox
- The "all" virtual mailbox would only show 89 messages. I switched it to be a mirror of my "archive" mailbox and the number started to look more reasonable. This could be the "lots of mailboxes" bug describe in http://dovecot.org/list/dovecot-news/2009-December/000145.html
"lots of mailboxes" should cause error to be logged.
What does the error look like? I could search my logs for it.
- I tried to create an IMAP search, rather than a virtual folder, that looked for x-mailbox INBOX header like the virtual folder does. It too came up empty. It doesn't exactly surprise me because I don't see an x-mailbox header in any of these messages.
x-mailbox doesn't use a header, it uses the actual mailbox name where the message exists.
Oh... what if the message exists in multiple mailboxes? Typically anything in INBOX can also be found in my "all mail" archive.
I guess that means it's crucial that, whatever else I do, INBOX should be part of the "all mail" virtual folder in order for this to work. I didn't quite understand that before, and I think it's important to have a description somewhere of how x-mailbox works that would help me to get to that conclusion. Certainly the existing description at http://wiki.dovecot.org/Plugins/Virtual that it represents the "original" mailbox isn't adequate for that purpose.
Lastly, I want to report that for me, the speed of these IMAP searches doesn't begin to approach what I can do with mairix if I want a message's entire thread. I'm happy to use mairix, although it would be nicer not to duplicate that capability if it's already in the server. But it needs to be fast. Is there something I can do to make it go faster?
How slow is it? How many messages do you have? I think it should be pretty fast.
150523 messages in 2.6G
Anyway, dovecot -n output and contents of dovecot-virtual file could help figuring out what your problem is.
Having got the x-mailbox insight (I think---thanks), I have tried the following combinations:
# ~/Maildir/virtual/INBOX/dovecot-virtual INBOX zz_archive* inthread refs x-mailbox inbox
shows only messages in INBOX. THe archives are actually in folders like zz_archive.2010.01
# ~/Maildir/virtual/all/dovecot-virtual INBOX zz_archive* all
# ~/Maildir/virtual/INBOX/dovecot-virtual virtual.all inthread refs x-mailbox inbox
shows only messages in INBOX
# ~/Maildir/virtual/all/dovecot-virtual * all
# ~/Maildir/virtual/INBOX/dovecot-virtual virtual.all inthread refs x-mailbox inbox
Appears to hang
# ~/Maildir/virtual/INBOX/dovecot-virtual INBOX zz_archive.*.* inthread refs x-mailbox inbox
Appears to hang. For example, the little pie chart in Apple Mail that shows mailbox scanning progress is stopped. Wanderlust gets totally stuck.
# 1.2.8: /usr/local/etc/dovecot.conf
# OS: FreeBSD 6.2-RELEASE amd64
protocols: imap pop3 imaps pop3s
listen: 64.156.193.20
ssl_ca_file: /etc/ssl/private/network_solutions_ca.crt
ssl_cert_file: /etc/ssl/certs/www.boostpro.com.crt
ssl_key_file: /etc/ssl/private/www.boostpro.com.key
login_dir: /var/run/dovecot/login
login_executable(default): /usr/local/libexec/dovecot/imap-login
login_executable(imap): /usr/local/libexec/dovecot/imap-login
login_executable(pop3): /usr/local/libexec/dovecot/pop3-login
verbose_proctitle: yes
first_valid_gid: 0
mail_privileged_group: mail
mail_location: maildir:~/Maildir
mail_executable(default): /usr/local/libexec/dovecot/imap
mail_executable(imap): /usr/local/libexec/dovecot/imap
mail_executable(pop3): /usr/local/libexec/dovecot/pop3
mail_plugins(default): virtual autocreate
mail_plugins(imap): virtual autocreate
mail_plugins(pop3): virtual
mail_plugin_dir(default): /usr/local/lib/dovecot/imap
mail_plugin_dir(imap): /usr/local/lib/dovecot/imap
mail_plugin_dir(pop3): /usr/local/lib/dovecot/pop3
imap_client_workarounds(default): delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
imap_client_workarounds(imap): delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
imap_client_workarounds(pop3):
pop3_client_workarounds(default):
pop3_client_workarounds(imap):
pop3_client_workarounds(pop3): outlook-no-nuls oe-ns-eoh
namespace:
type: private
inbox: yes
list: yes
subscriptions: yes
namespace:
type: private
separator: .
prefix: virtual.
location: virtual:~/Maildir/virtual
list: yes
subscriptions: yes
lda:
postmaster_address: postmaster@boost-consulting.com
mail_plugins: sieve virtual
sendmail_path: /usr/sbin/sendmail
auth default:
master_user_separator: *
verbose: yes
debug: yes
debug_passwords: yes
passdb:
driver: passwd-file
args: /usr/local/etc/dovecot/master.passwd
master: yes
passdb:
driver: pam
userdb:
driver: passwd
socket:
type: listen
client:
path: /var/run/dovecot/auth-client
mode: 438
plugin:
fts: squat lucene
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
On Wed, 2010-01-06 at 11:50 -0500, David Abrahams wrote:
At Wed, 6 Jan 2010 14:17:40 +0200, Timo Sirainen wrote:
On 4.1.2010, at 20.47, David Abrahams wrote:
- I had to manually create the virtual folder for all my users or they couldn't access their mail at all. Is this fixed in 2.0?
No.
OK, is it considered a bug that should be addressed? IMO there should at least be a way to tell dovecot to ignore the non-existence of a particular folder.
Actually it looks like v2.0 just creates the directory if it's missing. I'm not really sure if it's a good thing or not, but I guess I moved that part of the code to be common across all storages, so maybe it's good. :)
"lots of mailboxes" should cause error to be logged.
What does the error look like? I could search my logs for it.
Easiest would be to make Dovecot log errors to a different file (log_path to different than info_log_path). Then you wouldn't have to search for errors, simply see if anything shows up in the error log. If you want to grep, I suppose anything with Error: or Fatal: or Panic: prefix would do.
- I tried to create an IMAP search, rather than a virtual folder, that looked for x-mailbox INBOX header like the virtual folder does. It too came up empty. It doesn't exactly surprise me because I don't see an x-mailbox header in any of these messages.
x-mailbox doesn't use a header, it uses the actual mailbox name where the message exists.
Oh... what if the message exists in multiple mailboxes? Typically anything in INBOX can also be found in my "all mail" archive. .. I guess that means it's crucial that, whatever else I do, INBOX should be part of the "all mail" virtual folder in order for this to work. I didn't quite understand that before, and I think it's important to have a description somewhere of how x-mailbox works that would help me to get to that conclusion. Certainly the existing description at http://wiki.dovecot.org/Plugins/Virtual that it represents the "original" mailbox isn't adequate for that purpose.
Hmm. If you're making a virtual mailbox out of another virtual mailbox, I'm not entirely sure what X-MAILBOX should do. Currently it returns the parent virtual mailbox's name. But should it instead return the mailbox name that physically contains the mails? I'm beginning to think that it probably should. I'll change that in v2.0.
Lastly, I want to report that for me, the speed of these IMAP searches doesn't begin to approach what I can do with mairix if I want a message's entire thread. I'm happy to use mairix, although it would be nicer not to duplicate that capability if it's already in the server. But it needs to be fast. Is there something I can do to make it go faster?
How slow is it? How many messages do you have? I think it should be pretty fast.
150523 messages in 2.6G
Anyway, dovecot -n output and contents of dovecot-virtual file could help figuring out what your problem is.
Having got the x-mailbox insight (I think---thanks), I have tried the following combinations:
# ~/Maildir/virtual/INBOX/dovecot-virtual INBOX zz_archive* inthread refs x-mailbox inbox
shows only messages in INBOX. THe archives are actually in folders like zz_archive.2010.01
Is this fast or slow then?
# ~/Maildir/virtual/all/dovecot-virtual * all
# ~/Maildir/virtual/INBOX/dovecot-virtual virtual.all inthread refs x-mailbox inbox
Appears to hang
It's probably going to take a while to build the thread index. After that it should be pretty fast. It would be easier to see how far it gets by talking imap:
a login username password b select virtual.all c thread refs all d select virtual.INBOX
After the c) command is finished, the thread thread index is built and d) command should be fast enough. In my tests with 40k messages the d) command takes two seconds. Most of that time goes to opening virtual.all, which in turn is slow because of the number of mailboxes and could be made faster by mailbox list indexes.
At Tue, 19 Jan 2010 16:51:04 +0200, Timo Sirainen wrote:
On Wed, 2010-01-06 at 11:50 -0500, David Abrahams wrote:
At Wed, 6 Jan 2010 14:17:40 +0200, Timo Sirainen wrote:
On 4.1.2010, at 20.47, David Abrahams wrote:
- I had to manually create the virtual folder for all my users or they couldn't access their mail at all. Is this fixed in 2.0?
No.
OK, is it considered a bug that should be addressed? IMO there should at least be a way to tell dovecot to ignore the non-existence of a particular folder.
Actually it looks like v2.0 just creates the directory if it's missing. I'm not really sure if it's a good thing or not, but I guess I moved that part of the code to be common across all storages, so maybe it's good. :)
Well, my inclination would be to ignore missing directories until you try to do something with them. If I set up a fancy virtual folder arrangement for advanced users I'd like ordinary users not to ever have to encounter it.
"lots of mailboxes" should cause error to be logged.
What does the error look like? I could search my logs for it.
Easiest would be to make Dovecot log errors to a different file (log_path to different than info_log_path). Then you wouldn't have to search for errors, simply see if anything shows up in the error log.
I'll try that, thanks.
If you want to grep, I suppose anything with Error: or Fatal: or Panic: prefix would do.
Nothing in the current logs, but they may have been rotated out.
- I tried to create an IMAP search, rather than a virtual folder, that looked for x-mailbox INBOX header like the virtual folder does. It too came up empty. It doesn't exactly surprise me because I don't see an x-mailbox header in any of these messages.
x-mailbox doesn't use a header, it uses the actual mailbox name where the message exists.
Oh... what if the message exists in multiple mailboxes? Typically anything in INBOX can also be found in my "all mail" archive. .. I guess that means it's crucial that, whatever else I do, INBOX should be part of the "all mail" virtual folder in order for this to work. I didn't quite understand that before, and I think it's important to have a description somewhere of how x-mailbox works that would help me to get to that conclusion. Certainly the existing description at http://wiki.dovecot.org/Plugins/Virtual that it represents the "original" mailbox isn't adequate for that purpose.
Hmm. If you're making a virtual mailbox out of another virtual mailbox, I'm not entirely sure what X-MAILBOX should do. Currently it returns the parent virtual mailbox's name. But should it instead return the mailbox name that physically contains the mails? I'm beginning to think that it probably should.
Why? Because fetching from there will be faster?
Having got the x-mailbox insight (I think---thanks), I have tried the following combinations:
# ~/Maildir/virtual/INBOX/dovecot-virtual INBOX zz_archive* inthread refs x-mailbox inbox
shows only messages in INBOX. THe archives are actually in folders like zz_archive.2010.01
Is this fast or slow then?
Oh, perfectly fast, but also perfectly ineffective :-)
# ~/Maildir/virtual/all/dovecot-virtual * all
# ~/Maildir/virtual/INBOX/dovecot-virtual virtual.all inthread refs x-mailbox inbox
Appears to hang
It's probably going to take a while to build the thread index. After that it should be pretty fast. It would be easier to see how far it gets by talking imap:
a login username password b select virtual.all c thread refs all d select virtual.INBOX
a login <username> <pw> a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH] Logged in b select virtual.all closed
(boom!)
I guess that explains my problem... after a fashion.
Ah, my error file contains lots of these:
Jan 21 18:06:01 IMAP(dave): Error: mmap() failed with index cache file /home/dave/Maildir/.zz_archive.2009.06/dovecot.index.cache: Cannot allocate memory Jan 21 18:06:01 IMAP(dave): Fatal: pool_system_realloc(1048576): Out of memory
Okay, I bumped up mail_process_size from 256 to 1024 and it seems not to be bailing out quite so soon.
b select virtual.all
- FLAGS (\Answered \Flagged \Deleted \Seen \Draft unknown-3 unknown-5 unknown-6 $Forwarded $NotJunk unknown-0 unknown-2 NonJunk NotJunk gnus-forward $Junk Junk gnus-download gnus-save unknown-1 $Label1 JunkRecorded $MDNSent unknown-4 gnus-expire unknown-8 receipt-handled)
- OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft unknown-3 unknown-5 unknown-6 $Forwarded $NotJunk unknown-0 unknown-2 NonJunk NotJunk gnus-forward $Junk Junk gnus-download gnus-save unknown-1 $Label1 JunkRecorded $MDNSent unknown-4 gnus-expire unknown-8 receipt-handled \*)] Flags permitted.
- 149262 EXISTS
- 0 RECENT
- OK [UNSEEN 1] First unseen.
- OK [UIDVALIDITY 1264126364] UIDs valid
- OK [UIDNEXT 149263] Predicted next UID
- OK [HIGHESTMODSEQ 24] Highest b OK [READ-WRITE] Select completed. c thread refs all c BAD Error in IMAP command THREAD: Missing search parameters
But, whatever is wrong with command c, it does seem to be working!
After the c) command is finished, the thread thread index is built and d) command should be fast enough. In my tests with 40k messages the d) command takes two seconds. Most of that time goes to opening virtual.all, which in turn is slow because of the number of mailboxes and could be made faster by mailbox list indexes.
Thanks for your help; I'll be playing with this and seeing how well it performs in practice.
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
At Thu, 21 Jan 2010 21:17:37 -0500, David Abrahams wrote:
But, whatever is wrong with command c, it does seem to be working!
Spoke too soon, perhaps.
If I delete the last message in a thread from my regular INBOX, the conversation view still shows the thread.
By the way, is there any way to get the messages to show up as Seen if they're not found in the INBOX?
Thanks,
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
Timo, is this a known issue?
At Thu, 21 Jan 2010 21:36:41 -0500, David Abrahams wrote:
At Thu, 21 Jan 2010 21:17:37 -0500, David Abrahams wrote:
But, whatever is wrong with command c, it does seem to be working!
Spoke too soon, perhaps.
If I delete the last message in a thread from my regular INBOX, the conversation view still shows the thread.
By the way, is there any way to get the messages to show up as Seen if they're not found in the INBOX?
Thanks,
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
I'll look into that at the same time when I fix the other problem with virtual mailboxes. Which happens after I release v2.0.beta2 (which in turn requires several bugfixes..).
On Wed, 2010-01-27 at 12:03 -0500, David Abrahams wrote:
Timo, is this a known issue?
At Thu, 21 Jan 2010 21:36:41 -0500, David Abrahams wrote:
At Thu, 21 Jan 2010 21:17:37 -0500, David Abrahams wrote:
But, whatever is wrong with command c, it does seem to be working!
Spoke too soon, perhaps.
If I delete the last message in a thread from my regular INBOX, the conversation view still shows the thread.
By the way, is there any way to get the messages to show up as Seen if they're not found in the INBOX?
Thanks,
At Wed, 27 Jan 2010 21:41:58 +0200, Timo Sirainen wrote:
[1 <text/plain; ISO-8859-15 (quoted-printable)>] I'll look into that at the same time when I fix the other problem with virtual mailboxes. Which happens after I release v2.0.beta2 (which in turn requires several bugfixes..).
Great, thanks. I'll just sit tight and wait.
-- Dave Abrahams Meet me at BoostCon: http://www.boostcon.com BoostPro Computing http://www.boostpro.com
participants (4)
-
Charles Marcus
-
David Abrahams
-
Ed W
-
Timo Sirainen