12 ms·
Show HN: Floobits – Remote pair programming done right
- danso 13y agoVery cool idea, trying it out right now. I have one caveat though...I get that there's a distinction of "public" and "private", with the latter being reserved for free accounts. But I don't know what "public" actually means...I'm assuming that at minimum, it means that anyone who guesses a URL of my workspace can join in on the fun. But how do other users discover new workspaces? Is there an "Explore" endpoint similar to Github's, where people can just see what others are doing in public?
- ggreer 13y agoYour public workspaces are listed under your user profile (https://floobits.com/u/ggreer/ https://floobits.com/u/ggreer/ for example). So if someone knows your username, they can guess the URL and see your public workspaces. We haven't written any discovery stuff yet, but it'll happen eventually. I was playing around a while back and wrote https://floobits.com/code_roulette https://floobits.com/code_roulette, but it isn't linked to anywhere on the site.
- akkartik 13y agoThanks, your comment helped me answer the question, "what does public mean?" I don't see that answered anywhere on the site. I found myself wondering, "Does that mean we can't choose who we collaborate with, chatroulette-style? Or are the sessions recorded for viewing somehow? (That would be cool!) Or is just the fact of the session published somewhere? (Insufficient differentiator to get people to pay.)" (Also, a copy-writing suggestion: on https://floobits.com/plans https://floobits.com/plans, the words 'free plan' link to the signup page. I clicked on the link looking for a blurb about the free plan. Y'all should add such a blurb. Or link to the signup page from the words 'sign up' instead.)
- StavrosK 13y agoHey, this is pretty interesting. One feature request: Do you think you could add Mozilla Persona for authentication? I don't like yet another u/p, and that Github permissions screen left me a bit uneasy (although I didn't see anything untoward).
- kansface 13y agoWe are just using Github for auth right now. One day it would be nice to be able to suck in private repos. We could probably add support for Mozilla Persona without much trouble. The real problem is presenting a sane UI.
- StavrosK 13y agoI will not argue with that, for I see the truth of your words.
- ThomPete 13y agoSo this could potentially become a pair programming tool that would allow a single person to oversee the work of several people too. Could be good for remote education. In fact I would be willing to pay someone to teach me objective-c this way.
- parennoob 13y agoI went to 'Sign in with Github', and got: "Sorry, but an error made this operation impossible." Is this feature not enabled here, or is the site slashdotted?
- ggreer 13y agoIt might be a bug in django-social-auth. I've had a couple of people complain about it, but I can't reproduce it even if I create a new GitHub account. I've found bugs in DSA before, such as https://github.com/omab/django-social-auth/pull/697 https://github.com/omab/django-social-auth/pull/697 I'll have to look into it more. Sorry about that. :(
- jhartikainen 13y agoLooks interesting, but I get the feeling using something like ScreenHero would work better. I've used ScreenHero for sort-of pair programming and it works extremely well + it's not limited to editors.
- aantix 13y agoScreenhero is great for a lot of things but it's laggy if you just want to jump in, and start typing on the remote system. VNC, etc, all of them suffer from this. But with a lightweight protocol like ssh with tmux/vim things feel much more responsive. The responsiveness is the problem I assume they're trying to address with the individual editor plugins.. I described a similar solution to remote pair programming about a year ago : https://gist.github.com/aantix/1999816 https://gist.github.com/aantix/1999816
- kansface 13y agoScreenHero is limiting in a few ways. 1. Both users are confined to looking at the same thing. 2. Only one user can input at a time. 3. One person may be stuck in an unfamiliar IDE. 4. Only 2? people can work on a thing. We started to build Floobits after pair programming for 8 months or so because nothing else worked. Floobits also has a web based editor and basic support for terminal sharing. We also get to do really neat things because our protocol understands changes in source code; for instance, Floobits is self hosting and streams our changes to staging in hard real time. You can imagine other integration around source control, continuous deployment/integration too. I think ScreenHero has its uses, but pair programming isn't its strongest.
- cmrx64 13y agoBeen watching floobits since you announced it. Very excited to see it launch with bunches of new features!
- efm 13y agoNew ways to collaborate remotely and easily are valuable. Travel time is a waste. David Socha from the University of Washington is looking for teams to video for his research into collaboration. http://davidsocha.wordpress.com/collaboration-in-the-wild/ http://davidsocha.wordpress.com/collaboration-in-the-wild/
- kansface 13y agoYour post reminded me that alerts for uses when someone is working would be valuable. ggreer and I should also really broadcast our g+ hangouts (we use Floobits to write Floobits).
- efm 13y agoI learn so much watching other people do things I want to do better. Floobits can make this possible in a new way. twitch.tv does a nice job of notifications, and in providing the opportunity to observe how other people play. (Instead of game channels; programming languages, problem spaces, ratings of team members...)
- cpolis 13y agoThis is a fantastic idea and I'm really excited to start using this - I wanted to develop this kind of program for a while. This is my use case: I work with designers who are hesitant to use git and make changes really quick and test them on a live WP or similar site. Often times we have two or three people needing to edit a single css file and everyone has to open/close the file often to not overwrite the changes of others. Maybe there is a better workflow, but a collaborative editing tool like this will go a long way in streamlining this process.
- kaushikt 13y agoYou are completely right about the designer bit. Sadly enough, some of my colleagues are still very hooked up with SVN and are not really set on moving on to Git. In cases like these, i think this could actually help.
- jrpt 13y agoYou could teach them to how to use SmartGit or a git management application. I'm technical and I still prefer SmartGit over the command line.
- kaushikt 13y agoI have asked my colleagues to try out the git mac app by github. That really helps. I prefer CLI to be honest. I will check out SmartGit, never really heard about it before. Thanks.
- BHSPitMonkey 13y agoThat's easy; Just migrate your CSS to a Google Doc, then add some logic to your build process to download the doc via the Drive API and unformat the text. What could go wrong? :)
- kansface 13y agoA surprisingly nice feature of using floobits has been in building our own website- we stream changes to staging in real time. Feedback is immediate and trivially sharable. We will add better integration later for running hooks based on file globing, etc. So, you could do things like automatically compile less or restart a service when a file is saved or changed, etc.
- jivid 13y agoThis looks great, good job! A couple of things: 1. I renamed the default FLOOBITS_README.md to teach.py, but the path at the top of the page still showed the README filename. teach.py showed up in the left nav, so I don't really know what was going on there. 2. When I was loading one of the workspaces under https://floobits.com/u/ggreer https://floobits.com/u/ggreer, clicking on the files in the left nav took really long to load, about 8-10 seconds. I almost thought that all the files were blank at first and were there just to show the nested directory structure. Apart from that, I think this is really cool! I'm definitely going to be using it over the next few days.
- ggreer 13y ago1. Shows how often I look at the path at the top. Bug filed. Probably will be fixed today. 2. Yeah... it turns out that one EC2 medium instance isn't the best thing to show HN with. I booted 4 servers to split out services, but I doubt we'll have everything moved until tonight. Thank you for your feedback and your patience.
- aantix 13y agoHopefully they will create a plugin for RubyMine. Not sure, but maybe if they create a plugin for IntelliJ, they'd cover the entire family of Jetbrains editors? (IntelliJ, Rubymine PyCharm, PhpStorm)?
- kansface 13y agoIntelliJ will be the next editor we support, but we'll probably tidy up Vim and Emacs first.
- aantix 13y agoWill that plugin then by default cover their other editors as well?
- kansface 13y agoI think so, but of course we won't know until we build it.
- qwertz123 13y agoThat's great. You can't believe how much I'm looking forward to that!
- vadivlkumar 13y agoIntelliJ please.. There are plenty of people uses it who loves pair programming
- haar 13y agoThank you. I really enjoyed the concept and was playing around with Floobits last month, but found it quite testing at times using the vim integration. My colleague was using the ST integration, and found that sometimes he would be locked out of a file completely after I'd done some visual block changes. I'll give it another whirl some time and provide proper feedback if it still exists.
- yesimahuman 13y agoLooks great, going to try it out. Some feedback: it seems I was able to do a private session on the free plan, but the error message indicates I've used 1 out of 0 private sessions. I think it's important to be able to trial the private session. As I am doing work for my company, I don't want anyone else looking at the work, but I want to try out the product on something real.
- kansface 13y agoRight now we have soft limits- looks like it should stay that way.
- mef 13y agoThis needs to be communicated better. I signed up, created a session, but when I tried to make the session private I got the message about being over the limit and assumed that the attempt to make the session private failed and it remained public, so I deleted it and that was the end of the tryout for me. Also, I was alarmed that my session started off as publically listed and viewable as it was created from a private codebase. Ideally it wouldn't ever be public unless explicitly set to be.
- kansface 13y agoThanks for the feedback. As it turns out, getting the user experience right is harder than making it go.
- kansface 13y agoWe have now changed the default for new users of any sort to have 1 private workspace for free. Thanks for your feedback. We will also change new workspaces to be private if at all possible given the user's limits.
- mef 13y agoThanks very much, will retry the service.
- kaushikt 13y agoGreat job. I just signed up. I think you should have requested my email address from github as well. So that, i would have my gravatar on Floobits. I am not missing anything, am i ?
- tommoor 13y agoReally interesting idea guys, looking forward to giving it a try. If you're in San Francisco i'd love to hook up and talk remote collaboration :-)
- ggreer 13y agoIf anyone's curious, a long time ago I wrote about why I chose to make this: http://geoff.greer.fm/2012/10/19/cross-editor-real-time-collaboration/ http://geoff.greer.fm/2012/10/19/cross-editor-real-time-coll... I didn't realize it would be as hard as it's been. Operational transformation is hard. Persistent network connections in editor plugins are hard. OT + network connections in editor plugins is comically hard.
- zbruhnke 13y agoDid you get into YC?
- aslakhellesoy 13y agoDid you write your own OT server or did you use something else?
- jamesdeer 13y agoWould LOVE to hear more about your experience with OT— what specific challenges you faced, how you pulled it off etc :)
- mustardhamsters 13y agoThis still had a bunch of issues when I tried it: The user I connected with saw many instances of my user because I was trying to connect with Sublime Text, and couldn't give permission to all of them. The system didn't sync well from ST to the browser, but it worked the other way around. At some point we began typing over each other entirely. Screenshot here: http://grab.by/oAgS http://grab.by/oAgS Really want to see this working well!
- kansface 13y agoWe are really struggling under the load right now. Also, i noticed that you are using Vim? We have echo loop detection in Sublime, but haven't ported over that logic yet.
- swalsh 13y agoI had this idea a while ago, Notch was having one of his programming live streams. I thought, man what if instead of us just watching this guy write code we could all be working on it at the same time. I don't know how well it would work, but it would be cool to use a platform like this to try it. Maybe some open source app. It would be like an Amish barn raisin'
- kansface 13y agoWe do have a hidden code_roulette feature. We do a bad job of explaining privacy or potentially the lack thereof to our users. Once we get that figured out, we can add more social features. As for the barn raising, its not too uncommon for ggreer or I to spot bugs in other peoples code on Floobits. There is probably an entirely different business somewhere in there.
- jrpt 13y agoYou guys should sponsor an event where some famous programmer leads a programming session with an audience on your service.
- ctb_mg 13y agoCan you comment on the technical details on how this works at the network level? How secure is this?
- kansface 13y agoWe just compiled a FAQ and pushed it. https://floobits.com/help/faq/ https://floobits.com/help/faq/ Sadly, we didn't use any anchors so you'll have to scroll to "How does Floobits work under the hood?" If you have further questions, let me know.
- daurnimator 13y agoTrying to install in sublime I see: Package Control: Error downloading package. URL error unknown url type: https downloading http://github.com/Floobits/floobits-sublime/archive/0.17.5.zip http://github.com/Floobits/floobits-sublime/archive/0.17.5.z....
- ggreer 13y agoAre you using Sublime Text 3 on linux? ST3 on linux ships with a broken SSL module. We work around it for our own plugin, but I don't think Package Control does. If you're curious how the work-around code works, see https://github.com/Floobits/floobits-sublime/blob/master/floobits.py#L31 https://github.com/Floobits/floobits-sublime/blob/master/flo... The shared objects that code tries to load are all in https://github.com/Floobits/floobits-sublime/tree/master/lib https://github.com/Floobits/floobits-sublime/tree/master/lib
- daurnimator 13y agoI tried both ST2 and 3 (on linux). Could it be that my system default python is 3 (not 2)?
- kansface 13y agoST2 and ST3 ship their own python for linux I believe. Unfortunately, it has been stripped of useful modules like ssl. We have attempted to add support (see https://github.com/Floobits/floobits-sublime/tree/master/lib https://github.com/Floobits/floobits-sublime/tree/master/lib) but this is something Sublime should do, not us.
- kansface 13y agoYou should try installing floobits outside of package control: https://floobits.com/help/plugins/#sublime-text https://floobits.com/help/plugins/#sublime-text See manual installation.
- GrinningFool 13y agoLooks great - any plans to offer self-hosted for those who want behind-the-firewall solutions?
- kansface 13y agoYes, but it will be a while.
- GrinningFool 13y agoExcellent to hear, thanks.
- RobotCaleb 13y agoAny support for private networks or networks not on the internet? Not everyone wants/can send their code through a third party.
- kansface 13y agoNot yet, but its on our radar.
- RobotCaleb 13y agoCool, thanks. How can I sign up for notification of that feature being implemented?
- kansface 13y agoI imagine its at least a couple of months off- probably longer. Signing up for an account with us is probably the best thing for now. We send out updates from time to time.
- sgrove 13y agoBeen watching this for awhile, it's what we've wanted for years now (we thought about building this as dev offering for Bushido's platform). Finally giving it a go in emacs, I just get a Floobits buffer that continually spits out "floobits agent says: ... select(): No socket." non-stop. Edit: Trying it again a second time seems to have worked. Temporary bug, or pebkac perhaps?
- kansface 13y agoCould be a bug- the emacs support is rough around the edges.
- sgrove 13y agoIt seems like the core support is there, quite nice. It disables my ability to select text though (via mark-set and moving the cursor). Love that other people's selections are highlighted though! Is there a github repo for the individual plugins so we can track issues/possibly enhancements?
- kansface 13y agoYeah, check out https://github.com/Floobits https://github.com/Floobits
- agentultra 13y agoGlad to see more people experimenting in this space! Currently I'm using sqwiggle + screenhero and it'd be killer if they could somehow have a baby together. Screenhero allows me to share my emacs (or any window). Works like a charm.
- stevenklein 13y agoWe use Floobits a few times a week to pair and it's incredible.
- plg 13y agoWhy does it have to be organized around a centralized server requiring user accounts? Why not make it peer to peer instead? Haven't we learned our lesson?
- ThomPete 13y agoYeah if you want to monetize don't allow people to have it all running on their own servers.
- nickik 13y agoMaybe because the want to make money?
- kansface 13y agoWe'll have a behind the firewall installation option at some point. There are a few reasons: 1. The backend is non trivial and is getting more complex as we move forward. It sucks to make users run their own service. Running a full blown server out of a editor plugin also isn't feasible. 2. As a user, I don't want to have to deal with firewalls. As a founder, I don't want to have to deal with supporting users punching holes through their firewalls. 3. Peer to peer is very hard for this system; keep in mind, we get cascading failures with increasing latency as patches fail to get merged and instead cause conflicts. Conflicts make us drop patches, or try to do the equivalent of a rebase. 4. Accounts of some sort are required for access control. 5. Finally, we are trying to make a sustainable business. We understand your concerns- we've also been burned by services that shut down: https://floobits.com/pledge/ https://floobits.com/pledge/
- jalopy 13y agoHoly cow this is an awesome concept. Haven't tried it yet, but if it works it's completely transformative. Can be used as a teaching tool for anything - not just for pair programming. Very, very cool! Thank you for charging money so you can build a real business and keep improving on it. Please, please work with the JetBrains folks to integrate w/their suite of products? Please?!
- deleted 13y ago[deleted]
- lince 13y agoAwesome tool. I don't know why, but I was expecting a place to get in touch to other programmers to do Pair Programming (i.e. for small katas or side projects). Does it exists? If it doesn't, does anyone wants to have a bit of fun doing Pair Programming to create it together? :)
- kansface 13y agoThere are a few projects around the web, but Floobits doesn't do this right now. We plan on implementing more social features once we've ironed out some usability issues.
- t4nkd 13y agoMaybe I'd know the answer faster if I just tried, but, does this let people pair from, lets say, SublimeText to Vim? From the screenshots it seems to be one-way(sharing from a native editor to Floobits web editor).
- kansface 13y agoYes it does, although we're not happy with our current Vim support. We will probably end up forking Vim.
- KurtMueller 13y agoMadeye.io is fun and allows "swarm programming".
- gleb 13y agoVery neat. Quick patch to make (require 'floobits) work: diff --git a/floobits.el b/floobits.el index 5f05d33..029e6bd 100644 --- a/floobits.el +++ b/floobits.el @@ -451,3 +451,5 @@ See floobits-share-dir to create one or visit floobits.com." (cons 'added added-text) (cons 'deleted deleted)))) (floobits-send-to-agent req 'buffer_list_change))))) + +(provide 'floobits)
- kansface 13y agoThanks for the patch- I hadn't really considered someone requiring Floobits so its not really built as a library.
- gleb 13y agoThat's how I normally load things from .emacs
- kansface 13y agoWe suck at elisp. Every once in a while, we'd like to be able to pay someone to help us out for an hour or so in some very specific domain. Maybe one day we'll implement that feature.
- gleb 13y agoWhich integration is most solid - Sublime Text?
- ggreer 13y agoYeah. Sublime Text is our best plugin. There are still some issues with it on linux, but we use it every day.
- zbruhnke 13y agoI find it interesting that when you wrote the blog post in October you were a self-described love of textmate and in the past few months you've already made the switch over to sublime. Seems like alot of people are going that way. I'm afraid if I don't move I may be one of the last holdouts to leave textmate lol
- nwenzel 13y agoPretty sure this could be part of the answer to the pros/cons debate of working remotely... productivity vs collaboration.
- geekbri 13y agoGave this thing a whirl. The terminal sharing is nice, however the person I paired with had a real hard time seeing any of the commands I was typing. The PS1 modification flootty makes pushes almost everything right out of their window and they claimed they were unable to scroll vertically
- kansface 13y agoThanks for the info. Were both of you using flootty? The web integration as actually better, since we use a JS PTY which lets us control the output much more easily than just shoving data into stdout.
- kapad 13y agoGetting an error Unable to create workspace: <urlopen error unknown url type: https> Have tried both the master branch and teh 0.17.5 tag. Same issue. The package control install was not working so just copy pasted the directory into sublime packages. Could this be the issue?
- kansface 13y agoAs an experiment, this room is publicly writable- let us know what you think. edit: I'm taking down this link as we are completely crushed- I suppose getting DOSed by our own users is the best way to go down.
- gazd 13y agohard to use with a single cursor and so many anon users edit: Ah I see you can hold alt and click with mouse to get your own cursor
- kansface 13y agoActually, everyone gets their own cursor, but all selections are highlighted for everyone else. Sorry, we've never tested a workspace with 300+ active users :P
- wf 13y agoThe room is empty for me? Am I missing something...?
- kansface 13y agoLike I said, we are getting slammed. Over 500 people were in the room... typing at the same time.
- thom 13y agoSo does this support emacs on one side, vim on the other? If so, thank you, you're awesome.
- kansface 13y agoIt does.
- kansface 13y agoFloobits is down... and back up.
- dannyolinsky 13y agoWe're big floobits fans. Using it to pair remotely with Sublime.
- garlandbinns 13y agoCongrats Geoff and Matt! Geoff, I randomly bumped into you on Freenode a couple of months back and chatted w/ you briefly and you were telling me about this. So happy for you all to see this on HN getting such great feedback. Nice job working hard and making it happen! :)
- johnnyg 13y agoTextMate? Guess I'm going extinct. :-)
- shaunol 13y agoThis is quite awesome - Visual Studio support would rock!
- kansface 13y agoI did some research into V++ and I believe it will be doable, but this is a long ways off.
- meowface 13y agoThis is surprisingly cool. With some more polish, this could become a real wave-maker. You could consider making it a bit more of a "freemium" model. Something like allowing users to set up 1-2 private coding collaborations for free, but without any version control, terminal-sharing, or the other bells and whistles.
- kansface 13y agoAgreed. New users should almost certainly get a free private repo or two.
- bagels 13y agoWhy does the demo have ascii art penises? I think it detracts from the otherwise quality presentation.
- njoubert 13y agoFrom Sublime: Unable to create workspace, maximum recursion depth exceeded.
- ggreer 13y agoTry it now. We just pushed a fix to package control.
- contingencies 13y agoWhat's the point of video when programming? That's just a distraction.
- kansface 13y agoAudio is crucially important. Video is nice when discussing code.
- contingencies 13y agoQuestion = Why is it nice? Response = "it's nice"
- efm 13y agoShowing is different than telling. People will show how focused they are, or frustrated, with small facial expressions. They are unlikely to talk about these transient states. But, these states will tell you: this bit of code is ugly; I'm tired and need a break; Wow, that's great!
- MichaelGG 13y agoWhen joining the hn_feedback, the edit button seems to fail: discarding because event origin is Object ?follow=1:62 Connecting to https://floobits.com:8448/ ... b8cb474e2761.js:427 Joining workspace Floobits / hn_feedback b8cb474e2761.js:445 room_info Object b8cb474e2761.js:4535 Uncaught TypeError: Cannot read property 'path' of null b8cb474e2761.js:205 (anonymous function) b8cb474e2761.js:205 x.event.dispatch jquery-2.0.3.min.js:3 y.handle jquery-2.0.3.min.js:3 Chrome on Windows 7. Seems like none of the buttons (like delete) work, either. I don't see any activity other than people in the chatroom. Just a black center screen.
- kansface 13y agoYeah. That would be floobits dying under load. Basically, you can download the static resources from our webserver because they are cached, but you can't retrieve the meta data necessary to load the workspace from our api because there are over a hundred people in the workspace copy pasting huge chunks of text and deleting them as rapidly as possible. We are scrambling to fix the problem right now.
- lsiebert 13y agoI like that you have free organization plans, but I think you need some sort of intermediate option for a classroom type environment and student groups. The ability to a teacher or TA pair program, or set up students to work in small groups on a semester long project would be awesome. However A 12 week class with 30 students is 1.5k, if I am understanding how your plans work correctly, and I don't see that happening. Given that it's less likely to be always on programming when it's students and teachers, I think a significant deduction would be reasonable. Alternatively, you could spin off a classroom focused version. Maybe something that will need to wait for when you are more profitable, but if you get people used to your service as a student, they will carry it with them.
- kansface 13y agoI like this idea. We should support an educational option to get people onto the platform. While 1.5K to basically replace an office is a no-brainer, its far too much for students.
- disc 13y agoI think this use-case has a lot of potential. As someone who's past tutorials, yet not quite confident enough to seek employment with my hobby language, I'd love some small-group or individual pairing experience (sort of like golf or skiing lessons, only for programmers.) As long as the cost for facilitating this is reasonable, I wouldn't have a problem paying for it.
- arikrak 13y agoDouglas Engelbart would be proud. I wonder which will be more common in a few years - something like this, or collaboration fully in the cloud, like c9.io.
- kansface 13y agoI don't see cloud editors replacing native ones for quite some time. Maybe WebVim and WebEmacs will supplant them one day, but programmers are married to their text editors. We also like to work when we don't have Internet access. In the mean time, I think we should use the best of both worlds.
- cheesylard 13y agoSo um..... call me ignorant, but how is this any different from: person 1: screen -t "foo" person 2: ssh person1@blahblah.com screen -x "foo" ??
- anonymoushn 13y agoOne person can use emacs while the other one uses vim
- sampo 13y ago> screen -t "foo" You mean screen -S "foo" right?
- cheesylard 13y agoYeah. I'll edit that in. Thanks. edit: Never mind. Looks like I can't.
- thejosh 13y agoNot everyone uses the same editors.
- kansface 13y agoAs thejosh pointed out, not everyone uses the same editor. Futhermore, most programmers (I estimate 90%) don't use terminal based editors. Some common distributions of emacs/vim (MacVim) won't even run in a terminal for that matter. Forcing N users to share one screen and one editor sucks. Finally, absolutely no one wants to deal with private keys and setting up users/groups.
- deleted 13y ago[deleted]
- johncoltrane 13y agoFor what it's worth, you can run MacVim in a terminal emulator with $ mvim -v filename
- 13y ago
- ggchappell 13y agoFiglet sighting. :-)
- coldman333 13y agohi all , i have some error in msgs.floobits.log , on Windows 7 / Sublime 3 "Error handling room_info event with data {... }: path is on mount 'd:', start on mount 'c:' " have fix this?
- oceanician 13y agoThis looks really good. Just need another Ruby programmer to try it out with now :) Anyone free a week today - next Friday, 26th July?
- JeroenRansijn 13y agoNice release guys! Good to see you on the front page on HN. Keep going.